From c1287cbe6c8cad9fcbd29fb4433d56132691034c Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 15 Oct 2022 11:22:08 +0000 Subject: [PATCH 001/477] refactor(auth): replace myth/auth with codeigniter/shield + define new roles closes #222 --- .devcontainer/devcontainer.json | 4 +- app/Common.php | 6 + app/Config/Email.php | 2 +- app/Config/Events.php | 16 - app/Config/Filters.php | 6 +- app/Config/Routes.php | 10 +- app/Config/Security.php | 2 +- app/Config/Validation.php | 2 - app/Controllers/ActorController.php | 4 +- app/Controllers/BaseController.php | 2 + app/Controllers/CreditsController.php | 2 +- app/Controllers/EpisodeCommentController.php | 7 +- app/Controllers/EpisodeController.php | 16 +- app/Controllers/HomeController.php | 18 +- app/Controllers/MapController.php | 3 +- app/Controllers/PageController.php | 3 +- app/Controllers/PodcastController.php | 21 +- app/Controllers/PostController.php | 9 +- ...ia.php => 2021-05-29-120000_add_media.php} | 2 + ...p => 2021-05-29-152000_add_categories.php} | 0 ...hp => 2021-05-30-101000_add_languages.php} | 0 ...php => 2021-05-30-101500_add_podcasts.php} | 0 ...php => 2021-06-05-170000_add_episodes.php} | 0 ...hp => 2021-06-05-190000_add_platforms.php} | 0 ...1-06-05-200000_add_podcasts_platforms.php} | 0 ...es.php => 2021-08-17-150000_add_pages.php} | 0 ...-09-29-150000_add_podcasts_categories.php} | 0 ....php => 2021-12-25-120000_add_persons.php} | 0 ...021-12-25-130000_add_podcasts_persons.php} | 0 ...021-12-25-140000_add_episodes_persons.php} | 0 ...=> 2021-12-25-150000_add_credits_view.php} | 0 ...-02-23-100000_add_episode_id_to_posts.php} | 0 ...-03-09-113000_add_created_by_to_posts.php} | 0 app/Database/Seeds/AppSeeder.php | 1 - app/Database/Seeds/AuthSeeder.php | 328 ------------------ app/Database/Seeds/TestSeeder.php | 20 +- app/Entities/Clip/BaseClip.php | 4 +- app/Entities/Podcast.php | 11 +- app/Helpers/auth_helper.php | 89 ----- app/Models/PodcastModel.php | 84 +---- app/Models/UserModel.php | 55 --- app/Resources/icons/shield-user.svg | 4 + app/Views/errors/html/error_403.php | 29 ++ app/Views/errors/html/error_404.php | 2 +- app/Views/errors/html/production.php | 4 +- composer.json | 4 +- composer.lock | 137 ++++---- docs/.gitlab-ci.yml | 3 - docs/.vitepress/config.ts | 4 + docs/src/getting-started/auth.md | 86 +++++ modules/Admin/Config/Routes.php | 292 +++++----------- .../Controllers/ContributorController.php | 203 ----------- .../Admin/Controllers/EpisodeController.php | 16 +- .../Controllers/EpisodePersonController.php | 2 +- .../Controllers/NotificationController.php | 2 +- .../Admin/Controllers/PodcastController.php | 53 ++- .../Controllers/PodcastImportController.php | 12 +- .../Controllers/PodcastPersonController.php | 2 +- .../Controllers/PodcastPlatformController.php | 2 +- .../Admin/Controllers/SoundbiteController.php | 4 +- modules/Admin/Controllers/UserController.php | 258 -------------- .../Controllers/VideoClipsController.php | 6 +- modules/Admin/Language/en/Breadcrumb.php | 1 + modules/Admin/Language/id/User.php | 56 --- modules/Admin/Language/it/User.php | 56 --- modules/Admin/Language/nl/User.php | 56 --- modules/Admin/Language/oc/User.php | 56 --- modules/Admin/Language/pt/User.php | 56 --- modules/Admin/Language/ru/User.php | 56 --- modules/Admin/Language/sk/User.php | 56 --- modules/Admin/Language/sv/User.php | 56 --- modules/Analytics/Config/Analytics.php | 6 +- modules/Auth/Auth.php | 42 +++ .../Auth/Authorization/FlatAuthorization.php | 54 --- modules/Auth/Authorization/GroupModel.php | 30 -- .../Auth/Authorization/PermissionModel.php | 53 --- modules/Auth/Commands/RolesDoc.php | 184 ++++++++++ modules/Auth/Config/Auth.php | 123 +++++-- modules/Auth/Config/AuthGroups.php | 285 +++++++++++++++ modules/Auth/Config/AuthRoutes.php | 42 +++ modules/Auth/Config/Events.php | 14 + modules/Auth/Config/Routes.php | 158 +++++++-- modules/Auth/Config/Services.php | 80 +---- modules/Auth/Controllers/ActionController.php | 29 ++ modules/Auth/Controllers/AuthController.php | 204 ----------- .../Controllers/ContributorController.php | 243 +++++++++++++ .../Auth/Controllers/InteractController.php | 36 ++ modules/Auth/Controllers/LoginController.php | 24 ++ .../Auth/Controllers/MagicLinkController.php | 76 ++++ .../Controllers/MyAccountController.php | 31 +- .../Auth/Controllers/RegisterController.php | 29 ++ modules/Auth/Controllers/UserController.php | 276 +++++++++++++++ .../2020-07-03-191500_add_podcasts_users.php | 46 --- ...020-12-29-100000_add_is_owner_to_users.php | 31 ++ modules/Auth/Database/Seeds/.gitkeep | 0 modules/Auth/Database/Seeds/AuthSeeder.php | 302 ---------------- modules/Auth/Entities/User.php | 109 ------ modules/Auth/Filters/PermissionFilter.php | 77 ++-- modules/Auth/Helpers/auth_helper.php | 296 ++++++++++++++++ .../Language/ar/Contributor.php | 0 .../{Admin => Auth}/Language/ar/MyAccount.php | 0 modules/{Admin => Auth}/Language/ar/User.php | 5 +- .../Language/br/Contributor.php | 0 .../{Admin => Auth}/Language/br/MyAccount.php | 0 modules/{Admin => Auth}/Language/br/User.php | 5 +- .../Language/ca/Contributor.php | 0 .../{Admin => Auth}/Language/ca/MyAccount.php | 0 modules/{Admin => Auth}/Language/ca/User.php | 5 +- .../Language/de/Contributor.php | 0 .../{Admin => Auth}/Language/de/MyAccount.php | 0 modules/{Admin => Auth}/Language/de/User.php | 5 +- .../Language/el/Contributor.php | 0 .../{Admin => Auth}/Language/el/MyAccount.php | 0 .../Language/gd => Auth/Language/el}/User.php | 5 +- modules/Auth/Language/en/Auth.php | 89 +++++ .../sv => Auth/Language/en}/Contributor.php | 10 +- .../{Admin => Auth}/Language/en/MyAccount.php | 0 modules/Auth/Language/en/User.php | 60 ++++ .../Language/es/Contributor.php | 0 .../{Admin => Auth}/Language/es/MyAccount.php | 0 modules/{Admin => Auth}/Language/es/User.php | 5 +- .../en => Auth/Language/fa}/Contributor.php | 0 .../{Admin => Auth}/Language/fa/MyAccount.php | 0 .../Language/el => Auth/Language/fa}/User.php | 5 +- .../Language/fr/Contributor.php | 0 .../{Admin => Auth}/Language/fr/MyAccount.php | 0 modules/{Admin => Auth}/Language/fr/User.php | 5 +- .../fa => Auth/Language/gd}/Contributor.php | 0 .../{Admin => Auth}/Language/gd/MyAccount.php | 0 .../Language/fa => Auth/Language/gd}/User.php | 5 +- .../Language/gl/Contributor.php | 0 .../{Admin => Auth}/Language/gl/MyAccount.php | 0 modules/{Admin => Auth}/Language/gl/User.php | 5 +- .../gd => Auth/Language/id}/Contributor.php | 0 .../{Admin => Auth}/Language/id/MyAccount.php | 0 .../Language/en => Auth/Language/id}/User.php | 5 +- .../Language/it/Contributor.php | 0 .../{Admin => Auth}/Language/it/MyAccount.php | 0 modules/Auth/Language/it/User.php | 53 +++ .../Language/nl/Contributor.php | 0 .../{Admin => Auth}/Language/nl/MyAccount.php | 0 modules/Auth/Language/nl/User.php | 53 +++ .../Language/nn-NO/Contributor.php | 0 .../Language/nn-NO/MyAccount.php | 0 .../{Admin => Auth}/Language/nn-NO/User.php | 5 +- .../id => Auth/Language/oc}/Contributor.php | 0 .../{Admin => Auth}/Language/oc/MyAccount.php | 0 modules/Auth/Language/oc/User.php | 53 +++ .../Language/pl/Contributor.php | 0 .../{Admin => Auth}/Language/pl/MyAccount.php | 0 modules/{Admin => Auth}/Language/pl/User.php | 5 +- .../Language/pt-BR/Contributor.php | 0 .../Language/pt-BR/MyAccount.php | 0 .../{Admin => Auth}/Language/pt-BR/User.php | 5 +- .../oc => Auth/Language/pt}/Contributor.php | 0 .../{Admin => Auth}/Language/pt/MyAccount.php | 0 modules/Auth/Language/pt/User.php | 53 +++ .../pt => Auth/Language/ru}/Contributor.php | 0 .../{Admin => Auth}/Language/ru/MyAccount.php | 0 modules/Auth/Language/ru/User.php | 53 +++ .../Language/sk/Contributor.php | 0 .../{Admin => Auth}/Language/sk/MyAccount.php | 0 modules/Auth/Language/sk/User.php | 53 +++ .../ru => Auth/Language/sv}/Contributor.php | 0 .../{Admin => Auth}/Language/sv/MyAccount.php | 0 modules/Auth/Language/sv/User.php | 53 +++ .../Language/zh-Hans/Contributor.php | 0 .../Language/zh-Hans/MyAccount.php | 0 .../{Admin => Auth}/Language/zh-Hans/User.php | 5 +- modules/Auth/Models/UserModel.php | 50 +++ .../Install/Controllers/InstallController.php | 64 ++-- modules/Install/Language/en/Install.php | 2 +- modules/PremiumPodcasts/Config/Routes.php | 26 +- .../Controllers/SubscriptionController.php | 12 +- .../Filters/PodcastUnlockFilter.php | 5 +- phpstan.neon | 4 +- themes/cp_admin/_partials/_nav_header.php | 27 +- themes/cp_admin/_partials/_user_info.php | 20 +- themes/cp_admin/contributor/add.php | 3 +- themes/cp_admin/contributor/delete.php | 37 ++ themes/cp_admin/contributor/edit.php | 8 +- themes/cp_admin/contributor/list.php | 10 +- themes/cp_admin/my_account/view.php | 3 +- themes/cp_admin/podcast/list.php | 2 +- themes/cp_admin/user/create.php | 19 +- themes/cp_admin/user/delete.php | 35 ++ themes/cp_admin/user/edit.php | 14 +- themes/cp_admin/user/list.php | 32 +- themes/cp_admin/user/view.php | 6 + themes/cp_app/_admin_navbar.php | 48 ++- themes/cp_app/embed.php | 2 +- themes/cp_app/home.php | 2 +- themes/cp_app/pages/_layout.php | 2 +- themes/cp_app/pages/map.php | 2 +- themes/cp_auth/_layout.php | 3 +- themes/cp_auth/email_2fa_show.php | 38 ++ themes/cp_auth/email_2fa_verify.php | 36 ++ themes/cp_auth/email_activate_show.php | 28 ++ themes/cp_auth/emails/activation.php | 11 - themes/cp_auth/emails/email_2fa_email.php | 1 + .../cp_auth/emails/email_activate_email.php | 3 + themes/cp_auth/emails/forgot.php | 13 - themes/cp_auth/emails/magic_link_email.php | 5 + themes/cp_auth/emails/welcome_email.php | 10 + themes/cp_auth/forgot.php | 24 -- themes/cp_auth/login.php | 41 ++- themes/cp_auth/magic_link_form.php | 24 ++ themes/cp_auth/magic_link_message.php | 13 + themes/cp_auth/magic_link_set_password.php | 26 ++ themes/cp_auth/register.php | 34 +- themes/cp_auth/reset.php | 38 -- themes/cp_install/_layout.php | 3 +- themes/cp_install/create_superadmin.php | 10 +- 213 files changed, 3372 insertions(+), 3210 deletions(-) rename app/Database/Migrations/{2020-05-29-120000_add_media.php => 2021-05-29-120000_add_media.php} (96%) rename app/Database/Migrations/{2020-05-29-152000_add_categories.php => 2021-05-29-152000_add_categories.php} (100%) rename app/Database/Migrations/{2020-05-30-101000_add_languages.php => 2021-05-30-101000_add_languages.php} (100%) rename app/Database/Migrations/{2020-05-30-101500_add_podcasts.php => 2021-05-30-101500_add_podcasts.php} (100%) rename app/Database/Migrations/{2020-06-05-170000_add_episodes.php => 2021-06-05-170000_add_episodes.php} (100%) rename app/Database/Migrations/{2020-06-05-190000_add_platforms.php => 2021-06-05-190000_add_platforms.php} (100%) rename app/Database/Migrations/{2020-06-05-200000_add_podcasts_platforms.php => 2021-06-05-200000_add_podcasts_platforms.php} (100%) rename app/Database/Migrations/{2020-08-17-150000_add_pages.php => 2021-08-17-150000_add_pages.php} (100%) rename app/Database/Migrations/{2020-09-29-150000_add_podcasts_categories.php => 2021-09-29-150000_add_podcasts_categories.php} (100%) rename app/Database/Migrations/{2020-12-25-120000_add_persons.php => 2021-12-25-120000_add_persons.php} (100%) rename app/Database/Migrations/{2020-12-25-130000_add_podcasts_persons.php => 2021-12-25-130000_add_podcasts_persons.php} (100%) rename app/Database/Migrations/{2020-12-25-140000_add_episodes_persons.php => 2021-12-25-140000_add_episodes_persons.php} (100%) rename app/Database/Migrations/{2020-12-25-150000_add_credits_view.php => 2021-12-25-150000_add_credits_view.php} (100%) rename app/Database/Migrations/{2021-02-23-100000_add_episode_id_to_posts.php => 2022-02-23-100000_add_episode_id_to_posts.php} (100%) rename app/Database/Migrations/{2021-03-09-113000_add_created_by_to_posts.php => 2022-03-09-113000_add_created_by_to_posts.php} (100%) delete mode 100644 app/Database/Seeds/AuthSeeder.php delete mode 100644 app/Helpers/auth_helper.php delete mode 100644 app/Models/UserModel.php create mode 100644 app/Resources/icons/shield-user.svg create mode 100644 app/Views/errors/html/error_403.php create mode 100644 docs/src/getting-started/auth.md delete mode 100644 modules/Admin/Controllers/ContributorController.php delete mode 100644 modules/Admin/Controllers/UserController.php delete mode 100644 modules/Admin/Language/id/User.php delete mode 100644 modules/Admin/Language/it/User.php delete mode 100644 modules/Admin/Language/nl/User.php delete mode 100644 modules/Admin/Language/oc/User.php delete mode 100644 modules/Admin/Language/pt/User.php delete mode 100644 modules/Admin/Language/ru/User.php delete mode 100644 modules/Admin/Language/sk/User.php delete mode 100644 modules/Admin/Language/sv/User.php create mode 100644 modules/Auth/Auth.php delete mode 100644 modules/Auth/Authorization/FlatAuthorization.php delete mode 100644 modules/Auth/Authorization/GroupModel.php delete mode 100644 modules/Auth/Authorization/PermissionModel.php create mode 100644 modules/Auth/Commands/RolesDoc.php create mode 100644 modules/Auth/Config/AuthGroups.php create mode 100644 modules/Auth/Config/AuthRoutes.php create mode 100644 modules/Auth/Config/Events.php create mode 100644 modules/Auth/Controllers/ActionController.php delete mode 100644 modules/Auth/Controllers/AuthController.php create mode 100644 modules/Auth/Controllers/ContributorController.php create mode 100644 modules/Auth/Controllers/InteractController.php create mode 100644 modules/Auth/Controllers/LoginController.php create mode 100644 modules/Auth/Controllers/MagicLinkController.php rename modules/{Admin => Auth}/Controllers/MyAccountController.php (73%) create mode 100644 modules/Auth/Controllers/RegisterController.php create mode 100644 modules/Auth/Controllers/UserController.php delete mode 100644 modules/Auth/Database/Migrations/2020-07-03-191500_add_podcasts_users.php create mode 100644 modules/Auth/Database/Migrations/2020-12-29-100000_add_is_owner_to_users.php delete mode 100644 modules/Auth/Database/Seeds/.gitkeep delete mode 100644 modules/Auth/Database/Seeds/AuthSeeder.php delete mode 100644 modules/Auth/Entities/User.php create mode 100644 modules/Auth/Helpers/auth_helper.php rename modules/{Admin => Auth}/Language/ar/Contributor.php (100%) rename modules/{Admin => Auth}/Language/ar/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/ar/User.php (90%) rename modules/{Admin => Auth}/Language/br/Contributor.php (100%) rename modules/{Admin => Auth}/Language/br/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/br/User.php (90%) rename modules/{Admin => Auth}/Language/ca/Contributor.php (100%) rename modules/{Admin => Auth}/Language/ca/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/ca/User.php (88%) rename modules/{Admin => Auth}/Language/de/Contributor.php (100%) rename modules/{Admin => Auth}/Language/de/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/de/User.php (88%) rename modules/{Admin => Auth}/Language/el/Contributor.php (100%) rename modules/{Admin => Auth}/Language/el/MyAccount.php (100%) rename modules/{Admin/Language/gd => Auth/Language/el}/User.php (89%) create mode 100644 modules/Auth/Language/en/Auth.php rename modules/{Admin/Language/sv => Auth/Language/en}/Contributor.php (70%) rename modules/{Admin => Auth}/Language/en/MyAccount.php (100%) create mode 100644 modules/Auth/Language/en/User.php rename modules/{Admin => Auth}/Language/es/Contributor.php (100%) rename modules/{Admin => Auth}/Language/es/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/es/User.php (88%) rename modules/{Admin/Language/en => Auth/Language/fa}/Contributor.php (100%) rename modules/{Admin => Auth}/Language/fa/MyAccount.php (100%) rename modules/{Admin/Language/el => Auth/Language/fa}/User.php (89%) rename modules/{Admin => Auth}/Language/fr/Contributor.php (100%) rename modules/{Admin => Auth}/Language/fr/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/fr/User.php (89%) rename modules/{Admin/Language/fa => Auth/Language/gd}/Contributor.php (100%) rename modules/{Admin => Auth}/Language/gd/MyAccount.php (100%) rename modules/{Admin/Language/fa => Auth/Language/gd}/User.php (89%) rename modules/{Admin => Auth}/Language/gl/Contributor.php (100%) rename modules/{Admin => Auth}/Language/gl/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/gl/User.php (88%) rename modules/{Admin/Language/gd => Auth/Language/id}/Contributor.php (100%) rename modules/{Admin => Auth}/Language/id/MyAccount.php (100%) rename modules/{Admin/Language/en => Auth/Language/id}/User.php (89%) rename modules/{Admin => Auth}/Language/it/Contributor.php (100%) rename modules/{Admin => Auth}/Language/it/MyAccount.php (100%) create mode 100644 modules/Auth/Language/it/User.php rename modules/{Admin => Auth}/Language/nl/Contributor.php (100%) rename modules/{Admin => Auth}/Language/nl/MyAccount.php (100%) create mode 100644 modules/Auth/Language/nl/User.php rename modules/{Admin => Auth}/Language/nn-NO/Contributor.php (100%) rename modules/{Admin => Auth}/Language/nn-NO/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/nn-NO/User.php (89%) rename modules/{Admin/Language/id => Auth/Language/oc}/Contributor.php (100%) rename modules/{Admin => Auth}/Language/oc/MyAccount.php (100%) create mode 100644 modules/Auth/Language/oc/User.php rename modules/{Admin => Auth}/Language/pl/Contributor.php (100%) rename modules/{Admin => Auth}/Language/pl/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/pl/User.php (89%) rename modules/{Admin => Auth}/Language/pt-BR/Contributor.php (100%) rename modules/{Admin => Auth}/Language/pt-BR/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/pt-BR/User.php (89%) rename modules/{Admin/Language/oc => Auth/Language/pt}/Contributor.php (100%) rename modules/{Admin => Auth}/Language/pt/MyAccount.php (100%) create mode 100644 modules/Auth/Language/pt/User.php rename modules/{Admin/Language/pt => Auth/Language/ru}/Contributor.php (100%) rename modules/{Admin => Auth}/Language/ru/MyAccount.php (100%) create mode 100644 modules/Auth/Language/ru/User.php rename modules/{Admin => Auth}/Language/sk/Contributor.php (100%) rename modules/{Admin => Auth}/Language/sk/MyAccount.php (100%) create mode 100644 modules/Auth/Language/sk/User.php rename modules/{Admin/Language/ru => Auth/Language/sv}/Contributor.php (100%) rename modules/{Admin => Auth}/Language/sv/MyAccount.php (100%) create mode 100644 modules/Auth/Language/sv/User.php rename modules/{Admin => Auth}/Language/zh-Hans/Contributor.php (100%) rename modules/{Admin => Auth}/Language/zh-Hans/MyAccount.php (100%) rename modules/{Admin => Auth}/Language/zh-Hans/User.php (90%) create mode 100644 modules/Auth/Models/UserModel.php create mode 100644 themes/cp_admin/contributor/delete.php create mode 100644 themes/cp_admin/user/delete.php create mode 100644 themes/cp_auth/email_2fa_show.php create mode 100644 themes/cp_auth/email_2fa_verify.php create mode 100644 themes/cp_auth/email_activate_show.php delete mode 100644 themes/cp_auth/emails/activation.php create mode 100644 themes/cp_auth/emails/email_2fa_email.php create mode 100644 themes/cp_auth/emails/email_activate_email.php delete mode 100644 themes/cp_auth/emails/forgot.php create mode 100644 themes/cp_auth/emails/magic_link_email.php create mode 100644 themes/cp_auth/emails/welcome_email.php delete mode 100644 themes/cp_auth/forgot.php create mode 100644 themes/cp_auth/magic_link_form.php create mode 100644 themes/cp_auth/magic_link_message.php create mode 100644 themes/cp_auth/magic_link_set_password.php delete mode 100644 themes/cp_auth/reset.php diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index fbd4eb36..afed9ca1 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -29,6 +29,7 @@ "bmewburn.vscode-intelephense-client", "bradlc.vscode-tailwindcss", "breezelin.phpstan", + "DavidAnson.vscode-markdownlint", "dbaeumer.vscode-eslint", "eamodio.gitlens", "esbenp.prettier-vscode", @@ -41,6 +42,7 @@ "runem.lit-plugin", "streetsidesoftware.code-spell-checker", "stylelint.vscode-stylelint", - "wayou.vscode-todo-highlight" + "wayou.vscode-todo-highlight", + "yzhang.markdown-all-in-one" ] } diff --git a/app/Common.php b/app/Common.php index 1f3b17c2..6876d968 100644 --- a/app/Common.php +++ b/app/Common.php @@ -29,6 +29,10 @@ if (! function_exists('view')) { */ function view(string $name, array $data = [], array $options = []): string { + if (array_key_exists('theme', $options)) { + Theme::setTheme($options['theme']); + } + $path = Theme::path(); /** @var CodeIgniter\View\View $renderer */ @@ -55,6 +59,8 @@ if (! function_exists('lang')) { * * @param array $args * + * TODO: remove, and escape args when necessary + * * @return string|string[] */ function lang(string $line, array $args = [], ?string $locale = null, bool $escape = true): string | array diff --git a/app/Config/Email.php b/app/Config/Email.php index 2f651dca..c8713ee8 100644 --- a/app/Config/Email.php +++ b/app/Config/Email.php @@ -77,7 +77,7 @@ class Email extends BaseConfig /** * Type of mail, either 'text' or 'html' */ - public string $mailType = 'text'; + public string $mailType = 'html'; /** * Character set (utf-8, iso-8859-1, etc.) diff --git a/app/Config/Events.php b/app/Config/Events.php index 004e1453..07332c3d 100644 --- a/app/Config/Events.php +++ b/app/Config/Events.php @@ -9,7 +9,6 @@ use App\Entities\Post; use App\Models\EpisodeModel; use CodeIgniter\Events\Events; use CodeIgniter\Exceptions\FrameworkException; -use Modules\Auth\Entities\User; /* * -------------------------------------------------------------------- @@ -56,21 +55,6 @@ Events::on('pre_system', static function () { } }); -Events::on('login', static function (User $user): void { - helper('auth'); - // set interact_as_actor_id value - $userPodcasts = $user->podcasts; - if ($userPodcasts = $user->podcasts) { - set_interact_as_actor($userPodcasts[0]->actor_id); - } -}); - -Events::on('logout', static function (User $user): void { - helper('auth'); - // remove user's interact_as_actor session - remove_interact_as_actor(); -}); - /* * -------------------------------------------------------------------- * Fediverse events diff --git a/app/Config/Filters.php b/app/Config/Filters.php index 54fa52b3..fc706492 100644 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -15,8 +15,6 @@ use Modules\Auth\Filters\PermissionFilter; use Modules\Fediverse\Filters\AllowCorsFilter; use Modules\Fediverse\Filters\FediverseFilter; use Modules\PremiumPodcasts\Filters\PodcastUnlockFilter; -use Myth\Auth\Filters\LoginFilter; -use Myth\Auth\Filters\RoleFilter; class Filters extends BaseConfig { @@ -31,8 +29,6 @@ class Filters extends BaseConfig 'honeypot' => Honeypot::class, 'invalidchars' => InvalidChars::class, 'secureheaders' => SecureHeaders::class, - 'login' => LoginFilter::class, - 'role' => RoleFilter::class, 'permission' => PermissionFilter::class, 'fediverse' => FediverseFilter::class, 'allow-cors' => AllowCorsFilter::class, @@ -86,7 +82,7 @@ class Filters extends BaseConfig parent::__construct(); $this->filters = [ - 'login' => [ + 'session' => [ 'before' => [config('Admin')->gateway . '*', config('Analytics')->gateway . '*'], ], 'podcast-unlock' => [ diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 01530037..803c0625 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -214,7 +214,7 @@ $routes->get('/pages/(:slug)', 'PageController/$1', [ $routes->group('@(:podcastHandle)', static function ($routes): void { $routes->post('posts/new', 'PostController::attemptCreate/$1', [ 'as' => 'post-attempt-create', - 'filter' => 'permission:podcast-manage_publications', + 'filter' => 'permission:podcast#.manage-publications', ]); // Post $routes->group('posts/(:uuid)', static function ($routes): void { @@ -251,14 +251,14 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { // Actions $routes->post('action', 'PostController::attemptAction/$1/$2', [ 'as' => 'post-attempt-action', - 'filter' => 'permission:podcast-interact_as', + 'filter' => 'permission:podcast#.interact-as', ]); $routes->post( 'block-actor', 'PostController::attemptBlockActor/$1/$2', [ 'as' => 'post-attempt-block-actor', - 'filter' => 'permission:fediverse-block_actors', + 'filter' => 'permission:fediverse.manage-blocks', ], ); $routes->post( @@ -266,12 +266,12 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { 'PostController::attemptBlockDomain/$1/$2', [ 'as' => 'post-attempt-block-domain', - 'filter' => 'permission:fediverse-block_domains', + 'filter' => 'permission:fediverse.manage-blocks', ], ); $routes->post('delete', 'PostController::attemptDelete/$1/$2', [ 'as' => 'post-attempt-delete', - 'filter' => 'permission:podcast-manage_publications', + 'filter' => 'permission:podcast#.manage-publications', ]); $routes->get( 'remote/(:postAction)', diff --git a/app/Config/Security.php b/app/Config/Security.php index 0b986a41..29b51d2f 100644 --- a/app/Config/Security.php +++ b/app/Config/Security.php @@ -17,7 +17,7 @@ class Security extends BaseConfig * * @var 'cookie'|'session' */ - public string $csrfProtection = 'cookie'; + public string $csrfProtection = 'session'; /** * -------------------------------------------------------------------------- diff --git a/app/Config/Validation.php b/app/Config/Validation.php index ae8d9e69..d9157b1a 100644 --- a/app/Config/Validation.php +++ b/app/Config/Validation.php @@ -11,7 +11,6 @@ use CodeIgniter\Validation\CreditCardRules; use CodeIgniter\Validation\FileRules; use CodeIgniter\Validation\FormatRules; use CodeIgniter\Validation\Rules; -use Myth\Auth\Authentication\Passwords\ValidationRules as PasswordRules; class Validation extends BaseConfig { @@ -27,7 +26,6 @@ class Validation extends BaseConfig CreditCardRules::class, AppRules::class, AppFileRules::class, - PasswordRules::class, ]; /** diff --git a/app/Controllers/ActorController.php b/app/Controllers/ActorController.php index 9e2138e1..3ac8547c 100644 --- a/app/Controllers/ActorController.php +++ b/app/Controllers/ActorController.php @@ -20,12 +20,12 @@ class ActorController extends FediverseActorController /** * @var string[] */ - protected $helpers = ['auth', 'svg', 'components', 'misc', 'seo']; + protected $helpers = ['svg', 'components', 'misc', 'seo']; public function follow(): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { // @phpstan-ignore-next-line $this->registerPodcastWebpageHit($this->actor->podcast->id); } diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php index fd82bc08..fba12dd8 100644 --- a/app/Controllers/BaseController.php +++ b/app/Controllers/BaseController.php @@ -34,5 +34,7 @@ abstract class BaseController extends Controller parent::initController($request, $response, $logger); Theme::setTheme('app'); + + $this->helpers = array_merge($this->helpers, ['setting']); } } diff --git a/app/Controllers/CreditsController.php b/app/Controllers/CreditsController.php index 7bfe5b84..1d41afd2 100644 --- a/app/Controllers/CreditsController.php +++ b/app/Controllers/CreditsController.php @@ -23,7 +23,7 @@ class CreditsController extends BaseController $cacheName = implode( '_', - array_filter(['page', 'credits', $locale, can_user_interact() ? 'authenticated' : null]), + array_filter(['page', 'credits', $locale, auth()->loggedIn() ? 'authenticated' : null]), ); if (! ($found = cache($cacheName))) { diff --git a/app/Controllers/EpisodeCommentController.php b/app/Controllers/EpisodeCommentController.php index b0617336..9aaf2b5a 100644 --- a/app/Controllers/EpisodeCommentController.php +++ b/app/Controllers/EpisodeCommentController.php @@ -79,7 +79,7 @@ class EpisodeCommentController extends BaseController public function view(): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->podcast->id); } @@ -91,7 +91,8 @@ class EpisodeCommentController extends BaseController "comment#{$this->comment->id}", service('request') ->getLocale(), - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); @@ -105,7 +106,7 @@ class EpisodeCommentController extends BaseController ]; // if user is logged in then send to the authenticated activity view - if (can_user_interact()) { + if (auth()->loggedIn()) { helper('form'); return view('episode/comment', $data); } diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index 3d30b4e5..6b9c5cf0 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -66,7 +66,7 @@ class EpisodeController extends BaseController public function index(): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->episode->podcast_id); } @@ -79,7 +79,8 @@ class EpisodeController extends BaseController service('request') ->getLocale(), is_unlocked($this->podcast->handle) ? 'unlocked' : null, - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); @@ -94,7 +95,7 @@ class EpisodeController extends BaseController $this->podcast->id, ); - if (can_user_interact()) { + if (auth()->loggedIn()) { helper('form'); return view('episode/comments', $data); @@ -115,7 +116,7 @@ class EpisodeController extends BaseController public function activity(): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->episode->podcast_id); } @@ -129,7 +130,8 @@ class EpisodeController extends BaseController service('request') ->getLocale(), is_unlocked($this->podcast->handle) ? 'unlocked' : null, - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); @@ -144,7 +146,7 @@ class EpisodeController extends BaseController $this->podcast->id, ); - if (can_user_interact()) { + if (auth()->loggedIn()) { helper('form'); return view('episode/activity', $data); @@ -167,7 +169,7 @@ class EpisodeController extends BaseController header('Content-Security-Policy: frame-ancestors http://*:* https://*:*'); // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->episode->podcast_id); } diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php index 724a274a..b2f28b55 100644 --- a/app/Controllers/HomeController.php +++ b/app/Controllers/HomeController.php @@ -13,13 +13,20 @@ namespace App\Controllers; use App\Models\PodcastModel; use CodeIgniter\HTTP\RedirectResponse; use Config\Services; +use Exception; class HomeController extends BaseController { public function index(): RedirectResponse | string { - $db = db_connect(); - if ($db->getDatabase() === '' || ! $db->tableExists('podcasts')) { + $sortOptions = ['activity', 'created_desc', 'created_asc']; + $sortBy = in_array($this->request->getGet('sort'), $sortOptions, true) ? $this->request->getGet( + 'sort' + ) : 'activity'; + + try { + $allPodcasts = (new PodcastModel())->getAllPodcasts($sortBy); + } catch (Exception) { // Database connection has not been set or could not find the podcasts table // Redirecting to install page because it is likely that Castopod has not been installed yet. // NB: as base_url wouldn't have been defined here, redirect to install wizard manually @@ -27,13 +34,6 @@ class HomeController extends BaseController return redirect()->to(rtrim(host_url(), '/') . $route); } - $sortOptions = ['activity', 'created_desc', 'created_asc']; - $sortBy = in_array($this->request->getGet('sort'), $sortOptions, true) ? $this->request->getGet( - 'sort' - ) : 'activity'; - - $allPodcasts = (new PodcastModel())->getAllPodcasts($sortBy); - // check if there's only one podcast to redirect user to it if (count($allPodcasts) === 1) { return redirect()->route('podcast-activity', [$allPodcasts[0]->handle]); diff --git a/app/Controllers/MapController.php b/app/Controllers/MapController.php index 2a8c06b0..cf64312e 100644 --- a/app/Controllers/MapController.php +++ b/app/Controllers/MapController.php @@ -24,7 +24,8 @@ class MapController extends BaseController 'map', service('request') ->getLocale(), - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); diff --git a/app/Controllers/PageController.php b/app/Controllers/PageController.php index 7fc1424a..27f71e95 100644 --- a/app/Controllers/PageController.php +++ b/app/Controllers/PageController.php @@ -44,7 +44,8 @@ class PageController extends BaseController $this->page->slug, service('request') ->getLocale(), - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); diff --git a/app/Controllers/PodcastController.php b/app/Controllers/PodcastController.php index 4e2450f4..06377d4b 100644 --- a/app/Controllers/PodcastController.php +++ b/app/Controllers/PodcastController.php @@ -62,7 +62,7 @@ class PodcastController extends BaseController public function activity(): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->podcast->id); } @@ -75,7 +75,8 @@ class PodcastController extends BaseController service('request') ->getLocale(), is_unlocked($this->podcast->handle) ? 'unlocked' : null, - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); @@ -87,7 +88,7 @@ class PodcastController extends BaseController ]; // if user is logged in then send to the authenticated activity view - if (can_user_interact()) { + if (auth()->loggedIn()) { helper('form'); return view('podcast/activity', $data); @@ -111,7 +112,7 @@ class PodcastController extends BaseController public function about(): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->podcast->id); } @@ -124,7 +125,8 @@ class PodcastController extends BaseController service('request') ->getLocale(), is_unlocked($this->podcast->handle) ? 'unlocked' : null, - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); @@ -138,7 +140,7 @@ class PodcastController extends BaseController ]; // // if user is logged in then send to the authenticated activity view - if (can_user_interact()) { + if (auth()->loggedIn()) { helper('form'); return view('podcast/about', $data); @@ -162,7 +164,7 @@ class PodcastController extends BaseController public function episodes(): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->podcast->id); } @@ -191,7 +193,8 @@ class PodcastController extends BaseController service('request') ->getLocale(), is_unlocked($this->podcast->handle) ? 'unlocked' : null, - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); @@ -264,7 +267,7 @@ class PodcastController extends BaseController ), ]; - if (can_user_interact()) { + if (auth()->loggedIn()) { return view('podcast/episodes', $data); } diff --git a/app/Controllers/PostController.php b/app/Controllers/PostController.php index 3db4ab27..b2bf8e8d 100644 --- a/app/Controllers/PostController.php +++ b/app/Controllers/PostController.php @@ -70,7 +70,7 @@ class PostController extends FediversePostController public function view(): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->podcast->id); } @@ -85,7 +85,8 @@ class PostController extends FediversePostController "post#{$this->post->id}", service('request') ->getLocale(), - can_user_interact() ? 'authenticated' : null, + auth() + ->loggedIn() ? 'authenticated' : null, ]), ); @@ -97,7 +98,7 @@ class PostController extends FediversePostController ]; // if user is logged in then send to the authenticated activity view - if (can_user_interact()) { + if (auth()->loggedIn()) { helper('form'); return view('post/post', $data); } @@ -239,7 +240,7 @@ class PostController extends FediversePostController public function remoteAction(string $action): string { // Prevent analytics hit when authenticated - if (! can_user_interact()) { + if (! auth()->loggedIn()) { $this->registerPodcastWebpageHit($this->podcast->id); } diff --git a/app/Database/Migrations/2020-05-29-120000_add_media.php b/app/Database/Migrations/2021-05-29-120000_add_media.php similarity index 96% rename from app/Database/Migrations/2020-05-29-120000_add_media.php rename to app/Database/Migrations/2021-05-29-120000_add_media.php index 177827c5..732f51e2 100644 --- a/app/Database/Migrations/2020-05-29-120000_add_media.php +++ b/app/Database/Migrations/2021-05-29-120000_add_media.php @@ -55,10 +55,12 @@ class AddMedia extends Migration ], 'uploaded_by' => [ 'type' => 'INT', + 'constraint' => 11, 'unsigned' => true, ], 'updated_by' => [ 'type' => 'INT', + 'constraint' => 11, 'unsigned' => true, ], 'uploaded_at' => [ diff --git a/app/Database/Migrations/2020-05-29-152000_add_categories.php b/app/Database/Migrations/2021-05-29-152000_add_categories.php similarity index 100% rename from app/Database/Migrations/2020-05-29-152000_add_categories.php rename to app/Database/Migrations/2021-05-29-152000_add_categories.php diff --git a/app/Database/Migrations/2020-05-30-101000_add_languages.php b/app/Database/Migrations/2021-05-30-101000_add_languages.php similarity index 100% rename from app/Database/Migrations/2020-05-30-101000_add_languages.php rename to app/Database/Migrations/2021-05-30-101000_add_languages.php diff --git a/app/Database/Migrations/2020-05-30-101500_add_podcasts.php b/app/Database/Migrations/2021-05-30-101500_add_podcasts.php similarity index 100% rename from app/Database/Migrations/2020-05-30-101500_add_podcasts.php rename to app/Database/Migrations/2021-05-30-101500_add_podcasts.php diff --git a/app/Database/Migrations/2020-06-05-170000_add_episodes.php b/app/Database/Migrations/2021-06-05-170000_add_episodes.php similarity index 100% rename from app/Database/Migrations/2020-06-05-170000_add_episodes.php rename to app/Database/Migrations/2021-06-05-170000_add_episodes.php diff --git a/app/Database/Migrations/2020-06-05-190000_add_platforms.php b/app/Database/Migrations/2021-06-05-190000_add_platforms.php similarity index 100% rename from app/Database/Migrations/2020-06-05-190000_add_platforms.php rename to app/Database/Migrations/2021-06-05-190000_add_platforms.php diff --git a/app/Database/Migrations/2020-06-05-200000_add_podcasts_platforms.php b/app/Database/Migrations/2021-06-05-200000_add_podcasts_platforms.php similarity index 100% rename from app/Database/Migrations/2020-06-05-200000_add_podcasts_platforms.php rename to app/Database/Migrations/2021-06-05-200000_add_podcasts_platforms.php diff --git a/app/Database/Migrations/2020-08-17-150000_add_pages.php b/app/Database/Migrations/2021-08-17-150000_add_pages.php similarity index 100% rename from app/Database/Migrations/2020-08-17-150000_add_pages.php rename to app/Database/Migrations/2021-08-17-150000_add_pages.php diff --git a/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php b/app/Database/Migrations/2021-09-29-150000_add_podcasts_categories.php similarity index 100% rename from app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php rename to app/Database/Migrations/2021-09-29-150000_add_podcasts_categories.php diff --git a/app/Database/Migrations/2020-12-25-120000_add_persons.php b/app/Database/Migrations/2021-12-25-120000_add_persons.php similarity index 100% rename from app/Database/Migrations/2020-12-25-120000_add_persons.php rename to app/Database/Migrations/2021-12-25-120000_add_persons.php diff --git a/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php b/app/Database/Migrations/2021-12-25-130000_add_podcasts_persons.php similarity index 100% rename from app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php rename to app/Database/Migrations/2021-12-25-130000_add_podcasts_persons.php diff --git a/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php b/app/Database/Migrations/2021-12-25-140000_add_episodes_persons.php similarity index 100% rename from app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php rename to app/Database/Migrations/2021-12-25-140000_add_episodes_persons.php diff --git a/app/Database/Migrations/2020-12-25-150000_add_credits_view.php b/app/Database/Migrations/2021-12-25-150000_add_credits_view.php similarity index 100% rename from app/Database/Migrations/2020-12-25-150000_add_credits_view.php rename to app/Database/Migrations/2021-12-25-150000_add_credits_view.php diff --git a/app/Database/Migrations/2021-02-23-100000_add_episode_id_to_posts.php b/app/Database/Migrations/2022-02-23-100000_add_episode_id_to_posts.php similarity index 100% rename from app/Database/Migrations/2021-02-23-100000_add_episode_id_to_posts.php rename to app/Database/Migrations/2022-02-23-100000_add_episode_id_to_posts.php diff --git a/app/Database/Migrations/2021-03-09-113000_add_created_by_to_posts.php b/app/Database/Migrations/2022-03-09-113000_add_created_by_to_posts.php similarity index 100% rename from app/Database/Migrations/2021-03-09-113000_add_created_by_to_posts.php rename to app/Database/Migrations/2022-03-09-113000_add_created_by_to_posts.php diff --git a/app/Database/Seeds/AppSeeder.php b/app/Database/Seeds/AppSeeder.php index 4be06109..2c52a18d 100644 --- a/app/Database/Seeds/AppSeeder.php +++ b/app/Database/Seeds/AppSeeder.php @@ -18,7 +18,6 @@ class AppSeeder extends Seeder { public function run(): void { - $this->call('AuthSeeder'); $this->call('CategorySeeder'); $this->call('LanguageSeeder'); $this->call('PlatformSeeder'); diff --git a/app/Database/Seeds/AuthSeeder.php b/app/Database/Seeds/AuthSeeder.php deleted file mode 100644 index 32181d18..00000000 --- a/app/Database/Seeds/AuthSeeder.php +++ /dev/null @@ -1,328 +0,0 @@ -[] - */ - protected array $groups = [ - [ - 'name' => 'superadmin', - 'description' => - 'Somebody who has access to all the castopod instance features', - ], - [ - 'name' => 'podcast_admin', - 'description' => - 'Somebody who has access to all the features within a given podcast', - ], - ]; - - /** - * Build permissions array as a list of: - * - * ``` context => [ [action, description], [action, description], ... ] ``` - * - * @var array[]> - */ - protected array $permissions = [ - 'settings' => [ - [ - 'name' => 'view', - 'description' => 'View settings options', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'manage', - 'description' => 'Update general settings', - 'has_permission' => ['superadmin'], - ], - ], - 'users' => [ - [ - 'name' => 'create', - 'description' => 'Create a user', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'list', - 'description' => 'List all users', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'view', - 'description' => 'View any user info', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'manage_authorizations', - 'description' => 'Add or remove roles/permissions to a user', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'manage_bans', - 'description' => 'Ban / unban a user', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'force_pass_reset', - 'description' => - 'Force a user to update his password upon next login', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'delete', - 'description' => - 'Delete user without removing him from database', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'delete_permanently', - 'description' => - 'Delete all occurrences of a user from the database', - 'has_permission' => ['superadmin'], - ], - ], - 'pages' => [ - [ - 'name' => 'manage', - 'description' => 'List / create / edit / delete pages', - 'has_permission' => ['superadmin'], - ], - ], - 'podcasts' => [ - [ - 'name' => 'create', - 'description' => 'Add a new podcast', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'import', - 'description' => 'Import a new podcast from an external feed', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'list', - 'description' => 'List all podcasts and their episodes', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'view', - 'description' => 'View any podcast and their contributors list', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'delete', - 'description' => 'Delete any podcast from the database', - 'has_permission' => ['superadmin'], - ], - ], - 'episodes' => [ - [ - 'name' => 'list', - 'description' => 'List all episodes of any podcast', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'view', - 'description' => 'View any episode of any podcast', - 'has_permission' => ['superadmin'], - ], - ], - 'podcast' => [ - [ - 'name' => 'view', - 'description' => 'View a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'edit', - 'description' => 'Edit a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'manage_subscriptions', - 'description' => - 'Add / edit / remove podcast subscriptions', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'manage_contributors', - 'description' => - 'Add / remove contributors to a podcast and edit their roles', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'manage_platforms', - 'description' => 'Set / remove platform links of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'manage_publications', - 'description' => - 'Publish a podcast and publish / unpublish its episodes & posts', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'interact_as', - 'description' => - 'Interact as the podcast to favourite / share or reply to posts.', - 'has_permission' => ['podcast_admin'], - ], - ], - 'podcast_episodes' => [ - [ - 'name' => 'list', - 'description' => 'List all episodes of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'view', - 'description' => 'View any episode of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'create', - 'description' => 'Add new episodes for a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'edit', - 'description' => 'Edit an episode of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'delete', - 'description' => - 'Delete all occurrences of an episode of a podcast from the database', - 'has_permission' => ['podcast_admin'], - ], - ], - 'person' => [ - [ - 'name' => 'create', - 'description' => 'Add a new person', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'list', - 'description' => 'List all persons', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'view', - 'description' => 'View any person', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'edit', - 'description' => 'Edit a person', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'delete', - 'description' => - 'Delete permanently any person from the database', - 'has_permission' => ['superadmin'], - ], - ], - 'fediverse' => [ - [ - 'name' => 'block_actors', - 'description' => - 'Block fediverse actors from interacting with the instance.', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'block_domains', - 'description' => - 'Block fediverse domains from interacting with the instance.', - 'has_permission' => ['superadmin'], - ], - ], - ]; - - public function run(): void - { - $groupId = 0; - $dataGroups = []; - foreach ($this->groups as $group) { - $dataGroups[] = [ - 'id' => ++$groupId, - 'name' => $group['name'], - 'description' => $group['description'], - ]; - } - - // Map permissions to a format the `auth_permissions` table expects - $dataPermissions = []; - $dataGroupsPermissions = []; - $permissionId = 0; - foreach ($this->permissions as $context => $actions) { - foreach ($actions as $action) { - $dataPermissions[] = [ - 'id' => ++$permissionId, - 'name' => $context . '-' . $action['name'], - 'description' => $action['description'], - ]; - - foreach ($action['has_permission'] as $role) { - // link permission to specified groups - $dataGroupsPermissions[] = [ - 'group_id' => $this->getGroupIdByName($role, $dataGroups), - 'permission_id' => $permissionId, - ]; - } - } - } - - if ($this->db->table('auth_groups')->countAll() < count($dataPermissions)) { - $this->db - ->table('auth_permissions') - ->ignore(true) - ->insertBatch($dataPermissions); - } - - if ($this->db->table('auth_groups')->countAll() < count($dataGroups)) { - $this->db - ->table('auth_groups') - ->ignore(true) - ->insertBatch($dataGroups); - } - - if ($this->db->table('auth_groups_permissions')->countAll() < count($dataGroupsPermissions)) { - $this->db - ->table('auth_groups_permissions') - ->ignore(true) - ->insertBatch($dataGroupsPermissions); - } - } - - /** - * @param array[] $dataGroups - */ - public static function getGroupIdByName(string $name, array $dataGroups): ?int - { - foreach ($dataGroups as $group) { - if ($group['name'] === $name) { - return $group['id']; - } - } - - return null; - } -} diff --git a/app/Database/Seeds/TestSeeder.php b/app/Database/Seeds/TestSeeder.php index e37198db..57a52219 100644 --- a/app/Database/Seeds/TestSeeder.php +++ b/app/Database/Seeds/TestSeeder.php @@ -18,24 +18,32 @@ class TestSeeder extends Seeder { public function run(): void { + helper('setting'); + /** - * Inserts an active user with the following credentials: username: admin password: AGUehL3P + * Inserts an owner with the following credentials: admin: `admin@example.com` password: `AGUehL3P` */ $this->db->table('users') ->insert([ 'id' => 1, 'username' => 'admin', - 'email' => 'admin@example.com', - 'password_hash' => - '$2y$10$TXJEHX/djW8jtzgpDVf7dOOCGo5rv1uqtAYWdwwwkttQcDkAeB2.6', - 'active' => 1, + 'is_owner' => 1, + ]); + + $this->db->table('auth_identities') + ->insert([ + 'id' => 1, + 'user_id' => 1, + 'type' => 'email_password', + 'secret' => 'admin@example.com', + 'secret2' => '$2y$10$TXJEHX/djW8jtzgpDVf7dOOCGo5rv1uqtAYWdwwwkttQcDkAeB2.6', ]); $this->db ->table('auth_groups_users') ->insert([ - 'group_id' => 1, 'user_id' => 1, + 'group' => setting('AuthGroups.mostPowerfulGroup'), ]); } } diff --git a/app/Entities/Clip/BaseClip.php b/app/Entities/Clip/BaseClip.php index efe88b4e..51ccc0a5 100644 --- a/app/Entities/Clip/BaseClip.php +++ b/app/Entities/Clip/BaseClip.php @@ -17,11 +17,11 @@ use App\Entities\Podcast; use App\Models\EpisodeModel; use App\Models\MediaModel; use App\Models\PodcastModel; -use App\Models\UserModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\I18n\Time; -use Modules\Auth\Entities\User; +use CodeIgniter\Shield\Entities\User; +use Modules\Auth\Models\UserModel; /** * @property int $id diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index 22e5d3b1..efcdb88d 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -18,18 +18,18 @@ use App\Models\EpisodeModel; use App\Models\MediaModel; use App\Models\PersonModel; use App\Models\PlatformModel; -use App\Models\UserModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; use CodeIgniter\I18n\Time; +use CodeIgniter\Shield\Entities\User; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\Autolink\AutolinkExtension; use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; use League\CommonMark\Extension\DisallowedRawHtml\DisallowedRawHtmlExtension; use League\CommonMark\Extension\SmartPunct\SmartPunctExtension; use League\CommonMark\MarkdownConverter; -use Modules\Auth\Entities\User; +use Modules\Auth\Models\UserModel; use Modules\PremiumPodcasts\Entities\Subscription; use Modules\PremiumPodcasts\Models\SubscriptionModel; use RuntimeException; @@ -100,6 +100,8 @@ class Podcast extends Entity { protected string $link; + protected string $at_handle; + protected ?Actor $actor = null; protected ?Image $cover = null; @@ -208,6 +210,11 @@ class Podcast extends Entity 'updated_by' => 'integer', ]; + public function getAtHandle(): string + { + return '@' . $this->handle; + } + /** * @noRector ReturnTypeDeclarationRector */ diff --git a/app/Helpers/auth_helper.php b/app/Helpers/auth_helper.php deleted file mode 100644 index 3c1bc815..00000000 --- a/app/Helpers/auth_helper.php +++ /dev/null @@ -1,89 +0,0 @@ -check(); - return $authenticate->user(); - } -} - -if (! function_exists('set_interact_as_actor')) { - /** - * Sets the actor id of which the user is acting as - */ - function set_interact_as_actor(int $actorId): void - { - $authenticate = service('authentication'); - $authenticate->check(); - - $session = session(); - $session->set('interact_as_actor_id', $actorId); - } -} - -if (! function_exists('remove_interact_as_actor')) { - /** - * Removes the actor id of which the user is acting as - */ - function remove_interact_as_actor(): void - { - $session = session(); - $session->remove('interact_as_actor_id'); - } -} - -if (! function_exists('interact_as_actor_id')) { - /** - * Sets the podcast id of which the user is acting as - */ - function interact_as_actor_id(): int - { - $authenticate = service('authentication'); - $authenticate->check(); - - $session = session(); - return $session->get('interact_as_actor_id'); - } -} - -if (! function_exists('interact_as_actor')) { - /** - * Get the actor the user is currently interacting as - */ - function interact_as_actor(): Actor | false - { - $authenticate = service('authentication'); - $authenticate->check(); - - $session = session(); - if ($session->has('interact_as_actor_id')) { - return model(ActorModel::class, false)->getActorById($session->get('interact_as_actor_id')); - } - - return false; - } -} - -if (! function_exists('can_user_interact')) { - function can_user_interact(): bool - { - return (bool) interact_as_actor(); - } -} diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 78d52672..300ffdf3 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -11,7 +11,6 @@ declare(strict_types=1); namespace App\Models; use App\Entities\Podcast; -use CodeIgniter\Database\Query; use CodeIgniter\HTTP\URI; use CodeIgniter\Model; use phpseclib\Crypt\RSA; @@ -205,15 +204,14 @@ class PodcastModel extends Model /** * Gets all the podcasts a given user is contributing to * + * @param string[] $userPodcastIds * @return Podcast[] podcasts */ - public function getUserPodcasts(int $userId): array + public function getUserPodcasts(int $userId, array $userPodcastIds): array { $cacheName = "user{$userId}_podcasts"; if (! ($found = cache($cacheName))) { - $found = $this->select('podcasts.*') - ->join('podcasts_users', 'podcasts_users.podcast_id = podcasts.id') - ->where('podcasts_users.user_id', $userId) + $found = $userPodcastIds === [] ? [] : $this->whereIn('id', $userPodcastIds) ->findAll(); cache() @@ -223,76 +221,18 @@ class PodcastModel extends Model return $found; } - public function addPodcastContributor(int $userId, int $podcastId, int $groupId): Query | bool + public function getContributorGroup(int $userId, int $podcastId): int | false { - cache()->delete("podcast#{$podcastId}_contributors"); - - $data = [ - 'user_id' => $userId, - 'podcast_id' => $podcastId, - 'group_id' => $groupId, - ]; - - return $this->db->table('podcasts_users') - ->insert($data); - } - - public function updatePodcastContributor(int $userId, int $podcastId, int $groupId): bool - { - cache()->delete("podcast#{$podcastId}_contributors"); - - return $this->db - ->table('podcasts_users') - ->where([ - 'user_id' => $userId, - 'podcast_id' => $podcastId, - ]) - ->update([ - 'group_id' => $groupId, - ]); - } - - public function removePodcastContributor(int $userId, int $podcastId): string | bool - { - cache()->delete("podcast#{$podcastId}_contributors"); - - return $this->db - ->table('podcasts_users') - ->where([ - 'user_id' => $userId, - 'podcast_id' => $podcastId, - ]) - ->delete(); - } - - public function getContributorGroupId(int $userId, int | string $podcastId): int | false - { - if (! is_numeric($podcastId)) { - // identifier is the podcast name, request must be a join - $userPodcast = $this->db - ->table('podcasts_users') - ->select('group_id, user_id') - ->join('podcasts', 'podcasts.id = podcasts_users.podcast_id') - ->where([ - 'user_id' => $userId, - 'handle' => $podcastId, - ]) - ->get() - ->getResultObject(); - } else { - $userPodcast = $this->db - ->table('podcasts_users') - ->select('group_id') - ->where([ - 'user_id' => $userId, - 'podcast_id' => $podcastId, - ]) - ->get() - ->getResultObject(); - } + $userPodcast = $this->db + ->table('auth_groups_users') + ->select('user_id, group') + ->where('user_id', $userId) + ->like('group', "podcast#{$podcastId}") + ->get() + ->getResultObject(); return $userPodcast !== [] - ? (int) $userPodcast[0]->group_id + ? (int) $userPodcast[0]->group : false; } diff --git a/app/Models/UserModel.php b/app/Models/UserModel.php deleted file mode 100644 index 13685b89..00000000 --- a/app/Models/UserModel.php +++ /dev/null @@ -1,55 +0,0 @@ -select('users.*, auth_groups.name as podcast_role') - ->join('podcasts_users', 'podcasts_users.user_id = users.id') - ->join('auth_groups', 'auth_groups.id = podcasts_users.group_id') - ->where('podcasts_users.podcast_id', $podcastId) - ->findAll(); - - cache() - ->save($cacheName, $found, DECADE); - } - - return $found; - } - - public function getPodcastContributor(int $userId, int $podcastId): ?User - { - // @phpstan-ignore-next-line - return $this->select('users.*, podcasts_users.podcast_id as podcast_id, auth_groups.name as podcast_role') - ->join('podcasts_users', 'podcasts_users.user_id = users.id') - ->join('auth_groups', 'auth_groups.id = podcasts_users.group_id') - ->where([ - 'users.id' => $userId, - 'podcast_id' => $podcastId, - ]) - ->first(); - } -} diff --git a/app/Resources/icons/shield-user.svg b/app/Resources/icons/shield-user.svg new file mode 100644 index 00000000..37cf8289 --- /dev/null +++ b/app/Resources/icons/shield-user.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/Views/errors/html/error_403.php b/app/Views/errors/html/error_403.php new file mode 100644 index 00000000..0a8d31b4 --- /dev/null +++ b/app/Views/errors/html/error_403.php @@ -0,0 +1,29 @@ + + + + + + + + + 403 Forbidden + ' /> + asset('styles/index.css', 'css') ?> + + + + +

403 - Forbidden

+ +

+ + + + You do not have sufficient permissions to access that page. + +

+ + + + diff --git a/app/Views/errors/html/error_404.php b/app/Views/errors/html/error_404.php index ed288ac1..bbf30689 100644 --- a/app/Views/errors/html/error_404.php +++ b/app/Views/errors/html/error_404.php @@ -14,7 +14,7 @@ -

404 - File Not Found

+

404 - File Not Found

diff --git a/app/Views/errors/html/production.php b/app/Views/errors/html/production.php index 1ddf8306..0b6bc13b 100644 --- a/app/Views/errors/html/production.php +++ b/app/Views/errors/html/production.php @@ -10,14 +10,14 @@ Whoops! ' /> asset('styles/index.css', 'css') ?> - isLoggedIn()): ?> + loggedIn()): ?> asset('js/error.ts', 'js') ?> - isLoggedIn()): ?> + loggedIn()): ?>

diff --git a/composer.json b/composer.json index 318e1240..1519add3 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,6 @@ "james-heinrich/getid3": "^2.0.x-dev", "whichbrowser/parser": "^v2.1.7", "geoip2/geoip2": "v2.13.0", - "myth/auth": "dev-develop", "league/commonmark": "^2.3.5", "vlucas/phpdotenv": "^v5.4.1", "league/html-to-markdown": "^v5.1.0", @@ -23,7 +22,8 @@ "essence/essence": "^3.5.4", "codeigniter4/settings": "^v2.1.0", "chrisjean/php-ico": "^1.0.4", - "melbahja/seo": "^v2.1.1" + "melbahja/seo": "^v2.1.1", + "codeigniter4/shield": "dev-develop" }, "require-dev": { "mikey179/vfsstream": "^v1.6.11", diff --git a/composer.lock b/composer.lock index 0eaf6f04..253d0e08 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "caa3b9ff10584fe03c7be1176713b427", + "content-hash": "51482dcb24c719550a1f0aa7e7580dfc", "packages": [ { "name": "adaures/ipcat-php", @@ -286,6 +286,70 @@ }, "time": "2021-11-22T17:30:18+00:00" }, + { + "name": "codeigniter4/shield", + "version": "dev-develop", + "source": { + "type": "git", + "url": "https://github.com/codeigniter4/shield.git", + "reference": "f4cdfb672b600a032a6f0bfc0b7735411bee0cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/codeigniter4/shield/zipball/f4cdfb672b600a032a6f0bfc0b7735411bee0cae", + "reference": "f4cdfb672b600a032a6f0bfc0b7735411bee0cae", + "shasum": "" + }, + "require": { + "codeigniter4/settings": "^2.0", + "php": "^7.4.3 || ^8.0" + }, + "provide": { + "codeigniter4/authentication-implementation": "1.0" + }, + "require-dev": { + "codeigniter4/devkit": "^1.0", + "codeigniter4/framework": "^4.2.3", + "mockery/mockery": "^1.0" + }, + "default-branch": true, + "type": "library", + "autoload": { + "files": [ + "src/Helpers/auth_helper.php", + "src/Helpers/email_helper.php" + ], + "psr-4": { + "CodeIgniter\\Shield\\": "src" + }, + "exclude-from-classmap": ["**/Database/Migrations/**"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Lonnie Ezell", + "email": "lonnieje@gmail.com", + "role": "Developer" + } + ], + "description": "Authentication and Authorization for CodeIgniter 4", + "homepage": "https://github.com/codeigniter4/shield", + "keywords": [ + "Authentication", + "authorization", + "codeigniter", + "codeigniter4" + ], + "support": { + "docs": "https://github.com/codeigniter4/shield/blob/develop/docs/index.md", + "forum": "https://github.com/codeigniter4/shield/discussions", + "issues": "https://github.com/codeigniter4/shield/issues", + "slack": "https://codeigniterchat.slack.com", + "source": "https://github.com/codeigniter4/shield" + }, + "time": "2022-10-05T10:11:44+00:00" + }, { "name": "composer/ca-bundle", "version": "1.3.4", @@ -1367,73 +1431,6 @@ }, "time": "2021-05-10T16:28:01+00:00" }, - { - "name": "myth/auth", - "version": "dev-develop", - "source": { - "type": "git", - "url": "https://github.com/lonnieezell/myth-auth.git", - "reference": "cc94231f5284e9578967aba4796f018809669c84" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lonnieezell/myth-auth/zipball/cc94231f5284e9578967aba4796f018809669c84", - "reference": "cc94231f5284e9578967aba4796f018809669c84", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "provide": { - "codeigniter4/authentication-implementation": "1.0" - }, - "require-dev": { - "codeigniter4/codeigniter4-standard": "^1.0", - "codeigniter4/devkit": "^1.0", - "codeigniter4/framework": "^4.1", - "mockery/mockery": "^1.0" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "Myth\\Auth\\": "src" - }, - "exclude-from-classmap": ["**/Database/Migrations/**"] - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Lonnie Ezell", - "email": "lonnieje@gmail.com", - "homepage": "http://newmythmedia.com", - "role": "Developer" - } - ], - "description": "Flexible authentication/authorization system for CodeIgniter 4.", - "homepage": "https://github.com/lonnieezell/myth-auth", - "keywords": ["Authentication", "authorization", "codeigniter"], - "support": { - "issues": "https://github.com/lonnieezell/myth-auth/issues", - "source": "https://github.com/lonnieezell/myth-auth/tree/develop" - }, - "funding": [ - { - "url": "https://github.com/lonnieezell", - "type": "github" - }, - { - "url": "https://github.com/mgatner", - "type": "github" - }, - { - "url": "https://www.patreon.com/lonnieezell", - "type": "patreon" - } - ], - "time": "2022-08-01T17:23:52+00:00" - }, { "name": "nette/schema", "version": "v1.2.2", @@ -6684,8 +6681,8 @@ "minimum-stability": "stable", "stability-flags": { "james-heinrich/getid3": 20, - "myth/auth": 20, - "michalsn/codeigniter4-uuid": 20 + "michalsn/codeigniter4-uuid": 20, + "codeigniter4/shield": 20 }, "prefer-stable": true, "prefer-lowest": false, diff --git a/docs/.gitlab-ci.yml b/docs/.gitlab-ci.yml index d7f739a2..f9c992b7 100644 --- a/docs/.gitlab-ci.yml +++ b/docs/.gitlab-ci.yml @@ -22,7 +22,6 @@ build: script: - npm run build except: - - develop - main - beta - alpha @@ -40,7 +39,6 @@ build-production: - docs/.vitepress/dist expire_in: 30 mins only: - - develop - main - beta - alpha @@ -72,7 +70,6 @@ deploy: - rsync -avzuh -e "ssh -p $SSH_PORT" $SOURCE_FOLDER $USER@$HOST:$TEMP_DIRECTORY --progress - ssh $USER@$HOST -p $SSH_PORT "rsync -rtv $TEMP_DIRECTORY $DIRECTORY" only: - - develop - main - beta - alpha diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index c76d8335..f74cf504 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -179,6 +179,7 @@ function getGuideSidebarEn() { }, { text: "Security", link: "/getting-started/security" }, { text: "Update", link: "/getting-started/update" }, + { text: "Auth", link: "/getting-started/auth" }, ], }, { @@ -207,6 +208,7 @@ function getGuideSidebarFr() { }, { text: "Sécurité", link: "/fr/getting-started/security" }, { text: "Mise à jour", link: "/fr/getting-started/update" }, + { text: "Authentification", link: "/fr/getting-started/auth" }, ], }, { @@ -235,6 +237,7 @@ function getGuideSidebarPtBR() { }, { text: "Segurança", link: "/pt-BR/getting-started/security" }, { text: "Atualizar", link: "/pt-BR/getting-started/update" }, + { text: "Autenticação", link: "/pt-BR/getting-started/auth" }, ], }, { @@ -263,6 +266,7 @@ function getGuideSidebarNnNO() { }, { text: "Sikkerhet", link: "/nn-NO/getting-started/security" }, { text: "Oppdaterer", link: "/nn-NO/getting-started/update" }, + { text: "Autentisering", link: "/pt-BR/getting-started/auth" }, ], }, { diff --git a/docs/src/getting-started/auth.md b/docs/src/getting-started/auth.md new file mode 100644 index 00000000..00eeb819 --- /dev/null +++ b/docs/src/getting-started/auth.md @@ -0,0 +1,86 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php index ad767a0d..7bf22166 100644 --- a/modules/Admin/Config/Routes.php +++ b/modules/Admin/Config/Routes.php @@ -25,60 +25,60 @@ $routes->group( $routes->group('settings', static function ($routes): void { $routes->get('/', 'SettingsController', [ 'as' => 'settings-general', - 'filter' => 'permission:settings-manage', + 'filter' => 'permission:admin.settings', ]); $routes->post('instance', 'SettingsController::attemptInstanceEdit', [ 'as' => 'settings-instance', - 'filter' => 'permission:settings-manage', + 'filter' => 'permission:admin.settings', ]); $routes->get('instance-delete-icon', 'SettingsController::deleteIcon', [ 'as' => 'settings-instance-delete-icon', - 'filter' => 'permission:settings-manage', + 'filter' => 'permission:admin.settings', ]); $routes->post('instance-images-regenerate', 'SettingsController::regenerateImages', [ 'as' => 'settings-images-regenerate', - 'filter' => 'permission:settings-manage', + 'filter' => 'permission:admin.settings', ]); $routes->post('instance-housekeeping-run', 'SettingsController::runHousekeeping', [ 'as' => 'settings-housekeeping-run', - 'filter' => 'permission:settings-manage', + 'filter' => 'permission:admin.settings', ]); $routes->get('theme', 'SettingsController::theme', [ 'as' => 'settings-theme', - 'filter' => 'permission:settings-manage', + 'filter' => 'permission:admin.settings', ]); $routes->post('theme', 'SettingsController::attemptSetInstanceTheme', [ 'as' => 'settings-theme', - 'filter' => 'permission:settings-manage', + 'filter' => 'permission:admin.settings', ]); }); $routes->group('persons', static function ($routes): void { $routes->get('/', 'PersonController', [ 'as' => 'person-list', - 'filter' => 'permission:person-list', + 'filter' => 'permission:persons.manage', ]); $routes->get('new', 'PersonController::create', [ 'as' => 'person-create', - 'filter' => 'permission:person-create', + 'filter' => 'permission:persons.manage', ]); $routes->post('new', 'PersonController::attemptCreate', [ - 'filter' => 'permission:person-create', + 'filter' => 'permission:persons.manage', ]); $routes->group('(:num)', static function ($routes): void { $routes->get('/', 'PersonController::view/$1', [ 'as' => 'person-view', - 'filter' => 'permission:person-view', + 'filter' => 'permission:persons.manage', ]); $routes->get('edit', 'PersonController::edit/$1', [ 'as' => 'person-edit', - 'filter' => 'permission:person-edit', + 'filter' => 'permission:persons.manage', ]); $routes->post('edit', 'PersonController::attemptEdit/$1', [ - 'filter' => 'permission:person-edit', + 'filter' => 'permission:persons.manage', ]); $routes->add('delete', 'PersonController::delete/$1', [ 'as' => 'person-delete', - 'filter' => 'permission:person-delete', + 'filter' => 'permission:persons.manage', ]); }); }); @@ -89,31 +89,31 @@ $routes->group( ]); $routes->get('new', 'PodcastController::create', [ 'as' => 'podcast-create', - 'filter' => 'permission:podcasts-create', + 'filter' => 'permission:podcasts.create', ]); $routes->post('new', 'PodcastController::attemptCreate', [ - 'filter' => 'permission:podcasts-create', + 'filter' => 'permission:podcasts.create', ]); $routes->get('import', 'PodcastImportController', [ 'as' => 'podcast-import', - 'filter' => 'permission:podcasts-import', + 'filter' => 'permission:podcasts.import', ]); $routes->post('import', 'PodcastImportController::attemptImport', [ - 'filter' => 'permission:podcasts-import', + 'filter' => 'permission:podcasts.import', ]); // Podcast // Use ids in admin area to help permission and group lookups $routes->group('(:num)', static function ($routes): void { $routes->get('/', 'PodcastController::view/$1', [ 'as' => 'podcast-view', - 'filter' => 'permission:podcasts-view,podcast-view', + 'filter' => 'permission:podcast#.view', ]); $routes->get('edit', 'PodcastController::edit/$1', [ 'as' => 'podcast-edit', - 'filter' => 'permission:podcast-edit', + 'filter' => 'permission:podcast#.edit', ]); $routes->post('edit', 'PodcastController::attemptEdit/$1', [ - 'filter' => 'permission:podcast-edit', + 'filter' => 'permission:podcast#.edit', ]); $routes->get( 'publish', @@ -121,7 +121,7 @@ $routes->group( [ 'as' => 'podcast-publish', 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.manage-publications', ], ); $routes->post( @@ -129,7 +129,7 @@ $routes->group( 'PodcastController::attemptPublish/$1', [ 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.manage-publications', ], ); $routes->get( @@ -138,7 +138,7 @@ $routes->group( [ 'as' => 'podcast-publish_edit', 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.manage-publications', ], ); $routes->post( @@ -146,7 +146,7 @@ $routes->group( 'PodcastController::attemptPublishEdit/$1', [ 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.manage-publications', ], ); $routes->get( @@ -155,34 +155,34 @@ $routes->group( [ 'as' => 'podcast-publish-cancel', 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.manage-publications', ], ); $routes->get('edit/delete-banner', 'PodcastController::deleteBanner/$1', [ 'as' => 'podcast-banner-delete', - 'filter' => 'permission:podcast-edit', + 'filter' => 'permission:podcast#.edit', ]); $routes->get('delete', 'PodcastController::delete/$1', [ 'as' => 'podcast-delete', - 'filter' => 'permission:podcasts-delete', + 'filter' => 'permission:podcast#.delete', ]); $routes->post('delete', 'PodcastController::attemptDelete/$1', [ - 'filter' => 'permission:podcasts-delete', + 'filter' => 'permission:podcast#.delete', ]); $routes->get('update', 'PodcastImportController::updateImport/$1', [ 'as' => 'podcast-update-feed', - 'filter' => 'permission:podcasts-import', + 'filter' => 'permission:podcast#.manage-import', ]); $routes->group('persons', static function ($routes): void { $routes->get('/', 'PodcastPersonController/$1', [ 'as' => 'podcast-persons-manage', - 'filter' => 'permission:podcast-edit', + 'filter' => 'permission:podcast#.manage-persons', ]); $routes->post( '/', 'PodcastPersonController::attemptAdd/$1', [ - 'filter' => 'permission:podcast-edit', + 'filter' => 'permission:podcast#.manage-persons', ], ); $routes->get( @@ -190,21 +190,21 @@ $routes->group( 'PodcastPersonController::remove/$1/$2', [ 'as' => 'podcast-person-remove', - 'filter' => 'permission:podcast-edit', + 'filter' => 'permission:podcast#.manage-persons', ], ); }); $routes->group('analytics', static function ($routes): void { $routes->get('/', 'PodcastController::viewAnalytics/$1', [ 'as' => 'podcast-analytics', - 'filter' => 'permission:podcasts-view,podcast-view', + 'filter' => 'permission:podcast#.view', ]); $routes->get( 'webpages', 'PodcastController::viewAnalyticsWebpages/$1', [ 'as' => 'podcast-analytics-webpages', - 'filter' => 'permission:podcasts-view,podcast-view', + 'filter' => 'permission:podcast#.view', ], ); $routes->get( @@ -212,7 +212,7 @@ $routes->group( 'PodcastController::viewAnalyticsLocations/$1', [ 'as' => 'podcast-analytics-locations', - 'filter' => 'permission:podcasts-view,podcast-view', + 'filter' => 'permission:podcast#.view', ], ); $routes->get( @@ -220,7 +220,7 @@ $routes->group( 'PodcastController::viewAnalyticsUniqueListeners/$1', [ 'as' => 'podcast-analytics-unique-listeners', - 'filter' => 'permission:podcasts-view,podcast-view', + 'filter' => 'permission:podcast#.view', ], ); $routes->get( @@ -228,7 +228,7 @@ $routes->group( 'PodcastController::viewAnalyticsListeningTime/$1', [ 'as' => 'podcast-analytics-listening-time', - 'filter' => 'permission:podcasts-view,podcast-view', + 'filter' => 'permission:podcast#.view', ], ); $routes->get( @@ -236,7 +236,7 @@ $routes->group( 'PodcastController::viewAnalyticsTimePeriods/$1', [ 'as' => 'podcast-analytics-time-periods', - 'filter' => 'permission:podcasts-view,podcast-view', + 'filter' => 'permission:podcast#.view', ], ); $routes->get( @@ -244,7 +244,7 @@ $routes->group( 'PodcastController::viewAnalyticsPlayers/$1', [ 'as' => 'podcast-analytics-players', - 'filter' => 'permission:podcasts-view,podcast-view', + 'filter' => 'permission:podcast#.view', ], ); }); @@ -253,17 +253,17 @@ $routes->group( $routes->get('/', 'EpisodeController::list/$1', [ 'as' => 'episode-list', 'filter' => - 'permission:episodes-list,podcast_episodes-list', + 'permission:podcast#.episodes.view', ]); $routes->get('new', 'EpisodeController::create/$1', [ 'as' => 'episode-create', - 'filter' => 'permission:podcast_episodes-create', + 'filter' => 'permission:podcast#.episodes.create', ]); $routes->post( 'new', 'EpisodeController::attemptCreate/$1', [ - 'filter' => 'permission:podcast_episodes-create', + 'filter' => 'permission:podcast#.episodes.create', ], ); // Episode @@ -271,17 +271,17 @@ $routes->group( $routes->get('/', 'EpisodeController::view/$1/$2', [ 'as' => 'episode-view', 'filter' => - 'permission:episodes-view,podcast_episodes-view', + 'permission:podcast#.episodes.view', ]); $routes->get('edit', 'EpisodeController::edit/$1/$2', [ 'as' => 'episode-edit', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.edit', ]); $routes->post( 'edit', 'EpisodeController::attemptEdit/$1/$2', [ - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.edit', ], ); $routes->get( @@ -290,7 +290,7 @@ $routes->group( [ 'as' => 'episode-publish', 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->post( @@ -298,7 +298,7 @@ $routes->group( 'EpisodeController::attemptPublish/$1/$2', [ 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->get( @@ -307,7 +307,7 @@ $routes->group( [ 'as' => 'episode-publish_edit', 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->post( @@ -315,7 +315,7 @@ $routes->group( 'EpisodeController::attemptPublishEdit/$1/$2', [ 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->get( @@ -324,7 +324,7 @@ $routes->group( [ 'as' => 'episode-publish-cancel', 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->get( @@ -350,7 +350,7 @@ $routes->group( [ 'as' => 'episode-unpublish', 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->post( @@ -358,7 +358,7 @@ $routes->group( 'EpisodeController::attemptUnpublish/$1/$2', [ 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->get( @@ -367,7 +367,7 @@ $routes->group( [ 'as' => 'episode-delete', 'filter' => - 'permission:podcast_episodes-delete', + 'permission:podcast#.episodes.delete', ], ); $routes->post( @@ -375,7 +375,7 @@ $routes->group( 'EpisodeController::attemptDelete/$1/$2', [ 'filter' => - 'permission:podcast_episodes-delete', + 'permission:podcast#.episodes.delete', ], ); $routes->get( @@ -383,7 +383,7 @@ $routes->group( 'EpisodeController::transcriptDelete/$1/$2', [ 'as' => 'transcript-delete', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.edit', ], ); $routes->get( @@ -391,7 +391,7 @@ $routes->group( 'EpisodeController::chaptersDelete/$1/$2', [ 'as' => 'chapters-delete', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.edit', ], ); $routes->get( @@ -399,7 +399,7 @@ $routes->group( 'SoundbiteController::list/$1/$2', [ 'as' => 'soundbites-list', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->get( @@ -407,7 +407,7 @@ $routes->group( 'SoundbiteController::create/$1/$2', [ 'as' => 'soundbites-create', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->post( @@ -415,7 +415,7 @@ $routes->group( 'SoundbiteController::attemptCreate/$1/$2', [ 'as' => 'soundbites-create', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->get( @@ -423,7 +423,7 @@ $routes->group( 'SoundbiteController::delete/$1/$2/$3', [ 'as' => 'soundbites-delete', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->get( @@ -431,7 +431,7 @@ $routes->group( 'VideoClipsController::list/$1/$2', [ 'as' => 'video-clips-list', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->get( @@ -439,7 +439,7 @@ $routes->group( 'VideoClipsController::create/$1/$2', [ 'as' => 'video-clips-create', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->post( @@ -447,7 +447,7 @@ $routes->group( 'VideoClipsController::attemptCreate/$1/$2', [ 'as' => 'video-clips-create', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->get( @@ -455,7 +455,7 @@ $routes->group( 'VideoClipsController::view/$1/$2/$3', [ 'as' => 'video-clip', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->get( @@ -463,7 +463,7 @@ $routes->group( 'VideoClipsController::retry/$1/$2/$3', [ 'as' => 'video-clip-retry', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->get( @@ -471,7 +471,7 @@ $routes->group( 'VideoClipsController::delete/$1/$2/$3', [ 'as' => 'video-clip-delete', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-clips', ], ); $routes->get( @@ -479,20 +479,20 @@ $routes->group( 'EpisodeController::embed/$1/$2', [ 'as' => 'embed-add', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.edit', ], ); $routes->group('persons', static function ($routes): void { $routes->get('/', 'EpisodePersonController/$1/$2', [ 'as' => 'episode-persons-manage', - 'filter' => 'permission:podcast_episodes-edit', + 'filter' => 'permission:podcast#.episodes.manage-persons', ]); $routes->post( '/', 'EpisodePersonController::attemptAdd/$1/$2', [ 'filter' => - 'permission:podcast_episodes-edit', + 'permission:podcast#.episodes.manage-persons', ], ); $routes->get( @@ -501,7 +501,7 @@ $routes->group( [ 'as' => 'episode-person-remove', 'filter' => - 'permission:podcast_episodes-edit', + 'permission:podcast#.episodes.manage-persons', ], ); }); @@ -511,7 +511,7 @@ $routes->group( 'EpisodeController::attemptCommentCreate/$1/$2', [ 'as' => 'comment-attempt-create', - 'filter' => 'permission:podcast-manage_publications', + 'filter' => 'permission:podcast#.episodes.manage-comments', ] ); $routes->post( @@ -519,7 +519,7 @@ $routes->group( 'EpisodeController::attemptCommentReply/$1/$2/$3', [ 'as' => 'comment-attempt-reply', - 'filter' => 'permission:podcast-manage_publications', + 'filter' => 'permission:podcast#.episodes.manage-comments', ] ); $routes->post( @@ -527,73 +527,19 @@ $routes->group( 'EpisodeController::attemptCommentDelete/$1/$2', [ 'as' => 'comment-attempt-delete', - 'filter' => 'permission:podcast-manage_publications', + 'filter' => 'permission:podcast#.episodes.manage-comments', ] ); }); }); }); - // Podcast contributors - $routes->group('contributors', static function ($routes): void { - $routes->get('/', 'ContributorController::list/$1', [ - 'as' => 'contributor-list', - 'filter' => - 'permission:podcasts-view,podcast-manage_contributors', - ]); - $routes->get('add', 'ContributorController::add/$1', [ - 'as' => 'contributor-add', - 'filter' => 'permission:podcast-manage_contributors', - ]); - $routes->post( - 'add', - 'ContributorController::attemptAdd/$1', - [ - 'filter' => - 'permission:podcast-manage_contributors', - ], - ); - // Contributor - $routes->group('(:num)', static function ($routes): void { - $routes->get('/', 'ContributorController::view/$1/$2', [ - 'as' => 'contributor-view', - 'filter' => - 'permission:podcast-manage_contributors', - ]); - $routes->get( - 'edit', - 'ContributorController::edit/$1/$2', - [ - 'as' => 'contributor-edit', - 'filter' => - 'permission:podcast-manage_contributors', - ], - ); - $routes->post( - 'edit', - 'ContributorController::attemptEdit/$1/$2', - [ - 'filter' => - 'permission:podcast-manage_contributors', - ], - ); - $routes->get( - 'remove', - 'ContributorController::remove/$1/$2', - [ - 'as' => 'contributor-remove', - 'filter' => - 'permission:podcast-manage_contributors', - ], - ); - }); - }); $routes->group('platforms', static function ($routes): void { $routes->get( '/', 'PodcastPlatformController::platforms/$1/podcasting', [ 'as' => 'platforms-podcasting', - 'filter' => 'permission:podcast-manage_platforms', + 'filter' => 'permission:podcast#.manage-platforms', ], ); $routes->get( @@ -601,7 +547,7 @@ $routes->group( 'PodcastPlatformController::platforms/$1/social', [ 'as' => 'platforms-social', - 'filter' => 'permission:podcast-manage_platforms', + 'filter' => 'permission:podcast#.manage-platforms', ], ); $routes->get( @@ -609,7 +555,7 @@ $routes->group( 'PodcastPlatformController::platforms/$1/funding', [ 'as' => 'platforms-funding', - 'filter' => 'permission:podcast-manage_platforms', + 'filter' => 'permission:podcast#.manage-platforms', ], ); $routes->post( @@ -617,7 +563,7 @@ $routes->group( 'PodcastPlatformController::attemptPlatformsUpdate/$1/$2', [ 'as' => 'platforms-save', - 'filter' => 'permission:podcast-manage_platforms', + 'filter' => 'permission:podcast#.manage-platforms', ], ); $routes->get( @@ -625,7 +571,7 @@ $routes->group( 'PodcastPlatformController::removePodcastPlatform/$1/$2', [ 'as' => 'podcast-platform-remove', - 'filter' => 'permission:podcast-manage_platforms', + 'filter' => 'permission:podcast#.manage-platforms', ], ); }); @@ -633,12 +579,15 @@ $routes->group( $routes->group('notifications', static function ($routes): void { $routes->get('/', 'NotificationController::list/$1', [ 'as' => 'notification-list', + 'filter' => 'permission:podcast#.view', ]); $routes->get('(:num)/mark-as-read', 'NotificationController::markAsRead/$1/$2', [ 'as' => 'notification-mark-as-read', + 'filter' => 'permission:podcast#.manage-notifications', ]); $routes->get('mark-all-as-read', 'NotificationController::markAllAsRead/$1', [ 'as' => 'notification-mark-all-as-read', + 'filter' => 'permission:podcast#.manage-notifications', ]); }); }); @@ -653,7 +602,7 @@ $routes->group( 'FediverseController::blockedActors', [ 'as' => 'fediverse-blocked-actors', - 'filter' => 'permission:fediverse-block_actors', + 'filter' => 'permission:fediverse.manage-blocks', ], ); $routes->get( @@ -661,7 +610,7 @@ $routes->group( 'FediverseController::blockedDomains', [ 'as' => 'fediverse-blocked-domains', - 'filter' => 'permission:fediverse-block_domains', + 'filter' => 'permission:fediverse.manage-blocks', ], ); }); @@ -669,13 +618,14 @@ $routes->group( $routes->group('pages', static function ($routes): void { $routes->get('/', 'PageController::list', [ 'as' => 'page-list', + 'filter' => 'permission:pages.manage', ]); $routes->get('new', 'PageController::create', [ 'as' => 'page-create', - 'filter' => 'permission:pages-manage', + 'filter' => 'permission:pages.manage', ]); $routes->post('new', 'PageController::attemptCreate', [ - 'filter' => 'permission:pages-manage', + 'filter' => 'permission:pages.manage', ]); $routes->group('(:num)', static function ($routes): void { $routes->get('/', 'PageController::view/$1', [ @@ -683,78 +633,16 @@ $routes->group( ]); $routes->get('edit', 'PageController::edit/$1', [ 'as' => 'page-edit', - 'filter' => 'permission:pages-manage', + 'filter' => 'permission:pages.manage', ]); $routes->post('edit', 'PageController::attemptEdit/$1', [ - 'filter' => 'permission:pages-manage', + 'filter' => 'permission:pages.manage', ]); $routes->get('delete', 'PageController::delete/$1', [ 'as' => 'page-delete', - 'filter' => 'permission:pages-manage', + 'filter' => 'permission:pages.manage', ]); }); }); - // Users - $routes->group('users', static function ($routes): void { - $routes->get('/', 'UserController::list', [ - 'as' => 'user-list', - 'filter' => 'permission:users-list', - ]); - $routes->get('new', 'UserController::create', [ - 'as' => 'user-create', - 'filter' => 'permission:users-create', - ]); - $routes->post('new', 'UserController::attemptCreate', [ - 'filter' => 'permission:users-create', - ]); - // User - $routes->group('(:num)', static function ($routes): void { - $routes->get('/', 'UserController::view/$1', [ - 'as' => 'user-view', - 'filter' => 'permission:users-view', - ]); - $routes->get('edit', 'UserController::edit/$1', [ - 'as' => 'user-edit', - 'filter' => 'permission:users-manage_authorizations', - ]); - $routes->post('edit', 'UserController::attemptEdit/$1', [ - 'filter' => 'permission:users-manage_authorizations', - ]); - $routes->get('ban', 'UserController::ban/$1', [ - 'as' => 'user-ban', - 'filter' => 'permission:users-manage_bans', - ]); - $routes->get('unban', 'UserController::unBan/$1', [ - 'as' => 'user-unban', - 'filter' => 'permission:users-manage_bans', - ]); - $routes->get( - 'force-pass-reset', - 'UserController::forcePassReset/$1', - [ - 'as' => 'user-force_pass_reset', - 'filter' => 'permission:users-force_pass_reset', - ], - ); - $routes->get('delete', 'UserController::delete/$1', [ - 'as' => 'user-delete', - 'filter' => 'permission:users-delete', - ]); - }); - }); - // My account - $routes->group('my-account', static function ($routes): void { - $routes->get('/', 'MyAccountController', [ - 'as' => 'my-account', - ]); - $routes->get( - 'change-password', - 'MyAccountController::changePassword/$1', - [ - 'as' => 'change-password', - ], - ); - $routes->post('change-password', 'MyAccountController::attemptChange/$1'); - }); }, ); diff --git a/modules/Admin/Controllers/ContributorController.php b/modules/Admin/Controllers/ContributorController.php deleted file mode 100644 index 71dfc073..00000000 --- a/modules/Admin/Controllers/ContributorController.php +++ /dev/null @@ -1,203 +0,0 @@ -getPodcastById((int) $params[0])) === null) { - throw PageNotFoundException::forPageNotFound(); - } - - $this->podcast = $podcast; - - if (count($params) <= 1) { - return $this->{$method}(); - } - - if (($this->user = (new UserModel())->getPodcastContributor((int) $params[1], (int) $params[0])) !== null) { - return $this->{$method}(); - } - - throw PageNotFoundException::forPageNotFound(); - } - - public function list(): string - { - $data = [ - 'podcast' => $this->podcast, - ]; - - replace_breadcrumb_params([ - 0 => $this->podcast->title, - ]); - return view('contributor/list', $data); - } - - public function view(): string - { - $data = [ - 'podcast' => $this->podcast, - 'contributor' => (new UserModel())->getPodcastContributor($this->user->id, $this->podcast->id), - ]; - - replace_breadcrumb_params([ - 0 => $this->podcast->title, - 1 => $this->user->username, - ]); - return view('contributor/view', $data); - } - - public function add(): string - { - helper('form'); - - $users = (new UserModel())->findAll(); - $userOptions = array_reduce( - $users, - static function ($result, $user) { - $result[$user->id] = $user->username; - return $result; - }, - [], - ); - - $roles = (new GroupModel())->getContributorRoles(); - $roleOptions = array_reduce( - $roles, - static function ($result, $role) { - $result[$role->id] = lang('Contributor.roles.' . $role->name); - return $result; - }, - [], - ); - - $data = [ - 'podcast' => $this->podcast, - 'userOptions' => $userOptions, - 'roleOptions' => $roleOptions, - ]; - - replace_breadcrumb_params([ - 0 => $this->podcast->title, - ]); - return view('contributor/add', $data); - } - - public function attemptAdd(): RedirectResponse - { - try { - (new PodcastModel())->addPodcastContributor( - (int) $this->request->getPost('user'), - $this->podcast->id, - (int) $this->request->getPost('role'), - ); - } catch (Exception) { - return redirect() - ->back() - ->withInput() - ->with('errors', [lang('Contributor.messages.alreadyAddedError')]); - } - - return redirect()->route('contributor-list', [$this->podcast->id]); - } - - public function edit(): string - { - helper('form'); - - $roles = (new GroupModel())->getContributorRoles(); - $roleOptions = array_reduce( - $roles, - static function ($result, $role) { - $result[$role->id] = lang('Contributor.roles.' . $role->name); - return $result; - }, - [], - ); - - $data = [ - 'podcast' => $this->podcast, - 'user' => $this->user, - 'contributorGroupId' => (new PodcastModel())->getContributorGroupId( - $this->user->id, - $this->podcast->id, - ), - 'roleOptions' => $roleOptions, - ]; - - replace_breadcrumb_params([ - 0 => $this->podcast->title, - 1 => $this->user->username, - ]); - return view('contributor/edit', $data); - } - - public function attemptEdit(): RedirectResponse - { - (new PodcastModel())->updatePodcastContributor( - $this->user->id, - $this->podcast->id, - (int) $this->request->getPost('role'), - ); - - return redirect()->route('contributor-edit', [$this->podcast->id, $this->user->id])->with( - 'message', - lang('Contributor.messages.editSuccess') - ); - } - - public function remove(): RedirectResponse - { - if ($this->podcast->created_by === $this->user->id) { - return redirect() - ->back() - ->with('errors', [lang('Contributor.messages.removeOwnerError')]); - } - - $podcastModel = new PodcastModel(); - if ( - ! $podcastModel->removePodcastContributor($this->user->id, $this->podcast->id) - ) { - return redirect() - ->back() - ->with('errors', $podcastModel->errors()); - } - - return redirect() - ->route('contributor-list', [$this->podcast->id]) - ->with( - 'message', - lang('Contributor.messages.removeSuccess', [ - 'username' => $this->user->username, - 'podcastTitle' => $this->podcast->title, - ]), - ); - } -} diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 6c14d7f3..821c7bd7 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -95,7 +95,7 @@ class EpisodeController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('episode/list', $data); } @@ -108,7 +108,7 @@ class EpisodeController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/view', $data); @@ -125,7 +125,7 @@ class EpisodeController extends BaseController 'nextEpisodeNumber' => (new EpisodeModel())->getNextEpisodeNumber($this->podcast->id, $currentSeasonNumber), ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('episode/create', $data); } @@ -261,7 +261,7 @@ class EpisodeController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/edit', $data); @@ -438,7 +438,7 @@ class EpisodeController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/publish', $data); @@ -551,7 +551,7 @@ class EpisodeController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/publish_edit', $data); @@ -851,7 +851,7 @@ class EpisodeController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/delete', $data); @@ -949,7 +949,7 @@ class EpisodeController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/embed', $data); diff --git a/modules/Admin/Controllers/EpisodePersonController.php b/modules/Admin/Controllers/EpisodePersonController.php index ee46c04d..0e0e8625 100644 --- a/modules/Admin/Controllers/EpisodePersonController.php +++ b/modules/Admin/Controllers/EpisodePersonController.php @@ -59,7 +59,7 @@ class EpisodePersonController extends BaseController 'taxonomyOptions' => (new PersonModel())->getTaxonomyOptions(), ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/persons', $data); diff --git a/modules/Admin/Controllers/NotificationController.php b/modules/Admin/Controllers/NotificationController.php index f4bc5558..ea04b6c3 100644 --- a/modules/Admin/Controllers/NotificationController.php +++ b/modules/Admin/Controllers/NotificationController.php @@ -67,7 +67,7 @@ class NotificationController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/notifications', $data); diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 7e9726af..4acc02fa 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -23,7 +23,6 @@ use App\Models\PostModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\I18n\Time; -use Config\Services; use Modules\Analytics\Models\AnalyticsPodcastByCountryModel; use Modules\Analytics\Models\AnalyticsPodcastByEpisodeModel; use Modules\Analytics\Models\AnalyticsPodcastByHourModel; @@ -56,13 +55,13 @@ class PodcastController extends BaseController public function list(): string { - if (! has_permission('podcasts-list')) { + if (auth()->user()->can('podcasts.view')) { $data = [ - 'podcasts' => (new PodcastModel())->getUserPodcasts((int) user_id()), + 'podcasts' => (new PodcastModel())->findAll(), ]; } else { $data = [ - 'podcasts' => (new PodcastModel())->findAll(), + 'podcasts' => get_user_podcasts(auth()->user()), ]; } @@ -76,7 +75,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/view', $data); } @@ -88,7 +87,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/analytics/index', $data); } @@ -100,7 +99,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/analytics/webpages', $data); } @@ -112,7 +111,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/analytics/locations', $data); } @@ -124,7 +123,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/analytics/unique_listeners', $data); } @@ -136,7 +135,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/analytics/listening_time', $data); } @@ -148,7 +147,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/analytics/time_periods', $data); } @@ -160,7 +159,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/analytics/players', $data); } @@ -253,10 +252,11 @@ class PodcastController extends BaseController ->with('errors', $podcastModel->errors()); } - $authorize = Services::authorization(); - $podcastAdminGroup = $authorize->group('podcast_admin'); - - $podcastModel->addPodcastContributor(user_id(), $newPodcastId, (int) $podcastAdminGroup->id); + // generate podcast roles and permissions + // before setting current user as podcast admin + config('AuthGroups') + ->generatePodcastAuthorizations($newPodcastId); + add_podcast_group(auth()->user(), (int) $newPodcastId, setting('AuthGroups.mostPowerfulPodcastGroup')); // set Podcast categories (new CategoryModel())->setPodcastCategories( @@ -264,10 +264,6 @@ class PodcastController extends BaseController $this->request->getPost('other_categories') ?? [], ); - // set interact as the newly created podcast actor - $createdPodcast = (new PodcastModel())->getPodcastById($newPodcastId); - set_interact_as_actor($createdPodcast->actor_id); - $db->transComplete(); return redirect()->route('podcast-view', [$newPodcastId])->with( @@ -290,7 +286,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/edit', $data); } @@ -444,7 +440,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/delete', $data); } @@ -576,15 +572,6 @@ class PodcastController extends BaseController } } - if ($this->podcast->actor_id === interact_as_actor_id()) { - //set interact to the most recently created podcast actor - $mostRecentPodcast = (new PodcastModel())->orderBy('created_at', 'desc') - ->first(); - if ($mostRecentPodcast !== null) { - set_interact_as_actor($mostRecentPodcast->actor_id); - } - } - $db->transComplete(); //delete podcast media files and folder @@ -620,7 +607,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/publish', $data); @@ -754,7 +741,7 @@ class PodcastController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/publish_edit', $data); diff --git a/modules/Admin/Controllers/PodcastImportController.php b/modules/Admin/Controllers/PodcastImportController.php index 39b0f09a..f7515a4b 100644 --- a/modules/Admin/Controllers/PodcastImportController.php +++ b/modules/Admin/Controllers/PodcastImportController.php @@ -23,7 +23,6 @@ use App\Models\PlatformModel; use App\Models\PodcastModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; -use Config\Services; use ErrorException; use League\HTMLToMarkdown\HtmlConverter; @@ -201,10 +200,11 @@ class PodcastImportController extends BaseController ->with('errors', $podcastModel->errors()); } - $authorize = Services::authorization(); - $podcastAdminGroup = $authorize->group('podcast_admin'); - - $podcastModel->addPodcastContributor(user_id(), $newPodcastId, (int) $podcastAdminGroup->id); + // set current user as podcast admin + // 1. create new group + config('AuthGroups') + ->generatePodcastAuthorizations($newPodcastId); + add_podcast_group(auth()->user(), $newPodcastId, 'admin'); $podcastsPlatformsData = []; $platformTypes = [ @@ -460,9 +460,7 @@ class PodcastImportController extends BaseController } } - // set interact as the newly imported podcast actor $importedPodcast = (new PodcastModel())->getPodcastById($newPodcastId); - set_interact_as_actor($importedPodcast->actor_id); // set podcast publication date $importedPodcast->published_at = $firstEpisodePublicationDate ?? $importedPodcast->created_at; diff --git a/modules/Admin/Controllers/PodcastPersonController.php b/modules/Admin/Controllers/PodcastPersonController.php index 722ba28a..1c5d8213 100644 --- a/modules/Admin/Controllers/PodcastPersonController.php +++ b/modules/Admin/Controllers/PodcastPersonController.php @@ -47,7 +47,7 @@ class PodcastPersonController extends BaseController 'taxonomyOptions' => (new PersonModel())->getTaxonomyOptions(), ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/persons', $data); } diff --git a/modules/Admin/Controllers/PodcastPlatformController.php b/modules/Admin/Controllers/PodcastPlatformController.php index 08b8f961..61936420 100644 --- a/modules/Admin/Controllers/PodcastPlatformController.php +++ b/modules/Admin/Controllers/PodcastPlatformController.php @@ -53,7 +53,7 @@ class PodcastPlatformController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('podcast/platforms', $data); diff --git a/modules/Admin/Controllers/SoundbiteController.php b/modules/Admin/Controllers/SoundbiteController.php index 0016de24..e389e645 100644 --- a/modules/Admin/Controllers/SoundbiteController.php +++ b/modules/Admin/Controllers/SoundbiteController.php @@ -77,7 +77,7 @@ class SoundbiteController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/soundbites_list', $data); @@ -93,7 +93,7 @@ class SoundbiteController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/soundbites_new', $data); diff --git a/modules/Admin/Controllers/UserController.php b/modules/Admin/Controllers/UserController.php deleted file mode 100644 index 3dc70d44..00000000 --- a/modules/Admin/Controllers/UserController.php +++ /dev/null @@ -1,258 +0,0 @@ -{$method}(); - } - - if ($this->user = (new UserModel())->find($params[0])) { - return $this->{$method}(); - } - - throw PageNotFoundException::forPageNotFound(); - } - - public function list(): string - { - $data = [ - 'users' => (new UserModel())->findAll(), - ]; - - return view('user/list', $data); - } - - public function view(): string - { - $data = [ - 'user' => $this->user, - ]; - - replace_breadcrumb_params([ - 0 => $this->user->username, - ]); - return view('user/view', $data); - } - - public function create(): string - { - helper('form'); - - $data = [ - 'roles' => (new GroupModel())->getUserRoles(), - ]; - - return view('user/create', $data); - } - - public function attemptCreate(): RedirectResponse - { - $userModel = new UserModel(); - - // Validate here first, since some things, - // like the password, can only be validated properly here. - $rules = array_merge( - $userModel->getValidationRules([ - 'only' => ['username'], - ]), - [ - 'email' => 'required|valid_email|is_unique[users.email]', - 'password' => 'required|strong_password', - ], - ); - - if (! $this->validate($rules)) { - return redirect() - ->back() - ->withInput() - ->with('errors', $this->validator->getErrors()); - } - - // Save the user - $user = new User($this->request->getPost()); - - // Activate user - $user->activate(); - - // Force user to reset his password on first connection - $user->forcePasswordReset(); - - if (! $userModel->insert($user)) { - return redirect() - ->back() - ->withInput() - ->with('errors', $userModel->errors()); - } - - // Success! - return redirect() - ->route('user-list') - ->with('message', lang('User.messages.createSuccess', [ - 'username' => $user->username, - ])); - } - - public function edit(): string - { - helper('form'); - - $roles = (new GroupModel())->getUserRoles(); - $roleOptions = array_reduce( - $roles, - static function ($result, $role) { - $result[$role->name] = lang('User.roles.' . $role->name); - return $result; - }, - [], - ); - - $data = [ - 'user' => $this->user, - 'roleOptions' => $roleOptions, - ]; - - replace_breadcrumb_params([ - 0 => $this->user->username, - ]); - return view('user/edit', $data); - } - - public function attemptEdit(): RedirectResponse - { - $authorize = Services::authorization(); - - $roles = $this->request->getPost('roles'); - - if ($this->user->isOwner) { - return redirect() - ->back() - ->with('errors', [ - lang('User.messages.editOwnerError', [ - 'username' => $this->user->username, - ]), - ]); - } - - $authorize->setUserGroups($this->user->id, $roles ?? []); - - // Success! - return redirect() - ->route('user-list') - ->with('message', lang('User.messages.rolesEditSuccess', [ - 'username' => $this->user->username, - ])); - } - - public function forcePassReset(): RedirectResponse - { - $userModel = new UserModel(); - $this->user->forcePasswordReset(); - - if (! $userModel->update($this->user->id, $this->user)) { - return redirect() - ->back() - ->with('errors', $userModel->errors()); - } - - // Success! - return redirect() - ->route('user-list') - ->with( - 'message', - lang('User.messages.forcePassResetSuccess', [ - 'username' => $this->user->username, - ]), - ); - } - - public function ban(): RedirectResponse - { - $authorize = Services::authorization(); - if ($authorize->inGroup('superadmin', $this->user->id)) { - return redirect() - ->back() - ->with('errors', [ - lang('User.messages.banSuperAdminError', [ - 'username' => $this->user->username, - ]), - ]); - } - - $userModel = new UserModel(); - // TODO: add ban reason? - $this->user->ban(''); - - if (! $userModel->update($this->user->id, $this->user)) { - return redirect() - ->back() - ->with('errors', $userModel->errors()); - } - - return redirect() - ->route('user-list') - ->with('message', lang('User.messages.banSuccess', [ - 'username' => $this->user->username, - ])); - } - - public function unBan(): RedirectResponse - { - $userModel = new UserModel(); - $this->user->unBan(); - - if (! $userModel->update($this->user->id, $this->user)) { - return redirect() - ->back() - ->with('errors', $userModel->errors()); - } - - return redirect() - ->route('user-list') - ->with('message', lang('User.messages.unbanSuccess', [ - 'username' => $this->user->username, - ])); - } - - public function delete(): RedirectResponse - { - $authorize = Services::authorization(); - if ($authorize->inGroup('superadmin', $this->user->id)) { - return redirect() - ->back() - ->with('errors', [ - lang('User.messages.deleteSuperAdminError', [ - 'username' => $this->user->username, - ]), - ]); - } - - (new UserModel())->delete($this->user->id); - - return redirect() - ->back() - ->with('message', lang('User.messages.deleteSuccess', [ - 'username' => $this->user->username, - ])); - } -} diff --git a/modules/Admin/Controllers/VideoClipsController.php b/modules/Admin/Controllers/VideoClipsController.php index 49878800..02ab95cf 100644 --- a/modules/Admin/Controllers/VideoClipsController.php +++ b/modules/Admin/Controllers/VideoClipsController.php @@ -82,7 +82,7 @@ class VideoClipsController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); return view('episode/video_clips_list', $data); @@ -99,7 +99,7 @@ class VideoClipsController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, 2 => $videoClip->title, ]); @@ -114,7 +114,7 @@ class VideoClipsController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => $this->episode->title, ]); diff --git a/modules/Admin/Language/en/Breadcrumb.php b/modules/Admin/Language/en/Breadcrumb.php index f3269bfa..823ccd65 100644 --- a/modules/Admin/Language/en/Breadcrumb.php +++ b/modules/Admin/Language/en/Breadcrumb.php @@ -28,6 +28,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'unpublish', 'delete' => 'delete', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'block lists', 'users' => 'users', diff --git a/modules/Admin/Language/id/User.php b/modules/Admin/Language/id/User.php deleted file mode 100644 index 585d6799..00000000 --- a/modules/Admin/Language/id/User.php +++ /dev/null @@ -1,56 +0,0 @@ - "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'roles' => 'Roles', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'roles' => [ - 'superadmin' => 'Super admin', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => - "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Admin/Language/it/User.php b/modules/Admin/Language/it/User.php deleted file mode 100644 index 585d6799..00000000 --- a/modules/Admin/Language/it/User.php +++ /dev/null @@ -1,56 +0,0 @@ - "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'roles' => 'Roles', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'roles' => [ - 'superadmin' => 'Super admin', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => - "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Admin/Language/nl/User.php b/modules/Admin/Language/nl/User.php deleted file mode 100644 index 585d6799..00000000 --- a/modules/Admin/Language/nl/User.php +++ /dev/null @@ -1,56 +0,0 @@ - "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'roles' => 'Roles', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'roles' => [ - 'superadmin' => 'Super admin', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => - "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Admin/Language/oc/User.php b/modules/Admin/Language/oc/User.php deleted file mode 100644 index 585d6799..00000000 --- a/modules/Admin/Language/oc/User.php +++ /dev/null @@ -1,56 +0,0 @@ - "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'roles' => 'Roles', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'roles' => [ - 'superadmin' => 'Super admin', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => - "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Admin/Language/pt/User.php b/modules/Admin/Language/pt/User.php deleted file mode 100644 index 585d6799..00000000 --- a/modules/Admin/Language/pt/User.php +++ /dev/null @@ -1,56 +0,0 @@ - "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'roles' => 'Roles', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'roles' => [ - 'superadmin' => 'Super admin', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => - "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Admin/Language/ru/User.php b/modules/Admin/Language/ru/User.php deleted file mode 100644 index 585d6799..00000000 --- a/modules/Admin/Language/ru/User.php +++ /dev/null @@ -1,56 +0,0 @@ - "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'roles' => 'Roles', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'roles' => [ - 'superadmin' => 'Super admin', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => - "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Admin/Language/sk/User.php b/modules/Admin/Language/sk/User.php deleted file mode 100644 index 585d6799..00000000 --- a/modules/Admin/Language/sk/User.php +++ /dev/null @@ -1,56 +0,0 @@ - "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'roles' => 'Roles', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'roles' => [ - 'superadmin' => 'Super admin', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => - "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Admin/Language/sv/User.php b/modules/Admin/Language/sv/User.php deleted file mode 100644 index 585d6799..00000000 --- a/modules/Admin/Language/sv/User.php +++ /dev/null @@ -1,56 +0,0 @@ - "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'roles' => 'Roles', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'roles' => [ - 'superadmin' => 'Super admin', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => - "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Analytics/Config/Analytics.php b/modules/Analytics/Config/Analytics.php index ab263a08..6caea6b0 100644 --- a/modules/Analytics/Config/Analytics.php +++ b/modules/Analytics/Config/Analytics.php @@ -20,9 +20,9 @@ class Analytics extends BaseConfig * @var array */ public array $routeFilters = [ - 'analytics-full-data' => 'permission:podcasts-view,podcast-view', - 'analytics-data' => 'permission:podcasts-view,podcast-view', - 'analytics-filtered-data' => 'permission:podcasts-view,podcast-view', + 'analytics-full-data' => 'permission:podcast#.view', + 'analytics-data' => 'permission:podcast#.view', + 'analytics-filtered-data' => 'permission:podcast#.view', ]; /** diff --git a/modules/Auth/Auth.php b/modules/Auth/Auth.php new file mode 100644 index 00000000..09e32581 --- /dev/null +++ b/modules/Auth/Auth.php @@ -0,0 +1,42 @@ +routes($routes); + * - auth()->routes($routes, ['except' => ['login', 'register']]) + */ + public function routes(RouteCollection &$routes, array $config = []): void + { + $authRoutes = config('AuthRoutes') + ->routes; + + $routes->group(config('Auth')->gateway, [ + 'namespace' => 'Modules\Auth\Controllers', + ], static function (RouteCollection $routes) use ($authRoutes, $config): void { + foreach ($authRoutes as $name => $row) { + if (! isset($config['except']) || ! in_array($name, $config['except'], true)) { + foreach ($row as $params) { + $options = isset($params[3]) + ? [ + 'as' => $params[3], + ] + : null; + $routes->{$params[0]}($params[1], $params[2], $options); + } + } + } + }); + } +} diff --git a/modules/Auth/Authorization/FlatAuthorization.php b/modules/Auth/Authorization/FlatAuthorization.php deleted file mode 100644 index 933a2728..00000000 --- a/modules/Auth/Authorization/FlatAuthorization.php +++ /dev/null @@ -1,54 +0,0 @@ -getPermissionID($permission); - - if (! is_numeric($permissionId)) { - return false; - } - - return $this->permissionModel->doesGroupHavePermission($groupId, $permissionId); - } - - /** - * Makes user part of given groups. - * - * @param array $groups Either collection of ID or names - */ - public function setUserGroups(int $userId, array $groups = []): bool - { - // remove user from all groups before resetting it in new groups - $this->groupModel->removeUserFromAllGroups($userId); - - if ($groups === []) { - return true; - } - - foreach ($groups as $group) { - $this->addUserToGroup($userId, $group); - } - - return true; - } -} diff --git a/modules/Auth/Authorization/GroupModel.php b/modules/Auth/Authorization/GroupModel.php deleted file mode 100644 index 74618542..00000000 --- a/modules/Auth/Authorization/GroupModel.php +++ /dev/null @@ -1,30 +0,0 @@ -select('auth_groups.*') - ->like('name', 'podcast_', 'after') - ->findAll(); - } - - /** - * @return mixed[] - */ - public function getUserRoles(): array - { - return $this->select('auth_groups.*') - ->notLike('name', 'podcast_', 'after') - ->findAll(); - } -} diff --git a/modules/Auth/Authorization/PermissionModel.php b/modules/Auth/Authorization/PermissionModel.php deleted file mode 100644 index 01106c10..00000000 --- a/modules/Auth/Authorization/PermissionModel.php +++ /dev/null @@ -1,53 +0,0 @@ -getPermissionsForGroup($groupId); - - return count($groupPerms) && - array_key_exists($permissionId, $groupPerms); - } - - /** - * Gets all permissions for a group in a way that can be easily used to check against: - * - * [ id => name, id => name ] - * - * @return array - */ - public function getPermissionsForGroup(int $groupId): array - { - $cacheName = "group{$groupId}_permissions"; - if (! ($found = cache($cacheName))) { - $groupPermissions = $this->db - ->table('auth_groups_permissions') - ->select('id, auth_permissions.name') - ->join('auth_permissions', 'auth_permissions.id = permission_id', 'inner') - ->where('group_id', $groupId) - ->get() - ->getResultObject(); - - $found = []; - foreach ($groupPermissions as $row) { - $found[$row->id] = strtolower($row->name); - } - - cache() - ->save($cacheName, $found, 300); - } - - return $found; - } -} diff --git a/modules/Auth/Commands/RolesDoc.php b/modules/Auth/Commands/RolesDoc.php new file mode 100644 index 00000000..5326c2b1 --- /dev/null +++ b/modules/Auth/Commands/RolesDoc.php @@ -0,0 +1,184 @@ + + */ + private const COMMENT_BLOCK_IDS = [ + 'instance_roles' => 'AUTH-INSTANCE-ROLES-LIST', + 'instance_permissions' => 'AUTH-INSTANCE-PERMISSIONS-LIST', + 'podcast_roles' => 'AUTH-PODCAST-ROLES-LIST', + 'podcast_permissions' => 'AUTH-PODCAST-PERMISSIONS-LIST', + ]; + + /** + * @var string + */ + protected $group = 'auth'; + + /** + * @var string + */ + protected $name = 'auth:generate-doc'; + + /** + * @var string + */ + protected $description = 'Generates the html table references for roles and permissions in the docs.'; + + public function run(array $params): void + { + // loop over all files in path + $defaultFile = glob(ROOTPATH . 'docs/src/getting-started/auth.md'); + $localizedFiles = glob(ROOTPATH . 'docs/src/**/getting-started/auth.md') ?? []; + $files = array_merge($defaultFile, $localizedFiles); + CLI::write(implode(', ', $files)); + + if ($files === []) { + return; + } + + foreach ($files as $file) { + $locale = $this->detectLocaleFromPath($file); + $language = Services::language(); + $language->setLocale($locale); + + $authGroups = new AuthGroups(); + + $fileContents = file_get_contents($file); + + foreach (self::COMMENT_BLOCK_IDS as $key => $block_id) { + $pattern = '/()[\S\s]*()/'; + + $handleInjectMethod = 'handle' . str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $key))); + + $fileContents = $this->{$handleInjectMethod}($authGroups, $fileContents, $pattern); + } + + // Write the contents back to the file + file_put_contents($file, $fileContents); + } + } + + protected function handleInstanceRoles($authGroups, string $fileContents, string $pattern): string + { + $instanceMatrix = $authGroups->matrix; + return $this->renderCommentBlock( + $fileContents, + $pattern, + ['role', 'description', 'permissions'], + $authGroups->instanceGroups, + static function ($table, $key, $value) use ($instanceMatrix): void { + $table->addRow($value['title'], $value['description'], implode(', ', $instanceMatrix[$key])); + } + ); + } + + protected function handleInstancePermissions($authGroups, string $fileContents, string $pattern): string + { + return $this->renderCommentBlock( + $fileContents, + $pattern, + ['permission', 'description'], + $authGroups->instancePermissions, + static function ($table, $key, $value): void { + $table->addRow($key, $value); + } + ); + } + + protected function handlePodcastRoles($authGroups, string $fileContents, string $pattern): string + { + $podcastMatrix = $authGroups->podcastMatrix; + return $this->renderCommentBlock( + $fileContents, + $pattern, + ['role', 'description', 'permissions'], + $authGroups->podcastGroups, + static function ($table, $key, $value) use ($podcastMatrix): void { + $table->addRow($value['title'], $value['description'], implode(', ', $podcastMatrix[$key])); + } + ); + } + + protected function handlePodcastPermissions($authGroups, string $fileContents, string $pattern): string + { + return $this->renderCommentBlock( + $fileContents, + $pattern, + ['permission', 'description'], + $authGroups->podcastPermissions, + static function ($table, $key, $value): void { + $table->addRow($key, $value); + } + ); + } + + private function renderCommentBlock( + string $fileContents, + string $pattern, + array $tableHeading, + array $data, + Closure $callback + ): string { + // check if it has the start and end comments to insert roles table + // looking for and + + $hasInstanceInsertComments = preg_match($pattern, $fileContents); + + if (! $hasInstanceInsertComments) { + return $fileContents; + } + + // prepare role table + $table = new Table(); + $table->setHeading($tableHeading); + + foreach ($data as $key => $value) { + $callback($table, $key, $value); + } + + $converter = new HtmlConverter(); + $converter->getEnvironment() + ->addConverter(new TableConverter()); + $markdownTable = $converter->convert($table->generate()); + + // insert table between block comments + $newFileContents = preg_replace( + $pattern, + '${1}' . PHP_EOL . PHP_EOL . $markdownTable . PHP_EOL . PHP_EOL . '${2}', + $fileContents + ); + + if ($newFileContents === null) { + return $fileContents; + } + + return $newFileContents; + } + + private function detectLocaleFromPath($filePath): string + { + preg_match('~docs\/src\/(?:([a-z]{2}(?:-[A-Za-z]{2,})?)\/)getting-started\/auth\.md~', $filePath, $match); + + if ($match === []) { + return 'en'; + } + + return $match[1]; + } +} diff --git a/modules/Auth/Config/Auth.php b/modules/Auth/Config/Auth.php index 11ffea8a..e9017374 100644 --- a/modules/Auth/Config/Auth.php +++ b/modules/Auth/Config/Auth.php @@ -4,46 +4,99 @@ declare(strict_types=1); namespace Modules\Auth\Config; -use Myth\Auth\Config\Auth as MythAuthConfig; +use CodeIgniter\Shield\Authentication\Actions\ActionInterface; +use CodeIgniter\Shield\Config\Auth as ShieldAuth; +use Modules\Auth\Models\UserModel; -class Auth extends MythAuthConfig +class Auth extends ShieldAuth { /** - * -------------------------------------------------------------------------- - * Views used by Auth Controllers - * -------------------------------------------------------------------------- + * ////////////////// AUTHENTICATION ////////////////// * * @var array */ - public $views = [ + public array $views = [ 'login' => 'login', 'register' => 'register', - 'forgot' => 'forgot', - 'reset' => 'reset', - 'emailForgot' => 'emails/forgot', - 'emailActivation' => 'emails/activation', + 'layout' => '_layout', + 'action_email_2fa' => 'email_2fa_show', + 'action_email_2fa_verify' => 'email_2fa_verify', + 'action_email_2fa_email' => 'emails/email_2fa_email', + 'action_email_activate_show' => 'email_activate_show', + 'action_email_activate_email' => 'emails/email_activate_email', + 'magic-link-login' => 'magic_link_form', + 'magic-link-message' => 'magic_link_message', + 'magic-link-email' => 'emails/magic_link_email', + 'magic-link-set-password' => 'magic_link_set_password', + 'welcome-email' => 'emails/welcome_email', ]; /** - * -------------------------------------------------------------------------- - * Layout for the views to extend - * -------------------------------------------------------------------------- + * -------------------------------------------------------------------- + * Redirect urLs + * -------------------------------------------------------------------- + * The default URL that a user will be redirected to after + * various auth actions. If you need more flexibility you can + * override the `getUrl()` method to apply any logic you may need. * - * @var string + * @var array */ - public $viewLayout = '_layout'; + public array $redirects = [ + 'register' => '/', + 'login' => '/', + 'logout' => 'login', + ]; /** - * -------------------------------------------------------------------------- - * Allow User Registration - * -------------------------------------------------------------------------- - * When enabled (default) any unregistered user may apply for a new - * account. If you disable registration you may need to ensure your - * controllers and views know not to offer registration. + * -------------------------------------------------------------------- + * Authentication Actions + * -------------------------------------------------------------------- + * Specifies the class that represents an action to take after + * the user logs in or registers a new account at the site. * - * @var bool + * You must register actions in the order of the actions to be performed. + * + * Available actions with Shield: + * - register: 'CodeIgniter\Shield\Authentication\Actions\EmailActivator' + * - login: 'CodeIgniter\Shield\Authentication\Actions\Email2FA' + * + * @var array|null> */ - public $allowRegistration = false; + public array $actions = [ + 'register' => null, + 'login' => null, + ]; + + /** + * -------------------------------------------------------------------- + * Allow Registration + * -------------------------------------------------------------------- + * Determines whether users can register for the site. + */ + public bool $allowRegistration = true; + + /** + * -------------------------------------------------------------------- + * Welcome Link Lifetime + * -------------------------------------------------------------------- + * Specifies the amount of time, in seconds, that a welcome link is valid. + * You can use Time Constants or any desired number. + */ + public int $welcomeLinkLifetime = 48 * HOUR; + + /** + * -------------------------------------------------------------------- + * User Provider + * -------------------------------------------------------------------- + * The name of the class that handles user persistence. + * By default, this is the included UserModel, which + * works with any of the database engines supported by CodeIgniter. + * You can change it as long as they adhere to the + * CodeIgniter\Shield\Models\UserModel. + * + * @var class-string + */ + public string $userProvider = UserModel::class; /** * -------------------------------------------------------------------------- @@ -52,4 +105,28 @@ class Auth extends MythAuthConfig * Defines a base route for all authentication related pages */ public string $gateway = 'cp-auth'; + + public function __construct() + { + $adminGateway = config('Admin') + ->gateway; + + $this->redirects = [ + 'register' => $adminGateway, + 'login' => $adminGateway, + 'logout' => $adminGateway, + ]; + } + + /** + * Returns the URL that a user should be redirected to after a successful login. + * + * Redirects to the set-password form if magicLogin + */ + public function loginRedirect(): string + { + $url = session('magicLogin') ? route_to('magic-link-set-password') : setting('Auth.redirects')['login']; + + return $this->getUrl($url); + } } diff --git a/modules/Auth/Config/AuthGroups.php b/modules/Auth/Config/AuthGroups.php new file mode 100644 index 00000000..cfbcbada --- /dev/null +++ b/modules/Auth/Config/AuthGroups.php @@ -0,0 +1,285 @@ +attempt($credentials); + * + * @var array> + */ + public array $groups = []; + + /** + * -------------------------------------------------------------------- + * Permissions + * -------------------------------------------------------------------- + * The available permissions in the system. Each system is defined + * where the key is the + * + * If a permission is not listed here it cannot be used. + * + * @var array + */ + public array $permissions = []; + + /** + * -------------------------------------------------------------------- + * Permissions Matrix + * -------------------------------------------------------------------- + * Maps permissions to groups. + * @var array> + */ + public array $matrix = []; + + /** + * @var array> + */ + public array $instanceGroups = []; + + /** + * @var array + */ + public array $instancePermissions = []; + + /** + * @var array> + */ + public array $podcastGroups = []; + + /** + * @var array + */ + public array $podcastPermissions = []; + + /** + * @var string[] + */ + public array $instanceBaseGroups = ['superadmin', 'manager', 'podcaster']; + + /** + * @var string[] + */ + public array $instanceBasePermissions = [ + 'admin.access', + 'admin.settings', + 'users.manage', + 'persons.manage', + 'pages.manage', + 'podcasts.view', + 'podcasts.create', + 'podcasts.import', + 'fediverse.manage-blocks', + ]; + + /** + * @var array> + */ + public array $instanceMatrix = [ + 'superadmin' => [ + 'admin.*', + 'podcasts.*', + 'users.manage', + 'persons.manage', + 'pages.manage', + 'fediverse.manage-blocks', + ], + 'manager' => ['podcasts.create', 'podcasts.import', 'persons.manage', 'pages.manage'], + 'podcaster' => ['admin.access'], + ]; + + /** + * @var string[] + */ + public array $podcastBaseGroups = ['admin', 'editor', 'author', 'guest']; + + /** + * @var string[] + */ + public array $podcastBasePermissions = [ + 'view', + 'edit', + 'delete', + 'manage-import', + 'manage-persons', + 'manage-subscriptions', + 'manage-contributors', + 'manage-platforms', + 'manage-publications', + 'interact-as', + 'episodes.view', + 'episodes.create', + 'episodes.edit', + 'episodes.delete', + 'episodes.manage-persons', + 'episodes.manage-clips', + 'episodes.manage-publications', + 'episodes.manage-comments', + ]; + + /** + * @var array + */ + public array $podcastMatrix = [ + 'admin' => ['*'], + 'editor' => [ + 'view', + 'edit', + 'manage-import', + 'manage-persons', + 'manage-platforms', + 'manage-publications', + 'interact-as', + 'episodes.view', + 'episodes.create', + 'episodes.edit', + 'episodes.delete', + 'episodes.manage-persons', + 'episodes.manage-clips', + 'episodes.manage-publications', + 'episodes.manage-comments', + ], + 'author' => [ + 'view', + 'manage-persons', + 'episodes.view', + 'episodes.create', + 'episodes.edit', + 'episodes.manage-persons', + 'episodes.manage-clips', + ], + 'guest' => ['view', 'episodes.view'], + ]; + + /** + * Fill groups, permissions and matrix based on + */ + public function __construct($locale = null) + { + parent::__construct(); + + foreach ($this->instanceBaseGroups as $group) { + $this->instanceGroups[$group] = [ + 'title' => lang("Auth.instance_groups.{$group}.title"), + 'description' => lang("Auth.instance_groups.{$group}.description"), + ]; + } + + $this->groups = $this->instanceGroups; + + foreach ($this->instanceBasePermissions as $permission) { + $this->instancePermissions[$permission] = lang("Auth.instance_permissions.{$permission}"); + $this->permissions[$permission] = lang("Auth.instance_permissions.{$permission}"); + } + + $this->matrix = $this->instanceMatrix; + + $this->generateBasePodcastAuthorizations(); + + /** + * For each podcast, include podcast groups, permissions, and matrix into $groups, $permissions, and $matrix + * attributes. + */ + $podcasts = (new PodcastModel())->findAll(); + foreach ($podcasts as $podcast) { + $this->generatePodcastAuthorizations($podcast->id, $locale); + } + } + + public function generateBasePodcastAuthorizations(): void + { + foreach ($this->podcastBaseGroups as $group) { + $this->podcastGroups[$group] = [ + 'title' => lang("Auth.podcast_groups.{$group}.title", [ + 'id' => '{id}', + ]), + 'description' => lang("Auth.podcast_groups.{$group}.description", [ + 'id' => '{id}', + ]), + ]; + } + + foreach ($this->podcastBasePermissions as $permission) { + $this->podcastPermissions[$permission] = lang("Auth.podcast_permissions.{$permission}", [ + 'id' => '{id}', + ]); + $this->permissions[$permission] = lang("Auth.podcast_permissions.{$permission}", [ + 'id' => '{id}', + ]); + } + } + + public function generatePodcastAuthorizations(int $podcastId): void + { + foreach ($this->podcastBaseGroups as $group) { + $podcastGroup = 'podcast#' . $podcastId . '-' . $group; + $this->groups[$podcastGroup] = [ + 'title' => lang("Auth.podcast_groups.{$group}.title", [ + 'id' => $podcastId, + ]), + 'description' => lang("Auth.podcast_groups.{$group}.description", [ + 'id' => $podcastId, + ]), + ]; + } + + foreach ($this->podcastBasePermissions as $permission) { + $podcastPermission = 'podcast#' . $podcastId . '.' . $permission; + $this->permissions[$podcastPermission] = lang("Auth.podcast_permissions.{$permission}", [ + 'id' => $podcastId, + ]); + } + + foreach ($this->podcastMatrix as $group => $permissionWildcards) { + $podcastGroup = 'podcast#' . $podcastId . '-' . $group; + foreach ($permissionWildcards as $permissionWildcard) { + $podcastPermissionWildcard = 'podcast#' . $podcastId . '.' . $permissionWildcard; + $this->matrix[$podcastGroup][] = $podcastPermissionWildcard; + } + } + } +} diff --git a/modules/Auth/Config/AuthRoutes.php b/modules/Auth/Config/AuthRoutes.php new file mode 100644 index 00000000..314203fa --- /dev/null +++ b/modules/Auth/Config/AuthRoutes.php @@ -0,0 +1,42 @@ + [ + ['get', 'register', 'RegisterController::registerView', 'register'], + ['post', 'register', 'RegisterController::registerAction'], + ], + 'login' => [ + ['get', 'login', 'LoginController::loginView', 'login'], + ['post', 'login', 'LoginController::loginAction'], + ], + 'magic-link' => [ + [ + 'get', + 'login/magic-link', + 'MagicLinkController::loginView', + 'magic-link', // Route name + ], + ['post', 'login/magic-link', 'MagicLinkController::loginAction'], + [ + 'get', + 'login/verify-magic-link', + 'MagicLinkController::verify', + 'verify-magic-link', // Route name + ], + ], + 'logout' => [['get', 'logout', 'LoginController::logoutAction', 'logout']], + 'auth-actions' => [ + ['get', 'auth/a/show', 'ActionController::show', 'auth-action-show'], + ['post', 'auth/a/handle', 'ActionController::handle', 'auth-action-handle'], + ['post', 'auth/a/verify', 'ActionController::verify', 'auth-action-verify'], + ], + ]; +} diff --git a/modules/Auth/Config/Events.php b/modules/Auth/Config/Events.php new file mode 100644 index 00000000..36b0cf2a --- /dev/null +++ b/modules/Auth/Config/Events.php @@ -0,0 +1,14 @@ +routes($routes); + +// Admin routes for users and podcast contributors $routes->group( - config('Auth') + config('Admin') ->gateway, [ 'namespace' => 'Modules\Auth\Controllers', ], static function ($routes): void { - // Login/out - $routes->get('login', 'AuthController::login', [ - 'as' => 'login', + $routes->get('magic-link-set-password', 'MagicLinkController::setPasswordView', [ + 'as' => 'magic-link-set-password', ]); - $routes->post('login', 'AuthController::attemptLogin'); - $routes->get('logout', 'AuthController::logout', [ - 'as' => 'logout', - ]); - // Registration - $routes->get('register', 'AuthController::register', [ - 'as' => 'register', - ]); - $routes->post('register', 'AuthController::attemptRegister'); - // Activation - $routes->get('activate-account', 'AuthController::activateAccount', [ - 'as' => 'activate-account', - ]); - $routes->get( - 'resend-activate-account', - 'AuthController::resendActivateAccount', - [ - 'as' => 'resend-activate-account', - ], - ); - // Forgot/Resets - $routes->get('forgot', 'AuthController::forgotPassword', [ - 'as' => 'forgot', - ]); - $routes->post('forgot', 'AuthController::attemptForgot'); - $routes->get('reset-password', 'AuthController::resetPassword', [ - 'as' => 'reset-password', - ]); - $routes->post('reset-password', 'AuthController::attemptReset'); - // interacting as an actor - $routes->post('interact-as-actor', 'AuthController::attemptInteractAsActor', [ + $routes->post('magic-link-set-password', 'MagicLinkController::setPasswordAction'); + + $routes->post('interact-as-actor', 'InteractController::attemptInteractAsActor', [ 'as' => 'interact-as-actor', ]); + + // Users + $routes->group('users', static function ($routes): void { + $routes->get('/', 'UserController::list', [ + 'as' => 'user-list', + 'filter' => 'permission:users.manage', + ]); + $routes->get('new', 'UserController::create', [ + 'as' => 'user-create', + 'filter' => 'permission:users.manage', + ]); + $routes->post('new', 'UserController::attemptCreate', [ + 'filter' => 'permission:users.manage', + ]); + // User + $routes->group('(:num)', static function ($routes): void { + $routes->get('/', 'UserController::view/$1', [ + 'as' => 'user-view', + 'filter' => 'permission:users.manage', + ]); + $routes->get('edit', 'UserController::edit/$1', [ + 'as' => 'user-edit', + 'filter' => 'permission:users.manage', + ]); + $routes->post('edit', 'UserController::attemptEdit/$1', [ + 'filter' => 'permission:users.manage', + ]); + $routes->get('delete', 'UserController::delete/$1', [ + 'as' => 'user-delete', + 'filter' => 'permission:users.manage', + ]); + $routes->post('delete', 'UserController::attemptDelete/$1', [ + 'as' => 'user-delete', + 'filter' => 'permission:users.manage', + ]); + }); + }); + // My account + $routes->group('my-account', static function ($routes): void { + $routes->get('/', 'MyAccountController', [ + 'as' => 'my-account', + ]); + $routes->get('change-password', 'MyAccountController::changePassword', [ + 'as' => 'change-password', + ],); + $routes->post('change-password', 'MyAccountController::attemptChange'); + }); + + // Podcast contributors + $routes->group('podcasts/(:num)/contributors', static function ($routes): void { + $routes->get('/', 'ContributorController::list/$1', [ + 'as' => 'contributor-list', + 'filter' => + 'permission:podcast#.manage-contributors', + ]); + $routes->get('add', 'ContributorController::add/$1', [ + 'as' => 'contributor-add', + 'filter' => 'permission:podcast#.manage-contributors', + ]); + $routes->post( + 'add', + 'ContributorController::attemptAdd/$1', + [ + 'filter' => + 'permission:podcast#.manage-contributors', + ], + ); + // Contributor + $routes->group('(:num)', static function ($routes): void { + $routes->get('/', 'ContributorController::view/$1/$2', [ + 'as' => 'contributor-view', + 'filter' => + 'permission:podcast#.manage-contributors', + ]); + $routes->get( + 'edit', + 'ContributorController::edit/$1/$2', + [ + 'as' => 'contributor-edit', + 'filter' => + 'permission:podcast#.manage-contributors', + ], + ); + $routes->post( + 'edit', + 'ContributorController::attemptEdit/$1/$2', + [ + 'filter' => + 'permission:podcast#.manage-contributors', + ], + ); + $routes->get( + 'remove', + 'ContributorController::remove/$1/$2', + [ + 'as' => 'contributor-remove', + 'filter' => + 'permission:podcast#.manage-contributors', + ], + ); + $routes->post( + 'remove', + 'ContributorController::attemptRemove/$1/$2', + [ + 'filter' => + 'permission:podcast#.manage-contributors', + ], + ); + }); + }); } ); diff --git a/modules/Auth/Config/Services.php b/modules/Auth/Config/Services.php index 71b8129c..f3dd45f7 100644 --- a/modules/Auth/Config/Services.php +++ b/modules/Auth/Config/Services.php @@ -4,87 +4,23 @@ declare(strict_types=1); namespace Modules\Auth\Config; -use App\Models\UserModel; -use CodeIgniter\Config\BaseService; -use CodeIgniter\Model; -use Modules\Auth\Authorization\FlatAuthorization; -use Modules\Auth\Authorization\GroupModel; -use Modules\Auth\Authorization\PermissionModel; -use Myth\Auth\Models\LoginModel; +use CodeIgniter\Shield\Authentication\Authentication; +use Config\Services as BaseService; +use Modules\Auth\Auth; -/** - * Services Configuration file. - * - * Services are simply other classes/libraries that the system uses to do its job. This is used by CodeIgniter to allow - * the core of the framework to be swapped out easily without affecting the usage within the rest of your application. - * - * This file holds any application-specific services, or service overrides that you might need. An example has been - * included with the general method format you should use for your service methods. For more examples, see the core - * Services file at system/Config/Services.php. - */ class Services extends BaseService { /** - * @return mixed + * The base auth class */ - public static function authentication( - string $lib = 'local', - Model $userModel = null, - Model $loginModel = null, - bool $getShared = true - ) { + public static function auth(bool $getShared = true): Auth + { if ($getShared) { - return self::getSharedInstance('authentication', $lib, $userModel, $loginModel); + return self::getSharedInstance('auth'); } - // config() checks first in app/Config $config = config('Auth'); - $class = $config->authenticationLibs[$lib]; - - $instance = new $class($config); - - if ($userModel === null) { - $userModel = new UserModel(); - } - - if ($loginModel === null) { - $loginModel = new LoginModel(); - } - - return $instance->setUserModel($userModel) - ->setLoginModel($loginModel); - } - - /** - * @return mixed|$this - */ - public static function authorization( - Model $groupModel = null, - Model $permissionModel = null, - Model $userModel = null, - bool $getShared = true - ) { - if ($getShared) { - return self::getSharedInstance('authorization', $groupModel, $permissionModel, $userModel); - } - - if ($groupModel === null) { - $groupModel = new GroupModel(); - } - - if ($permissionModel === null) { - $permissionModel = new PermissionModel(); - } - - /* @phpstan-ignore-next-line */ - $instance = new FlatAuthorization($groupModel, $permissionModel); - - if ($userModel === null) { - $userModel = new UserModel(); - } - - /* @phpstan-ignore-next-line */ - return $instance->setUserModel($userModel); + return new Auth(new Authentication($config)); } } diff --git a/modules/Auth/Controllers/ActionController.php b/modules/Auth/Controllers/ActionController.php new file mode 100644 index 00000000..e9db4ab3 --- /dev/null +++ b/modules/Auth/Controllers/ActionController.php @@ -0,0 +1,29 @@ +config->allowRegistration) { - return redirect() - ->back() - ->withInput() - ->with('error', lang('Auth.registerDisabled')); - } - - $users = model('UserModel'); - - // Validate here first, since some things, - // like the password, can only be validated properly here. - $rules = [ - 'username' => - 'required|alpha_numeric_space|min_length[3]|is_unique[users.username]', - 'email' => 'required|valid_email|is_unique[users.email]', - 'password' => 'required|strong_password', - ]; - - if (! $this->validate($rules)) { - return redirect() - ->back() - ->withInput() - ->with('errors', service('validation')->getErrors()); - } - - // Save the user - $allowedPostFields = array_merge(['password'], $this->config->validFields, $this->config->personalFields); - $user = new User($this->request->getPost($allowedPostFields)); - - $this->config->requireActivation === null - ? $user->activate() - : $user->generateActivateHash(); - - // Ensure default group gets assigned if set - if ($this->config->defaultUserGroup !== null) { - $users = $users->withGroup($this->config->defaultUserGroup); - } - - if (! $users->save($user)) { - return redirect() - ->back() - ->withInput() - ->with('errors', $users->errors()); - } - - if ($this->config->requireActivation !== null) { - $activator = service('activator'); - $sent = $activator->send($user); - - if (! $sent) { - return redirect() - ->back() - ->withInput() - ->with('error', $activator->error() ?? lang('Auth.unknownError')); - } - - // Success! - return redirect() - ->route('login') - ->with('message', lang('Auth.activationSuccess')); - } - - // Success! - return redirect() - ->route('login') - ->with('message', lang('Auth.registerSuccess')); - } - - /** - * Verifies the code with the email and saves the new password, if they all pass validation. - */ - public function attemptReset(): RedirectResponse - { - if ($this->config->activeResetter === null) { - return redirect() - ->route('login') - ->with('error', lang('Auth.forgotDisabled')); - } - - $users = model('UserModel'); - - // First things first - log the reset attempt. - $users->logResetAttempt( - $this->request->getPost('email'), - $this->request->getPost('token'), - $this->request->getIPAddress(), - (string) $this->request->getUserAgent(), - ); - - $rules = [ - 'token' => 'required', - 'email' => 'required|valid_email', - 'password' => 'required|strong_password', - ]; - - if (! $this->validate($rules)) { - return redirect() - ->back() - ->withInput() - ->with('errors', $users->errors()); - } - - $user = $users - ->where('email', $this->request->getPost('email')) - ->where('reset_hash', $this->request->getPost('token')) - ->first(); - - if ($user === null) { - return redirect() - ->back() - ->with('error', lang('Auth.forgotNoUser')); - } - - // Reset token still valid? - if ( - $user->reset_expires !== null && - time() > $user->reset_expires->getTimestamp() - ) { - return redirect() - ->back() - ->withInput() - ->with('error', lang('Auth.resetTokenExpired')); - } - - // Success! Save the new password, and cleanup the reset hash. - $user->password = $this->request->getPost('password'); - $user->reset_hash = null; - $user->reset_at = date('Y-m-d H:i:s'); - $user->reset_expires = null; - $user->force_pass_reset = false; - $users->save($user); - - helper('auth'); - - // set interact_as_actor_id value - $userPodcasts = $user->podcasts; - if ($userPodcasts = $user->podcasts) { - set_interact_as_actor($userPodcasts[0]->actor_id); - } - - return redirect() - ->route('login') - ->with('message', lang('Auth.resetSuccess')); - } - - public function attemptInteractAsActor(): RedirectResponse - { - $rules = [ - 'actor_id' => 'required|numeric', - ]; - - if (! $this->validate($rules)) { - return redirect() - ->back() - ->withInput() - ->with('errors', service('validation')->getErrors()); - } - - helper('auth'); - - set_interact_as_actor((int) $this->request->getPost('actor_id')); - - return redirect()->back(); - } -} diff --git a/modules/Auth/Controllers/ContributorController.php b/modules/Auth/Controllers/ContributorController.php new file mode 100644 index 00000000..d40f0581 --- /dev/null +++ b/modules/Auth/Controllers/ContributorController.php @@ -0,0 +1,243 @@ +getPodcastById((int) $params[0])) === null) { + throw PageNotFoundException::forPageNotFound(); + } + + $this->podcast = $podcast; + + if (count($params) <= 1) { + return $this->{$method}(); + } + + if (($this->contributor = (new UserModel())->getPodcastContributor( + (int) $params[1], + (int) $params[0] + )) !== null) { + return $this->{$method}(); + } + + throw PageNotFoundException::forPageNotFound(); + } + + public function list(): string + { + $data = [ + 'podcast' => $this->podcast, + ]; + + replace_breadcrumb_params([ + 0 => $this->podcast->at_handle, + ]); + return view('contributor/list', $data); + } + + public function view(): string + { + $data = [ + 'podcast' => $this->podcast, + 'contributor' => (new UserModel())->getPodcastContributor($this->contributor->id, $this->podcast->id), + ]; + + replace_breadcrumb_params([ + 0 => $this->podcast->at_handle, + 1 => $this->contributor->username, + ]); + return view('contributor/view', $data); + } + + public function add(): string + { + helper('form'); + + $users = (new UserModel())->findAll(); + $contributorOptions = array_reduce( + $users, + static function ($result, $user) { + $result[$user->id] = $user->username; + return $result; + }, + [], + ); + + $roles = setting('AuthGroups.podcastBaseGroups'); + $roleOptions = []; + array_walk( + $roles, + static function ($role, $key) use (&$roleOptions): array { + $roleOptions[$role] = lang('Auth.podcast_groups.' . $role . '.title'); + return $roleOptions; + }, + [], + ); + + $data = [ + 'podcast' => $this->podcast, + 'contributorOptions' => $contributorOptions, + 'roleOptions' => $roleOptions, + ]; + + replace_breadcrumb_params([ + 0 => $this->podcast->at_handle, + ]); + return view('contributor/add', $data); + } + + public function attemptAdd(): RedirectResponse + { + $user = (new UserModel())->find((int) $this->request->getPost('user')); + + if (get_podcast_group($user, $this->podcast->id)) { + return redirect() + ->back() + ->withInput() + ->with('errors', [lang('Contributor.messages.alreadyAddedError')]); + } + + add_podcast_group($user, $this->podcast->id, $this->request->getPost('role')); + + return redirect()->route('contributor-list', [$this->podcast->id]); + } + + public function edit(): string|RedirectResponse + { + helper('form'); + + $roles = setting('AuthGroups.podcastBaseGroups'); + $roleOptions = []; + array_walk( + $roles, + static function ($role) use (&$roleOptions): array { + $roleOptions[$role] = lang('Auth.podcast_groups.' . $role . '.title'); + return $roleOptions; + }, + [], + ); + + $contributorGroup = get_podcast_group($this->contributor, $this->podcast->id); + + if ($contributorGroup === null) { + return redirect() + ->back() + ->withInput() + ->with('errors', [lang('Contributor.messages.notAddedError')]); + } + + $data = [ + 'podcast' => $this->podcast, + 'contributor' => $this->contributor, + 'contributorGroup' => $contributorGroup, + 'roleOptions' => $roleOptions, + ]; + + replace_breadcrumb_params([ + 0 => $this->podcast->at_handle, + 1 => $this->contributor->username, + ]); + return view('contributor/edit', $data); + } + + public function attemptEdit(): RedirectResponse + { + // forbid updating a podcast owner + if ($this->podcast->created_by === $this->contributor->id) { + return redirect() + ->back() + ->with('errors', [lang('Contributor.messages.editOwnerError')]); + } + + $group = $this->request->getPost('role'); + + set_podcast_group($this->contributor, $this->podcast->id, $group); + + cache() + ->delete("podcast#{$this->podcast->id}_contributors"); + + return redirect()->route('contributor-list', [$this->podcast->id])->with( + 'message', + lang('Contributor.messages.editSuccess') + ); + } + + public function remove(): string + { + helper('form'); + + $data = [ + 'podcast' => $this->podcast, + 'contributor' => $this->contributor, + ]; + + replace_breadcrumb_params([ + 0 => $this->podcast->at_handle, + 1 => $this->contributor->username, + ]); + return view('contributor/delete', $data); + } + + public function attemptRemove(): RedirectResponse + { + if ($this->podcast->created_by === $this->contributor->id) { + return redirect() + ->back() + ->with('errors', [lang('Contributor.messages.removeOwnerError')]); + } + + $rules = [ + 'understand' => 'required', + ]; + + if (! $this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + cache() + ->delete("podcast#{$this->podcast->id}_contributors"); + + // remove contributor from podcast group + $this->contributor->removeGroup(get_podcast_group($this->contributor, $this->podcast->id)); + + return redirect() + ->route('contributor-list', [$this->podcast->id]) + ->with( + 'message', + lang('Contributor.messages.removeSuccess', [ + 'username' => $this->contributor->username, + 'podcastTitle' => $this->podcast->title, + ]), + ); + } +} diff --git a/modules/Auth/Controllers/InteractController.php b/modules/Auth/Controllers/InteractController.php new file mode 100644 index 00000000..b917149b --- /dev/null +++ b/modules/Auth/Controllers/InteractController.php @@ -0,0 +1,36 @@ + 'required|numeric', + ]; + + if (! $this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', service('validation')->getErrors()); + } + + helper('auth'); + + set_interact_as_actor((int) $this->request->getPost('actor_id')); + + return redirect()->back(); + } +} diff --git a/modules/Auth/Controllers/LoginController.php b/modules/Auth/Controllers/LoginController.php new file mode 100644 index 00000000..75163cd6 --- /dev/null +++ b/modules/Auth/Controllers/LoginController.php @@ -0,0 +1,24 @@ +to(config('Auth')->loginRedirect()); + } + + return view(setting('Auth.views')['magic-link-set-password']); + } + + public function setPasswordAction(): RedirectResponse + { + $rules = [ + 'new_password' => 'required|strong_password', + ]; + + $userModel = new UserModel(); + if (! $this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $userModel->errors()); + } + + // set new password to user + auth() + ->user() + ->password = $this->request->getPost('new_password'); + + if (! $userModel->update(auth()->user()->id, auth()->user())) { + return redirect() + ->back() + ->withInput() + ->with('errors', $userModel->errors()); + } + + // remove magic login session to reinstate normal check + if (session('magicLogin')) { + session()->removeTempdata('magicLogin'); + } + + // Success! + return redirect()->to(config('Auth')->loginRedirect()) + ->with('message', lang('MyAccount.messages.passwordChangeSuccess')); + } +} diff --git a/modules/Admin/Controllers/MyAccountController.php b/modules/Auth/Controllers/MyAccountController.php similarity index 73% rename from modules/Admin/Controllers/MyAccountController.php rename to modules/Auth/Controllers/MyAccountController.php index 8ffa0247..afa368ca 100644 --- a/modules/Admin/Controllers/MyAccountController.php +++ b/modules/Auth/Controllers/MyAccountController.php @@ -8,11 +8,11 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace Modules\Admin\Controllers; +namespace Modules\Auth\Controllers; -use App\Models\UserModel; use CodeIgniter\HTTP\RedirectResponse; -use Config\Services; +use Modules\Admin\Controllers\BaseController; +use Modules\Auth\Models\UserModel; class MyAccountController extends BaseController { @@ -30,16 +30,12 @@ class MyAccountController extends BaseController public function attemptChange(): RedirectResponse { - $auth = Services::authentication(); - $userModel = new UserModel(); - - // Validate here first, since some things, - // like the password, can only be validated properly here. $rules = [ 'password' => 'required', 'new_password' => 'required|strong_password|differs[password]', ]; + $userModel = new UserModel(); if (! $this->validate($rules)) { return redirect() ->back() @@ -47,23 +43,28 @@ class MyAccountController extends BaseController ->with('errors', $userModel->errors()); } + // check credentials with the old password if logged in without magic link $credentials = [ - 'email' => user() + 'email' => auth() + ->user() ->email, 'password' => $this->request->getPost('password'), ]; - if (! $auth->validate($credentials)) { - return redirect() - ->back() - ->withInput() + $validCreds = auth() + ->check($credentials); + + if (! $validCreds->isOK()) { + return redirect()->back() ->with('error', lang('MyAccount.messages.wrongPasswordError')); } - user() + // set new password to user + auth() + ->user() ->password = $this->request->getPost('new_password'); - if (! $userModel->update(user_id(), user())) { + if (! $userModel->update(auth()->user()->id, auth()->user())) { return redirect() ->back() ->withInput() diff --git a/modules/Auth/Controllers/RegisterController.php b/modules/Auth/Controllers/RegisterController.php new file mode 100644 index 00000000..b54c0d9c --- /dev/null +++ b/modules/Auth/Controllers/RegisterController.php @@ -0,0 +1,29 @@ +{$method}(); + } + + if ($this->user = (new UserModel())->find($params[0])) { + return $this->{$method}(); + } + + throw PageNotFoundException::forPageNotFound(); + } + + public function list(): string + { + $data = [ + 'users' => (new UserModel())->findAll(), + ]; + + return view('user/list', $data); + } + + public function view(): string + { + $data = [ + 'user' => $this->user, + ]; + + replace_breadcrumb_params([ + 0 => $this->user->username, + ]); + return view('user/view', $data); + } + + public function create(): string + { + helper('form'); + + $roles = setting('AuthGroups.instanceGroups'); + $roleOptions = []; + array_walk( + $roles, + static function ($role, $key) use (&$roleOptions): array { + $roleOptions[$key] = $role['title']; + return $roleOptions; + }, + [], + ); + + $data = [ + 'roleOptions' => $roleOptions, + ]; + + return view('user/create', $data); + } + + /** + * Create the user with the provided username and email. The password is set as a random string and a magic link is + * sent to the user to allow them setting their password. + */ + public function attemptCreate(): RedirectResponse + { + helper('text'); + + $db = db_connect(); + $db->transStart(); + + $userModel = new UserModel(); + + // Save the user + $email = $this->request->getPost('email'); + $user = new User([ + 'username' => $this->request->getPost('username'), + 'email' => $email, + // set a random password + // user will be prompted to change it on first magic link login. + 'password' => random_string('alnum', 32), + ]); + try { + $userModel->save($user); + } catch (ValidationException) { + return redirect()->back() + ->withInput() + ->with('errors', $userModel->errors()); + } + + $user = $userModel->findById($userModel->getInsertID()); + $user->addGroup($this->request->getPost('role')); + + // **** SEND WELCOME LINK FOR FIRST LOGIN **** + + /** @var UserIdentityModel $identityModel */ + $identityModel = model(UserIdentityModel::class); + + // Delete any previous magic-link identities + $identityModel->deleteIdentitiesByType($user, Session::ID_TYPE_MAGIC_LINK); + + // Generate the code and save it as an identity + $token = random_string('crypto', 20); + + $identityModel->insert([ + 'user_id' => $user->id, + 'type' => Session::ID_TYPE_MAGIC_LINK, + 'secret' => $token, + 'expires' => Time::now()->addSeconds(setting('Auth.welcomeLinkLifetime'))->format('Y-m-d H:i:s'), + ]); + + // Send the user an email with the code + $email = emailer() + ->setFrom(setting('Email.fromEmail'), setting('Email.fromName') ?? ''); + $email->setTo($user->email); + $email->setSubject(lang('Auth.welcomeSubject', [ + 'siteName' => setting('App.siteName'), + ], null, false)); + $email->setMessage(view(setting('Auth.views')['welcome-email'], [ + 'token' => $token, + ], [ + 'theme' => 'auth', + ])); + + if (! $email->send(false)) { + log_message('error', $email->printDebugger(['headers'])); + + return redirect()->back() + ->with('error', lang('Auth.unableSendEmailToUser', [$user->email])); + } + + // Clear the email + $email->clear(); + + $db->transComplete(); + + // Success! + return redirect() + ->route('user-list') + ->with('message', lang('User.messages.createSuccess', [ + 'username' => $user->username, + ])); + } + + public function edit(): string + { + helper('form'); + + $roles = setting('AuthGroups.instanceGroups'); + $roleOptions = []; + array_walk( + $roles, + static function ($role, $key) use (&$roleOptions): array { + $roleOptions[$key] = $role['title']; + return $roleOptions; + }, + [], + ); + + $data = [ + 'user' => $this->user, + 'roleOptions' => $roleOptions, + ]; + + replace_breadcrumb_params([ + 0 => $this->user->username, + ]); + return view('user/edit', $data); + } + + public function attemptEdit(): RedirectResponse + { + // The instance owner is a superadmin and the only user that cannot be demoted. + if ((bool) $this->user->is_owner) { + return redirect() + ->back() + ->with('errors', [ + lang('User.messages.editOwnerError', [ + 'username' => $this->user->username, + ]), + ]); + } + + $group = $this->request->getPost('role'); + + set_instance_group($this->user, $group); + + // Success! + return redirect() + ->route('user-list') + ->with('message', lang('User.messages.roleEditSuccess', [ + 'username' => $this->user->username, + ])); + } + + public function delete(): string + { + helper(['form']); + + $data = [ + 'user' => $this->user, + ]; + + replace_breadcrumb_params([ + 0 => $this->user->username, + ]); + return view('user/delete', $data); + } + + public function attemptDelete(): RedirectResponse + { + // You cannot delete the instance owner. + if ((bool) $this->user->is_owner) { + return redirect() + ->back() + ->with('errors', [ + lang('User.messages.deleteOwnerError', [ + 'username' => $this->user->username, + ]), + ]); + } + + // You cannot delete a superadmin + // superadmin has to be demoted before being deleted + if ($this->user->inGroup(setting('AuthGroups.mostPowerfulPodcastGroup'))) { + return redirect() + ->back() + ->with('errors', [ + lang('User.messages.deleteSuperAdminError', [ + 'username' => $this->user->username, + ]), + ]); + } + + $rules = [ + 'understand' => 'required', + ]; + + if (! $this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + (new UserModel())->delete($this->user->id, true); + + return redirect() + ->route('user-list') + ->with('message', lang('User.messages.deleteSuccess', [ + 'username' => $this->user->username, + ])); + } +} diff --git a/modules/Auth/Database/Migrations/2020-07-03-191500_add_podcasts_users.php b/modules/Auth/Database/Migrations/2020-07-03-191500_add_podcasts_users.php deleted file mode 100644 index b6535c4a..00000000 --- a/modules/Auth/Database/Migrations/2020-07-03-191500_add_podcasts_users.php +++ /dev/null @@ -1,46 +0,0 @@ -forge->addField([ - 'podcast_id' => [ - 'type' => 'INT', - 'unsigned' => true, - ], - 'user_id' => [ - 'type' => 'INT', - 'unsigned' => true, - ], - 'group_id' => [ - 'type' => 'INT', - 'unsigned' => true, - ], - ]); - $this->forge->addPrimaryKey(['user_id', 'podcast_id']); - $this->forge->addForeignKey('user_id', 'users', 'id', '', 'CASCADE'); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id', '', 'CASCADE'); - $this->forge->addForeignKey('group_id', 'auth_groups', 'id', '', 'CASCADE'); - $this->forge->createTable('podcasts_users'); - } - - public function down(): void - { - $this->forge->dropTable('podcasts_users'); - } -} diff --git a/modules/Auth/Database/Migrations/2020-12-29-100000_add_is_owner_to_users.php b/modules/Auth/Database/Migrations/2020-12-29-100000_add_is_owner_to_users.php new file mode 100644 index 00000000..aa587ba4 --- /dev/null +++ b/modules/Auth/Database/Migrations/2020-12-29-100000_add_is_owner_to_users.php @@ -0,0 +1,31 @@ + [ + 'type' => 'TINYINT', + 'constraint' => 1, + 'default' => 0, + 'null' => false, + ], + ]; + + $this->forge->addColumn('users', $fields); + } + + public function down(): void + { + $fields = ['is_owner']; + $this->forge->dropColumn('users', $fields); + } +} diff --git a/modules/Auth/Database/Seeds/.gitkeep b/modules/Auth/Database/Seeds/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/Auth/Database/Seeds/AuthSeeder.php b/modules/Auth/Database/Seeds/AuthSeeder.php deleted file mode 100644 index 976c904b..00000000 --- a/modules/Auth/Database/Seeds/AuthSeeder.php +++ /dev/null @@ -1,302 +0,0 @@ -[] - */ - protected array $groups = [ - [ - 'name' => 'superadmin', - 'description' => - 'Somebody who has access to all the castopod instance features', - ], - [ - 'name' => 'podcast_admin', - 'description' => - 'Somebody who has access to all the features within a given podcast', - ], - ]; - - /** - * Build permissions array as a list of: - * - * ``` context => [ [action, description], [action, description], ... ] ``` - * - * @var array[]> - */ - protected array $permissions = [ - 'users' => [ - [ - 'name' => 'create', - 'description' => 'Create a user', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'list', - 'description' => 'List all users', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'view', - 'description' => 'View any user info', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'manage_authorizations', - 'description' => 'Add or remove roles/permissions to a user', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'manage_bans', - 'description' => 'Ban / unban a user', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'force_pass_reset', - 'description' => - 'Force a user to update his password upon next login', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'delete', - 'description' => - 'Delete user without removing him from database', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'delete_permanently', - 'description' => - 'Delete all occurrences of a user from the database', - 'has_permission' => ['superadmin'], - ], - ], - 'pages' => [ - [ - 'name' => 'manage', - 'description' => 'List / create / edit / delete pages', - 'has_permission' => ['superadmin'], - ], - ], - 'podcasts' => [ - [ - 'name' => 'create', - 'description' => 'Add a new podcast', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'import', - 'description' => 'Import a new podcast from an external feed', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'list', - 'description' => 'List all podcasts and their episodes', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'view', - 'description' => 'View any podcast and their contributors list', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'delete', - 'description' => 'Delete any podcast from the database', - 'has_permission' => ['superadmin'], - ], - ], - 'episodes' => [ - [ - 'name' => 'list', - 'description' => 'List all episodes of any podcast', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'view', - 'description' => 'View any episode of any podcast', - 'has_permission' => ['superadmin'], - ], - ], - 'podcast' => [ - [ - 'name' => 'view', - 'description' => 'View a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'edit', - 'description' => 'Edit a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'manage_contributors', - 'description' => - 'Add / remove contributors to a podcast and edit their roles', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'manage_platforms', - 'description' => 'Set / remove platform links of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'manage_publications', - 'description' => - 'Publish / unpublish episodes & posts of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'interact_as', - 'description' => - 'Interact as the podcast to favourite / share or reply to posts.', - 'has_permission' => ['podcast_admin'], - ], - ], - 'podcast_episodes' => [ - [ - 'name' => 'list', - 'description' => 'List all episodes of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'view', - 'description' => 'View any episode of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'create', - 'description' => 'Add new episodes for a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'edit', - 'description' => 'Edit an episode of a podcast', - 'has_permission' => ['podcast_admin'], - ], - [ - 'name' => 'delete', - 'description' => - 'Delete all occurrences of an episode of a podcast from the database', - 'has_permission' => ['podcast_admin'], - ], - ], - 'person' => [ - [ - 'name' => 'create', - 'description' => 'Add a new person', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'list', - 'description' => 'List all persons', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'view', - 'description' => 'View any person', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'edit', - 'description' => 'Edit a person', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'delete', - 'description' => - 'Delete permanently any person from the database', - 'has_permission' => ['superadmin'], - ], - ], - 'fediverse' => [ - [ - 'name' => 'block_actors', - 'description' => - 'Block fediverse actors from interacting with the instance.', - 'has_permission' => ['superadmin'], - ], - [ - 'name' => 'block_domains', - 'description' => - 'Block fediverse domains from interacting with the instance.', - 'has_permission' => ['superadmin'], - ], - ], - ]; - - public function run(): void - { - $groupId = 0; - $dataGroups = []; - foreach ($this->groups as $group) { - $dataGroups[] = [ - 'id' => ++$groupId, - 'name' => $group['name'], - 'description' => $group['description'], - ]; - } - - // Map permissions to a format the `auth_permissions` table expects - $dataPermissions = []; - $dataGroupsPermissions = []; - $permissionId = 0; - foreach ($this->permissions as $context => $actions) { - foreach ($actions as $action) { - $dataPermissions[] = [ - 'id' => ++$permissionId, - 'name' => $context . '-' . $action['name'], - 'description' => $action['description'], - ]; - - foreach ($action['has_permission'] as $role) { - // link permission to specified groups - $dataGroupsPermissions[] = [ - 'group_id' => $this->getGroupIdByName($role, $dataGroups), - 'permission_id' => $permissionId, - ]; - } - } - } - - $this->db - ->table('auth_permissions') - ->ignore(true) - ->insertBatch($dataPermissions); - $this->db - ->table('auth_groups') - ->ignore(true) - ->insertBatch($dataGroups); - $this->db - ->table('auth_groups_permissions') - ->ignore(true) - ->insertBatch($dataGroupsPermissions); - } - - /** - * @param array[] $dataGroups - */ - public static function getGroupIdByName(string $name, array $dataGroups): ?int - { - foreach ($dataGroups as $group) { - if ($group['name'] === $name) { - return $group['id']; - } - } - - return null; - } -} diff --git a/modules/Auth/Entities/User.php b/modules/Auth/Entities/User.php deleted file mode 100644 index 312bde68..00000000 --- a/modules/Auth/Entities/User.php +++ /dev/null @@ -1,109 +0,0 @@ - - */ - protected $casts = [ - 'id' => 'integer', - 'active' => 'boolean', - 'force_pass_reset' => 'boolean', - 'podcast_id' => '?integer', - 'podcast_role' => '?string', - ]; - - public function getIsOwner(): bool - { - $firstUser = (new UserModel())->first(); - - if (! $firstUser instanceof self) { - return false; - } - - return $this->username === $firstUser->username; - } - - /** - * Returns the podcasts the user is contributing to - * - * @return Podcast[] - */ - public function getPodcasts(): array - { - if ($this->id === null) { - throw new RuntimeException('Users must be created before getting podcasts.'); - } - - if ($this->podcasts === null) { - $this->podcasts = (new PodcastModel())->getUserPodcasts($this->id); - } - - return $this->podcasts; - } - - /** - * Returns the ids of the user's actors that have unread notifications - * - * @return int[] - */ - public function getActorIdsWithUnreadNotifications(): array - { - if ($this->getPodcasts() === []) { - return []; - } - - $unreadNotifications = (new NotificationModel())->whereIn( - 'target_actor_id', - array_column($this->getPodcasts(), 'actor_id') - ) - ->where('read_at', null) - ->findAll(); - - return array_column($unreadNotifications, 'target_actor_id'); - } -} diff --git a/modules/Auth/Filters/PermissionFilter.php b/modules/Auth/Filters/PermissionFilter.php index 19824798..44d7b785 100644 --- a/modules/Auth/Filters/PermissionFilter.php +++ b/modules/Auth/Filters/PermissionFilter.php @@ -8,8 +8,8 @@ use App\Models\PodcastModel; use CodeIgniter\Filters\FilterInterface; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\Shield\Exceptions\RuntimeException; use Config\Services; -use Myth\Auth\Exceptions\PermissionException; class PermissionFilter implements FilterInterface { @@ -24,62 +24,49 @@ class PermissionFilter implements FilterInterface */ public function before(RequestInterface $request, $params = null) { - helper('auth'); - - if ($params === null) { + if (empty($params)) { return; } - $authenticate = Services::authentication(); - - // if no user is logged in then send to the login form - if (! $authenticate->check()) { - session()->set('redirect_url', current_url()); - return redirect('login'); + if (! function_exists('auth')) { + helper('auth'); } - helper('misc'); - $authorize = Services::authorization(); - $router = Services::router(); - $routerParams = $router->params(); - $result = false; + if (! auth()->loggedIn()) { + return redirect()->to('login'); + } + + $result = true; - // Check if user has at least one of the permissions foreach ($params as $permission) { - // check if permission is for a specific podcast - if ( - (str_starts_with($permission, 'podcast-') || - str_starts_with($permission, 'podcast_episodes-')) && - $routerParams !== [] - ) { - if ( - ($groupId = (new PodcastModel())->getContributorGroupId( - $authenticate->id(), - $routerParams[0], - )) && - $authorize->groupHasPermission($permission, $groupId) - ) { - $result = true; - break; + // does permission is specific to a podcast? + if (str_contains($permission, '#')) { + $router = Services::router(); + $routerParams = $router->params(); + + // get podcast id + $podcastId = null; + if (is_numeric($routerParams[0])) { + $podcastId = (int) $routerParams[0]; + } else { + $podcast = (new PodcastModel())->getPodcastByHandle($routerParams[0]); + if ($podcast !== null) { + $podcastId = $podcast->id; + } + } + + if ($podcastId !== null) { + $permission = str_replace('#', '#' . $podcastId, $permission); } - } elseif ( - $authorize->hasPermission($permission, $authenticate->id()) - ) { - $result = true; - break; } + + $result = $result && auth() + ->user() + ->can($permission); } if (! $result) { - if ($authenticate->silent()) { - $redirectURL = session('redirect_url') ?? '/'; - unset($_SESSION['redirect_url']); - return redirect() - ->to($redirectURL) - ->with('error', lang('Auth.notEnoughPrivilege')); - } - - throw new PermissionException(lang('Auth.notEnoughPrivilege')); + throw new RuntimeException(lang('Auth.notEnoughPrivilege'), 403); } } diff --git a/modules/Auth/Helpers/auth_helper.php b/modules/Auth/Helpers/auth_helper.php new file mode 100644 index 00000000..f382e3f4 --- /dev/null +++ b/modules/Auth/Helpers/auth_helper.php @@ -0,0 +1,296 @@ +setAuthenticator($alias); + } +} + +if (! function_exists('set_interact_as_actor')) { + /** + * Sets the actor id of which the user is acting as + */ + function set_interact_as_actor(int $actorId): void + { + if (auth()->loggedIn()) { + session() + ->set('interact_as_actor_id', $actorId); + } + } +} + +if (! function_exists('remove_interact_as_actor')) { + /** + * Removes the actor id of which the user is acting as + */ + function remove_interact_as_actor(): void + { + session()->remove('interact_as_actor_id'); + } +} + +if (! function_exists('interact_as_actor_id')) { + /** + * Sets the podcast id of which the user is acting as + */ + function interact_as_actor_id(): ?int + { + return session()->get('interact_as_actor_id'); + } +} + +if (! function_exists('interact_as_actor')) { + /** + * Get the actor the user is currently interacting as + */ + function interact_as_actor(): Actor | false + { + if (! auth()->loggedIn()) { + return false; + } + + $session = session(); + if (! $session->has('interact_as_actor_id')) { + return false; + } + + return model(ActorModel::class, false)->getActorById($session->get('interact_as_actor_id')); + } +} + +if (! function_exists('can_user_interact')) { + function can_user_interact(): bool + { + return (bool) interact_as_actor(); + } +} + +if (! function_exists('add_podcast_group')) { + function add_podcast_group(User $user, int $podcastId, string $group): User + { + $podcastGroup = 'podcast#' . $podcastId . '-' . $group; + + return $user->addGroup($podcastGroup); + } +} + +if (! function_exists('get_instance_group')) { + function get_instance_group(User $user): ?string + { + $instanceGroups = array_filter($user->getGroups() ?? [], static function ($group): bool { + return ! str_starts_with($group, 'podcast#'); + }); + + if ($instanceGroups === []) { + return null; + } + + $instanceGroup = array_shift($instanceGroups); + + // Verify that a user belongs to one group only! + if ($instanceGroups !== []) { + // remove any other group the user belongs to + $user->removeGroup(...$instanceGroups); + } + + return $instanceGroup; + } +} + +if (! function_exists('set_instance_group')) { + function set_instance_group(User $user, string $group): User + { + // remove old instance group + if (get_instance_group($user)) { + $user->removeGroup(get_instance_group($user)); + } + + // set new group + return $user->addGroup($group); + } +} + +if (! function_exists('get_podcast_group')) { + function get_podcast_group(User $user, int $podcastId): ?string + { + $podcastGroups = array_filter($user->getGroups() ?? [], static function ($group) use ($podcastId): bool { + return str_starts_with($group, "podcast#{$podcastId}"); + }); + + if ($podcastGroups === []) { + return null; + } + + $podcastGroup = array_shift($podcastGroups); + + // Verify that a user belongs to one group only! + if ($podcastGroups !== []) { + // remove any other group the user belongs to + $user->removeGroup(...$podcastGroups); + } + + // strip the `podcast#{id}.` prefix when returning group + return substr($podcastGroup, strlen('podcast#' . $podcastId . '-')); + } +} + +if (! function_exists('set_podcast_group')) { + function set_podcast_group(User $user, int $podcastId, string $group): User + { + // remove old instance group + $user->removeGroup("podcast#{$podcastId}-" . get_podcast_group($user, $podcastId)); + + // set new group + return add_podcast_group($user, $podcastId, $group); + } +} + +if (! function_exists('get_podcast_groups')) { + /** + * @return string[] + */ + function get_user_podcast_ids(User $user): array + { + $podcastGroups = array_filter($user->getGroups() ?? [], static function ($group): bool { + return str_starts_with($group, 'podcast#'); + }); + + $userPodcastIds = []; + // extract all podcast ids from groups + foreach ($podcastGroups as $podcastGroup) { + $userPodcastIds[] = substr($podcastGroup, strpos($podcastGroup, '#') + 1, 1); + } + + return $userPodcastIds; + } +} + +if (! function_exists('can_podcast')) { + function can_podcast(User $user, int $podcastId, string $permission): bool + { + return $user->can('podcast#' . $podcastId . '.' . $permission); + } +} + +if (! function_exists('get_user_podcasts')) { + /** + * Returns the podcasts the user is contributing to + * + * @return Podcast[] + */ + function get_user_podcasts(User $user): array + { + return (new PodcastModel())->getUserPodcasts($user->id, get_user_podcast_ids($user)); + } +} + +if (! function_exists('get_podcasts_user_can_interact_with')) { + /** + * @return Podcast[] + */ + function get_podcasts_user_can_interact_with(User $user): array + { + $userPodcasts = (new PodcastModel())->getUserPodcasts($user->id, get_user_podcast_ids($user)); + + $hasInteractAsPrivilege = interact_as_actor_id() === null; + + if ($userPodcasts === []) { + if ($hasInteractAsPrivilege) { + remove_interact_as_actor(); + } + + return []; + } + + $isInteractAsPrivilegeLost = true; + $podcastsUserCanInteractWith = []; + foreach ($userPodcasts as $userPodcast) { + if (can_podcast($user, $userPodcast->id, 'interact-as')) { + if (interact_as_actor_id() === $userPodcast->actor_id) { + $isInteractAsPrivilegeLost = false; + } + + $podcastsUserCanInteractWith[] = $userPodcast; + } + } + + if ($podcastsUserCanInteractWith === []) { + if (interact_as_actor_id() !== null) { + remove_interact_as_actor(); + } + + return []; + } + + // check if user has lost the interact as privilege for current podcast actor. + // --> Remove interact as if there's no podcast actor to interact as + // or set the first podcast actor the user can interact as + if ($isInteractAsPrivilegeLost) { + set_interact_as_actor($podcastsUserCanInteractWith[0]->actor_id); + } + + return $podcastsUserCanInteractWith; + } +} + +if (! function_exists('get_actor_ids_with_unread_notifications')) { + /** + * Returns the ids of the user's actors that have unread notifications + * + * @return int[] + */ + function get_actor_ids_with_unread_notifications(User $user): array + { + if (($userPodcasts = get_user_podcasts($user)) === []) { + return []; + } + + $unreadNotifications = (new NotificationModel())->whereIn( + 'target_actor_id', + array_column($userPodcasts, 'actor_id') + ) + ->where('read_at', null) + ->findAll(); + + return array_column($unreadNotifications, 'target_actor_id'); + } +} + +if (! function_exists('get_group_title')) { + /** + * @return array<'title'|'description', string> + */ + function get_group_info(string $group, ?int $podcastId = null): array + { + if ($podcastId === null) { + return setting('AuthGroups.instanceGroups')[$group]; + } + + return setting('AuthGroups.podcastGroups')[$group]; + } +} diff --git a/modules/Admin/Language/ar/Contributor.php b/modules/Auth/Language/ar/Contributor.php similarity index 100% rename from modules/Admin/Language/ar/Contributor.php rename to modules/Auth/Language/ar/Contributor.php diff --git a/modules/Admin/Language/ar/MyAccount.php b/modules/Auth/Language/ar/MyAccount.php similarity index 100% rename from modules/Admin/Language/ar/MyAccount.php rename to modules/Auth/Language/ar/MyAccount.php diff --git a/modules/Admin/Language/ar/User.php b/modules/Auth/Language/ar/User.php similarity index 90% rename from modules/Admin/Language/ar/User.php rename to modules/Auth/Language/ar/User.php index f2a33409..7607ad97 100644 --- a/modules/Admin/Language/ar/User.php +++ b/modules/Auth/Language/ar/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'احذف', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', 'banSuccess' => '{username} has been banned.', 'unbanSuccess' => '{username} has been unbanned.', 'editOwnerError' => diff --git a/modules/Admin/Language/br/Contributor.php b/modules/Auth/Language/br/Contributor.php similarity index 100% rename from modules/Admin/Language/br/Contributor.php rename to modules/Auth/Language/br/Contributor.php diff --git a/modules/Admin/Language/br/MyAccount.php b/modules/Auth/Language/br/MyAccount.php similarity index 100% rename from modules/Admin/Language/br/MyAccount.php rename to modules/Auth/Language/br/MyAccount.php diff --git a/modules/Admin/Language/br/User.php b/modules/Auth/Language/br/User.php similarity index 90% rename from modules/Admin/Language/br/User.php rename to modules/Auth/Language/br/User.php index 314e676a..1fa37c2a 100644 --- a/modules/Admin/Language/br/User.php +++ b/modules/Auth/Language/br/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Kemm rolloù {username}", - 'forcePassReset' => 'Force pass reset', 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Dilemel', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', 'banSuccess' => '{username} has been banned.', 'unbanSuccess' => '{username} has been unbanned.', 'editOwnerError' => diff --git a/modules/Admin/Language/ca/Contributor.php b/modules/Auth/Language/ca/Contributor.php similarity index 100% rename from modules/Admin/Language/ca/Contributor.php rename to modules/Auth/Language/ca/Contributor.php diff --git a/modules/Admin/Language/ca/MyAccount.php b/modules/Auth/Language/ca/MyAccount.php similarity index 100% rename from modules/Admin/Language/ca/MyAccount.php rename to modules/Auth/Language/ca/MyAccount.php diff --git a/modules/Admin/Language/ca/User.php b/modules/Auth/Language/ca/User.php similarity index 88% rename from modules/Admin/Language/ca/User.php rename to modules/Auth/Language/ca/User.php index 9e2f172a..d0065c45 100644 --- a/modules/Admin/Language/ca/User.php +++ b/modules/Auth/Language/ca/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Editar els rols de {username}", - 'forcePassReset' => 'Força el restabliment de la contrasenya', 'ban' => 'Bandejar', 'unban' => 'Re-admetre', 'delete' => 'Eliminar', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'S\'ha creat l\'usuari! Es demanarà a {username} un restabliment de la contrasenya durant la primera autenticació.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "S'han actualitzat correctament els rols de {username}.", - 'forcePassResetSuccess' => - 'Es demanarà a {username} un restabliment de contrasenya durant la següent visita.', 'banSuccess' => '{username} ha estat bandejat.', 'unbanSuccess' => '{username} ha estat desbandejat.', 'editOwnerError' => diff --git a/modules/Admin/Language/de/Contributor.php b/modules/Auth/Language/de/Contributor.php similarity index 100% rename from modules/Admin/Language/de/Contributor.php rename to modules/Auth/Language/de/Contributor.php diff --git a/modules/Admin/Language/de/MyAccount.php b/modules/Auth/Language/de/MyAccount.php similarity index 100% rename from modules/Admin/Language/de/MyAccount.php rename to modules/Auth/Language/de/MyAccount.php diff --git a/modules/Admin/Language/de/User.php b/modules/Auth/Language/de/User.php similarity index 88% rename from modules/Admin/Language/de/User.php rename to modules/Auth/Language/de/User.php index a4d261be..f6337ed4 100644 --- a/modules/Admin/Language/de/User.php +++ b/modules/Auth/Language/de/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Bearbeite {username}'s Rollen", - 'forcePassReset' => 'Erzwinge Pass-Zurücksetzung', 'ban' => 'Bannen', 'unban' => 'Entbannen', 'delete' => 'Löschen', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'Benutzer wurde erfolgreich erstellt! {username} wird bei der ersten Authentifizierung zu einer Passwortzurücksetzung aufgefordert.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "{username}'s Rollen wurden erfolgreich aktualisiert.", - 'forcePassResetSuccess' => - '{username} wird beim nächsten Besuch zu einem Zurücksetzen des Passworts aufgefordert.', 'banSuccess' => '{username} wurde gebannt.', 'unbanSuccess' => '{username} wurde entbannt.', 'editOwnerError' => diff --git a/modules/Admin/Language/el/Contributor.php b/modules/Auth/Language/el/Contributor.php similarity index 100% rename from modules/Admin/Language/el/Contributor.php rename to modules/Auth/Language/el/Contributor.php diff --git a/modules/Admin/Language/el/MyAccount.php b/modules/Auth/Language/el/MyAccount.php similarity index 100% rename from modules/Admin/Language/el/MyAccount.php rename to modules/Auth/Language/el/MyAccount.php diff --git a/modules/Admin/Language/gd/User.php b/modules/Auth/Language/el/User.php similarity index 89% rename from modules/Admin/Language/gd/User.php rename to modules/Auth/Language/el/User.php index 585d6799..fe3a9e1a 100644 --- a/modules/Admin/Language/gd/User.php +++ b/modules/Auth/Language/el/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', 'banSuccess' => '{username} has been banned.', 'unbanSuccess' => '{username} has been unbanned.', 'editOwnerError' => diff --git a/modules/Auth/Language/en/Auth.php b/modules/Auth/Language/en/Auth.php new file mode 100644 index 00000000..6928cf9b --- /dev/null +++ b/modules/Auth/Language/en/Auth.php @@ -0,0 +1,89 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Admin/Language/sv/Contributor.php b/modules/Auth/Language/en/Contributor.php similarity index 70% rename from modules/Admin/Language/sv/Contributor.php rename to modules/Auth/Language/en/Contributor.php index d0f3b93d..c70badc0 100644 --- a/modules/Admin/Language/sv/Contributor.php +++ b/modules/Auth/Language/en/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Add contributor', 'submit_edit' => 'Update role', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "You can't remove the podcast owner!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Admin/Language/en/MyAccount.php b/modules/Auth/Language/en/MyAccount.php similarity index 100% rename from modules/Admin/Language/en/MyAccount.php rename to modules/Auth/Language/en/MyAccount.php diff --git a/modules/Auth/Language/en/User.php b/modules/Auth/Language/en/User.php new file mode 100644 index 00000000..32ec560c --- /dev/null +++ b/modules/Auth/Language/en/User.php @@ -0,0 +1,60 @@ + "Edit {username}'s role", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'role' => 'Role', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'role' => 'Role', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Admin/Language/es/Contributor.php b/modules/Auth/Language/es/Contributor.php similarity index 100% rename from modules/Admin/Language/es/Contributor.php rename to modules/Auth/Language/es/Contributor.php diff --git a/modules/Admin/Language/es/MyAccount.php b/modules/Auth/Language/es/MyAccount.php similarity index 100% rename from modules/Admin/Language/es/MyAccount.php rename to modules/Auth/Language/es/MyAccount.php diff --git a/modules/Admin/Language/es/User.php b/modules/Auth/Language/es/User.php similarity index 88% rename from modules/Admin/Language/es/User.php rename to modules/Auth/Language/es/User.php index 1b37eec2..cf00d948 100644 --- a/modules/Admin/Language/es/User.php +++ b/modules/Auth/Language/es/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Editar rol de {username}", - 'forcePassReset' => 'Forzar el reseteo de la contraseña', 'ban' => 'Banear', 'unban' => 'Desbanear', 'delete' => 'Borrar', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => '¡Usuario creado con éxito! Se le pedirá a {username} que restablezca la contraseña en la primera autenticación.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "Los roles de {username} se han actualizado correctamente.", - 'forcePassResetSuccess' => - 'Se pedirá a {username} que restablezca su contraseña en la próxima visita.', 'banSuccess' => '{username} ha sido baneado.', 'unbanSuccess' => '{username} ha sido desbaneado.', 'editOwnerError' => diff --git a/modules/Admin/Language/en/Contributor.php b/modules/Auth/Language/fa/Contributor.php similarity index 100% rename from modules/Admin/Language/en/Contributor.php rename to modules/Auth/Language/fa/Contributor.php diff --git a/modules/Admin/Language/fa/MyAccount.php b/modules/Auth/Language/fa/MyAccount.php similarity index 100% rename from modules/Admin/Language/fa/MyAccount.php rename to modules/Auth/Language/fa/MyAccount.php diff --git a/modules/Admin/Language/el/User.php b/modules/Auth/Language/fa/User.php similarity index 89% rename from modules/Admin/Language/el/User.php rename to modules/Auth/Language/fa/User.php index 585d6799..fe3a9e1a 100644 --- a/modules/Admin/Language/el/User.php +++ b/modules/Auth/Language/fa/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', 'banSuccess' => '{username} has been banned.', 'unbanSuccess' => '{username} has been unbanned.', 'editOwnerError' => diff --git a/modules/Admin/Language/fr/Contributor.php b/modules/Auth/Language/fr/Contributor.php similarity index 100% rename from modules/Admin/Language/fr/Contributor.php rename to modules/Auth/Language/fr/Contributor.php diff --git a/modules/Admin/Language/fr/MyAccount.php b/modules/Auth/Language/fr/MyAccount.php similarity index 100% rename from modules/Admin/Language/fr/MyAccount.php rename to modules/Auth/Language/fr/MyAccount.php diff --git a/modules/Admin/Language/fr/User.php b/modules/Auth/Language/fr/User.php similarity index 89% rename from modules/Admin/Language/fr/User.php rename to modules/Auth/Language/fr/User.php index c5d33a12..27283ed9 100644 --- a/modules/Admin/Language/fr/User.php +++ b/modules/Auth/Language/fr/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Modifier les rôles de {username}", - 'forcePassReset' => 'Forcer la réinitialisation du mot de passe', 'ban' => 'Bloquer', 'unban' => 'Débloquer', 'delete' => 'Supprimer', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'Utilisateur créé avec succès ! {username} devra modifier son mot de passe à la première authentification.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "Les rôles de {username} ont été mis à jour avec succès.", - 'forcePassResetSuccess' => - '{username} devra modifier son mot de passe à la prochaine visite.', 'banSuccess' => '{username} a été bloqué.', 'unbanSuccess' => '{username} a été débloqué.', 'editOwnerError' => diff --git a/modules/Admin/Language/fa/Contributor.php b/modules/Auth/Language/gd/Contributor.php similarity index 100% rename from modules/Admin/Language/fa/Contributor.php rename to modules/Auth/Language/gd/Contributor.php diff --git a/modules/Admin/Language/gd/MyAccount.php b/modules/Auth/Language/gd/MyAccount.php similarity index 100% rename from modules/Admin/Language/gd/MyAccount.php rename to modules/Auth/Language/gd/MyAccount.php diff --git a/modules/Admin/Language/fa/User.php b/modules/Auth/Language/gd/User.php similarity index 89% rename from modules/Admin/Language/fa/User.php rename to modules/Auth/Language/gd/User.php index 585d6799..fe3a9e1a 100644 --- a/modules/Admin/Language/fa/User.php +++ b/modules/Auth/Language/gd/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', 'banSuccess' => '{username} has been banned.', 'unbanSuccess' => '{username} has been unbanned.', 'editOwnerError' => diff --git a/modules/Admin/Language/gl/Contributor.php b/modules/Auth/Language/gl/Contributor.php similarity index 100% rename from modules/Admin/Language/gl/Contributor.php rename to modules/Auth/Language/gl/Contributor.php diff --git a/modules/Admin/Language/gl/MyAccount.php b/modules/Auth/Language/gl/MyAccount.php similarity index 100% rename from modules/Admin/Language/gl/MyAccount.php rename to modules/Auth/Language/gl/MyAccount.php diff --git a/modules/Admin/Language/gl/User.php b/modules/Auth/Language/gl/User.php similarity index 88% rename from modules/Admin/Language/gl/User.php rename to modules/Auth/Language/gl/User.php index 4bdfcab9..dd84c53d 100644 --- a/modules/Admin/Language/gl/User.php +++ b/modules/Auth/Language/gl/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Editar os roles de {username}", - 'forcePassReset' => 'Forzar restablecemento do contrasinal', 'ban' => 'Vetar', 'unban' => 'Retirar veto', 'delete' => 'Eliminar', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'Usuaria creada correctamente! Váiselle pedir a {username} que cambie o seu contrasinal após o primeiro acceso.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "Os roles de {username} actualizáronse correctamente.", - 'forcePassResetSuccess' => - 'Solicitarase que {username} restableza o contrasinal na seguinte visita.', 'banSuccess' => '{username} foi vetada.', 'unbanSuccess' => 'Retirouse o veto sobre {username}.', 'editOwnerError' => diff --git a/modules/Admin/Language/gd/Contributor.php b/modules/Auth/Language/id/Contributor.php similarity index 100% rename from modules/Admin/Language/gd/Contributor.php rename to modules/Auth/Language/id/Contributor.php diff --git a/modules/Admin/Language/id/MyAccount.php b/modules/Auth/Language/id/MyAccount.php similarity index 100% rename from modules/Admin/Language/id/MyAccount.php rename to modules/Auth/Language/id/MyAccount.php diff --git a/modules/Admin/Language/en/User.php b/modules/Auth/Language/id/User.php similarity index 89% rename from modules/Admin/Language/en/User.php rename to modules/Auth/Language/id/User.php index 585d6799..fe3a9e1a 100644 --- a/modules/Admin/Language/en/User.php +++ b/modules/Auth/Language/id/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Edit {username}'s roles", - 'forcePassReset' => 'Force pass reset', 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'User created successfully! {username} will be prompted with a password reset upon first authentication.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "{username}'s roles have been successfully updated.", - 'forcePassResetSuccess' => - '{username} will be prompted with a password reset upon next visit.', 'banSuccess' => '{username} has been banned.', 'unbanSuccess' => '{username} has been unbanned.', 'editOwnerError' => diff --git a/modules/Admin/Language/it/Contributor.php b/modules/Auth/Language/it/Contributor.php similarity index 100% rename from modules/Admin/Language/it/Contributor.php rename to modules/Auth/Language/it/Contributor.php diff --git a/modules/Admin/Language/it/MyAccount.php b/modules/Auth/Language/it/MyAccount.php similarity index 100% rename from modules/Admin/Language/it/MyAccount.php rename to modules/Auth/Language/it/MyAccount.php diff --git a/modules/Auth/Language/it/User.php b/modules/Auth/Language/it/User.php new file mode 100644 index 00000000..fe3a9e1a --- /dev/null +++ b/modules/Auth/Language/it/User.php @@ -0,0 +1,53 @@ + "Edit {username}'s roles", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'roles' => 'Roles', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'roles' => [ + 'superadmin' => 'Super admin', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! {username} will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, you cannot edit its roles.', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Admin/Language/nl/Contributor.php b/modules/Auth/Language/nl/Contributor.php similarity index 100% rename from modules/Admin/Language/nl/Contributor.php rename to modules/Auth/Language/nl/Contributor.php diff --git a/modules/Admin/Language/nl/MyAccount.php b/modules/Auth/Language/nl/MyAccount.php similarity index 100% rename from modules/Admin/Language/nl/MyAccount.php rename to modules/Auth/Language/nl/MyAccount.php diff --git a/modules/Auth/Language/nl/User.php b/modules/Auth/Language/nl/User.php new file mode 100644 index 00000000..fe3a9e1a --- /dev/null +++ b/modules/Auth/Language/nl/User.php @@ -0,0 +1,53 @@ + "Edit {username}'s roles", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'roles' => 'Roles', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'roles' => [ + 'superadmin' => 'Super admin', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! {username} will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, you cannot edit its roles.', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Admin/Language/nn-NO/Contributor.php b/modules/Auth/Language/nn-NO/Contributor.php similarity index 100% rename from modules/Admin/Language/nn-NO/Contributor.php rename to modules/Auth/Language/nn-NO/Contributor.php diff --git a/modules/Admin/Language/nn-NO/MyAccount.php b/modules/Auth/Language/nn-NO/MyAccount.php similarity index 100% rename from modules/Admin/Language/nn-NO/MyAccount.php rename to modules/Auth/Language/nn-NO/MyAccount.php diff --git a/modules/Admin/Language/nn-NO/User.php b/modules/Auth/Language/nn-NO/User.php similarity index 89% rename from modules/Admin/Language/nn-NO/User.php rename to modules/Auth/Language/nn-NO/User.php index 0a51b30d..a3ec4bfe 100644 --- a/modules/Admin/Language/nn-NO/User.php +++ b/modules/Auth/Language/nn-NO/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Endre rollene til {username}", - 'forcePassReset' => 'Tving passordnullstilling', 'ban' => 'Steng ute', 'unban' => 'Slepp inn att', 'delete' => 'Slett', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'Brukaren er oppretta! {username} vil få spørsmål om å endra passord fyrste gong hen loggar inn.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "Rollene til {username} er oppdaterte.", - 'forcePassResetSuccess' => - '{username} vil bli beden om å endra passord neste gong hen loggar inn.', 'banSuccess' => '{username} er utestengd.', 'unbanSuccess' => '{username} fekk sleppa inn att.', 'editOwnerError' => diff --git a/modules/Admin/Language/id/Contributor.php b/modules/Auth/Language/oc/Contributor.php similarity index 100% rename from modules/Admin/Language/id/Contributor.php rename to modules/Auth/Language/oc/Contributor.php diff --git a/modules/Admin/Language/oc/MyAccount.php b/modules/Auth/Language/oc/MyAccount.php similarity index 100% rename from modules/Admin/Language/oc/MyAccount.php rename to modules/Auth/Language/oc/MyAccount.php diff --git a/modules/Auth/Language/oc/User.php b/modules/Auth/Language/oc/User.php new file mode 100644 index 00000000..fe3a9e1a --- /dev/null +++ b/modules/Auth/Language/oc/User.php @@ -0,0 +1,53 @@ + "Edit {username}'s roles", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'roles' => 'Roles', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'roles' => [ + 'superadmin' => 'Super admin', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! {username} will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, you cannot edit its roles.', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Admin/Language/pl/Contributor.php b/modules/Auth/Language/pl/Contributor.php similarity index 100% rename from modules/Admin/Language/pl/Contributor.php rename to modules/Auth/Language/pl/Contributor.php diff --git a/modules/Admin/Language/pl/MyAccount.php b/modules/Auth/Language/pl/MyAccount.php similarity index 100% rename from modules/Admin/Language/pl/MyAccount.php rename to modules/Auth/Language/pl/MyAccount.php diff --git a/modules/Admin/Language/pl/User.php b/modules/Auth/Language/pl/User.php similarity index 89% rename from modules/Admin/Language/pl/User.php rename to modules/Auth/Language/pl/User.php index 7db87b44..7c2d0789 100644 --- a/modules/Admin/Language/pl/User.php +++ b/modules/Auth/Language/pl/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Edytuj role użytkownika {username}", - 'forcePassReset' => 'Wymuś resetowanie hasła', 'ban' => 'Zablokuj', 'unban' => 'Odblokuj', 'delete' => 'Usuń', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'Pomyślnie utworzono użytkownika! {username} zostanie poproszony o zresetowanie hasła przy pierwszym uwierzytelnieniu.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "Role {username} zostały pomyślnie zaktualizowane.", - 'forcePassResetSuccess' => - '{username} zostanie poproszony o zresetowanie hasła przy następnej wizycie.', 'banSuccess' => '{username} został zablokowany.', 'unbanSuccess' => '{username} został odblokowany.', 'editOwnerError' => diff --git a/modules/Admin/Language/pt-BR/Contributor.php b/modules/Auth/Language/pt-BR/Contributor.php similarity index 100% rename from modules/Admin/Language/pt-BR/Contributor.php rename to modules/Auth/Language/pt-BR/Contributor.php diff --git a/modules/Admin/Language/pt-BR/MyAccount.php b/modules/Auth/Language/pt-BR/MyAccount.php similarity index 100% rename from modules/Admin/Language/pt-BR/MyAccount.php rename to modules/Auth/Language/pt-BR/MyAccount.php diff --git a/modules/Admin/Language/pt-BR/User.php b/modules/Auth/Language/pt-BR/User.php similarity index 89% rename from modules/Admin/Language/pt-BR/User.php rename to modules/Auth/Language/pt-BR/User.php index d42b9fc6..aff24883 100644 --- a/modules/Admin/Language/pt-BR/User.php +++ b/modules/Auth/Language/pt-BR/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "Editar cargos de {username}", - 'forcePassReset' => 'Forçar redefinição da senha', 'ban' => 'Banir', 'unban' => 'Desbanir', 'delete' => 'Excluir', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => 'Usuário criado com sucesso! {username} terá que alterar sua senha na primeira autenticação.', - 'rolesEditSuccess' => + 'roleEditSuccess' => "Cargos de {username} foram atualizados com sucesso.", - 'forcePassResetSuccess' => - '{username} precisará alterar sua senha na próxima visita.', 'banSuccess' => '{username} foi banido.', 'unbanSuccess' => '{username} foi desbanido.', 'editOwnerError' => diff --git a/modules/Admin/Language/oc/Contributor.php b/modules/Auth/Language/pt/Contributor.php similarity index 100% rename from modules/Admin/Language/oc/Contributor.php rename to modules/Auth/Language/pt/Contributor.php diff --git a/modules/Admin/Language/pt/MyAccount.php b/modules/Auth/Language/pt/MyAccount.php similarity index 100% rename from modules/Admin/Language/pt/MyAccount.php rename to modules/Auth/Language/pt/MyAccount.php diff --git a/modules/Auth/Language/pt/User.php b/modules/Auth/Language/pt/User.php new file mode 100644 index 00000000..fe3a9e1a --- /dev/null +++ b/modules/Auth/Language/pt/User.php @@ -0,0 +1,53 @@ + "Edit {username}'s roles", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'roles' => 'Roles', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'roles' => [ + 'superadmin' => 'Super admin', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! {username} will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, you cannot edit its roles.', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Admin/Language/pt/Contributor.php b/modules/Auth/Language/ru/Contributor.php similarity index 100% rename from modules/Admin/Language/pt/Contributor.php rename to modules/Auth/Language/ru/Contributor.php diff --git a/modules/Admin/Language/ru/MyAccount.php b/modules/Auth/Language/ru/MyAccount.php similarity index 100% rename from modules/Admin/Language/ru/MyAccount.php rename to modules/Auth/Language/ru/MyAccount.php diff --git a/modules/Auth/Language/ru/User.php b/modules/Auth/Language/ru/User.php new file mode 100644 index 00000000..fe3a9e1a --- /dev/null +++ b/modules/Auth/Language/ru/User.php @@ -0,0 +1,53 @@ + "Edit {username}'s roles", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'roles' => 'Roles', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'roles' => [ + 'superadmin' => 'Super admin', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! {username} will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, you cannot edit its roles.', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Admin/Language/sk/Contributor.php b/modules/Auth/Language/sk/Contributor.php similarity index 100% rename from modules/Admin/Language/sk/Contributor.php rename to modules/Auth/Language/sk/Contributor.php diff --git a/modules/Admin/Language/sk/MyAccount.php b/modules/Auth/Language/sk/MyAccount.php similarity index 100% rename from modules/Admin/Language/sk/MyAccount.php rename to modules/Auth/Language/sk/MyAccount.php diff --git a/modules/Auth/Language/sk/User.php b/modules/Auth/Language/sk/User.php new file mode 100644 index 00000000..fe3a9e1a --- /dev/null +++ b/modules/Auth/Language/sk/User.php @@ -0,0 +1,53 @@ + "Edit {username}'s roles", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'roles' => 'Roles', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'roles' => [ + 'superadmin' => 'Super admin', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! {username} will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, you cannot edit its roles.', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Admin/Language/ru/Contributor.php b/modules/Auth/Language/sv/Contributor.php similarity index 100% rename from modules/Admin/Language/ru/Contributor.php rename to modules/Auth/Language/sv/Contributor.php diff --git a/modules/Admin/Language/sv/MyAccount.php b/modules/Auth/Language/sv/MyAccount.php similarity index 100% rename from modules/Admin/Language/sv/MyAccount.php rename to modules/Auth/Language/sv/MyAccount.php diff --git a/modules/Auth/Language/sv/User.php b/modules/Auth/Language/sv/User.php new file mode 100644 index 00000000..fe3a9e1a --- /dev/null +++ b/modules/Auth/Language/sv/User.php @@ -0,0 +1,53 @@ + "Edit {username}'s roles", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'roles' => 'Roles', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'roles' => [ + 'superadmin' => 'Super admin', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! {username} will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, you cannot edit its roles.', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Admin/Language/zh-Hans/Contributor.php b/modules/Auth/Language/zh-Hans/Contributor.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Contributor.php rename to modules/Auth/Language/zh-Hans/Contributor.php diff --git a/modules/Admin/Language/zh-Hans/MyAccount.php b/modules/Auth/Language/zh-Hans/MyAccount.php similarity index 100% rename from modules/Admin/Language/zh-Hans/MyAccount.php rename to modules/Auth/Language/zh-Hans/MyAccount.php diff --git a/modules/Admin/Language/zh-Hans/User.php b/modules/Auth/Language/zh-Hans/User.php similarity index 90% rename from modules/Admin/Language/zh-Hans/User.php rename to modules/Auth/Language/zh-Hans/User.php index cb3e0ed6..f76f603d 100644 --- a/modules/Admin/Language/zh-Hans/User.php +++ b/modules/Auth/Language/zh-Hans/User.php @@ -10,7 +10,6 @@ declare(strict_types=1); return [ 'edit_roles' => "编辑 {username} 的角色", - 'forcePassReset' => '强制重置', 'ban' => '封禁', 'unban' => '取消封禁', 'delete' => '删除', @@ -39,10 +38,8 @@ return [ 'messages' => [ 'createSuccess' => '用户创建成功!{username} 将在首次验证时提醒重置密码。', - 'rolesEditSuccess' => + 'roleEditSuccess' => "{username} 的角色已更新。", - 'forcePassResetSuccess' => - '下次访问时 {username} 将被提醒重置密码。', 'banSuccess' => '{username} 已被封禁。', 'unbanSuccess' => '{username} 已解除封禁。', 'editOwnerError' => diff --git a/modules/Auth/Models/UserModel.php b/modules/Auth/Models/UserModel.php new file mode 100644 index 00000000..82ba5177 --- /dev/null +++ b/modules/Auth/Models/UserModel.php @@ -0,0 +1,50 @@ +select('users.*') + ->join('auth_groups_users', 'users.id = auth_groups_users.user_id') + ->like('auth_groups_users.group', "podcast#{$podcastId}") + ->findAll(); + } + + public function getPodcastContributor(int $contributorId, int $podcastId): ?User + { + return $this->select('users.*') + ->join('auth_groups_users', 'users.id = auth_groups_users.user_id') + ->where('users.id', $contributorId) + ->like('auth_groups_users.group', "podcast#{$podcastId}") + ->first(); + } +} diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index 0f80f081..c5705c9f 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -10,18 +10,18 @@ declare(strict_types=1); namespace Modules\Install\Controllers; -use App\Models\UserModel; use CodeIgniter\Controller; use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\Shield\Entities\User; use Config\Database; use Config\Services; use Dotenv\Dotenv; use Dotenv\Exception\ValidationException; -use Modules\Auth\Entities\User; +use Modules\Auth\Models\UserModel; use Psr\Log\LoggerInterface; use Throwable; use ViewThemes\Theme; @@ -31,7 +31,7 @@ class InstallController extends Controller /** * @var string[] */ - protected $helpers = ['form', 'components', 'svg', 'misc']; + protected $helpers = ['form', 'components', 'svg', 'misc', 'setting']; /** * Constructor. @@ -117,10 +117,11 @@ class InstallController extends Controller try { $db = db_connect(); - // Check if superadmin has been created, meaning migrations and seeds have passed + // Check if instance owner has been created, meaning install was completed if ( $db->tableExists('users') && - (new UserModel())->countAll() > 0 + (new UserModel())->where('is_owner', true) + ->first() !== null ) { // if so, show a 404 page throw PageNotFoundException::forPageNotFound(); @@ -249,7 +250,7 @@ class InstallController extends Controller $migrations->setNamespace('CodeIgniter\Settings') ->latest(); - $migrations->setNamespace('Myth\Auth') + $migrations->setNamespace('CodeIgniter\Shield') ->latest(); $migrations->setNamespace('Modules\Fediverse') ->latest(); @@ -293,48 +294,25 @@ class InstallController extends Controller { $userModel = new UserModel(); - // Validate here first, since some things, - // like the password, can only be validated properly here. - $rules = array_merge( - $userModel->getValidationRules([ - 'only' => ['username'], - ]), - [ - 'email' => 'required|valid_email|is_unique[users.email]', - 'password' => 'required|strong_password', - ], - ); - - if (! $this->validate($rules)) { - return redirect() - ->back() - ->withInput() - ->with('errors', $this->validator->getErrors()); - } - // Save the user - $user = new User($this->request->getPost()); - - // Activate user - $user->activate(); - - $db = db_connect(); - - $db->transStart(); - if (! ($userId = $userModel->insert($user, true))) { - $db->transRollback(); - - return redirect() - ->back() + $user = new User([ + 'username' => $this->request->getPost('username'), + 'email' => $this->request->getPost('email'), + 'password' => $this->request->getPost('password'), + 'is_owner' => true, + ]); + try { + $userModel->save($user); + } catch (ValidationException) { + return redirect()->back() ->withInput() ->with('errors', $userModel->errors()); } - // add newly created user to superadmin group - $authorization = Services::authorization(); - $authorization->addUserToGroup($userId, 'superadmin'); + $user = $userModel->findById($userModel->getInsertID()); - $db->transComplete(); + // set newly created user as most powerful instance group (superadmin) + $user->addGroup(setting('AuthGroups.mostPowerfulGroup')); // Success! // set redirect_url session as admin area to go to after login @@ -342,7 +320,7 @@ class InstallController extends Controller ->set('redirect_url', route_to('admin')); return redirect() - ->route('login') + ->route('admin') ->with('message', lang('Install.messages.createSuperAdminSuccess')); } diff --git a/modules/Install/Language/en/Install.php b/modules/Install/Language/en/Install.php index 1f66ef11..45d26085 100644 --- a/modules/Install/Language/en/Install.php +++ b/modules/Install/Language/en/Install.php @@ -46,7 +46,7 @@ return [ ], 'next' => 'Next', 'submit' => 'Finish install', - 'create_superadmin' => 'Create your superadmin account', + 'create_superadmin' => 'Create your Super Admin account', 'email' => 'Email', 'username' => 'Username', 'password' => 'Password', diff --git a/modules/PremiumPodcasts/Config/Routes.php b/modules/PremiumPodcasts/Config/Routes.php index 2859b596..a9620794 100644 --- a/modules/PremiumPodcasts/Config/Routes.php +++ b/modules/PremiumPodcasts/Config/Routes.php @@ -20,30 +20,30 @@ $routes->group( $routes->get('/', 'SubscriptionController::list/$1', [ 'as' => 'subscription-list', 'filter' => - 'permission:podcasts-view,podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ]); $routes->get('add', 'SubscriptionController::add/$1', [ 'as' => 'subscription-add', - 'filter' => 'permission:podcast-manage_subscriptions', + 'filter' => 'permission:podcast#.manage-subscriptions', ]); $routes->post( 'add', 'SubscriptionController::attemptAdd/$1', [ 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ], ); $routes->post('save-link', 'SubscriptionController::attemptLinkSave/$1', [ 'as' => 'subscription-link-save', - 'filter' => 'permission:podcast-manage_subscriptions', + 'filter' => 'permission:podcast#.manage-subscriptions', ]); // Subscription $routes->group('(:num)', static function ($routes): void { $routes->get('/', 'SubscriptionController::view/$1/$2', [ 'as' => 'subscription-view', 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ]); $routes->get( 'edit', @@ -51,7 +51,7 @@ $routes->group( [ 'as' => 'subscription-edit', 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ], ); $routes->post( @@ -60,7 +60,7 @@ $routes->group( [ 'as' => 'subscription-edit', 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ], ); $routes->get( @@ -69,7 +69,7 @@ $routes->group( [ 'as' => 'subscription-regenerate-token', 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ] ); $routes->get( @@ -78,7 +78,7 @@ $routes->group( [ 'as' => 'subscription-suspend', 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ], ); $routes->post( @@ -86,7 +86,7 @@ $routes->group( 'SubscriptionController::attemptSuspend/$1/$2', [ 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ], ); $routes->get( @@ -95,7 +95,7 @@ $routes->group( [ 'as' => 'subscription-resume', 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ], ); $routes->get( @@ -104,7 +104,7 @@ $routes->group( [ 'as' => 'subscription-delete', 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ], ); $routes->post( @@ -112,7 +112,7 @@ $routes->group( 'SubscriptionController::attemptDelete/$1/$2', [ 'filter' => - 'permission:podcast-manage_subscriptions', + 'permission:podcast#.manage-subscriptions', ], ); }); diff --git a/modules/PremiumPodcasts/Controllers/SubscriptionController.php b/modules/PremiumPodcasts/Controllers/SubscriptionController.php index 055de5b8..c29bac8c 100644 --- a/modules/PremiumPodcasts/Controllers/SubscriptionController.php +++ b/modules/PremiumPodcasts/Controllers/SubscriptionController.php @@ -58,7 +58,7 @@ class SubscriptionController extends BaseController helper('form'); replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('subscription/list', $data); } @@ -106,7 +106,7 @@ class SubscriptionController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => '#' . $this->subscription->id, ]); return view('subscription/view', $data); @@ -121,7 +121,7 @@ class SubscriptionController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, ]); return view('subscription/add', $data); } @@ -247,7 +247,7 @@ class SubscriptionController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => '#' . $this->subscription->id, ]); return view('subscription/edit', $data); @@ -315,7 +315,7 @@ class SubscriptionController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => '#' . $this->subscription->id, ]); return view('subscription/suspend', $data); @@ -410,7 +410,7 @@ class SubscriptionController extends BaseController ]; replace_breadcrumb_params([ - 0 => $this->podcast->title, + 0 => $this->podcast->at_handle, 1 => '#' . $this->subscription->id, ]); return view('subscription/delete', $data); diff --git a/modules/PremiumPodcasts/Filters/PodcastUnlockFilter.php b/modules/PremiumPodcasts/Filters/PodcastUnlockFilter.php index 74468fa2..a4a1d3f8 100644 --- a/modules/PremiumPodcasts/Filters/PodcastUnlockFilter.php +++ b/modules/PremiumPodcasts/Filters/PodcastUnlockFilter.php @@ -11,7 +11,6 @@ use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\Router\Router; use Config\App; use Modules\PremiumPodcasts\PremiumPodcasts; -use Myth\Auth\Authentication\AuthenticationBase; class PodcastUnlockFilter implements FilterInterface { @@ -48,9 +47,7 @@ class PodcastUnlockFilter implements FilterInterface } // no need to go through the unlock form if user is connected - /** @var AuthenticationBase $auth */ - $auth = service('authentication'); - if ($auth->isLoggedIn()) { + if (auth()->loggedIn()) { return; } diff --git a/phpstan.neon b/phpstan.neon index cbedb485..8e79ac06 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -9,10 +9,12 @@ parameters: scanDirectories: - app/Helpers - modules/Analytics/Helpers + - modules/Auth/Helpers - modules/Fediverse/Helpers - modules/PremiumPodcasts/Helpers - vendor/codeigniter4/framework/system/Helpers - - vendor/myth/auth/src/Helpers + - vendor/codeigniter4/settings/src/Helpers + - vendor/codeigniter4/shield/src/Helpers excludePaths: - app/Libraries/Router.php - app/Views/* diff --git a/themes/cp_admin/_partials/_nav_header.php b/themes/cp_admin/_partials/_nav_header.php index b3711aa9..d3ec1f3c 100644 --- a/themes/cp_admin/_partials/_nav_header.php +++ b/themes/cp_admin/_partials/_nav_header.php @@ -1,3 +1,7 @@ +user()); ?> +
@@ -34,11 +38,11 @@ ], ]; - if (user()->podcasts !== []) { - foreach (user()->podcasts as $userPodcast) { + if ($userPodcasts !== []) { + foreach ($userPodcasts as $userPodcast) { $userPodcastTitle = esc($userPodcast->title); - $unreadNotificationDotDisplayClass = in_array($userPodcast->actor_id, user()->actorIdsWithUnreadNotifications, true) ? '' : 'hidden'; + $unreadNotificationDotDisplayClass = in_array($userPodcast->actor_id, $actorIdsWithUnreadNotifications, true) ? '' : 'hidden'; $items[] = [ 'type' => 'link', @@ -66,7 +70,7 @@ } ?> - +
podcasts as $userPodcast) { + foreach ($userPodcasts as $userPodcast) { $checkMark = interact_as_actor_id() === $userPodcast->actor_id ? icon('check', 'ml-2 bg-accent-base text-accent-contrast rounded-full') : ''; $userPodcastTitle = esc($userPodcast->title); @@ -96,7 +99,7 @@ } $interactAsText = lang('Common.choose_interact'); - $route = route_to('interact-as-actor'); + $interactAsRoute = route_to('interact-as-actor'); $csrfField = csrf_field(); $menuItems = [ @@ -120,14 +123,14 @@ ], ]; - if (user()->podcasts !== []) { + if ($userPodcasts !== []) { $menuItems = array_merge([ [ 'type' => 'html', 'content' => esc(<< {$interactAsText} -
+ {$csrfField} {$interactButtons}
diff --git a/themes/cp_admin/_partials/_user_info.php b/themes/cp_admin/_partials/_user_info.php index 61871f6a..6bb3aebb 100644 --- a/themes/cp_admin/_partials/_user_info.php +++ b/themes/cp_admin/_partials/_user_info.php @@ -1,11 +1,3 @@ -
-
- -
-
- email ?> -
-
@@ -14,12 +6,20 @@ username) ?>
+
+
+ +
+
+ email ?> +
+
- roles) ?> + getGroups()) ?>
@@ -27,6 +27,6 @@
- permissions) ?> + getPermissions()) ?>
diff --git a/themes/cp_admin/contributor/add.php b/themes/cp_admin/contributor/add.php index ef2325bb..91b3a94a 100644 --- a/themes/cp_admin/contributor/add.php +++ b/themes/cp_admin/contributor/add.php @@ -18,7 +18,7 @@ as="Select" name="user" label="" - options="" + options="" placeholder="" required="true" /> @@ -28,6 +28,7 @@ label="" options="" placeholder="" + selected="" required="true" /> diff --git a/themes/cp_admin/contributor/delete.php b/themes/cp_admin/contributor/delete.php new file mode 100644 index 00000000..d1f73379 --- /dev/null +++ b/themes/cp_admin/contributor/delete.php @@ -0,0 +1,37 @@ +extend('_layout') ?> + +section('title') ?> + $contributor->username, +]) ?> +endSection() ?> + +section('pageTitle') ?> + $contributor->username, +]) ?> +endSection() ?> + +section('content') ?> + +
+ + + $contributor->username, + 'podcastTitle' => $podcast->title, +]) ?> + + $contributor->username, + 'podcastTitle' => $podcast->title, +]) ?> + +
+ + +
+ +
+ +endSection() ?> diff --git a/themes/cp_admin/contributor/edit.php b/themes/cp_admin/contributor/edit.php index edfed841..ca854d96 100644 --- a/themes/cp_admin/contributor/edit.php +++ b/themes/cp_admin/contributor/edit.php @@ -1,25 +1,25 @@ extend('_layout') ?> section('title') ?> -username)]) ?> +username)]) ?> endSection() ?> section('pageTitle') ?> -username)]) ?> +username)]) ?> endSection() ?> section('content') ?> -
+ diff --git a/themes/cp_admin/contributor/list.php b/themes/cp_admin/contributor/list.php index 6ad44137..9da3de4d 100644 --- a/themes/cp_admin/contributor/list.php +++ b/themes/cp_admin/contributor/list.php @@ -25,8 +25,14 @@ ], [ 'header' => lang('Contributor.list.role'), - 'cell' => function ($contributor): string { - return lang('Contributor.roles.' . $contributor->podcast_role); + 'cell' => function ($contributor, $podcast): string { + $role = get_group_info(get_podcast_group($contributor, $podcast->id), $podcast->id)['title']; + + if ($podcast->created_by === $contributor->id) { + $role = '
' . icon('shield-user') . '' . $role . '
'; + } + + return $role; }, ], [ diff --git a/themes/cp_admin/my_account/view.php b/themes/cp_admin/my_account/view.php index c329ea71..5d5c1101 100644 --- a/themes/cp_admin/my_account/view.php +++ b/themes/cp_admin/my_account/view.php @@ -12,7 +12,8 @@ section('content') ?> user(), + 'user' => auth() + ->user(), ]) ?> endSection() ?> diff --git a/themes/cp_admin/podcast/list.php b/themes/cp_admin/podcast/list.php index 6736877e..28cbd916 100644 --- a/themes/cp_admin/podcast/list.php +++ b/themes/cp_admin/podcast/list.php @@ -17,7 +17,7 @@ section('content') ?>
- + $podcast, diff --git a/themes/cp_admin/user/create.php b/themes/cp_admin/user/create.php index d81377df..eb6b769b 100644 --- a/themes/cp_admin/user/create.php +++ b/themes/cp_admin/user/create.php @@ -14,6 +14,11 @@ + + - - diff --git a/themes/cp_admin/user/delete.php b/themes/cp_admin/user/delete.php new file mode 100644 index 00000000..70c915de --- /dev/null +++ b/themes/cp_admin/user/delete.php @@ -0,0 +1,35 @@ +extend('_layout') ?> + +section('title') ?> + $user->username, +]) ?> +endSection() ?> + +section('pageTitle') ?> + $user->username, +]) ?> +endSection() ?> + +section('content') ?> + +
+ + + $user->username, +]) ?> + + $user->username, +]) ?> + +
+ + +
+ +
+ +endSection() ?> diff --git a/themes/cp_admin/user/edit.php b/themes/cp_admin/user/edit.php index 2981b9f3..de91027d 100644 --- a/themes/cp_admin/user/edit.php +++ b/themes/cp_admin/user/edit.php @@ -1,13 +1,13 @@ extend('_layout') ?> section('title') ?> - esc($user->username), ]) ?> endSection() ?> section('pageTitle') ?> - esc($user->username), ]) ?> endSection() ?> @@ -19,12 +19,12 @@ + selected="" + required="true" /> diff --git a/themes/cp_admin/user/list.php b/themes/cp_admin/user/list.php index ce977792..9e87eed7 100644 --- a/themes/cp_admin/user/list.php +++ b/themes/cp_admin/user/list.php @@ -28,50 +28,30 @@ }, ], [ - 'header' => lang('User.list.roles'), + 'header' => lang('User.list.role'), 'cell' => function ($user) { - if ($user->isOwner) { - return 'owner, ' . implode(',', $user->roles); + $role = get_group_info(get_instance_group($user))['title']; + + if ((bool) $user->is_owner) { + $role = '
' . icon('shield-user') . '' . $role . '
'; } - return implode(',', $user->roles) . '' . lang('User.edit_roles', [ + return $role . '' . lang('User.edit_role', [ 'username' => esc($user->username), ]) . ''; }, ], - [ - 'header' => lang('User.list.banned'), - 'cell' => function ($user) { - return $user->isBanned() - ? lang('Common.yes') - : lang('Common.no'); - }, - ], [ 'header' => lang('Common.actions'), 'cell' => function ($user) { return '' . ''; }, ], diff --git a/themes/cp_admin/user/view.php b/themes/cp_admin/user/view.php index 5213a16a..3ce71ba1 100644 --- a/themes/cp_admin/user/view.php +++ b/themes/cp_admin/user/view.php @@ -6,6 +6,12 @@ ]) ?> endSection() ?> +section('pageTitle') ?> + esc($user->username), +]) ?> +endSection() ?> + section('content') ?> diff --git a/themes/cp_app/_admin_navbar.php b/themes/cp_app/_admin_navbar.php index 15f542f4..f17ea0d8 100644 --- a/themes/cp_app/_admin_navbar.php +++ b/themes/cp_app/_admin_navbar.php @@ -1,3 +1,7 @@ +user()); ?> +
@@ -12,7 +16,7 @@
@@ -28,11 +32,11 @@ ], ]; - if (user()->podcasts !== []) { - foreach (user()->podcasts as $userPodcast) { + if ($userPodcasts !== []) { + foreach ($userPodcasts as $userPodcast) { $userPodcastTitle = esc($userPodcast->title); - $unreadNotificationDotDisplayClass = in_array($userPodcast->actor_id, user()->actorIdsWithUnreadNotifications, true) ? '' : 'hidden'; + $unreadNotificationDotDisplayClass = in_array($userPodcast->actor_id, $actorIdsWithUnreadNotifications, true) ? '' : 'hidden'; $items[] = [ 'type' => 'link', @@ -60,7 +64,7 @@ } ?> - + podcasts as $userPodcast) { - $checkMark = interact_as_actor_id() === $userPodcast->actor_id ? icon('check', 'ml-2 bg-accent-base text-accent-contrast rounded-full') : ''; - $userPodcastTitle = esc($userPodcast->title); + foreach ($userPodcasts as $userPodcast) { + if (can_podcast(auth()->user(), $userPodcast->id, 'interact-as')) { + $checkMark = interact_as_actor_id() === $userPodcast->actor_id ? icon('check', 'ml-2 bg-accent-base text-accent-contrast rounded-full') : ''; + $userPodcastTitle = esc($userPodcast->title); - $interactButtons .= << -
{$userPodcastTitle}{$checkMark}
- - CODE_SAMPLE; + $interactButtons .= << +
{$userPodcastTitle}{$checkMark}
+ + CODE_SAMPLE; + } } $interactAsText = lang('Common.choose_interact'); - $route = route_to('interact-as-actor'); + $interactAsRoute = route_to('interact-as-actor'); $csrfField = csrf_field(); $menuItems = [ @@ -113,14 +123,14 @@ ], ]; - if (user()->podcasts !== []) { + if ($userPodcasts !== []) { $menuItems = array_merge([ [ 'type' => 'html', 'content' => esc(<< {$interactAsText} -
+ {$csrfField} {$interactButtons}
diff --git a/themes/cp_app/embed.php b/themes/cp_app/embed.php index 26621ea0..072160b9 100644 --- a/themes/cp_app/embed.php +++ b/themes/cp_app/embed.php @@ -45,7 +45,7 @@ style="--vm-player-box-shadow:0; --vm-player-theme: hsl(var(--color-accent-base)); --vm-control-focus-color: hsl(var(--color-accent-contrast)); --vm-control-spacing: 4px; --vm-menu-item-focus-bg: hsl(var(--color-background-highlight)); --vm-control-icon-size: 24px; " > - audio->file_url : $episode->audio_analytics_url . + loggedIn() ? $episode->audio->file_url : $episode->audio_analytics_url . (isset($_SERVER['HTTP_REFERER']) ? '?_from=' . parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) diff --git a/themes/cp_app/home.php b/themes/cp_app/home.php index c6f62d4c..b04f2994 100644 --- a/themes/cp_app/home.php +++ b/themes/cp_app/home.php @@ -32,7 +32,7 @@ - check()): ?> + loggedIn()): ?> include('_admin_navbar') ?> diff --git a/themes/cp_app/pages/_layout.php b/themes/cp_app/pages/_layout.php index f0eb353f..0e3134fe 100644 --- a/themes/cp_app/pages/_layout.php +++ b/themes/cp_app/pages/_layout.php @@ -34,7 +34,7 @@ - check()): ?> + loggedIn()): ?> include('_admin_navbar') ?> diff --git a/themes/cp_app/pages/map.php b/themes/cp_app/pages/map.php index 8f61b83a..228f1488 100644 --- a/themes/cp_app/pages/map.php +++ b/themes/cp_app/pages/map.php @@ -37,7 +37,7 @@ - check()): ?> + loggedIn()): ?> include('_admin_navbar') ?> diff --git a/themes/cp_auth/_layout.php b/themes/cp_auth/_layout.php index 7cbee616..166dff03 100644 --- a/themes/cp_auth/_layout.php +++ b/themes/cp_auth/_layout.php @@ -1,6 +1,7 @@ - + diff --git a/themes/cp_auth/email_2fa_show.php b/themes/cp_auth/email_2fa_show.php new file mode 100644 index 00000000..ddedc530 --- /dev/null +++ b/themes/cp_auth/email_2fa_show.php @@ -0,0 +1,38 @@ +extend(config('Auth')->views['layout']) ?> + +section('title') ?> endSection() ?> + +section('content') ?> + +
+
+
+
+ +

+ + +
+ + +
+ + + +
+ + value="email) ?>" required /> +
+ +
+ +
+ +
+
+
+
+ +endSection() ?> diff --git a/themes/cp_auth/email_2fa_verify.php b/themes/cp_auth/email_2fa_verify.php new file mode 100644 index 00000000..e9dad7f4 --- /dev/null +++ b/themes/cp_auth/email_2fa_verify.php @@ -0,0 +1,36 @@ +extend(config('Auth')->views['layout']) ?> + +section('title') ?> endSection() ?> + +section('content') ?> + +
+
+
+
+ +

+ + +
+ + +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+ +endSection() ?> diff --git a/themes/cp_auth/email_activate_show.php b/themes/cp_auth/email_activate_show.php new file mode 100644 index 00000000..d0d93d73 --- /dev/null +++ b/themes/cp_auth/email_activate_show.php @@ -0,0 +1,28 @@ + +extend(config('Auth')->views['layout']) ?> + +section('title') ?>endSection() ?> + +section('content') ?> + +

+ +
+ + + + + + + + +endSection() ?> diff --git a/themes/cp_auth/emails/activation.php b/themes/cp_auth/emails/activation.php deleted file mode 100644 index 4dc506c6..00000000 --- a/themes/cp_auth/emails/activation.php +++ /dev/null @@ -1,11 +0,0 @@ -

This is activation email for your account on .

- -

To activate your account use this URL.

- -

Activate account.

- -
- -

If you did not registered on this website, you can safely ignore this email.

diff --git a/themes/cp_auth/emails/email_2fa_email.php b/themes/cp_auth/emails/email_2fa_email.php new file mode 100644 index 00000000..bbc010c5 --- /dev/null +++ b/themes/cp_auth/emails/email_2fa_email.php @@ -0,0 +1 @@ +

diff --git a/themes/cp_auth/emails/email_activate_email.php b/themes/cp_auth/emails/email_activate_email.php new file mode 100644 index 00000000..9686df46 --- /dev/null +++ b/themes/cp_auth/emails/email_activate_email.php @@ -0,0 +1,3 @@ +

+ +

diff --git a/themes/cp_auth/emails/forgot.php b/themes/cp_auth/emails/forgot.php deleted file mode 100644 index e6f199aa..00000000 --- a/themes/cp_auth/emails/forgot.php +++ /dev/null @@ -1,13 +0,0 @@ -

Someone requested a password reset at this email address for .

- -

To reset the password use this code or URL and follow the instructions.

- -

Your Code:

- -

Visit the Reset Form.

- -
- -

If you did not request a password reset, you can safely ignore this email.

diff --git a/themes/cp_auth/emails/magic_link_email.php b/themes/cp_auth/emails/magic_link_email.php new file mode 100644 index 00000000..d6f6a943 --- /dev/null +++ b/themes/cp_auth/emails/magic_link_email.php @@ -0,0 +1,5 @@ +

+ + + +

diff --git a/themes/cp_auth/emails/welcome_email.php b/themes/cp_auth/emails/welcome_email.php new file mode 100644 index 00000000..13da1138 --- /dev/null +++ b/themes/cp_auth/emails/welcome_email.php @@ -0,0 +1,10 @@ +

+ current_domain(), + 'numberOfHours' => setting('Auth.welcomeLinkLifetime') / 3600, +]) ?>

+ + + + +

diff --git a/themes/cp_auth/forgot.php b/themes/cp_auth/forgot.php deleted file mode 100644 index 57756758..00000000 --- a/themes/cp_auth/forgot.php +++ /dev/null @@ -1,24 +0,0 @@ - -extend($config->viewLayout) ?> - -section('title') ?> - -endSection() ?> - - -section('content') ?> - -

- -
- - - - - - -endSection() ?> diff --git a/themes/cp_auth/login.php b/themes/cp_auth/login.php index ba6fd06e..34d2849e 100644 --- a/themes/cp_auth/login.php +++ b/themes/cp_auth/login.php @@ -1,29 +1,38 @@ -extend($config->viewLayout) ?> +extend(config('Auth')->views['layout']) ?> -section('title') ?> - -endSection() ?> +section('title') ?>endSection() ?> section('content') ?> -
+ + type="email" + inputmode="email" + autocomplete="email" + autofocus="autofocus" + /> - + + + + + + endSection() ?> @@ -32,14 +41,12 @@ section('footer') ?>
- allowRegistration): ?> - - - + +

+ + +

+
endSection() ?> diff --git a/themes/cp_auth/magic_link_form.php b/themes/cp_auth/magic_link_form.php new file mode 100644 index 00000000..b4f9c978 --- /dev/null +++ b/themes/cp_auth/magic_link_form.php @@ -0,0 +1,24 @@ + +extend(config('Auth')->views['layout']) ?> + +section('title') ?> endSection() ?> + +section('content') ?> + +
+ + + + + + + +endSection() ?> diff --git a/themes/cp_auth/magic_link_message.php b/themes/cp_auth/magic_link_message.php new file mode 100644 index 00000000..ade1b651 --- /dev/null +++ b/themes/cp_auth/magic_link_message.php @@ -0,0 +1,13 @@ +extend(config('Auth')->views['layout']) ?> + +section('title') ?> endSection() ?> + +section('content') ?> + +

+ +

+ + + +endSection() ?> diff --git a/themes/cp_auth/magic_link_set_password.php b/themes/cp_auth/magic_link_set_password.php new file mode 100644 index 00000000..64d85614 --- /dev/null +++ b/themes/cp_auth/magic_link_set_password.php @@ -0,0 +1,26 @@ + +extend(config('Auth')->views['layout']) ?> + +section('title') ?> + +endSection() ?> + + +section('content') ?> + +
+ + + + + + + + +endSection() ?> diff --git a/themes/cp_auth/register.php b/themes/cp_auth/register.php index 292f25ba..c8eeccc2 100644 --- a/themes/cp_auth/register.php +++ b/themes/cp_auth/register.php @@ -1,5 +1,5 @@ -extend($config->viewLayout) ?> +extend(config('Auth')->views['layout']) ?> section('title') ?> @@ -8,19 +8,22 @@ section('content') ?> -
+ - - + + + + @@ -41,10 +53,10 @@

+) ?>">

endSection() ?> diff --git a/themes/cp_auth/reset.php b/themes/cp_auth/reset.php deleted file mode 100644 index 2b9199a9..00000000 --- a/themes/cp_auth/reset.php +++ /dev/null @@ -1,38 +0,0 @@ - -extend($config->viewLayout) ?> - -section('title') ?> - -endSection() ?> - -section('content') ?> - -

- - - - - - - - - - - - - - -endSection() ?> diff --git a/themes/cp_install/_layout.php b/themes/cp_install/_layout.php index 0e72bbdb..6d35f502 100644 --- a/themes/cp_install/_layout.php +++ b/themes/cp_install/_layout.php @@ -1,5 +1,6 @@ - + diff --git a/themes/cp_install/create_superadmin.php b/themes/cp_install/create_superadmin.php index 25aeb06b..9fe28fa7 100644 --- a/themes/cp_install/create_superadmin.php +++ b/themes/cp_install/create_superadmin.php @@ -11,14 +11,14 @@
Date: Sun, 16 Oct 2022 10:36:54 +0000 Subject: [PATCH 002/477] feat(auth): add auth.enable2FA config to enable two-factor authentication + update phpstan and rector configs --- app/Config/Events.php | 3 -- modules/Auth/Config/Auth.php | 17 +++++++++++ modules/Auth/Language/en/Auth.php | 4 +++ phpstan.neon | 5 ++++ public/index.php | 12 ++++++++ public/media/site/index.html | 0 rector.php | 2 ++ spark | 12 ++++++++ themes/cp_auth/email_2fa_show.php | 42 ++++++++++----------------- themes/cp_auth/email_2fa_verify.php | 44 +++++++++++------------------ 10 files changed, 84 insertions(+), 57 deletions(-) delete mode 100644 public/media/site/index.html diff --git a/app/Config/Events.php b/app/Config/Events.php index 07332c3d..6d7f32bb 100644 --- a/app/Config/Events.php +++ b/app/Config/Events.php @@ -28,7 +28,6 @@ use CodeIgniter\Exceptions\FrameworkException; */ Events::on('pre_system', static function () { - // @phpstan-ignore-next-line if (ENVIRONMENT !== 'testing') { if (ini_get('zlib.output_compression')) { throw FrameworkException::forEnabledZlibOutputCompression(); @@ -46,8 +45,6 @@ Events::on('pre_system', static function () { * Debug Toolbar Listeners. * -------------------------------------------------------------------- * If you delete, they will no longer be collected. - * - * @phpstan-ignore-next-line */ if (CI_DEBUG && ! is_cli()) { Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect'); diff --git a/modules/Auth/Config/Auth.php b/modules/Auth/Config/Auth.php index e9017374..24ef0c89 100644 --- a/modules/Auth/Config/Auth.php +++ b/modules/Auth/Config/Auth.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Modules\Auth\Config; use CodeIgniter\Shield\Authentication\Actions\ActionInterface; +use CodeIgniter\Shield\Authentication\Actions\Email2FA; use CodeIgniter\Shield\Config\Auth as ShieldAuth; use Modules\Auth\Models\UserModel; @@ -75,6 +76,14 @@ class Auth extends ShieldAuth */ public bool $allowRegistration = true; + /** + * -------------------------------------------------------------------- + * Allow Two-Factor Authentication + * -------------------------------------------------------------------- + * Determines whether email 2FA is enabled. + */ + public bool $enable2FA = false; + /** * -------------------------------------------------------------------- * Welcome Link Lifetime @@ -108,6 +117,8 @@ class Auth extends ShieldAuth public function __construct() { + parent::__construct(); + $adminGateway = config('Admin') ->gateway; @@ -116,6 +127,12 @@ class Auth extends ShieldAuth 'login' => $adminGateway, 'logout' => $adminGateway, ]; + + // FIXME: enable2FA config can only be updated in the .env + // Using the settings service to have it set in the db causes infinite loop. + if ($this->enable2FA) { + $this->actions['login'] = Email2FA::class; + } } /** diff --git a/modules/Auth/Language/en/Auth.php b/modules/Auth/Language/en/Auth.php index 6928cf9b..09e3cd6b 100644 --- a/modules/Auth/Language/en/Auth.php +++ b/modules/Auth/Language/en/Auth.php @@ -80,6 +80,10 @@ return [ 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', ], + + // missing keys + 'code' => 'Your 6-digit code', + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', diff --git a/phpstan.neon b/phpstan.neon index 8e79ac06..4c46c3fa 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -20,6 +20,11 @@ parameters: - app/Views/* - modules/*/Views/* - themes/* + dynamicConstantNames: + - APP_NAMESPACE + - CI_DEBUG + - ENVIRONMENT + - SODIUM_LIBRARY_VERSION ignoreErrors: - '#Cannot access property [\$a-z_]+ on ((array\|)?object)#' - '#^Call to an undefined method CodeIgniter\\Database\\ConnectionInterface#' diff --git a/public/index.php b/public/index.php index cc758a8b..b80d9fbf 100644 --- a/public/index.php +++ b/public/index.php @@ -6,6 +6,18 @@ use CodeIgniter\Config\DotEnv; use Config\Paths; use Config\Services; +// Check PHP version. +$minPhpVersion = '8.0'; // If you update this, don't forget to update `spark`. +if (version_compare(PHP_VERSION, $minPhpVersion, '<')) { + $message = sprintf( + 'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s', + $minPhpVersion, + PHP_VERSION + ); + + exit($message); +} + // Path to the front controller (this file) define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR); diff --git a/public/media/site/index.html b/public/media/site/index.html deleted file mode 100644 index e69de29b..00000000 diff --git a/rector.php b/rector.php index 881a5ebd..96dad228 100644 --- a/rector.php +++ b/rector.php @@ -10,6 +10,7 @@ use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector; use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector; use Rector\Config\RectorConfig; use Rector\Core\ValueObject\PhpVersion; +use Rector\DeadCode\Rector\If_\UnwrapFutureCompatibleIfPhpVersionRector; use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector; use Rector\EarlyReturn\Rector\If_\ChangeOrIfReturnToEarlyReturnRector; use Rector\Php55\Rector\String_\StringClassNameToClassConstantRector; @@ -61,6 +62,7 @@ return static function (RectorConfig $rectorConfig): void { UnSpreadOperatorRector::class, ExplicitMethodCallOverMagicGetSetRector::class, RemoveExtraParametersRector::class, + UnwrapFutureCompatibleIfPhpVersionRector::class, // skip rule in specific directory StringClassNameToClassConstantRector::class => [ diff --git a/spark b/spark index 225422aa..306cf957 100644 --- a/spark +++ b/spark @@ -26,6 +26,18 @@ if (strpos(PHP_SAPI, 'cgi') === 0) { exit("The cli tool is not supported when running php-cgi. It needs php-cli to function!\n\n"); } +// Check PHP version. +$minPhpVersion = '8.0'; // If you update this, don't forget to update `public/index.php`. +if (version_compare(PHP_VERSION, $minPhpVersion, '<')) { + $message = sprintf( + 'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s', + $minPhpVersion, + PHP_VERSION + ); + + exit($message); +} + // We want errors to be shown when using it from the CLI. error_reporting(-1); ini_set('display_errors', '1'); diff --git a/themes/cp_auth/email_2fa_show.php b/themes/cp_auth/email_2fa_show.php index ddedc530..9e70a42a 100644 --- a/themes/cp_auth/email_2fa_show.php +++ b/themes/cp_auth/email_2fa_show.php @@ -1,38 +1,26 @@ + extend(config('Auth')->views['layout']) ?> section('title') ?> endSection() ?> section('content') ?> -
-
-
-
+
+ -

+ - -
- + + -
- - - -
- - value="email) ?>" required /> -
- -
- -
- -
-
-
-
endSection() ?> diff --git a/themes/cp_auth/email_2fa_verify.php b/themes/cp_auth/email_2fa_verify.php index e9dad7f4..18c67156 100644 --- a/themes/cp_auth/email_2fa_verify.php +++ b/themes/cp_auth/email_2fa_verify.php @@ -1,36 +1,26 @@ + extend(config('Auth')->views['layout']) ?> -section('title') ?> endSection() ?> +section('title') ?> endSection() ?> section('content') ?> -
-
-
-
+
+ -

+ - -
- - - - - - -
- -
- -
- -
- - -
-
-
+ + endSection() ?> From 88fb618c284c20dbe0c3ccd6f5a2e9e9d11c580a Mon Sep 17 00:00:00 2001 From: Romain de Laage Date: Sun, 16 Oct 2022 14:32:12 +0000 Subject: [PATCH 003/477] build(docker): forward server name to the PHP application fixes #246 --- docker/production/web-server/nginx.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/production/web-server/nginx.conf b/docker/production/web-server/nginx.conf index 425dcf24..fc2e47a8 100644 --- a/docker/production/web-server/nginx.conf +++ b/docker/production/web-server/nginx.conf @@ -61,6 +61,7 @@ http { location / { fastcgi_param SCRIPT_FILENAME /opt/castopod/public/index.php; include fastcgi_params; + fastcgi_param SERVER_NAME $host; fastcgi_index index.php; fastcgi_pass php-handler; } @@ -69,6 +70,7 @@ http { try_files $uri =404; fastcgi_param SCRIPT_FILENAME /opt/castopod/public/$fastcgi_script_name; include fastcgi_params; + fastcgi_param SERVER_NAME $host; fastcgi_index index.php; fastcgi_pass php-handler; } From c745fd8b289101cf38204d154477b2be3a9582ec Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 17 Oct 2022 14:04:47 +0000 Subject: [PATCH 004/477] ci(gitlabci): set base image with php8.0 tag --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d17fbda3..0fc62abd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: code.castopod.org:5050/adaures/castopod:latest +image: code.castopod.org:5050/adaures/castopod:php8.0 stages: - prepare From 3a57538572761b89b8eaaf6088cc5b5f59bc168f Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 17 Oct 2022 14:17:50 +0000 Subject: [PATCH 005/477] build: set minimal php version to 8.1 closes #225 --- .gitlab-ci.yml | 5 +- app/Config/Fediverse.php | 2 +- app/Controllers/EpisodeController.php | 2 +- app/Controllers/WebmanifestController.php | 2 +- app/Entities/Clip/VideoClip.php | 2 +- app/Entities/Episode.php | 8 +- app/Entities/Location.php | 2 +- app/Entities/Podcast.php | 4 +- app/Helpers/form_helper.php | 2 +- app/Helpers/media_helper.php | 2 +- app/Libraries/MediaClipper/VideoClipper.php | 2 +- app/Libraries/Router.php | 10 +- app/Models/EpisodeCommentModel.php | 2 +- app/Models/PlatformModel.php | 2 +- app/Views/Components/DropdownMenu.php | 2 +- builds | 4 +- composer.json | 6 +- composer.lock | 40 +- docker/production/app/Dockerfile | 4 +- docs/src/ar/getting-started/install.md | 6 +- docs/src/br/getting-started/install.md | 6 +- docs/src/ca/getting-started/install.md | 6 +- docs/src/de/getting-started/install.md | 6 +- docs/src/el/getting-started/install.md | 6 +- docs/src/es/getting-started/install.md | 6 +- docs/src/fa/getting-started/install.md | 6 +- docs/src/fr/getting-started/install.md | 6 +- docs/src/gd/getting-started/install.md | 6 +- docs/src/getting-started/install.md | 6 +- docs/src/gl/getting-started/install.md | 6 +- docs/src/id/getting-started/install.md | 6 +- docs/src/it/getting-started/install.md | 6 +- docs/src/nl/getting-started/install.md | 6 +- docs/src/nn-NO/getting-started/install.md | 6 +- docs/src/oc/getting-started/install.md | 6 +- docs/src/pl/getting-started/install.md | 6 +- docs/src/pt-BR/getting-started/install.md | 6 +- docs/src/pt/getting-started/install.md | 6 +- docs/src/ru/getting-started/install.md | 6 +- docs/src/sk/getting-started/install.md | 6 +- docs/src/sv/getting-started/install.md | 6 +- docs/src/zh-Hans/getting-started/install.md | 6 +- ecs.php | 31 +- .../Admin/Controllers/SettingsController.php | 10 +- modules/Analytics/AnalyticsTrait.php | 6 +- .../EpisodeAnalyticsController.php | 2 +- .../Analytics/Helpers/analytics_helper.php | 4 +- modules/Auth/Commands/RolesDoc.php | 6 +- modules/Auth/Helpers/auth_helper.php | 4 +- .../Fediverse/Controllers/ActorController.php | 4 +- .../Fediverse/Controllers/PostController.php | 2 +- modules/Fediverse/Models/PostModel.php | 5 +- package-lock.json | 429 +++++++++--------- package.json | 6 +- preload.php | 26 +- public/index.php | 2 +- rector.php | 26 +- spark | 6 +- tests/modules/Api/Rest/V1/PodcastTest.php | 2 +- 59 files changed, 415 insertions(+), 397 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0fc62abd..32748899 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: code.castopod.org:5050/adaures/castopod:php8.0 +image: code.castopod.org:5050/adaures/castopod:php8.1 stages: - prepare @@ -49,8 +49,9 @@ lint-php: - vendor/bin/ecs check --ansi # phpstan - increase memory limit to 1GB to prevent script failure - php -d memory_limit=1G vendor/bin/phpstan analyse --ansi + # FIXME: rector keeps failing in CI # run rector to check for php errors - - vendor/bin/rector process --dry-run --ansi + # - vendor/bin/rector process --dry-run --ansi dependencies: - php-dependencies diff --git a/app/Config/Fediverse.php b/app/Config/Fediverse.php index 4834d679..cb10bc1a 100644 --- a/app/Config/Fediverse.php +++ b/app/Config/Fediverse.php @@ -42,7 +42,7 @@ class Fediverse extends FediverseBaseConfig } ['dirname' => $dirname, 'extension' => $extension, 'filename' => $filename] = pathinfo( - $defaultBanner['path'] + (string) $defaultBanner['path'] ); $defaultBannerPath = $filename; if ($dirname !== '.') { diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index 6b9c5cf0..5b59cf55 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -176,7 +176,7 @@ class EpisodeController extends BaseController $session = Services::session(); $session->start(); if (isset($_SERVER['HTTP_REFERER'])) { - $session->set('embed_domain', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)); + $session->set('embed_domain', parse_url((string) $_SERVER['HTTP_REFERER'], PHP_URL_HOST)); } $cacheName = implode( diff --git a/app/Controllers/WebmanifestController.php b/app/Controllers/WebmanifestController.php index 8a1bd83e..653bcaae 100644 --- a/app/Controllers/WebmanifestController.php +++ b/app/Controllers/WebmanifestController.php @@ -20,7 +20,7 @@ class WebmanifestController extends Controller /** * @var array> */ - public const THEME_COLORS = [ + final public const THEME_COLORS = [ 'pine' => [ 'theme' => '#009486', 'background' => '#F0F9F8', diff --git a/app/Entities/Clip/VideoClip.php b/app/Entities/Clip/VideoClip.php index a4add008..960296f9 100644 --- a/app/Entities/Clip/VideoClip.php +++ b/app/Entities/Clip/VideoClip.php @@ -53,7 +53,7 @@ class VideoClip extends BaseClip public function setFormat(string $format): self { - $this->attributes['metadata'] = json_decode($this->attributes['metadata'], true); + $this->attributes['metadata'] = json_decode((string) $this->attributes['metadata'], true); $this->attributes['format'] = $format; $this->attributes['metadata']['format'] = $format; diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index d58059c2..56d8af8a 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -536,7 +536,7 @@ class Episode extends Entity { if ($this->description === null) { $this->description = trim( - preg_replace('~\s+~', ' ', strip_tags($this->attributes['description_html'])), + preg_replace('~\s+~', ' ', strip_tags((string) $this->attributes['description_html'])), ); } @@ -620,7 +620,7 @@ class Episode extends Entity 'elements' => $this->custom_rss, ], $xmlNode); - return (string) str_replace(['', ''], '', $xmlNode->asXML()); + return str_replace(['', ''], '', (string) $xmlNode->asXML()); } /** @@ -659,7 +659,7 @@ class Episode extends Entity $this->getPodcast() ->partner_id . '&guid=' . - urlencode($this->attributes['guid']); + urlencode((string) $this->attributes['guid']); if ($serviceSlug !== null) { $partnerLink .= '&_from=' . $serviceSlug; @@ -675,7 +675,7 @@ class Episode extends Entity $this->getPodcast() ->partner_id . '&guid=' . - urlencode($this->attributes['guid']) . + urlencode((string) $this->attributes['guid']) . ($serviceSlug !== null ? '&_from=' . $serviceSlug : ''); } } diff --git a/app/Entities/Location.php b/app/Entities/Location.php index 0062cd7d..b1098687 100644 --- a/app/Entities/Location.php +++ b/app/Entities/Location.php @@ -115,7 +115,7 @@ class Location extends Entity $places[0], 'osm_id' ) && $places[0]->osm_id !== null)) { - $this->attributes['osm'] = strtoupper(substr($places[0]->osm_type, 0, 1)) . $places[0]->osm_id; + $this->attributes['osm'] = strtoupper(substr((string) $places[0]->osm_type, 0, 1)) . $places[0]->osm_id; } return $this; diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index efcdb88d..b9fb35a8 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -495,7 +495,7 @@ class Podcast extends Entity { if ($this->description === null) { $this->description = trim( - (string) preg_replace('~\s+~', ' ', strip_tags($this->attributes['description_html'])), + (string) preg_replace('~\s+~', ' ', strip_tags((string) $this->attributes['description_html'])), ); } @@ -658,7 +658,7 @@ class Podcast extends Entity 'elements' => $this->custom_rss, ], $xmlNode); - return (string) str_replace(['', ''], '', $xmlNode->asXML()); + return str_replace(['', ''], '', (string) $xmlNode->asXML()); } /** diff --git a/app/Helpers/form_helper.php b/app/Helpers/form_helper.php index d0ab8d3a..85808f64 100644 --- a/app/Helpers/form_helper.php +++ b/app/Helpers/form_helper.php @@ -70,7 +70,7 @@ if (! function_exists('parse_form_attributes')) { foreach ($default as $key => $val) { if (! is_bool($val)) { - if ($key === 'name' && ! strlen($default['name'])) { + if ($key === 'name' && ! strlen((string) $default['name'])) { continue; } diff --git a/app/Helpers/media_helper.php b/app/Helpers/media_helper.php index f77d8ef9..e523f296 100644 --- a/app/Helpers/media_helper.php +++ b/app/Helpers/media_helper.php @@ -130,7 +130,7 @@ if (! function_exists('media_base_url')) { $appConfig = config('App'); $mediaBaseUrl = $appConfig->mediaBaseURL === '' ? $appConfig->baseURL : $appConfig->mediaBaseURL; - return rtrim($mediaBaseUrl, '/') . + return rtrim((string) $mediaBaseUrl, '/') . '/' . $appConfig->mediaRoot . '/' . diff --git a/app/Libraries/MediaClipper/VideoClipper.php b/app/Libraries/MediaClipper/VideoClipper.php index 1c97f7cc..7bf7e280 100644 --- a/app/Libraries/MediaClipper/VideoClipper.php +++ b/app/Libraries/MediaClipper/VideoClipper.php @@ -23,7 +23,7 @@ class VideoClipper /** * @var array */ - public const FONTS = [ + final public const FONTS = [ 'episodeTitle' => 'Rubik-Bold.ttf', 'podcastTitle' => 'Inter-Regular.otf', 'subtitles' => 'Inter-SemiBold', diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php index dc760907..9eb9fa51 100644 --- a/app/Libraries/Router.php +++ b/app/Libraries/Router.php @@ -159,17 +159,17 @@ class Router extends CodeIgniterRouter // Support resource route when function with subdirectory // ex: $routes->resource('Admin/Admins'); if ( - str_contains($val, '$') && + str_contains((string) $val, '$') && str_contains($routeKey, '(') && str_contains($routeKey, '/') ) { $replacekey = str_replace('/(.*)', '', $routeKey); $val = preg_replace('#^' . $routeKey . '$#u', $val, $uri); $val = str_replace($replacekey, str_replace('/', '\\', $replacekey), $val); - } elseif (str_contains($val, '$') && str_contains($routeKey, '(')) { + } elseif (str_contains((string) $val, '$') && str_contains($routeKey, '(')) { $val = preg_replace('#^' . $routeKey . '$#u', $val, $uri); - } elseif (str_contains($val, '/')) { - [$controller, $method] = explode('::', $val); + } elseif (str_contains((string) $val, '/')) { + [$controller, $method] = explode('::', (string) $val); // Only replace slashes in the controller, not in the method. $controller = str_replace('/', '\\', $controller); @@ -177,7 +177,7 @@ class Router extends CodeIgniterRouter $val = $controller . '::' . $method; } - $this->setRequest(explode('/', $val)); + $this->setRequest(explode('/', (string) $val)); $this->matchedRoute = [$matchedKey, $val]; diff --git a/app/Models/EpisodeCommentModel.php b/app/Models/EpisodeCommentModel.php index af096172..2c35b0c7 100644 --- a/app/Models/EpisodeCommentModel.php +++ b/app/Models/EpisodeCommentModel.php @@ -73,7 +73,7 @@ class EpisodeCommentModel extends UuidModel return $found; } - public function addComment(EpisodeComment $comment, bool $registerActivity = true): string | false + public function addComment(EpisodeComment $comment, bool $registerActivity = true): bool|int|object|string { $this->db->transStart(); diff --git a/app/Models/PlatformModel.php b/app/Models/PlatformModel.php index 990f4f59..29c7259f 100644 --- a/app/Models/PlatformModel.php +++ b/app/Models/PlatformModel.php @@ -53,7 +53,7 @@ class PlatformModel extends Model public function getPlatforms(): array { if (! ($found = cache('platforms'))) { - $baseUrl = rtrim(config('app')->baseURL, '/'); + $baseUrl = rtrim((string) config('app')->baseURL, '/'); $found = $this->select( "*, CONCAT('{$baseUrl}/assets/images/platforms/',`type`,'/',`slug`,'.svg') as icon", )->findAll(); diff --git a/app/Views/Components/DropdownMenu.php b/app/Views/Components/DropdownMenu.php index bed2220f..8c062311 100644 --- a/app/Views/Components/DropdownMenu.php +++ b/app/Views/Components/DropdownMenu.php @@ -41,7 +41,7 @@ class DropdownMenu extends Component ]); break; case 'html': - $menuItems .= htmlspecialchars_decode($item['content']); + $menuItems .= htmlspecialchars_decode((string) $item['content']); break; case 'separator': $menuItems .= '
'; diff --git a/builds b/builds index cc2ca085..75b9d966 100644 --- a/builds +++ b/builds @@ -38,7 +38,7 @@ if (is_file($file)) { if (is_array($array)) { if ($dev) { $array['minimum-stability'] = 'dev'; - $array['prefer-stable'] = true; + $array['prefer-stable'] = true; $array['repositories'] ??= []; $found = false; @@ -53,7 +53,7 @@ if (is_file($file)) { if (! $found) { $array['repositories'][] = [ 'type' => 'vcs', - 'url' => GITHUB_URL, + 'url' => GITHUB_URL, ]; } diff --git a/composer.json b/composer.json index 1519add3..7b06b0d8 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "homepage": "https://castopod.org", "license": "AGPL-3.0-or-later", "require": { - "php": "^8.0", + "php": "^8.1", "codeigniter4/framework": "v4.2.7", "james-heinrich/getid3": "^2.0.x-dev", "whichbrowser/parser": "^v2.1.7", @@ -47,8 +47,8 @@ "scripts": { "test": "vendor/bin/phpunit", "analyse": "vendor/bin/phpstan analyse --ansi", - "rector": "vendor/bin/rector process --dry-run --ansi --memory-limit=1G", - "rector:fix": "vendor/bin/rector process --ansi --memory-limit=1G", + "rector": "vendor/bin/rector process --dry-run --ansi --memory-limit=2G", + "rector:fix": "vendor/bin/rector process --ansi --memory-limit=2G", "style": "vendor/bin/ecs check --ansi", "style:fix": "vendor/bin/ecs check --fix --ansi", "post-install-cmd": [ diff --git a/composer.lock b/composer.lock index 253d0e08..13285f33 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "51482dcb24c719550a1f0aa7e7580dfc", + "content-hash": "c6dd2c4c4588bd654fd4973c5b574606", "packages": [ { "name": "adaures/ipcat-php", @@ -2411,16 +2411,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.4.1", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", "shasum": "" }, "require": { @@ -2435,15 +2435,19 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" }, "suggest": { "ext-filter": "Required to use the boolean validator." }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -2469,7 +2473,7 @@ "keywords": ["dotenv", "env", "environment"], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" }, "funding": [ { @@ -2481,7 +2485,7 @@ "type": "tidelift" } ], - "time": "2021-12-12T23:22:04+00:00" + "time": "2022-10-16T01:01:54+00:00" }, { "name": "whichbrowser/parser", @@ -3829,25 +3833,25 @@ }, { "name": "rector/rector", - "version": "0.14.5", + "version": "0.14.6", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "f7fd87b2435835f481e6a94ee28e09af412bd3cc" + "reference": "e61574288661334155de6e5f0f45497285abad5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/f7fd87b2435835f481e6a94ee28e09af412bd3cc", - "reference": "f7fd87b2435835f481e6a94ee28e09af412bd3cc", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/e61574288661334155de6e5f0f45497285abad5d", + "reference": "e61574288661334155de6e5f0f45497285abad5d", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.8.6" + "phpstan/phpstan": "^1.8.7" }, "conflict": { - "rector/rector-cakephp": "*", "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", "rector/rector-laravel": "*", "rector/rector-php-parser": "*", "rector/rector-phpoffice": "*", @@ -3869,7 +3873,7 @@ "description": "Instant Upgrade and Automated Refactoring of any PHP code", "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.14.5" + "source": "https://github.com/rectorphp/rector/tree/0.14.6" }, "funding": [ { @@ -3877,7 +3881,7 @@ "type": "github" } ], - "time": "2022-09-29T11:05:42+00:00" + "time": "2022-10-15T22:58:22+00:00" }, { "name": "sebastian/cli-parser", @@ -6687,7 +6691,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.0" + "php": "^8.1" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/docker/production/app/Dockerfile b/docker/production/app/Dockerfile index 6ac15b24..bf281d05 100644 --- a/docker/production/app/Dockerfile +++ b/docker/production/app/Dockerfile @@ -1,11 +1,11 @@ -FROM docker.io/alpine:3.13 AS ffmpeg-downloader +FROM docker.io/alpine:3.16 AS ffmpeg-downloader RUN apk add --no-cache curl && \ curl https://johnvansickle.com/ffmpeg/releases/ffmpeg-5.1.1-amd64-static.tar.xz -o ffmpeg.tar.xz && \ mkdir ffmpeg && \ tar -xJf ffmpeg.tar.xz -C ffmpeg --strip-components 1 -FROM docker.io/php:8.0-fpm-alpine3.13 +FROM docker.io/php:8.1-fpm-alpine3.16 COPY docker/production/app/entrypoint.sh /entrypoint.sh diff --git a/docs/src/ar/getting-started/install.md b/docs/src/ar/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/ar/getting-started/install.md +++ b/docs/src/ar/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/br/getting-started/install.md b/docs/src/br/getting-started/install.md index dac8517e..9e7a1744 100644 --- a/docs/src/br/getting-started/install.md +++ b/docs/src/br/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/ca/getting-started/install.md b/docs/src/ca/getting-started/install.md index 86a47cfd..e6516f14 100644 --- a/docs/src/ca/getting-started/install.md +++ b/docs/src/ca/getting-started/install.md @@ -20,13 +20,13 @@ Si preferiu utilitzar Docker, podeu ometre això i anar directament a la ## Requisits -- PHP v8.0 o superior +- PHP v8.1 o superior - MySQL versió 5.7 o superior o MariaDB versió 10.2 o superior - Support d'HTTPS -### PHP v8.0 o superior +### PHP v8.1 o superior -Es requereix PHP versió 8.0 o superior, amb les extensions següents +Es requereix PHP versió 8.1 o superior, amb les extensions següents instal·lades: - [intl](https://php.net/manual/en/intl.requirements.php) diff --git a/docs/src/de/getting-started/install.md b/docs/src/de/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/de/getting-started/install.md +++ b/docs/src/de/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/el/getting-started/install.md b/docs/src/el/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/el/getting-started/install.md +++ b/docs/src/el/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/es/getting-started/install.md b/docs/src/es/getting-started/install.md index d3fd3b03..b7febe86 100644 --- a/docs/src/es/getting-started/install.md +++ b/docs/src/es/getting-started/install.md @@ -20,13 +20,13 @@ Si prefieres usar Docker, puedes saltarte esto e ir directamente a la ## Requisitos -- PHP v8.0 o superior +- PHP v8.1 o superior - MySQL versión 5.7 o superior o MariaDB versión 10.2 o superior - Soporte HTTPS -### PHP v8.0 o superior +### PHP v8.1 o superior -Se requiere PHP versión 8.0 o superior con las siguientes extensiones +Se requiere PHP versión 8.1 o superior con las siguientes extensiones instaladas: - [intl](https://php.net/manual/en/intl.requirements.php) diff --git a/docs/src/fa/getting-started/install.md b/docs/src/fa/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/fa/getting-started/install.md +++ b/docs/src/fa/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/fr/getting-started/install.md b/docs/src/fr/getting-started/install.md index f3e19c3e..71b41bde 100644 --- a/docs/src/fr/getting-started/install.md +++ b/docs/src/fr/getting-started/install.md @@ -20,13 +20,13 @@ directement à la [documentation Docker](./docker.md) pour Castopod. ## Prérequis -- PHP v8.0 ou supérieure +- PHP v8.1 ou supérieure - MySQL version 5.7 ou supérieure ou MariaDB version 10.2 ou supérieure - Prise en charge HTTPS -### PHP v8.0 ou supérieure +### PHP v8.1 ou supérieure -PHP version 8.0 ou supérieure est requise, avec les extensions suivantes +PHP version 8.1 ou supérieure est requise, avec les extensions suivantes installées : - [intl](https://www.php.net/manual/fr/intl.requirements.php) diff --git a/docs/src/gd/getting-started/install.md b/docs/src/gd/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/gd/getting-started/install.md +++ b/docs/src/gd/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/getting-started/install.md b/docs/src/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/getting-started/install.md +++ b/docs/src/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/gl/getting-started/install.md b/docs/src/gl/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/gl/getting-started/install.md +++ b/docs/src/gl/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/id/getting-started/install.md b/docs/src/id/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/id/getting-started/install.md +++ b/docs/src/id/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/it/getting-started/install.md b/docs/src/it/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/it/getting-started/install.md +++ b/docs/src/it/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/nl/getting-started/install.md +++ b/docs/src/nl/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md index fe65ac10..fdd2a817 100644 --- a/docs/src/nn-NO/getting-started/install.md +++ b/docs/src/nn-NO/getting-started/install.md @@ -20,13 +20,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Krav -- PHP v8.0 eller nyare +- PHP v8.1 eller nyare - MySQL versjon 5.7 eller nyare, eller MariaDB versjon 10.2 eller nyare - Støtte for HTTPS -### PHP v8.0 eller nyare +### PHP v8.1 eller nyare -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/oc/getting-started/install.md +++ b/docs/src/oc/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/pl/getting-started/install.md +++ b/docs/src/pl/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md index 41c0a4a2..d27d6c59 100644 --- a/docs/src/pt-BR/getting-started/install.md +++ b/docs/src/pt-BR/getting-started/install.md @@ -20,13 +20,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requisitos -- PHP v8.0 ou superior +- PHP v8.1 ou superior - MySQL versão 5.7 ou superior ou MariaDB versão 10.2 ou superior - Suporte a HTTPS -### PHP v8.0 ou superior +### PHP v8.1 ou superior -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/pt/getting-started/install.md +++ b/docs/src/pt/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/ru/getting-started/install.md +++ b/docs/src/ru/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/sk/getting-started/install.md +++ b/docs/src/sk/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md index 3d73187d..c68be846 100644 --- a/docs/src/sv/getting-started/install.md +++ b/docs/src/sv/getting-started/install.md @@ -19,13 +19,13 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.0 or higher +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support -### PHP v8.0 or higher +### PHP v8.1 or higher -PHP version 8.0 or higher is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md index 9a4ead83..16960906 100644 --- a/docs/src/zh-Hans/getting-started/install.md +++ b/docs/src/zh-Hans/getting-started/install.md @@ -19,13 +19,13 @@ Castopod 的安装非常简单。 你能在大多数兼容的 PHP-MySQL 的服 ## 要求 -- PHP 8.0 或更高版本 +- PHP 8.1 或更高版本 - MySQL 5.7 或更高版本与 MariaDB 10.2 或更高版本 - HTTPS 支持 -### PHP 8.0 或更高版本 +### PHP 8.1 或更高版本 -需要 PHP 8.0 或更高版本,并安装以下扩展: +需要 PHP 8.1 或更高版本,并安装以下扩展: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) diff --git a/ecs.php b/ecs.php index 8e2da3b1..5e33e870 100644 --- a/ecs.php +++ b/ecs.php @@ -1,12 +1,14 @@ skip([ + $ecsConfig->skip([ // skip specific generated files __DIR__ . '/modules/Admin/Language/*/PersonsTaxonomy.php', @@ -26,7 +33,7 @@ return static function (ECSConfig $ecsConfig): void { __DIR__ . '/app/Views/Components/*', __DIR__ . '/modules/**/Views/Components/*', __DIR__ . '/themes/**/Views/Components/*', - __DIR__ . '/app/Helpers/components_helper.php' + __DIR__ . '/app/Helpers/components_helper.php', ], LineLengthFixer::class => [ @@ -43,18 +50,10 @@ return static function (ECSConfig $ecsConfig): void { // crowdin enforces its own style for translation files // remove SingleQuoteFixer for Language files to prevent conflicts - SingleQuoteFixer::class => [ - __DIR__ . '/app/Language/*', - __DIR__ . '/modules/**/Language/*' - ], + SingleQuoteFixer::class => [__DIR__ . '/app/Language/*', __DIR__ . '/modules/**/Language/*'], AssignmentInConditionSniff::class, ]); - $ecsConfig->sets([ - SetList::PSR_12, - SetList::SYMPLIFY, - SetList::COMMON, - SetList::CLEAN_CODE - ]); + $ecsConfig->sets([SetList::PSR_12, SetList::SYMPLIFY, SetList::COMMON, SetList::CLEAN_CODE]); }; diff --git a/modules/Admin/Controllers/SettingsController.php b/modules/Admin/Controllers/SettingsController.php index 8fd936f4..abd4413a 100644 --- a/modules/Admin/Controllers/SettingsController.php +++ b/modules/Admin/Controllers/SettingsController.php @@ -214,18 +214,18 @@ class SettingsController extends BaseController $allImages = (new MediaModel('image'))->getAllOfType(); foreach ($allImages as $image) { - if (str_starts_with($image->file_path, 'podcasts')) { - if (str_ends_with($image->file_path, 'banner.jpg') || str_ends_with( - $image->file_path, + if (str_starts_with((string) $image->file_path, 'podcasts')) { + if (str_ends_with((string) $image->file_path, 'banner.jpg') || str_ends_with( + (string) $image->file_path, 'banner.png' - ) || str_ends_with($image->file_path, 'banner.jpeg')) { + ) || str_ends_with((string) $image->file_path, 'banner.jpeg')) { $image->sizes = config('Images') ->podcastBannerSizes; } else { $image->sizes = config('Images') ->podcastCoverSizes; } - } elseif (str_starts_with($image->file_path, 'persons')) { + } elseif (str_starts_with((string) $image->file_path, 'persons')) { $image->sizes = config('Images') ->personAvatarSizes; } else { diff --git a/modules/Analytics/AnalyticsTrait.php b/modules/Analytics/AnalyticsTrait.php index 7d1680b4..12cdde88 100644 --- a/modules/Analytics/AnalyticsTrait.php +++ b/modules/Analytics/AnalyticsTrait.php @@ -31,10 +31,10 @@ trait AnalyticsTrait $referer = $session->get('referer'); $domain = - parse_url($referer, PHP_URL_HOST) === null + parse_url((string) $referer, PHP_URL_HOST) === null ? '- Direct -' - : parse_url($referer, PHP_URL_HOST); - parse_str((string) parse_url($referer, PHP_URL_QUERY), $queries); + : parse_url((string) $referer, PHP_URL_HOST); + parse_str((string) parse_url((string) $referer, PHP_URL_QUERY), $queries); $keywords = $queries['q'] ?? null; $procedureName = $db->prefixTable('analytics_website'); diff --git a/modules/Analytics/Controllers/EpisodeAnalyticsController.php b/modules/Analytics/Controllers/EpisodeAnalyticsController.php index e1244d51..8631af4b 100644 --- a/modules/Analytics/Controllers/EpisodeAnalyticsController.php +++ b/modules/Analytics/Controllers/EpisodeAnalyticsController.php @@ -63,7 +63,7 @@ class EpisodeAnalyticsController extends Controller } elseif ($session->get('embed_domain') !== null) { $serviceName = $session->get('embed_domain'); } elseif ($session->get('referer') !== null && $session->get('referer') !== '- Direct -') { - $serviceName = parse_url($session->get('referer'), PHP_URL_HOST); + $serviceName = parse_url((string) $session->get('referer'), PHP_URL_HOST); } $episodeData = unpack( diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php index 351c8da7..f5ef255a 100644 --- a/modules/Analytics/Helpers/analytics_helper.php +++ b/modules/Analytics/Helpers/analytics_helper.php @@ -212,7 +212,7 @@ if (! function_exists('set_user_session_referer')) { ? $_SERVER['HTTP_REFERER'] : '- Direct -'; $newreferer = - parse_url($newreferer, PHP_URL_HOST) === + parse_url((string) $newreferer, PHP_URL_HOST) === parse_url(current_url(false), PHP_URL_HOST) ? '- Direct -' : $newreferer; @@ -311,7 +311,7 @@ if (! function_exists('podcast_hit')) { // [0-1] bytes range requests are used (by Apple) to check that file exists and that 206 partial content is working. // We don't count these requests. // We calculate how many bytes are being downloaded based on HTTP_RANGE values: - $ranges = explode(',', substr($httpRange, 6)); + $ranges = explode(',', substr((string) $httpRange, 6)); foreach ($ranges as $range) { $parts = explode('-', $range); $downloadedBytes += array_key_exists(1, $parts) diff --git a/modules/Auth/Commands/RolesDoc.php b/modules/Auth/Commands/RolesDoc.php index 5326c2b1..fdd8833e 100644 --- a/modules/Auth/Commands/RolesDoc.php +++ b/modules/Auth/Commands/RolesDoc.php @@ -173,7 +173,11 @@ class RolesDoc extends BaseCommand private function detectLocaleFromPath($filePath): string { - preg_match('~docs\/src\/(?:([a-z]{2}(?:-[A-Za-z]{2,})?)\/)getting-started\/auth\.md~', $filePath, $match); + preg_match( + '~docs\/src\/(?:([a-z]{2}(?:-[A-Za-z]{2,})?)\/)getting-started\/auth\.md~', + (string) $filePath, + $match + ); if ($match === []) { return 'en'; diff --git a/modules/Auth/Helpers/auth_helper.php b/modules/Auth/Helpers/auth_helper.php index f382e3f4..a87ac811 100644 --- a/modules/Auth/Helpers/auth_helper.php +++ b/modules/Auth/Helpers/auth_helper.php @@ -155,7 +155,7 @@ if (! function_exists('get_podcast_group')) { } // strip the `podcast#{id}.` prefix when returning group - return substr($podcastGroup, strlen('podcast#' . $podcastId . '-')); + return substr((string) $podcastGroup, strlen('podcast#' . $podcastId . '-')); } } @@ -183,7 +183,7 @@ if (! function_exists('get_podcast_groups')) { $userPodcastIds = []; // extract all podcast ids from groups foreach ($podcastGroups as $podcastGroup) { - $userPodcastIds[] = substr($podcastGroup, strpos($podcastGroup, '#') + 1, 1); + $userPodcastIds[] = substr((string) $podcastGroup, strpos((string) $podcastGroup, '#') + 1, 1); } return $userPodcastIds; diff --git a/modules/Fediverse/Controllers/ActorController.php b/modules/Fediverse/Controllers/ActorController.php index 44b0dc3a..bf232890 100644 --- a/modules/Fediverse/Controllers/ActorController.php +++ b/modules/Fediverse/Controllers/ActorController.php @@ -334,7 +334,7 @@ class ActorController extends Controller ->setBody($followersCollection->toJSON()); } - public function attemptFollow(): RedirectResponse | ResponseInterface + public function attemptFollow(): RedirectResponse { $rules = [ 'handle' => @@ -382,7 +382,7 @@ class ActorController extends Controller } return redirect()->to( - str_replace('{uri}', urlencode($this->actor->uri), $data->links[$ostatusKey]->template), + str_replace('{uri}', urlencode($this->actor->uri), (string) $data->links[$ostatusKey]->template), ); } diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php index 7eb5f47e..a00efb83 100644 --- a/modules/Fediverse/Controllers/PostController.php +++ b/modules/Fediverse/Controllers/PostController.php @@ -259,7 +259,7 @@ class PostController extends Controller } return redirect()->to( - str_replace('{uri}', urlencode($this->post->uri), $data->links[$ostatusKey]->template), + str_replace('{uri}', urlencode($this->post->uri), (string) $data->links[$ostatusKey]->template), ); } diff --git a/modules/Fediverse/Models/PostModel.php b/modules/Fediverse/Models/PostModel.php index 94f2130c..3497e85b 100644 --- a/modules/Fediverse/Models/PostModel.php +++ b/modules/Fediverse/Models/PostModel.php @@ -11,7 +11,6 @@ declare(strict_types=1); namespace Modules\Fediverse\Models; use CodeIgniter\Database\BaseResult; -use CodeIgniter\Database\Query; use CodeIgniter\Events\Events; use CodeIgniter\HTTP\URI; use CodeIgniter\I18n\Time; @@ -230,7 +229,7 @@ class PostModel extends BaseUuidModel return $found; } - public function addPreviewCard(string $postId, int $previewCardId): Query | bool + public function addPreviewCard(string $postId, int $previewCardId): bool { return $this->db->table(config('Fediverse')->tablesPrefix . 'posts_preview_cards') ->insert([ @@ -249,7 +248,7 @@ class PostModel extends BaseUuidModel Post $post, bool $createPreviewCard = true, bool $registerActivity = true - ): string | false { + ): bool|int|object|string { helper('fediverse'); $this->db->transStart(); diff --git a/package-lock.json b/package-lock.json index 1831f5ab..f5089385 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.2", "@tailwindcss/typography": "^0.5.7", - "@types/leaflet": "^1.8.0", + "@types/leaflet": "^1.9.0", "@types/marked": "^4.0.7", "@types/wavesurfer.js": "^6.0.3", "@typescript-eslint/eslint-plugin": "^5.40.0", @@ -64,8 +64,8 @@ "prettier": "2.7.1", "prettier-plugin-organize-imports": "^3.1.1", "semantic-release": "^19.0.5", - "stylelint": "^14.13.0", - "stylelint-config-standard": "^28.0.0", + "stylelint": "^14.14.0", + "stylelint-config-standard": "^29.0.0", "svgo": "^2.8.0", "tailwindcss": "^3.1.8", "typescript": "^4.8.4", @@ -2460,6 +2460,22 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -3508,9 +3524,9 @@ } }, "node_modules/@types/leaflet": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.8.0.tgz", - "integrity": "sha512-+sXFmiJTFdhaXXIGFlV5re9AdqtAODoXbGAvxx02e5SHXL3ir7ClP5J7pahO8VmzKY3dth4RUS1nf2BTT+DW1A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.0.tgz", + "integrity": "sha512-7LeOSj7EloC5UcyOMo+1kc3S1UT3MjJxwqsMT1d2PTyvQz53w0Y0oSSk9nwZnOZubCmBvpSNGceucxiq+ZPEUw==", "dev": true, "dependencies": { "@types/geojson": "*" @@ -6305,9 +6321,9 @@ } }, "node_modules/esbuild": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz", - "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", "dev": true, "hasInstallScript": true, "bin": { @@ -6317,32 +6333,33 @@ "node": ">=12" }, "optionalDependencies": { - "esbuild-android-64": "0.14.48", - "esbuild-android-arm64": "0.14.48", - "esbuild-darwin-64": "0.14.48", - "esbuild-darwin-arm64": "0.14.48", - "esbuild-freebsd-64": "0.14.48", - "esbuild-freebsd-arm64": "0.14.48", - "esbuild-linux-32": "0.14.48", - "esbuild-linux-64": "0.14.48", - "esbuild-linux-arm": "0.14.48", - "esbuild-linux-arm64": "0.14.48", - "esbuild-linux-mips64le": "0.14.48", - "esbuild-linux-ppc64le": "0.14.48", - "esbuild-linux-riscv64": "0.14.48", - "esbuild-linux-s390x": "0.14.48", - "esbuild-netbsd-64": "0.14.48", - "esbuild-openbsd-64": "0.14.48", - "esbuild-sunos-64": "0.14.48", - "esbuild-windows-32": "0.14.48", - "esbuild-windows-64": "0.14.48", - "esbuild-windows-arm64": "0.14.48" + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" } }, "node_modules/esbuild-android-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz", - "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", "cpu": [ "x64" ], @@ -6356,9 +6373,9 @@ } }, "node_modules/esbuild-android-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz", - "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", "cpu": [ "arm64" ], @@ -6372,9 +6389,9 @@ } }, "node_modules/esbuild-darwin-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz", - "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", "cpu": [ "x64" ], @@ -6388,9 +6405,9 @@ } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz", - "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", "cpu": [ "arm64" ], @@ -6404,9 +6421,9 @@ } }, "node_modules/esbuild-freebsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz", - "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", "cpu": [ "x64" ], @@ -6420,9 +6437,9 @@ } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz", - "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", "cpu": [ "arm64" ], @@ -6436,9 +6453,9 @@ } }, "node_modules/esbuild-linux-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz", - "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", "cpu": [ "ia32" ], @@ -6452,9 +6469,9 @@ } }, "node_modules/esbuild-linux-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz", - "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", "cpu": [ "x64" ], @@ -6468,9 +6485,9 @@ } }, "node_modules/esbuild-linux-arm": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz", - "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", "cpu": [ "arm" ], @@ -6484,9 +6501,9 @@ } }, "node_modules/esbuild-linux-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz", - "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", "cpu": [ "arm64" ], @@ -6500,9 +6517,9 @@ } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz", - "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", "cpu": [ "mips64el" ], @@ -6516,9 +6533,9 @@ } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz", - "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", "cpu": [ "ppc64" ], @@ -6532,9 +6549,9 @@ } }, "node_modules/esbuild-linux-riscv64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz", - "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", "cpu": [ "riscv64" ], @@ -6548,9 +6565,9 @@ } }, "node_modules/esbuild-linux-s390x": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz", - "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", "cpu": [ "s390x" ], @@ -6564,9 +6581,9 @@ } }, "node_modules/esbuild-netbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz", - "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", "cpu": [ "x64" ], @@ -6580,9 +6597,9 @@ } }, "node_modules/esbuild-openbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz", - "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", "cpu": [ "x64" ], @@ -6596,9 +6613,9 @@ } }, "node_modules/esbuild-sunos-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz", - "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", "cpu": [ "x64" ], @@ -6612,9 +6629,9 @@ } }, "node_modules/esbuild-windows-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz", - "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", "cpu": [ "ia32" ], @@ -6628,9 +6645,9 @@ } }, "node_modules/esbuild-windows-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz", - "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", "cpu": [ "x64" ], @@ -6644,9 +6661,9 @@ } }, "node_modules/esbuild-windows-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz", - "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", "cpu": [ "arm64" ], @@ -12993,9 +13010,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "funding": [ { "type": "opencollective", @@ -14686,9 +14703,9 @@ } }, "node_modules/rollup": { - "version": "2.75.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", - "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -15524,9 +15541,9 @@ } }, "node_modules/stylelint": { - "version": "14.13.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.13.0.tgz", - "integrity": "sha512-NJSAdloiAB/jgVJKxMR90mWlctvmeBFGFVUvyKngi9+j/qPSJ5ZB+u8jOmGbLTnS7OHrII9NFGehPRyar8U5vg==", + "version": "14.14.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz", + "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==", "dev": true, "dependencies": { "@csstools/selector-specificity": "^2.0.2", @@ -15552,7 +15569,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.16", + "postcss": "^8.4.17", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -15589,15 +15606,15 @@ } }, "node_modules/stylelint-config-standard": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-28.0.0.tgz", - "integrity": "sha512-q/StuowDdDmFCravzGHAwgS9pjX0bdOQUEBBDIkIWsQuYGgYz/xsO8CM6eepmIQ1fc5bKdDVimlJZ6MoOUcJ5Q==", + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", + "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", "dev": true, "dependencies": { "stylelint-config-recommended": "^9.0.0" }, "peerDependencies": { - "stylelint": "^14.11.0" + "stylelint": "^14.14.0" } }, "node_modules/stylelint/node_modules/balanced-match": { @@ -18856,6 +18873,13 @@ "dev": true, "requires": {} }, + "@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "dev": true, + "optional": true + }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -19647,9 +19671,9 @@ } }, "@types/leaflet": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.8.0.tgz", - "integrity": "sha512-+sXFmiJTFdhaXXIGFlV5re9AdqtAODoXbGAvxx02e5SHXL3ir7ClP5J7pahO8VmzKY3dth4RUS1nf2BTT+DW1A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.0.tgz", + "integrity": "sha512-7LeOSj7EloC5UcyOMo+1kc3S1UT3MjJxwqsMT1d2PTyvQz53w0Y0oSSk9nwZnOZubCmBvpSNGceucxiq+ZPEUw==", "dev": true, "requires": { "@types/geojson": "*" @@ -21577,170 +21601,171 @@ } }, "esbuild": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz", - "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", "dev": true, "requires": { - "esbuild-android-64": "0.14.48", - "esbuild-android-arm64": "0.14.48", - "esbuild-darwin-64": "0.14.48", - "esbuild-darwin-arm64": "0.14.48", - "esbuild-freebsd-64": "0.14.48", - "esbuild-freebsd-arm64": "0.14.48", - "esbuild-linux-32": "0.14.48", - "esbuild-linux-64": "0.14.48", - "esbuild-linux-arm": "0.14.48", - "esbuild-linux-arm64": "0.14.48", - "esbuild-linux-mips64le": "0.14.48", - "esbuild-linux-ppc64le": "0.14.48", - "esbuild-linux-riscv64": "0.14.48", - "esbuild-linux-s390x": "0.14.48", - "esbuild-netbsd-64": "0.14.48", - "esbuild-openbsd-64": "0.14.48", - "esbuild-sunos-64": "0.14.48", - "esbuild-windows-32": "0.14.48", - "esbuild-windows-64": "0.14.48", - "esbuild-windows-arm64": "0.14.48" + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" } }, "esbuild-android-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz", - "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", "dev": true, "optional": true }, "esbuild-android-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz", - "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz", - "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz", - "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz", - "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz", - "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz", - "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz", - "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz", - "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz", - "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz", - "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz", - "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", "dev": true, "optional": true }, "esbuild-linux-riscv64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz", - "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", "dev": true, "optional": true }, "esbuild-linux-s390x": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz", - "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz", - "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz", - "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz", - "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", "dev": true, "optional": true }, "esbuild-windows-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz", - "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz", - "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz", - "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==", + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", "dev": true, "optional": true }, @@ -26047,9 +26072,9 @@ } }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -27087,9 +27112,9 @@ } }, "rollup": { - "version": "2.75.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", - "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -27687,9 +27712,9 @@ } }, "stylelint": { - "version": "14.13.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.13.0.tgz", - "integrity": "sha512-NJSAdloiAB/jgVJKxMR90mWlctvmeBFGFVUvyKngi9+j/qPSJ5ZB+u8jOmGbLTnS7OHrII9NFGehPRyar8U5vg==", + "version": "14.14.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz", + "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==", "dev": true, "requires": { "@csstools/selector-specificity": "^2.0.2", @@ -27715,7 +27740,7 @@ "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.16", + "postcss": "^8.4.17", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", @@ -27780,9 +27805,9 @@ "requires": {} }, "stylelint-config-standard": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-28.0.0.tgz", - "integrity": "sha512-q/StuowDdDmFCravzGHAwgS9pjX0bdOQUEBBDIkIWsQuYGgYz/xsO8CM6eepmIQ1fc5bKdDVimlJZ6MoOUcJ5Q==", + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", + "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", "dev": true, "requires": { "stylelint-config-recommended": "^9.0.0" diff --git a/package.json b/package.json index e2c2cb63..34432201 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.2", "@tailwindcss/typography": "^0.5.7", - "@types/leaflet": "^1.8.0", + "@types/leaflet": "^1.9.0", "@types/marked": "^4.0.7", "@types/wavesurfer.js": "^6.0.3", "@typescript-eslint/eslint-plugin": "^5.40.0", @@ -82,8 +82,8 @@ "prettier": "2.7.1", "prettier-plugin-organize-imports": "^3.1.1", "semantic-release": "^19.0.5", - "stylelint": "^14.13.0", - "stylelint-config-standard": "^28.0.0", + "stylelint": "^14.14.0", + "stylelint-config-standard": "^29.0.0", "svgo": "^2.8.0", "tailwindcss": "^3.1.8", "typescript": "^4.8.4", diff --git a/preload.php b/preload.php index 5840d804..95d7f1e7 100644 --- a/preload.php +++ b/preload.php @@ -1,12 +1,14 @@ * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. + * For the full copyright and license information, please view the LICENSE file that was distributed with this source + * code. */ /* @@ -75,12 +77,6 @@ class preload $this->loadAutoloader(); } - private function loadAutoloader(): void - { - $paths = new Config\Paths(); - require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php'; - } - /** * Load PHP files. */ @@ -88,12 +84,8 @@ class preload { foreach ($this->paths as $path) { $directory = new RecursiveDirectoryIterator($path['include']); - $fullTree = new RecursiveIteratorIterator($directory); - $phpFiles = new RegexIterator( - $fullTree, - '/.+((? $file) { foreach ($path['exclude'] as $exclude) { @@ -107,6 +99,12 @@ class preload } } } + + private function loadAutoloader(): void + { + $paths = new Config\Paths(); + require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php'; + } } (new preload())->load(); diff --git a/public/index.php b/public/index.php index b80d9fbf..d8fe40cc 100644 --- a/public/index.php +++ b/public/index.php @@ -7,7 +7,7 @@ use Config\Paths; use Config\Services; // Check PHP version. -$minPhpVersion = '8.0'; // If you update this, don't forget to update `spark`. +$minPhpVersion = '8.1'; // If you update this, don't forget to update `spark`. if (version_compare(PHP_VERSION, $minPhpVersion, '<')) { $message = sprintf( 'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s', diff --git a/rector.php b/rector.php index 96dad228..e9500488 100644 --- a/rector.php +++ b/rector.php @@ -18,21 +18,14 @@ use Rector\Php71\Rector\FuncCall\RemoveExtraParametersRector; use Rector\Set\ValueObject\SetList; return static function (RectorConfig $rectorConfig): void { - // get parameters - $rectorConfig->paths([ - __DIR__ . '/app', - __DIR__ . '/modules', - __DIR__ . '/tests', - __DIR__ . '/public', - ]); + $rectorConfig->paths([__DIR__ . '/app', __DIR__ . '/modules', __DIR__ . '/tests', __DIR__ . '/public']); // do you need to include constants, class aliases or custom autoloader? files listed will be executed - $rectorConfig->bootstrapFiles([ - __DIR__ . '/vendor/codeigniter4/framework/system/Test/bootstrap.php', - ]); + $rectorConfig->bootstrapFiles([__DIR__ . '/vendor/codeigniter4/framework/system/Test/bootstrap.php']); // Define what rule sets will be applied - $rectorConfig->sets([SetList::PHP_80, + $rectorConfig->sets([ + SetList::PHP_81, SetList::TYPE_DECLARATION, SetList::TYPE_DECLARATION_STRICT, SetList::CODE_QUALITY, @@ -44,7 +37,7 @@ return static function (RectorConfig $rectorConfig): void { // auto import fully qualified class names $rectorConfig->importNames(); - $rectorConfig->phpVersion(PhpVersion::PHP_80); + $rectorConfig->phpVersion(PhpVersion::PHP_81); $rectorConfig->skip([ // .mp3 files were somehow processed by rector, so skip all media files @@ -69,14 +62,9 @@ return static function (RectorConfig $rectorConfig): void { __DIR__ . '/app/Language/*', __DIR__ . '/modules/*/Language/*', ], - SymplifyQuoteEscapeRector::class => [ - __DIR__ . '/app/Language/*', - __DIR__ . '/modules/*/Language/*', - ], + SymplifyQuoteEscapeRector::class => [__DIR__ . '/app/Language/*', __DIR__ . '/modules/*/Language/*'], - NewlineAfterStatementRector::class => [ - __DIR__ . '/app/Views', - ] + NewlineAfterStatementRector::class => [__DIR__ . '/app/Views'], ]); // Path to phpstan with extensions, that PHPStan in Rector uses to determine types diff --git a/spark b/spark index 306cf957..ceed30a1 100644 --- a/spark +++ b/spark @@ -6,8 +6,8 @@ * * (c) CodeIgniter Foundation * - * For the full copyright and license information, please view - * the LICENSE file that was distributed with this source code. + * For the full copyright and license information, please view the LICENSE file that was distributed with this source + * code. */ /* @@ -27,7 +27,7 @@ if (strpos(PHP_SAPI, 'cgi') === 0) { } // Check PHP version. -$minPhpVersion = '8.0'; // If you update this, don't forget to update `public/index.php`. +$minPhpVersion = '8.1'; // If you update this, don't forget to update `public/index.php`. if (version_compare(PHP_VERSION, $minPhpVersion, '<')) { $message = sprintf( 'Your PHP version must be %s or higher to run CodeIgniter. Current version: %s', diff --git a/tests/modules/Api/Rest/V1/PodcastTest.php b/tests/modules/Api/Rest/V1/PodcastTest.php index ba6bc019..6131ad90 100644 --- a/tests/modules/Api/Rest/V1/PodcastTest.php +++ b/tests/modules/Api/Rest/V1/PodcastTest.php @@ -44,7 +44,7 @@ class PodcastTest extends CIUnitTestCase */ private array $podcast = []; - private string $podcastApiUrl; + private readonly string $podcastApiUrl; /** * @param array $data From c668f1c151562713a339ea5e4f2039a65fa17977 Mon Sep 17 00:00:00 2001 From: Benjamin Bellamy Date: Mon, 17 Oct 2022 15:48:29 +0000 Subject: [PATCH 006/477] chore(platforms): update amazon and podcastindex submit urls --- app/Database/Seeds/PlatformSeeder.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index dbfcd2e2..a008a4b6 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -23,15 +23,15 @@ class PlatformSeeder extends Seeder 'slug' => 'amazon', 'type' => 'podcasting', 'label' => 'Amazon Music and Audible', - 'home_url' => 'https://music.amazon.com/podcasts', - 'submit_url' => 'http://amazon.com/podcasters', + 'home_url' => 'https://music.amazon.com/', + 'submit_url' => 'https://podcasters.amazon.com/', ], [ 'slug' => 'antennapod', 'type' => 'podcasting', 'label' => 'AntennaPod', 'home_url' => 'https://antennapod.org/', - 'submit_url' => 'https://api.podcastindex.org/signup', + 'submit_url' => 'https://podcastindex.org/add', ], [ 'slug' => 'apple', @@ -161,7 +161,7 @@ class PlatformSeeder extends Seeder 'type' => 'podcasting', 'label' => 'Podcast Index', 'home_url' => 'https://podcastindex.org/', - 'submit_url' => 'https://api.podcastindex.org/signup', + 'submit_url' => 'https://podcastindex.org/add', ], [ 'slug' => 'podchaser', @@ -203,7 +203,7 @@ class PlatformSeeder extends Seeder 'type' => 'podcasting', 'label' => 'Podfriend', 'home_url' => 'https://www.podfriend.com/', - 'submit_url' => 'https://api.podcastindex.org/signup', + 'submit_url' => 'https://podcastindex.org/add', ], [ 'slug' => 'podverse', From d0836f3ee360a836f815c59ea755f288501dc517 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 18 Oct 2022 16:53:51 +0000 Subject: [PATCH 007/477] feat: add about page in admin with instance info + database update button --- app/Config/Autoload.php | 1 + .../2023-04-09-110000_testing_update.php | 35 ++++++++++ app/Resources/icons/information.svg | 4 ++ docs/src/getting-started/update.md | 40 +++++++---- modules/Admin/Config/Routes.php | 10 +++ modules/Admin/Controllers/AboutController.php | 67 +++++++++++++++++++ modules/Admin/Language/en/AboutCastopod.php | 22 ++++++ modules/Admin/Language/en/Breadcrumb.php | 1 + modules/Admin/Language/en/Navigation.php | 1 + modules/Update/Commands/DatabaseUpdate.php | 32 +++++++++ themes/cp_admin/_sidebar.php | 4 ++ themes/cp_admin/about.php | 35 ++++++++++ themes/cp_install/_layout.php | 4 +- 13 files changed, 242 insertions(+), 14 deletions(-) create mode 100644 app/Database/Migrations/2023-04-09-110000_testing_update.php create mode 100644 app/Resources/icons/information.svg create mode 100644 modules/Admin/Controllers/AboutController.php create mode 100644 modules/Admin/Language/en/AboutCastopod.php create mode 100644 modules/Update/Commands/DatabaseUpdate.php create mode 100644 themes/cp_admin/about.php diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index f314d3d2..1b4bab55 100644 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -48,6 +48,7 @@ class Autoload extends AutoloadConfig 'Modules\Auth' => ROOTPATH . 'modules/Auth/', 'Modules\Analytics' => ROOTPATH . 'modules/Analytics/', 'Modules\Install' => ROOTPATH . 'modules/Install/', + 'Modules\Update' => ROOTPATH . 'modules/Update/', 'Modules\Fediverse' => ROOTPATH . 'modules/Fediverse/', 'Modules\WebSub' => ROOTPATH . 'modules/WebSub/', 'Modules\Api\Rest\V1' => ROOTPATH . 'modules/Api/Rest/V1', diff --git a/app/Database/Migrations/2023-04-09-110000_testing_update.php b/app/Database/Migrations/2023-04-09-110000_testing_update.php new file mode 100644 index 00000000..44681198 --- /dev/null +++ b/app/Database/Migrations/2023-04-09-110000_testing_update.php @@ -0,0 +1,35 @@ +forge->addColumn('podcasts', [ + 'cool_update' => [ + 'type' => 'INT', + 'unsigned' => true, + 'null' => true, + 'after' => 'custom_rss', + ], + ]); + } + + public function down(): void + { + $this->forge->dropColumn('podcasts', 'cool_update'); + } +} diff --git a/app/Resources/icons/information.svg b/app/Resources/icons/information.svg new file mode 100644 index 00000000..39f02fbd --- /dev/null +++ b/app/Resources/icons/information.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/src/getting-started/update.md b/docs/src/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/getting-started/update.md +++ b/docs/src/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php index 7bf22166..586272ea 100644 --- a/modules/Admin/Config/Routes.php +++ b/modules/Admin/Config/Routes.php @@ -644,5 +644,15 @@ $routes->group( ]); }); }); + + $routes->get('about', 'AboutController', [ + 'as' => 'admin-about', + 'filter' => 'permission:admin.settings', + ]); + + $routes->post('update', 'AboutController::updateAction', [ + 'as' => 'update', + 'filter' => 'permission:admin.settings', + ]); }, ); diff --git a/modules/Admin/Controllers/AboutController.php b/modules/Admin/Controllers/AboutController.php new file mode 100644 index 00000000..02be5c9e --- /dev/null +++ b/modules/Admin/Controllers/AboutController.php @@ -0,0 +1,67 @@ + current_domain(), + 'version' => CP_VERSION, + 'php_version' => PHP_VERSION, + 'os' => PHP_OS, + 'languages' => implode(', ', config('App')->supportedLocales), + ]; + + return view('about', [ + 'info' => $instanceInfo, + ]); + } + + public function updateAction(): RedirectResponse + { + if ($this->request->getPost('action') === 'database') { + return $this->migrateDatabase(); + } + + return redirect()->back() + ->with('error', lang('Security.disallowedAction')); + } + + public function migrateDatabase(): RedirectResponse + { + $migrate = Services::migrations(); + + $migrate->setNamespace('CodeIgniter\Settings') + ->latest(); + $migrate->setNamespace('CodeIgniter\Shield') + ->latest(); + $migrate->setNamespace('Modules\Fediverse') + ->latest(); + $migrate->setNamespace(APP_NAMESPACE) + ->latest(); + $migrate->setNamespace('Modules\WebSub') + ->latest(); + $migrate->setNamespace('Modules\Auth') + ->latest(); + $migrate->setNamespace('Modules\PremiumPodcasts') + ->latest(); + $migrate->setNamespace('Modules\Analytics') + ->latest(); + + return redirect()->back() + ->with('message', lang('AboutCastopod.messages.databaseUpdateSuccess')); + } +} diff --git a/modules/Admin/Language/en/AboutCastopod.php b/modules/Admin/Language/en/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/en/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/en/Breadcrumb.php b/modules/Admin/Language/en/Breadcrumb.php index 823ccd65..b1742abf 100644 --- a/modules/Admin/Language/en/Breadcrumb.php +++ b/modules/Admin/Language/en/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pages', 'settings' => 'settings', 'theme' => 'theme', + 'about' => 'about', 'add' => 'add', 'new' => 'new', 'edit' => 'edit', diff --git a/modules/Admin/Language/en/Navigation.php b/modules/Admin/Language/en/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/en/Navigation.php +++ b/modules/Admin/Language/en/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Update/Commands/DatabaseUpdate.php b/modules/Update/Commands/DatabaseUpdate.php new file mode 100644 index 00000000..70a3ad01 --- /dev/null +++ b/modules/Update/Commands/DatabaseUpdate.php @@ -0,0 +1,32 @@ +call('migrate', [ + 'all' => true, + ]); + } +} diff --git a/themes/cp_admin/_sidebar.php b/themes/cp_admin/_sidebar.php index f557e5e9..af545250 100644 --- a/themes/cp_admin/_sidebar.php +++ b/themes/cp_admin/_sidebar.php @@ -53,4 +53,8 @@ $navigation = [
+ + + + diff --git a/themes/cp_admin/about.php b/themes/cp_admin/about.php new file mode 100644 index 00000000..8df341bf --- /dev/null +++ b/themes/cp_admin/about.php @@ -0,0 +1,35 @@ +extend('_layout') ?> + +section('title') ?> + +endSection() ?> + +section('pageTitle') ?> + +endSection() ?> + +section('content') ?> + +
+ + +
+ + $value): ?> +
+
+ +
+
+ +
+
+ + +endSection() ?> diff --git a/themes/cp_install/_layout.php b/themes/cp_install/_layout.php index 6d35f502..1065c588 100644 --- a/themes/cp_install/_layout.php +++ b/themes/cp_install/_layout.php @@ -6,8 +6,8 @@ - Castopod Install - + <?= lang('Install.title') ?> + From 1686f840d16f2bd3d71d7f222a59b8e6a838fd6e Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 18 Oct 2022 17:25:49 +0000 Subject: [PATCH 008/477] fix: sort episodes by published_at with unpublished episodes at the begining set the right permissions for episode's publication date edit fixes #249 --- modules/Admin/Config/Routes.php | 4 ++-- modules/Admin/Controllers/EpisodeController.php | 2 ++ modules/Admin/Controllers/PodcastController.php | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php index 586272ea..ce09a16f 100644 --- a/modules/Admin/Config/Routes.php +++ b/modules/Admin/Config/Routes.php @@ -333,7 +333,7 @@ $routes->group( [ 'as' => 'episode-publish_date_edit', 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->post( @@ -341,7 +341,7 @@ $routes->group( 'EpisodeController::attemptPublishDateEdit/$1/$2', [ 'filter' => - 'permission:podcast-manage_publications', + 'permission:podcast#.episodes.manage-publications', ], ); $routes->get( diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 821c7bd7..23a90cc6 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -74,6 +74,7 @@ class EpisodeController extends BaseController ->where('podcast_id', $this->podcast->id) ->like('title', $query) ->orLike('description_markdown', $query) + ->orderBy('-`published_at`', '', false) ->orderBy('created_at', 'desc'); } else { $episodes = (new EpisodeModel()) @@ -83,6 +84,7 @@ class EpisodeController extends BaseController } else { $episodes = (new EpisodeModel()) ->where('podcast_id', $this->podcast->id) + ->orderBy('-`published_at`', '', false) ->orderBy('created_at', 'desc'); } diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 4acc02fa..488fe464 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -422,6 +422,7 @@ class PodcastController extends BaseController { $episodes = (new EpisodeModel()) ->where('podcast_id', $podcastId) + ->orderBy('-`published_at`', '', false) ->orderBy('created_at', 'desc') ->findAll($limit); From 0bab4c7af9daabbbbb2a9f4a878364d58df89f32 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 19 Oct 2022 11:02:05 +0000 Subject: [PATCH 009/477] chore: remove testing update migration + rename auth migration --- .../2023-04-09-110000_testing_update.php | 35 ------------------- ...020-12-29-100000_add_is_owner_to_users.php | 3 +- 2 files changed, 1 insertion(+), 37 deletions(-) delete mode 100644 app/Database/Migrations/2023-04-09-110000_testing_update.php diff --git a/app/Database/Migrations/2023-04-09-110000_testing_update.php b/app/Database/Migrations/2023-04-09-110000_testing_update.php deleted file mode 100644 index 44681198..00000000 --- a/app/Database/Migrations/2023-04-09-110000_testing_update.php +++ /dev/null @@ -1,35 +0,0 @@ -forge->addColumn('podcasts', [ - 'cool_update' => [ - 'type' => 'INT', - 'unsigned' => true, - 'null' => true, - 'after' => 'custom_rss', - ], - ]); - } - - public function down(): void - { - $this->forge->dropColumn('podcasts', 'cool_update'); - } -} diff --git a/modules/Auth/Database/Migrations/2020-12-29-100000_add_is_owner_to_users.php b/modules/Auth/Database/Migrations/2020-12-29-100000_add_is_owner_to_users.php index aa587ba4..2047c220 100644 --- a/modules/Auth/Database/Migrations/2020-12-29-100000_add_is_owner_to_users.php +++ b/modules/Auth/Database/Migrations/2020-12-29-100000_add_is_owner_to_users.php @@ -6,8 +6,7 @@ namespace App\Database\Migrations; use CodeIgniter\Database\Migration; -// Add custom column for shield -class AddCustomColumnForUser extends Migration +class AddIsOwnerToUsers extends Migration { public function up(): void { From 73f094daf26a8cf75e39ebff1eeb7f9039276312 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 19 Oct 2022 11:35:08 +0000 Subject: [PATCH 010/477] revert(install): redirect to install in homepage if no database was set --- app/Controllers/HomeController.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php index b2f28b55..68816c0c 100644 --- a/app/Controllers/HomeController.php +++ b/app/Controllers/HomeController.php @@ -13,27 +13,27 @@ namespace App\Controllers; use App\Models\PodcastModel; use CodeIgniter\HTTP\RedirectResponse; use Config\Services; -use Exception; class HomeController extends BaseController { public function index(): RedirectResponse | string { - $sortOptions = ['activity', 'created_desc', 'created_asc']; - $sortBy = in_array($this->request->getGet('sort'), $sortOptions, true) ? $this->request->getGet( - 'sort' - ) : 'activity'; - - try { - $allPodcasts = (new PodcastModel())->getAllPodcasts($sortBy); - } catch (Exception) { - // Database connection has not been set or could not find the podcasts table + $db = db_connect(); + if ($db->getDatabase() === '' || ! $db->tableExists('podcasts')) { + // Database has not been set or could not find the podcasts table // Redirecting to install page because it is likely that Castopod has not been installed yet. // NB: as base_url wouldn't have been defined here, redirect to install wizard manually $route = Services::routes()->reverseRoute('install'); return redirect()->to(rtrim(host_url(), '/') . $route); } + $sortOptions = ['activity', 'created_desc', 'created_asc']; + $sortBy = in_array($this->request->getGet('sort'), $sortOptions, true) ? $this->request->getGet( + 'sort' + ) : 'activity'; + + $allPodcasts = (new PodcastModel())->getAllPodcasts($sortBy); + // check if there's only one podcast to redirect user to it if (count($allPodcasts) === 1) { return redirect()->route('podcast-activity', [$allPodcasts[0]->handle]); From 5a2ca0cc4ae85cc15960201c86f131cb822f714f Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 19 Oct 2022 11:47:26 +0000 Subject: [PATCH 011/477] fix(install): add password validation when creating super admin --- modules/Install/Controllers/InstallController.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index c5705c9f..e0d131f2 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -292,7 +292,18 @@ class InstallController extends Controller */ public function attemptCreateSuperAdmin(): RedirectResponse { + // validate user password + $rules = [ + 'password' => 'required|strong_password', + ]; + $userModel = new UserModel(); + if (! $this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $userModel->errors()); + } // Save the user $user = new User([ @@ -301,6 +312,7 @@ class InstallController extends Controller 'password' => $this->request->getPost('password'), 'is_owner' => true, ]); + try { $userModel->save($user); } catch (ValidationException) { From b07ac093b2cae646f9a897bc9dfeeaef6eda6561 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 19 Oct 2022 14:46:54 +0000 Subject: [PATCH 012/477] fix: validate slug length when submitting episode form + clean permalink edit prefix --- app/Resources/js/modules/permalink-edit.ts | 7 ++++++- modules/Admin/Controllers/EpisodeController.php | 2 ++ themes/cp_admin/episode/create.php | 4 ++-- themes/cp_admin/episode/edit.php | 4 ++-- themes/cp_admin/page/create.php | 4 ++-- themes/cp_admin/page/edit.php | 4 ++-- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/app/Resources/js/modules/permalink-edit.ts b/app/Resources/js/modules/permalink-edit.ts index fdda43cf..2ea12f2d 100644 --- a/app/Resources/js/modules/permalink-edit.ts +++ b/app/Resources/js/modules/permalink-edit.ts @@ -25,6 +25,9 @@ export class PermalinkEdit extends LitElement { @property({ attribute: "copy-label" }) copyLabel = "Copy"; + @property({ attribute: "permalink-base" }) + permalinkBase = ""; + @state() isEditable = false; @@ -68,6 +71,8 @@ export class PermalinkEdit extends LitElement { } firstUpdated(): void { + this.permalinkBase += this.permalinkBase.endsWith("/") ? "" : "/"; + // set permalink value this.setPermalink(); @@ -130,7 +135,7 @@ export class PermalinkEdit extends LitElement { } setPermalink(): void { - this.permalink = this._domain[0].innerHTML + this._slugInput[0].value; + this.permalink = this.permalinkBase + this._slugInput[0].value; } static styles = css` diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 23a90cc6..903cab0d 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -135,6 +135,7 @@ class EpisodeController extends BaseController public function attemptCreate(): RedirectResponse { $rules = [ + 'slug' => 'max_length[128]', 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]', 'cover' => 'is_image[cover]|ext_in[cover,jpg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', @@ -272,6 +273,7 @@ class EpisodeController extends BaseController public function attemptEdit(): RedirectResponse { $rules = [ + 'slug' => 'max_length[128]', 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]|permit_empty', 'cover' => diff --git a/themes/cp_admin/episode/create.php b/themes/cp_admin/episode/create.php index 4953d28b..64e3f995 100644 --- a/themes/cp_admin/episode/create.php +++ b/themes/cp_admin/episode/create.php @@ -45,8 +45,8 @@
- - handle) . '/episodes') . '/' ?> + + at_handle) . '/' ?>
diff --git a/themes/cp_admin/episode/edit.php b/themes/cp_admin/episode/edit.php index ab7d6a44..346ec7da 100644 --- a/themes/cp_admin/episode/edit.php +++ b/themes/cp_admin/episode/edit.php @@ -49,8 +49,8 @@
- - handle) . '/episodes') . '/' ?> + + handle) . '/' ?>
diff --git a/themes/cp_admin/page/create.php b/themes/cp_admin/page/create.php index 50c6351b..125196c5 100644 --- a/themes/cp_admin/page/create.php +++ b/themes/cp_admin/page/create.php @@ -23,8 +23,8 @@
- - + + …/pages/
diff --git a/themes/cp_admin/page/edit.php b/themes/cp_admin/page/edit.php index e1864e21..8047a1d0 100644 --- a/themes/cp_admin/page/edit.php +++ b/themes/cp_admin/page/edit.php @@ -25,8 +25,8 @@
- - + + …/pages/
From 07780c5f6f443a7f7f1cb9a817737cf60de377d5 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 20 Oct 2022 06:48:44 +0000 Subject: [PATCH 013/477] refactor(migrations): set namespace to null to run all migrations during install and updates --- modules/Admin/Controllers/AboutController.php | 16 +--------------- .../Install/Controllers/InstallController.php | 18 ++---------------- 2 files changed, 3 insertions(+), 31 deletions(-) diff --git a/modules/Admin/Controllers/AboutController.php b/modules/Admin/Controllers/AboutController.php index 02be5c9e..222bcefd 100644 --- a/modules/Admin/Controllers/AboutController.php +++ b/modules/Admin/Controllers/AboutController.php @@ -44,21 +44,7 @@ class AboutController extends BaseController { $migrate = Services::migrations(); - $migrate->setNamespace('CodeIgniter\Settings') - ->latest(); - $migrate->setNamespace('CodeIgniter\Shield') - ->latest(); - $migrate->setNamespace('Modules\Fediverse') - ->latest(); - $migrate->setNamespace(APP_NAMESPACE) - ->latest(); - $migrate->setNamespace('Modules\WebSub') - ->latest(); - $migrate->setNamespace('Modules\Auth') - ->latest(); - $migrate->setNamespace('Modules\PremiumPodcasts') - ->latest(); - $migrate->setNamespace('Modules\Analytics') + $migrate->setNamespace(null) ->latest(); return redirect()->back() diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index e0d131f2..82be50da 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -246,23 +246,9 @@ class InstallController extends Controller */ public function migrate(): void { - $migrations = Services::migrations(); + $migrate = Services::migrations(); - $migrations->setNamespace('CodeIgniter\Settings') - ->latest(); - $migrations->setNamespace('CodeIgniter\Shield') - ->latest(); - $migrations->setNamespace('Modules\Fediverse') - ->latest(); - $migrations->setNamespace(APP_NAMESPACE) - ->latest(); - $migrations->setNamespace('Modules\WebSub') - ->latest(); - $migrations->setNamespace('Modules\Auth') - ->latest(); - $migrations->setNamespace('Modules\PremiumPodcasts') - ->latest(); - $migrations->setNamespace('Modules\Analytics') + $migrate->setNamespace(null) ->latest(); } From d76a1d9feeb7f21bffeab4cef2f6e03c70f340aa Mon Sep 17 00:00:00 2001 From: crowdin Date: Thu, 20 Oct 2022 07:55:28 +0000 Subject: [PATCH 014/477] chore: new Crowdin updates --- app/Language/ko/Comment.php | 34 ++ app/Language/ko/Common.php | 30 ++ app/Language/ko/Episode.php | 33 ++ app/Language/ko/Fediverse.php | 37 +++ app/Language/ko/Home.php | 20 ++ app/Language/ko/Page.php | 17 + app/Language/ko/Podcast.php | 53 +++ app/Language/ko/Post.php | 40 +++ docs/src/ar/getting-started/update.md | 39 ++- docs/src/br/getting-started/update.md | 39 ++- docs/src/ca/getting-started/update.md | 94 +++--- docs/src/de/getting-started/update.md | 40 ++- docs/src/el/getting-started/update.md | 40 ++- docs/src/es/getting-started/update.md | 96 +++--- docs/src/fa/getting-started/update.md | 40 ++- docs/src/fr/getting-started/update.md | 96 +++--- docs/src/gd/getting-started/update.md | 40 ++- docs/src/gl/getting-started/update.md | 40 ++- docs/src/id/getting-started/update.md | 40 ++- docs/src/it/getting-started/update.md | 39 ++- docs/src/ko/getting-started/docker.md | 148 +++++++++ docs/src/ko/getting-started/install.md | 185 +++++++++++ docs/src/ko/getting-started/security.md | 26 ++ docs/src/ko/getting-started/update.md | 109 ++++++ docs/src/ko/index.md | 295 +++++++++++++++++ docs/src/nl/getting-started/update.md | 40 ++- docs/src/nn-NO/getting-started/update.md | 93 +++--- docs/src/oc/getting-started/update.md | 40 ++- docs/src/pl/getting-started/update.md | 39 ++- docs/src/pt-BR/getting-started/update.md | 96 +++--- docs/src/pt/getting-started/update.md | 40 ++- docs/src/ru/getting-started/update.md | 39 ++- docs/src/sk/getting-started/update.md | 40 ++- docs/src/sv/getting-started/update.md | 40 ++- docs/src/zh-Hans/getting-started/update.md | 84 +++-- modules/Admin/Language/ar/AboutCastopod.php | 22 ++ modules/Admin/Language/ar/Breadcrumb.php | 2 + modules/Admin/Language/ar/Navigation.php | 1 + modules/Admin/Language/br/AboutCastopod.php | 22 ++ modules/Admin/Language/br/Breadcrumb.php | 2 + modules/Admin/Language/br/Navigation.php | 1 + modules/Admin/Language/ca/AboutCastopod.php | 22 ++ modules/Admin/Language/ca/Breadcrumb.php | 2 + modules/Admin/Language/ca/Navigation.php | 1 + modules/Admin/Language/de/AboutCastopod.php | 22 ++ modules/Admin/Language/de/Breadcrumb.php | 2 + modules/Admin/Language/de/Navigation.php | 1 + modules/Admin/Language/el/AboutCastopod.php | 22 ++ modules/Admin/Language/el/Breadcrumb.php | 2 + modules/Admin/Language/el/Navigation.php | 1 + modules/Admin/Language/es/AboutCastopod.php | 22 ++ modules/Admin/Language/es/Breadcrumb.php | 2 + modules/Admin/Language/es/Navigation.php | 1 + modules/Admin/Language/fa/AboutCastopod.php | 22 ++ modules/Admin/Language/fa/Breadcrumb.php | 2 + modules/Admin/Language/fa/Navigation.php | 1 + modules/Admin/Language/fr/AboutCastopod.php | 22 ++ modules/Admin/Language/fr/Breadcrumb.php | 2 + modules/Admin/Language/fr/Navigation.php | 1 + modules/Admin/Language/gd/AboutCastopod.php | 22 ++ modules/Admin/Language/gd/Breadcrumb.php | 2 + modules/Admin/Language/gd/Navigation.php | 1 + modules/Admin/Language/gl/AboutCastopod.php | 22 ++ modules/Admin/Language/gl/Breadcrumb.php | 2 + modules/Admin/Language/gl/Navigation.php | 1 + modules/Admin/Language/id/AboutCastopod.php | 22 ++ modules/Admin/Language/id/Breadcrumb.php | 2 + modules/Admin/Language/id/Navigation.php | 1 + modules/Admin/Language/it/AboutCastopod.php | 22 ++ modules/Admin/Language/it/Breadcrumb.php | 2 + modules/Admin/Language/it/Navigation.php | 1 + modules/Admin/Language/ko/AboutCastopod.php | 22 ++ modules/Admin/Language/ko/Breadcrumb.php | 54 +++ modules/Admin/Language/ko/Charts.php | 40 +++ modules/Admin/Language/ko/Common.php | 51 +++ modules/Admin/Language/ko/Countries.php | 264 +++++++++++++++ modules/Admin/Language/ko/Dashboard.php | 28 ++ modules/Admin/Language/ko/Episode.php | 213 ++++++++++++ .../Admin/Language/ko/EpisodeNavigation.php | 23 ++ modules/Admin/Language/ko/Fediverse.php | 32 ++ modules/Admin/Language/ko/Home.php | 14 + modules/Admin/Language/ko/Install.php | 61 ++++ modules/Admin/Language/ko/Navigation.php | 42 +++ modules/Admin/Language/ko/Notifications.php | 19 ++ modules/Admin/Language/ko/Page.php | 30 ++ modules/Admin/Language/ko/Pager.php | 21 ++ modules/Admin/Language/ko/Person.php | 65 ++++ modules/Admin/Language/ko/Platforms.php | 30 ++ modules/Admin/Language/ko/Podcast.php | 310 ++++++++++++++++++ modules/Admin/Language/ko/PodcastImport.php | 37 +++ .../Admin/Language/ko/PodcastNavigation.php | 38 +++ modules/Admin/Language/ko/Settings.php | 58 ++++ modules/Admin/Language/ko/Soundbite.php | 31 ++ modules/Admin/Language/ko/Validation.php | 18 + modules/Admin/Language/ko/VideoClip.php | 72 ++++ modules/Admin/Language/nl/AboutCastopod.php | 22 ++ modules/Admin/Language/nl/Breadcrumb.php | 2 + modules/Admin/Language/nl/Navigation.php | 1 + .../Admin/Language/nn-NO/AboutCastopod.php | 22 ++ modules/Admin/Language/nn-NO/Breadcrumb.php | 2 + modules/Admin/Language/nn-NO/Navigation.php | 1 + modules/Admin/Language/oc/AboutCastopod.php | 22 ++ modules/Admin/Language/oc/Breadcrumb.php | 2 + modules/Admin/Language/oc/Navigation.php | 1 + modules/Admin/Language/pl/AboutCastopod.php | 22 ++ modules/Admin/Language/pl/Breadcrumb.php | 2 + modules/Admin/Language/pl/Navigation.php | 1 + .../Admin/Language/pt-BR/AboutCastopod.php | 22 ++ modules/Admin/Language/pt-BR/Breadcrumb.php | 2 + modules/Admin/Language/pt-BR/Navigation.php | 1 + modules/Admin/Language/pt/AboutCastopod.php | 22 ++ modules/Admin/Language/pt/Breadcrumb.php | 2 + modules/Admin/Language/pt/Navigation.php | 1 + modules/Admin/Language/ru/AboutCastopod.php | 22 ++ modules/Admin/Language/ru/Breadcrumb.php | 2 + modules/Admin/Language/ru/Navigation.php | 1 + modules/Admin/Language/sk/AboutCastopod.php | 22 ++ modules/Admin/Language/sk/Breadcrumb.php | 2 + modules/Admin/Language/sk/Navigation.php | 1 + modules/Admin/Language/sv/AboutCastopod.php | 22 ++ modules/Admin/Language/sv/Breadcrumb.php | 2 + modules/Admin/Language/sv/Navigation.php | 1 + .../Admin/Language/zh-Hans/AboutCastopod.php | 22 ++ modules/Admin/Language/zh-Hans/Breadcrumb.php | 2 + modules/Admin/Language/zh-Hans/Navigation.php | 1 + modules/Auth/Language/ar/Auth.php | 93 ++++++ modules/Auth/Language/br/Auth.php | 93 ++++++ modules/Auth/Language/ca/Auth.php | 93 ++++++ modules/Auth/Language/de/Auth.php | 93 ++++++ modules/Auth/Language/el/Auth.php | 93 ++++++ modules/Auth/Language/es/Auth.php | 93 ++++++ modules/Auth/Language/fa/Auth.php | 93 ++++++ modules/Auth/Language/fr/Auth.php | 93 ++++++ modules/Auth/Language/gd/Auth.php | 93 ++++++ modules/Auth/Language/gl/Auth.php | 93 ++++++ modules/Auth/Language/id/Auth.php | 93 ++++++ modules/Auth/Language/it/Auth.php | 93 ++++++ modules/Auth/Language/ko/Auth.php | 93 ++++++ modules/Auth/Language/nl/Auth.php | 93 ++++++ modules/Auth/Language/nn-NO/Auth.php | 93 ++++++ modules/Auth/Language/oc/Auth.php | 93 ++++++ modules/Auth/Language/pl/Auth.php | 93 ++++++ modules/Auth/Language/pt-BR/Auth.php | 93 ++++++ modules/Auth/Language/pt/Auth.php | 93 ++++++ modules/Auth/Language/ru/Auth.php | 93 ++++++ modules/Auth/Language/sk/Auth.php | 93 ++++++ modules/Auth/Language/sv/Auth.php | 93 ++++++ modules/Auth/Language/zh-Hans/Auth.php | 93 ++++++ modules/Install/Language/ko/Install.php | 62 ++++ .../Language/ko/PremiumPodcasts.php | 34 ++ .../Language/ko/Subscription.php | 100 ++++++ 151 files changed, 6259 insertions(+), 420 deletions(-) create mode 100644 app/Language/ko/Comment.php create mode 100644 app/Language/ko/Common.php create mode 100644 app/Language/ko/Episode.php create mode 100644 app/Language/ko/Fediverse.php create mode 100644 app/Language/ko/Home.php create mode 100644 app/Language/ko/Page.php create mode 100644 app/Language/ko/Podcast.php create mode 100644 app/Language/ko/Post.php create mode 100644 docs/src/ko/getting-started/docker.md create mode 100644 docs/src/ko/getting-started/install.md create mode 100644 docs/src/ko/getting-started/security.md create mode 100644 docs/src/ko/getting-started/update.md create mode 100644 docs/src/ko/index.md create mode 100644 modules/Admin/Language/ar/AboutCastopod.php create mode 100644 modules/Admin/Language/br/AboutCastopod.php create mode 100644 modules/Admin/Language/ca/AboutCastopod.php create mode 100644 modules/Admin/Language/de/AboutCastopod.php create mode 100644 modules/Admin/Language/el/AboutCastopod.php create mode 100644 modules/Admin/Language/es/AboutCastopod.php create mode 100644 modules/Admin/Language/fa/AboutCastopod.php create mode 100644 modules/Admin/Language/fr/AboutCastopod.php create mode 100644 modules/Admin/Language/gd/AboutCastopod.php create mode 100644 modules/Admin/Language/gl/AboutCastopod.php create mode 100644 modules/Admin/Language/id/AboutCastopod.php create mode 100644 modules/Admin/Language/it/AboutCastopod.php create mode 100644 modules/Admin/Language/ko/AboutCastopod.php create mode 100644 modules/Admin/Language/ko/Breadcrumb.php create mode 100644 modules/Admin/Language/ko/Charts.php create mode 100644 modules/Admin/Language/ko/Common.php create mode 100644 modules/Admin/Language/ko/Countries.php create mode 100644 modules/Admin/Language/ko/Dashboard.php create mode 100644 modules/Admin/Language/ko/Episode.php create mode 100644 modules/Admin/Language/ko/EpisodeNavigation.php create mode 100644 modules/Admin/Language/ko/Fediverse.php create mode 100644 modules/Admin/Language/ko/Home.php create mode 100644 modules/Admin/Language/ko/Install.php create mode 100644 modules/Admin/Language/ko/Navigation.php create mode 100644 modules/Admin/Language/ko/Notifications.php create mode 100644 modules/Admin/Language/ko/Page.php create mode 100644 modules/Admin/Language/ko/Pager.php create mode 100644 modules/Admin/Language/ko/Person.php create mode 100644 modules/Admin/Language/ko/Platforms.php create mode 100644 modules/Admin/Language/ko/Podcast.php create mode 100644 modules/Admin/Language/ko/PodcastImport.php create mode 100644 modules/Admin/Language/ko/PodcastNavigation.php create mode 100644 modules/Admin/Language/ko/Settings.php create mode 100644 modules/Admin/Language/ko/Soundbite.php create mode 100644 modules/Admin/Language/ko/Validation.php create mode 100644 modules/Admin/Language/ko/VideoClip.php create mode 100644 modules/Admin/Language/nl/AboutCastopod.php create mode 100644 modules/Admin/Language/nn-NO/AboutCastopod.php create mode 100644 modules/Admin/Language/oc/AboutCastopod.php create mode 100644 modules/Admin/Language/pl/AboutCastopod.php create mode 100644 modules/Admin/Language/pt-BR/AboutCastopod.php create mode 100644 modules/Admin/Language/pt/AboutCastopod.php create mode 100644 modules/Admin/Language/ru/AboutCastopod.php create mode 100644 modules/Admin/Language/sk/AboutCastopod.php create mode 100644 modules/Admin/Language/sv/AboutCastopod.php create mode 100644 modules/Admin/Language/zh-Hans/AboutCastopod.php create mode 100644 modules/Auth/Language/ar/Auth.php create mode 100644 modules/Auth/Language/br/Auth.php create mode 100644 modules/Auth/Language/ca/Auth.php create mode 100644 modules/Auth/Language/de/Auth.php create mode 100644 modules/Auth/Language/el/Auth.php create mode 100644 modules/Auth/Language/es/Auth.php create mode 100644 modules/Auth/Language/fa/Auth.php create mode 100644 modules/Auth/Language/fr/Auth.php create mode 100644 modules/Auth/Language/gd/Auth.php create mode 100644 modules/Auth/Language/gl/Auth.php create mode 100644 modules/Auth/Language/id/Auth.php create mode 100644 modules/Auth/Language/it/Auth.php create mode 100644 modules/Auth/Language/ko/Auth.php create mode 100644 modules/Auth/Language/nl/Auth.php create mode 100644 modules/Auth/Language/nn-NO/Auth.php create mode 100644 modules/Auth/Language/oc/Auth.php create mode 100644 modules/Auth/Language/pl/Auth.php create mode 100644 modules/Auth/Language/pt-BR/Auth.php create mode 100644 modules/Auth/Language/pt/Auth.php create mode 100644 modules/Auth/Language/ru/Auth.php create mode 100644 modules/Auth/Language/sk/Auth.php create mode 100644 modules/Auth/Language/sv/Auth.php create mode 100644 modules/Auth/Language/zh-Hans/Auth.php create mode 100644 modules/Install/Language/ko/Install.php create mode 100644 modules/PremiumPodcasts/Language/ko/PremiumPodcasts.php create mode 100644 modules/PremiumPodcasts/Language/ko/Subscription.php diff --git a/app/Language/ko/Comment.php b/app/Language/ko/Comment.php new file mode 100644 index 00000000..1dd8f5ea --- /dev/null +++ b/app/Language/ko/Comment.php @@ -0,0 +1,34 @@ + "{actorDisplayName}'s comment for {episodeTitle}", + 'back_to_comments' => 'Back to comments', + 'form' => [ + 'episode_message_placeholder' => 'Write a comment…', + 'reply_to_placeholder' => 'Reply to @{actorUsername}', + 'submit' => 'Send', + 'submit_reply' => 'Reply', + ], + 'likes' => '{numberOfLikes, plural, + one {# like} + other {# likes} + }', + 'replies' => '{numberOfReplies, plural, + one {# reply} + other {# replies} + }', + 'like' => 'Like', + 'reply' => 'Reply', + 'view_replies' => 'View replies ({numberOfReplies})', + 'block_actor' => 'Block user @{actorUsername}', + 'block_domain' => 'Block domain @{actorDomain}', + 'delete' => 'Delete comment', +]; diff --git a/app/Language/ko/Common.php b/app/Language/ko/Common.php new file mode 100644 index 00000000..1258afcc --- /dev/null +++ b/app/Language/ko/Common.php @@ -0,0 +1,30 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'close' => 'Close', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'go_back' => 'Go back', + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'read_more' => 'Read more', + 'read_less' => 'Read less', + 'see_more' => 'See more', + 'see_less' => 'See less', + 'legal_notice' => 'Legal notice', +]; diff --git a/app/Language/ko/Episode.php b/app/Language/ko/Episode.php new file mode 100644 index 00000000..ebe39336 --- /dev/null +++ b/app/Language/ko/Episode.php @@ -0,0 +1,33 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', + 'persons' => '{personsCount, plural, + one {# person} + other {# persons} + }', + 'persons_list' => 'Persons', + 'back_to_episodes' => 'Back to episodes of {podcast}', + 'comments' => 'Comments', + 'activity' => 'Activity', + 'description' => 'Episode description', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', +]; diff --git a/app/Language/ko/Fediverse.php b/app/Language/ko/Fediverse.php new file mode 100644 index 00000000..32f54c07 --- /dev/null +++ b/app/Language/ko/Fediverse.php @@ -0,0 +1,37 @@ + 'Your handle', + 'your_handle_hint' => 'Enter the @username@domain you want to act from.', + 'follow' => [ + 'label' => 'Follow', + 'title' => 'Follow {actorDisplayName}', + 'subtitle' => 'You are going to follow:', + 'accountNotFound' => 'The account could not be found.', + 'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…', + 'submit' => 'Proceed to follow', + ], + 'favourite' => [ + 'title' => "Favourite {actorDisplayName}'s post", + 'subtitle' => 'You are going to favourite:', + 'submit' => 'Proceed to favourite', + ], + 'reblog' => [ + 'title' => "Share {actorDisplayName}'s post", + 'subtitle' => 'You are going to share:', + 'submit' => 'Proceed to share', + ], + 'reply' => [ + 'title' => "Reply to {actorDisplayName}'s post", + 'subtitle' => 'You are going to reply to:', + 'submit' => 'Proceed to reply', + ], +]; diff --git a/app/Language/ko/Home.php b/app/Language/ko/Home.php new file mode 100644 index 00000000..1518239b --- /dev/null +++ b/app/Language/ko/Home.php @@ -0,0 +1,20 @@ + 'All podcasts', + 'sort_by' => 'Sort by', + 'sort_options' => [ + 'activity' => 'Recent activity', + 'created_desc' => 'Newest first', + 'created_asc' => 'Oldest first', + ], + 'no_podcast' => 'No podcast found', +]; diff --git a/app/Language/ko/Page.php b/app/Language/ko/Page.php new file mode 100644 index 00000000..7cd60669 --- /dev/null +++ b/app/Language/ko/Page.php @@ -0,0 +1,17 @@ + 'Back to home', + 'map' => [ + 'title' => 'Map', + 'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.', + ], +]; diff --git a/app/Language/ko/Podcast.php b/app/Language/ko/Podcast.php new file mode 100644 index 00000000..9b1e749a --- /dev/null +++ b/app/Language/ko/Podcast.php @@ -0,0 +1,53 @@ + 'RSS Podcast feed', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followTitle' => 'Follow {actorDisplayName} on the fediverse!', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'episodes_title' => 'Episodes of {podcastTitle}', + 'about' => 'About', + 'stats' => [ + 'title' => 'Stats', + 'number_of_seasons' => '{0, plural, + one {# season} + other {# seasons} + }', + 'number_of_episodes' => '{0, plural, + one {# episode} + other {# episodes} + }', + 'first_published_at' => 'First episode published on {0, date, medium}', + ], + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', + 'persons' => '{personsCount, plural, + one {# person} + other {# persons} + }', + 'persons_list' => 'Persons', +]; diff --git a/app/Language/ko/Post.php b/app/Language/ko/Post.php new file mode 100644 index 00000000..58d1cf80 --- /dev/null +++ b/app/Language/ko/Post.php @@ -0,0 +1,40 @@ + "{actorDisplayName}'s post", + 'back_to_actor_posts' => 'Back to {actor} posts', + 'actor_shared' => '{actor} shared', + 'reply_to' => 'Reply to @{actorUsername}', + 'form' => [ + 'message_placeholder' => 'Write a message…', + 'episode_message_placeholder' => 'Write a message for the episode…', + 'episode_url_placeholder' => 'Episode URL', + 'reply_to_placeholder' => 'Reply to @{actorUsername}', + 'submit' => 'Send', + 'submit_reply' => 'Reply', + ], + 'favourites' => '{numberOfFavourites, plural, + one {# favourite} + other {# favourites} + }', + 'reblogs' => '{numberOfReblogs, plural, + one {# share} + other {# shares} + }', + 'replies' => '{numberOfReplies, plural, + one {# reply} + other {# replies} + }', + 'expand' => 'Expand post', + 'block_actor' => 'Block user @{actorUsername}', + 'block_domain' => 'Block domain @{actorDomain}', + 'delete' => 'Delete post', +]; diff --git a/docs/src/ar/getting-started/update.md b/docs/src/ar/getting-started/update.md index 51e372ee..76668ae3 100644 --- a/docs/src/ar/getting-started/update.md +++ b/docs/src/ar/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,18 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - I haven't updated my instance in a long time… What should I do? + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/br/getting-started/update.md b/docs/src/br/getting-started/update.md index 51e372ee..76668ae3 100644 --- a/docs/src/br/getting-started/update.md +++ b/docs/src/br/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,18 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - I haven't updated my instance in a long time… What should I do? + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/ca/getting-started/update.md b/docs/src/ca/getting-started/update.md index cd282372..b6a4832a 100644 --- a/docs/src/ca/getting-started/update.md +++ b/docs/src/ca/getting-started/update.md @@ -9,70 +9,86 @@ Després d'instal·lar Castopod, és possible que vulgueu actualitzar la vostra instància a la darrera versió per gaudir de les últimes funcions ✨, correccions d'errors 🐛 i millores de rendiment ⚡. -## Instruccions d'actualització automàtica +## Update instructions -> Aviat... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Instruccions d'actualització manual + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) -1. Aneu a la - [pàgina de llançaments](https://code.castopod.org/adaures/castopod/-/releases) - i comproveu si la vostra instància està actualitzada amb la darrera versió de - Castopod +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version - - [On puc trobar la meva versió de Castopod?](#where-can-i-find-my-castopod-version) + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) -2. Baixeu l'últim paquet de llançament anomenat `Castopod Package`, podeu triar - entre els fitxers `zip` o `tar.gz` +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives - - ⚠️ Assegureu-vos de descarregar el paquet Castopod i **NO** el codi font + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) -3. Al vostre servidor: +3. On your server: - - Elimina tots els fitxers excepte `.env` i `public/media` - - Copieu els fitxers nous del paquet descarregat al vostre servidor + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server - ::: info Nota + ::: info Note - És possible que hàgiu de restablir els permisos dels fitxers durant el - procés d'instal·lació. Comproveu els [Detalls de seguretat](./security.md). + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). ::: -4. Les diferents versions poden incloure instruccions d'actualització - addicionals (vegeu la - [pàgina de versions](https://code.castopod.org/adaures/castopod/-/releases)). - Normalment són scripts de migració de bases de dades en format `.sql` per - actualitzar l'esquema de la base de dades. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Assegureu-vos que executeu els scripts al vostre panell phpmyadmin o - utilitzeu la línia d'ordres per actualitzar la base de dades juntament amb - els fitxers del paquet. - - [Fa molt de temps que no actualitzo la meva instància... Què hauria de fer?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. Si utilitzeu redis, esborreu la memòria cau. -6. ✨ Gaudiu de la vostra nova instància, tot fet i preparat! +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Aviat... 👀 ## Preguntes més freqüents (FAQ) ### On puc trobar la meva versió de Castopod? -Aneu al vostre panell de control de Castopod, la versió es mostra a la cantonada -inferior esquerra. +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. -Alternativament, podeu trobar la versió al fitxer -`app > Config > Constants.php`. +Alternatively, you can find the version in the `app > Config > Constants.php` +file. ### Fa temps que no actualitzo la meva instància... Què hauria de fer? -Cap problema. Només heu d'obtenir l'última versió tal com es descriu -anteriorment. Només, quan seguiu les instruccions de la versió en qüestió (4), -realitzeu-les de manera seqüencial, de la més antiga a la més nova. +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. > És possible que vulgueu fer una còpia de seguretat de la vostra instància en > funció del temps que no heu actualitzat Castopod. -Per exemple, si sou a `v1.0.0-alpha.42` i voleu actualitzar a `v1.0.0-beta.1`: +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: 0. (molt recomanable) Feu una còpia de seguretat dels vostres fitxers i base de dades. @@ -88,7 +104,7 @@ Per exemple, si sou a `v1.0.0-alpha.42` i voleu actualitzar a `v1.0.0-beta.1`: ### Hauria de fer una còpia de seguretat abans d'actualitzar? -T'aconsellem que ho facis, perquè no ho perdis tot si alguna cosa va malament! +We advise you do, so you don't lose everything if anything goes wrong! -De manera més general, us aconsellem que feu còpies de seguretat periòdiques -dels vostres fitxers i base de dades de Castopod per evitar que ho perdeu tot... +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/de/getting-started/update.md b/docs/src/de/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/de/getting-started/update.md +++ b/docs/src/de/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/el/getting-started/update.md b/docs/src/el/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/el/getting-started/update.md +++ b/docs/src/el/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/es/getting-started/update.md b/docs/src/es/getting-started/update.md index a5dd5b17..601afbeb 100644 --- a/docs/src/es/getting-started/update.md +++ b/docs/src/es/getting-started/update.md @@ -9,75 +9,85 @@ Después de instalar Castopod, es posible que quieras actualizar tu instancia a la última versión para disfrutar de las últimas características ✨, correcciones de errores 🐛 y mejoras de rendimiento ⚡. -## Instrucciones de actualización automática +## Update instructions -> Próximamente... 👀 - -## Instrucciones de actualización manual - -1. Vaya a la página de - [lanzamientos](https://code.castopod.org/adaures/castopod/-/releases) y vea - si su instancia está actualizada con la última versión de Castopod +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. - cf. - [¿Dónde puedo encontrar mi versión de Castopod?](#where-can-i-find-my-castopod-version) + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) -2. Descargue el último paquete de lanzamiento llamado `Paquete Castopod`, puede - elegir entre los archivos `zip` o `tar.gz` +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version - - ⚠️ Asegúrate de descargar el paquete de Castopod y **NO** el código fuente + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) -3. En tu servidor: +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives - - Eliminar todos los archivos excepto `.env` y la carpeta `public/media` - - Copie los nuevos archivos del paquete descargado en su servidor + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) - ::: Nota de información +3. On your server: - Es posible que necesite restablecer los permisos de los archivos después el - proceso de instalación. Compruebe - [preocupaciones de seguridad](./security.md). + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). ::: -4. Las versiones pueden venir con instrucciones de actualización adicionales - (véase la página de - [lanzamientos](https://code.castopod.org/adaures/castopod/-/releases)). - Generalmente son scripts de migración de base de datos en formato `.sql` para - actualizar su esquema de base de datos. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 ¡Asegúrate de ejecutar los scripts en tu panel phpmyadmin o usando la - línea de comandos para actualizar la base de datos junto con los archivos - de paquete! - - cf. + ```bash + php spark castopod:database-update + ``` -No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?

+5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! - 5. Si estás usando redis, limpia tu caché. +::: info Note -6. ✨ ¡Disfruta de tu instancia recién instalada, todo listo! +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Próximamente... 👀 ## Preguntas Frecuentes (FAQ) ### ¿Dónde puedo encontrar mi versión de Castopod? -Ve al panel de administración de Castopod, la versión se muestra en la esquina -inferior izquierda. +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. -Alternativamente, puedes encontrar la versión en el archivo -`app > Config > Constants.php`. +Alternatively, you can find the version in the `app > Config > Constants.php` +file. ### No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer? -¡No hay problema! Sólo obtenga la última versión tal y como se describe -anteriormente. Simplemente cuando vaya a través de las instrucciones de -lanzamiento (4), realice la actualización secuencialmente, desde el más antiguo -hasta el más reciente. +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. > Puede que quieras hacer una copia de seguridad de tu instancia dependiendo del > tiempo que no hayas actualizado Castopod. -Por ejemplo, si estás en `v1.0.0-alpha.42` y te gustaría actualizar a +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to `v1.0.0-beta.1`: 0. (altamente recomendado) Haga una copia de seguridad de sus archivos y base de @@ -94,7 +104,7 @@ Por ejemplo, si estás en `v1.0.0-alpha.42` y te gustaría actualizar a ### ¿Debo hacer una copia de seguridad antes de actualizar? -Te aconsejamos que hagas, así que no lo pierdas todo si algo sale mal! +We advise you do, so you don't lose everything if anything goes wrong! -De manera más general, te aconsejamos hacer copias de seguridad regulares de tus -archivos de Castopod y base de datos para evitar que pierdas todo… +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/fa/getting-started/update.md b/docs/src/fa/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/fa/getting-started/update.md +++ b/docs/src/fa/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/fr/getting-started/update.md b/docs/src/fr/getting-started/update.md index de303a2b..36221d24 100644 --- a/docs/src/fr/getting-started/update.md +++ b/docs/src/fr/getting-started/update.md @@ -9,75 +9,86 @@ Après avoir installé Castopod, vous pouvez mettre à jour votre instance vers dernière version afin de profiter des dernières fonctionnalités ✨, des corrections de bugs 🐛 et des améliorations de performance ⚡. -## Instructions de mise à jour automatique +## Update instructions -> Prochainement... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Instructions de mise à jour manuelle + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) -1. Allez sur la - [page de notes de versions](https://code.castopod.org/adaures/castopod/-/releases) - et vérifiez si votre instance est à jour avec la dernière version de - Castopod. +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version - cf. [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) -2. Téléchargez la dernière version du paquet nommé `Castopod Package`. Vous - pouvez choisir entre les archives au format `zip` ou `tar.gz`. +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives - - ⚠️ Assurez-vous de bien télécharger le paquet Castopod `Castopod Package` - et **PAS** le code source. + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) -3. Sur votre serveur : +3. On your server: - - Supprimer tous les fichiers sauf `.env` et `public/media` - - Copiez les nouveaux fichiers du package téléchargé sur votre serveur. + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server - ::: info Nota Bene + ::: info Note - Vous devrez peut-être re-définir les autorisations de fichiers comme - effectué durant le processus d'installation. Vérifiez les - [questions de sécurité](./security.md). + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). ::: -4. Les versions peuvent être accompagnées d'instructions de mise à jour - supplémentaires (cf. la - [page des notes de versions](https://code.castopod.org/adaures/castopod/-/releases)). - Il s'agit généralement de scripts de migration de base de données au format - `.sql` qui mettent à jour le schéma de votre base de données. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Assurez-vous d'exécuter les scripts sur votre interface phpmyadmin ou - utilisez la ligne de commande pour mettre à jour la base de données avec - les fichiers du paquet ! - - Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire - ? + ```bash + php spark castopod:database-update + ``` -5. Si vous utilisez redis, effacez votre cache. -6. ✨ Votre nouvelle instance est prête ! +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Prochainement... 👀 ## Foire Aux Questions (FAQ) ### Où puis-je trouver ma version de Castopod ? -Allez dans votre panneau d'administration de Castopod, la version s'affiche en -bas à gauche. +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. -Vous pouvez également trouver la version dans le fichier -`app > Config > Constants.php`. +Alternatively, you can find the version in the `app > Config > Constants.php` +file. ### [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) -Aucun souci ! Il suffit d'obtenir la dernière version comme décrit ci-dessus. -Lorsque vous exécutez les instructions de mise à jour (4), lancez-les -séquentiellement, de la plus ancienne à la plus récente. +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. > Vous devriez sauvegarder votre instance selon la date de votre dernière mise à > jour de Castopod. -Par exemple, si vous êtes en `v1.0.0-alpha.42` et souhaitez mettre à jour vers -la `v1.0.0-beta.1` : +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: 0. (fortement recommandé) Faites une sauvegarde de vos fichiers et de votre base de données. @@ -92,8 +103,7 @@ la `v1.0.0-beta.1` : ### Dois-je faire une sauvegarde avant de mettre à jour ? -Nous vous conseillons de le faire, afin de ne pas tout perdre si quelque chose -se passait mal ! +We advise you do, so you don't lose everything if anything goes wrong! -Plus généralement, nous vous conseillons de faire des sauvegardes régulières de -vos fichiers Castopod et de votre base de données afin d'éviter de tout perdre… +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/gd/getting-started/update.md b/docs/src/gd/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/gd/getting-started/update.md +++ b/docs/src/gd/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/gl/getting-started/update.md b/docs/src/gl/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/gl/getting-started/update.md +++ b/docs/src/gl/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/id/getting-started/update.md b/docs/src/id/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/id/getting-started/update.md +++ b/docs/src/id/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/it/getting-started/update.md b/docs/src/it/getting-started/update.md index 51e372ee..76668ae3 100644 --- a/docs/src/it/getting-started/update.md +++ b/docs/src/it/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,18 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - I haven't updated my instance in a long time… What should I do? + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/ko/getting-started/docker.md b/docs/src/ko/getting-started/docker.md new file mode 100644 index 00000000..ededc582 --- /dev/null +++ b/docs/src/ko/getting-started/docker.md @@ -0,0 +1,148 @@ +--- +title: Official Docker images +sidebarDepth: 3 +--- + +# Official Docker images + +Castopod pushes 2 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle + with all of Castopod dependencies +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an + Nginx configuration for Castopod + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) + +## Example usage + +1. Install [docker](https://docs.docker.com/get-docker/) and + [docker-compose](https://docs.docker.com/compose/install/) +2. Create a `docker-compose.yml` file with the following: + + ```yml + version: "3.7" + + services: + app: + image: castopod/app:beta + container_name: "castopod-app" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "http://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + networks: + - castopod-app + - castopod-db + restart: unless-stopped + + web-server: + image: castopod/web-server:beta + container_name: "castopod-web-server" + volumes: + - castopod-media:/var/www/html/media + networks: + - castopod-app + ports: + - 8080:80 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for TLS (SSL/HTTPS) + + TLS is mandatory for ActivityPub to work. This job can easily be handled by + a reverse proxy, for example with [Caddy](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8080 + } + ``` + +4. Run `docker-compose up -d`, wait for it to initialize and head on to + `https://castopod.example.com/cp-install` to finish setting up Castopod! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/app** + + | Variable name | Type (`default`) | Default | + | ---------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | --------------------- | ------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/ko/getting-started/install.md b/docs/src/ko/getting-started/install.md new file mode 100644 index 00000000..3d73187d --- /dev/null +++ b/docs/src/ko/getting-started/install.md @@ -0,0 +1,185 @@ +--- +title: Installation +sidebarDepth: 3 +--- + +# How to install Castopod? + +Castopod was thought-out to be easy to install. Whether using dedicated or +shared hosting, you can install it on most PHP-MySQL compatible web servers. + +::: tip Note + +We've released official Docker images for Castopod! + +If you prefer using Docker, you may skip this and go straight to the +[docker documentation](./docker.md) for Castopod. + +::: + +## Requirements + +- PHP v8.0 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support + +### PHP v8.0 or higher + +PHP version 8.0 or higher is required, with the following extensions installed: + +- [intl](https://php.net/manual/en/intl.requirements.php) +- [libcurl](https://php.net/manual/en/curl.requirements.php) +- [mbstring](https://php.net/manual/en/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, + **PNG** and **WEBP** libraries. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +::: warning Warning + +Castopod only works with supported MySQL 5.7 or higher compatible databases. It +will break with the previous MySQL v5.6 for example as its end of life was on +February 5, 2021. + +::: + +You will need the server hostname, database name, username and password to +complete the installation process. If you do not have these, please contact your +server administrator. + +#### Privileges + +User must have at least these privileges on the database for Castopod to work: +`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, +`REFERENCES`, `CREATE VIEW`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you +want to generate Video Clips. The following extensions must be installed: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +0. Get a Web Server with [requirements](#requirements) installed +1. Create a MySQL database for Castopod with a user having access and + modification privileges (for more info, see + [MySQL compatible database](#mysql-compatible-database)). +2. Activate HTTPS on your domain with an _SSL certificate_. +3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto + the web server if you haven’t already. + - ⚠️ Set the web server document root to the `public/` sub-folder within the + `castopod` folder. +4. Add **cron tasks** on your web server for various background processes + (replace the paths accordingly): + + - For social features to work properly, this task is used to broadcast social + activities to your followers on the fediverse: + + ```bash + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities + ``` + + - For having your episodes be broadcasted on open hubs upon publication using + [WebSub](https://en.wikipedia.org/wiki/WebSub): + + ```bash + * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish + ``` + + - For Video Clips to be created (see + [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)): + + ```bash + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips + ``` + + > These tasks run **every minute**. You may set the frequency depending on + > your needs: every 5, 10 minutes or more. + +### (recommended) Install Wizard + +1. Run the Castopod install script by going to the install wizard page + (`https://your_domain_name.com/cp-install`) in your favorite web browser. +2. Follow the instructions on your screen. +3. Start podcasting! + +::: info Note + +The install script writes a `.env` file in the package root. If you cannot go +through the install wizard, you can create and edit the `.env` file manually +based on the `.env.example` file. + +::: + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +You may add your email configuration in your instance's `.env` like so: + +```ini +# […] + +email.fromEmail="your_email_address" +email.SMTPHost="your_smtp_host" +email.SMTPUser="your_smtp_user" +email.SMTPPass="your_smtp_password" +``` + +#### Email config options + +| Variable name | Type | Default | +| ---------------- | -------------------- | ------------ | +| **`fromEmail`** | string | `undefined` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `undefined` | +| **`SMTPUser`** | string | `undefined` | +| **`SMTPPass`** | string | `undefined` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | + +## Community packages + +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. + +### Install with YunoHost + +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you. + +
+ + + Install Castopod with YunoHost + + +Github +Repo + +
diff --git a/docs/src/ko/getting-started/security.md b/docs/src/ko/getting-started/security.md new file mode 100644 index 00000000..e205698d --- /dev/null +++ b/docs/src/ko/getting-started/security.md @@ -0,0 +1,26 @@ +--- +title: Security +--- + +# Security concerns + +Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP +framework that encourages +[good security practices](https://codeigniter.com/user_guide/concepts/security.html). + +To maximize your instance's safety and prevent any malicious attack, we +recommend you update all your Castopod files permissions after installation or +updates (to avoid any prior permission error): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/ko/getting-started/update.md b/docs/src/ko/getting-started/update.md new file mode 100644 index 00000000..98e019fb --- /dev/null +++ b/docs/src/ko/getting-started/update.md @@ -0,0 +1,109 @@ +--- +title: Update +sidebarDepth: 3 +--- + +# How to update Castopod? + +After installing Castopod, you may want to update your instance to the latest +version in order to enjoy the latest features ✨, bug fixes 🐛 and performance +improvements ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version + + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives + + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). + + ::: + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```bash + php spark castopod:database-update + ``` + +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `public/media`. + +2. Go through each release update instructions sequentially (from oldest to + newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +We advise you do, so you don't lose everything if anything goes wrong! + +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/ko/index.md b/docs/src/ko/index.md new file mode 100644 index 00000000..d89daccb --- /dev/null +++ b/docs/src/ko/index.md @@ -0,0 +1,295 @@ +--- +sidebarDepth: 2 +--- + +# Welcome 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + +::: info Status + +Castopod is currently in **beta** but already quite stable and used by +podcasters around the world! + +::: + +
+ Install +
+ +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivation + +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. + +It is in fact one of the only media to have stayed this way for a long time. + +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. + +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. + +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. + +## Comparison with other solutions + +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. + +### Castopod vs Wordpress + +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. + +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. + +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. + +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. + +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwhale + +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. + +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod can be self-hosted and is the only solution that allows you to keep + full control over what you produce. Also, as it is open-source, you can even + customize it as you wish. + +- Castopod is the only solution that currently integrates both a decentralized + social network with ActivityPub as well as many of the podcasting 2.0 + features, hoping to bridge the gap between the two. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. + +### Contributing guide + +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
+ + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
+ Ad Aures Logo + NLnet Logo +
+ +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/nl/getting-started/update.md b/docs/src/nl/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/nl/getting-started/update.md +++ b/docs/src/nl/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/nn-NO/getting-started/update.md b/docs/src/nn-NO/getting-started/update.md index 9fd2b55d..3f99d4fc 100644 --- a/docs/src/nn-NO/getting-started/update.md +++ b/docs/src/nn-NO/getting-started/update.md @@ -8,68 +8,86 @@ sidebarDepth: 3 Når du har installert Castopod, kan det vera lurt å oppdatera nettstaden din til siste versjonen for å få nye funksjonar, ✨, feilrettingar 🐛 og betre yting ⚡. -## Framgangsmåte for å oppdatera automatisk +## Update instructions -> Kjem snart... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Framgangsmåte for å oppdatera manuelt + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) -1. Gå til - [sida med utgjevingar](https://code.castopod.org/adaures/castopod/-/releases) - og sjå om nettstaden din bruker siste utgåva av Castopod +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version - - jfr. - [Kvar finn eg Castopod-versjonsnummeret?](#where-can-i-find-my-castopod-version) + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) -2. Last ned den nyaste pakka som heiter `Castopod Package`, du kan velja mellom - `zip`- eller `tar.gz`-arkiva +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives - - ⚠️ Pass på at du lastar ned programpakka, og **IKKJE** kjeldekoden + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) -3. På vevtenaren din: +3. On your server: - - Fjern alle filene utanom `.env` og `public/media` - - Kopier dei nye filene frå den nedlasta pakka til vevtenaren din + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server - ::: info + ::: info Note - Det kan henda du må nullstilla filtilgangsrettar slik du gjer når du - installerer. Sjå [Tryggleiksspørsmål](./security.md). + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). ::: -4. Nokre utgjevingar kan ha fleire oppdateringsinstruksar (sjå - [sida med utgjevingar](https://code.castopod.org/adaures/castopod/-/releases)). - Det gjeld vanlegvis migreringsskript i `.sql`-format for å oppdatera - databaseskjemaet ditt. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Pass på at du køyrer skripta i phpmyadmin-panelet ditt eller - kommandolina for å oppdatera databasen i tillegg til pakkefilene! - - jfr. - [Eg har ikkje oppdatert på lenge… Kva skal eg gjera?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. Viss du bruker redis, må du tøma bufferen. -6. ✨ Ferdig! +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Kjem snart... 👀 ## Vanlege spørsmål (FAQ) ### Kvar finn eg Castopod-versjonsnummeret? -Gå til styringspanelet for Castopod. Versjonsnummeret står i nedste venstre -hjørnet. +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. -Du kan òg finna versjonsnummeret i `app > Config > Constants.php`-fila. +Alternatively, you can find the version in the `app > Config > Constants.php` +file. ### Eg har ikkje oppdatert på lenge… Kva skal eg gjera? -Ingen problem! Berre last ned den siste utgåva som skildra over. Hugs berre at -når du går gjennom utgjevingsinstruksane (4), går du gjennom dei frå eldst til -nyast. +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. > Du bør truleg tryggingskopiera nettstaden din, avhengig av kor lenge sidan det > er du oppdaterte Castopod. -Til dømes viss du er på `v1.0.0-alpha.42` og vil oppgradera til `v1.0.0-beta.1`: +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: 0. (stekt tilrådd) Ta ein tryggingskopi av filene og databasen din. @@ -82,8 +100,7 @@ Til dømes viss du er på `v1.0.0-alpha.42` og vil oppgradera til `v1.0.0-beta.1 ### Bør eg tryggingskopiera før eg oppdaterer? -Det bør du. Viss ikkje, kan du mista heile Castopod-nettstaden dersom noko går -gale! +We advise you do, so you don't lose everything if anything goes wrong! -I det heile bør du ta jamnlege tryggingskopiar av Castopod-filene og databasen -for å unngå å mista noko… +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/oc/getting-started/update.md b/docs/src/oc/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/oc/getting-started/update.md +++ b/docs/src/oc/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/pl/getting-started/update.md b/docs/src/pl/getting-started/update.md index 51e372ee..76668ae3 100644 --- a/docs/src/pl/getting-started/update.md +++ b/docs/src/pl/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,18 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - I haven't updated my instance in a long time… What should I do? + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/pt-BR/getting-started/update.md b/docs/src/pt-BR/getting-started/update.md index 18449201..398b5c0f 100644 --- a/docs/src/pt-BR/getting-started/update.md +++ b/docs/src/pt-BR/getting-started/update.md @@ -9,71 +9,85 @@ Depois de instalar o Castopod, você pode querer atualizar sua instância para a última versão para desfrutar das últimas funcionalidades ✨, correção de bugs 🐛 e melhorias de desempenho ⚡. -## Instruções de atualização automática +## Update instructions -> Em breve... 👀 - -## Instruções para atualização manual - -1. Vá para a - [página de versões](https://code.castopod.org/adaures/castopod/-/releases) e - veja se sua instância está atualizada com a última versão do Castopod +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. - cf. - [Onde posso encontrar minha versão do Castopod?](#where-can-i-find-my-castopod-version) + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) -2. Baixe o último pacote de versão chamado `Castopod Package`, você pode - escolher entre os arquivos `zip` ou `tar.gz` +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version - - ⚠️ Certifique-se de baixar o pacote Castopod e **NÃO** o Código Fonte + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) -3. No seu servidor: +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives - - Remova todos os arquivos, exceto `.env` e `public/media` - - Copie os novos arquivos do pacote baixado para o seu servidor + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) - ::: info Nota +3. On your server: - Talvez seja necessário redefinir as permissões de arquivos como durante o - processo de instalação. Verifique as - [Questões de segurança](./security.md). + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). ::: -4. Versões podem vir com instruções de atualização adicionais (veja a - [página de versões](https://code.castopod.org/adaures/castopod/-/releases)). - Geralmente são scripts de migração de banco de dados no formato `.sql` para - atualizar seu esquema de banco de dados. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Certifique-se de executar os scripts em seu painel phpmyadmin ou use a - linha de comando para atualizar o banco de dados junto com os arquivos do - pacote! - - cf. - [Faz muito tempo que não atualizo minha instância… O que devo fazer?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. Se você estiver usando redis, limpe seu cache. -6. ✨ Aproveite sua instância atualizada, está tudo pronto! +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Em breve... 👀 ## Perguntas frequentes (FAQ) ### Onde posso encontrar minha versão do Castopod? -Vá para o painel de administração do Castopod, a versão é exibida no canto -inferior esquerdo. +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. -Ou então, você pode encontrar a versão no arquivo -`app > Config > Constants.php`. +Alternatively, you can find the version in the `app > Config > Constants.php` +file. ### Faz muito tempo que não atualizo minha instância… O que devo fazer? -Sem problemas! Basta obter a versão mais recente, conforme descrito acima. Só -que, ao passar pelas instruções da versão (4), execute-as sequencialmente, da -mais antiga para a mais recente. +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. > Você pode querer fazer backup de sua instância dependendo de quanto tempo você > não atualizou o Castopod. -Por exemplo, se você estiver na `v1.0.0-alpha.42` e gostaria de atualizar para a +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to `v1.0.0-beta.1`: 0. (altamente recomendado) Faça um backup de seus arquivos e banco de dados. @@ -89,7 +103,7 @@ Por exemplo, se você estiver na `v1.0.0-alpha.42` e gostaria de atualizar para ### Devo fazer um backup antes de atualizar? -Aconselhamos você a fazer, assim você não perde tudo se algo der errado! +We advise you do, so you don't lose everything if anything goes wrong! -De forma mais geral, recomendamos que você faça backups regulares dos seus -arquivos de Castopod e banco de dados para evitar que você perca tudo… +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/pt/getting-started/update.md b/docs/src/pt/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/pt/getting-started/update.md +++ b/docs/src/pt/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/ru/getting-started/update.md b/docs/src/ru/getting-started/update.md index 51e372ee..76668ae3 100644 --- a/docs/src/ru/getting-started/update.md +++ b/docs/src/ru/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,18 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - I haven't updated my instance in a long time… What should I do? + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/sk/getting-started/update.md b/docs/src/sk/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/sk/getting-started/update.md +++ b/docs/src/sk/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/sv/getting-started/update.md b/docs/src/sv/getting-started/update.md index 1f48e274..98e019fb 100644 --- a/docs/src/sv/getting-started/update.md +++ b/docs/src/sv/getting-started/update.md @@ -9,11 +9,13 @@ After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance improvements ⚡. -## Automatic update instructions +## Update instructions -> Coming soon... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## Manual update instructions + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) 1. Go to the [releases page](https://code.castopod.org/adaures/castopod/-/releases) and @@ -26,6 +28,8 @@ improvements ⚡. between the `zip` or `tar.gz` archives - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) 3. On your server: @@ -39,19 +43,31 @@ improvements ⚡. ::: -4. Releases may come with additional update instructions (see - [releases page](https://code.castopod.org/adaures/castopod/-/releases)). They - are usually database migration scripts in `.sql` format to update your - database schema. +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 Make sure you run the scripts on your phpmyadmin panel or using command - line to update the database along with the package files! - - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. If you are using redis, clear your cache. +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + ## Frequently asked questions (FAQ) ### Where can I find my Castopod version? diff --git a/docs/src/zh-Hans/getting-started/update.md b/docs/src/zh-Hans/getting-started/update.md index 46624792..6e8b2b18 100644 --- a/docs/src/zh-Hans/getting-started/update.md +++ b/docs/src/zh-Hans/getting-started/update.md @@ -8,60 +8,85 @@ sidebarDepth: 3 安装 Castopod 后,你可能希望将实例更新到最新版本 版本以享受最新功能 ✨, 修复错误 🐛 和性能提升 ⚡。 -## 自动更新说明 +## Update instructions -> 即将到来... 👀 +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. -## 手动更新说明 + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) -1. 跳转至 [发布页面](https://code.castopod.org/adaures/castopod/-/releases) 并且 - 查看自己的实例是否为最新版本的 Castopod +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version - - 参考 - [在哪里可以找到我的 Castopod 版本号?](#where-can-i-find-my-castopod-version) + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) -2. 下载命名为 `Castopod Package`的最新版本,你可以选择 `zip` 或 `tar.gz` 压缩包 +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives - - ⚠️ 请确保你下载的是 Castopod 软件包而 **不是** 源代码 + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) -3. 在你的服务器上: +3. On your server: - - 删除除 `.env` 文件和 `public/media` 目录之外的所有文件 - - 将下载软件包中的新文件复制到你的服务器中 + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server - ::: 注意 + ::: info Note - 你可能在更新过程中需要重置文件权限。 检查 [安全问题](./security.md)。 + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). ::: -4. 新版本可能有额外的更新说明(请参阅 - [发布页面](https://code.castopod.org/adaures/castopod/-/releases))。 通常以 - `.sql` 格式的数据库迁移脚本更新你的数据库结构。 +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: - - 👉 确保在 phpmyadmin 面板上运行脚本或使用命令 行来更新数据库以及包文件! - - 参阅 - [我很长时间没有更新我的实例… 我该怎么办?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + ```bash + php spark castopod:database-update + ``` -5. 如果你正在使用 redis,请清除缓存。 -6. ✨ 享受你的新实例, 你已经更新完毕! +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> 即将到来... 👀 ## 常见问题(FAQ) ### 在哪里可以找到我的 Castopod 版本号? -跳转到你的 Castopod 管理面板,版本号显示在左下角。 +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. -或者,你可以在 `应用程序 > 配置 > Constants.php` 文件中找到版本号。 +Alternatively, you can find the version in the `app > Config > Constants.php` +file. ### 我很长时间没有更新我的实例… 我该怎么办? -没问题! 只需如上所述获取最新版本。 在执行上文步骤 (4) 时,将脚本按旧到新依次执 -行。 +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. > 你可能想要备份你的实例,这取决于您多久没有更新过 Castopod 。 -例如,如果你在 `v1.0.0-alpha.42` 并想要升级到 `v1.0.0-beta.1` +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: 0. (强烈推荐) 备份你的文件和数据库。 @@ -74,6 +99,7 @@ sidebarDepth: 3 ### 我是否应该在更新前备份? -我们建议你这样做,这样就不会在出现任何问题时丢失数据! +We advise you do, so you don't lose everything if anything goes wrong! -更笼统地说,我们建议你定期备份您的 Castopod 文件和 数据库,防止丢失所有内容…… +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/modules/Admin/Language/ar/AboutCastopod.php b/modules/Admin/Language/ar/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/ar/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/ar/Breadcrumb.php b/modules/Admin/Language/ar/Breadcrumb.php index 0156d943..f557a2ec 100644 --- a/modules/Admin/Language/ar/Breadcrumb.php +++ b/modules/Admin/Language/ar/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'صفحات', 'settings' => 'الإعدادات', 'theme' => 'الحلة', + 'about' => 'about', 'add' => 'إضافة', 'new' => 'جديد', 'edit' => 'تعديل', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'unpublish', 'delete' => 'احذف', + 'remove' => 'remove', 'fediverse' => 'الفديفرس', 'block-lists' => 'قوائم حجب', 'users' => 'مستخدمون', diff --git a/modules/Admin/Language/ar/Navigation.php b/modules/Admin/Language/ar/Navigation.php index f264138a..5fab3c3e 100644 --- a/modules/Admin/Language/ar/Navigation.php +++ b/modules/Admin/Language/ar/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'الإعدادات', 'settings-general' => 'العامة', 'settings-theme' => 'الحلة', + 'about' => 'About', 'account' => [ 'my-account' => 'حسابي', 'change-password' => 'تغيير الكلمة السرية', diff --git a/modules/Admin/Language/br/AboutCastopod.php b/modules/Admin/Language/br/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/br/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php index c2eb298a..46a4350b 100644 --- a/modules/Admin/Language/br/Breadcrumb.php +++ b/modules/Admin/Language/br/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pajennoù', 'settings' => 'arventennoù', 'theme' => 'neuz', + 'about' => 'about', 'add' => 'ouzhpennañ', 'new' => 'krouiñ', 'edit' => 'kemmañ', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'diembannañ', 'delete' => 'dilemel', + 'remove' => 'remove', 'fediverse' => 'kevrebed', 'block-lists' => 'roll ar re stanket', 'users' => 'implijerien·ezed', diff --git a/modules/Admin/Language/br/Navigation.php b/modules/Admin/Language/br/Navigation.php index b82240f9..a445181f 100644 --- a/modules/Admin/Language/br/Navigation.php +++ b/modules/Admin/Language/br/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Arventennoù', 'settings-general' => 'Hollek', 'settings-theme' => 'Neuz', + 'about' => 'About', 'account' => [ 'my-account' => 'Ma c\'hont', 'change-password' => 'Kemmañ ar ger-tremen', diff --git a/modules/Admin/Language/ca/AboutCastopod.php b/modules/Admin/Language/ca/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/ca/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/ca/Breadcrumb.php b/modules/Admin/Language/ca/Breadcrumb.php index 9fa7362a..5115dc04 100644 --- a/modules/Admin/Language/ca/Breadcrumb.php +++ b/modules/Admin/Language/ca/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pàgines', 'settings' => 'preferències', 'theme' => 'tema', + 'about' => 'about', 'add' => 'afegir', 'new' => 'nova', 'edit' => 'editar', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'desfer la publicació', 'delete' => 'eliminar', + 'remove' => 'remove', 'fediverse' => 'Fediverse', 'block-lists' => 'llista de bloquejats', 'users' => 'usuaris', diff --git a/modules/Admin/Language/ca/Navigation.php b/modules/Admin/Language/ca/Navigation.php index 77b48aee..2d75ea4f 100644 --- a/modules/Admin/Language/ca/Navigation.php +++ b/modules/Admin/Language/ca/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Preferències', 'settings-general' => 'General', 'settings-theme' => 'Tema', + 'about' => 'About', 'account' => [ 'my-account' => 'El meu compte', 'change-password' => 'Canviar la contrasenya', diff --git a/modules/Admin/Language/de/AboutCastopod.php b/modules/Admin/Language/de/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/de/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php index 2bf0fc70..188481fb 100644 --- a/modules/Admin/Language/de/Breadcrumb.php +++ b/modules/Admin/Language/de/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'Seiten', 'settings' => 'Einstellungen', 'theme' => 'Erscheinungsbild', + 'about' => 'about', 'add' => 'hinzufügen', 'new' => 'neu', 'edit' => 'bearbeiten', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'Veröffentlichung aufheben', 'delete' => 'löschen', + 'remove' => 'remove', 'fediverse' => 'Fediversum', 'block-lists' => 'Sperrlisten', 'users' => 'Benutzer', diff --git a/modules/Admin/Language/de/Navigation.php b/modules/Admin/Language/de/Navigation.php index 04fad137..d2264e25 100644 --- a/modules/Admin/Language/de/Navigation.php +++ b/modules/Admin/Language/de/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Einstellungen', 'settings-general' => 'Allgemein', 'settings-theme' => 'Erscheinungsbild', + 'about' => 'About', 'account' => [ 'my-account' => 'Mein Konto', 'change-password' => 'Passwort ändern', diff --git a/modules/Admin/Language/el/AboutCastopod.php b/modules/Admin/Language/el/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/el/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/el/Breadcrumb.php b/modules/Admin/Language/el/Breadcrumb.php index 38b8ec92..25c2cb6d 100644 --- a/modules/Admin/Language/el/Breadcrumb.php +++ b/modules/Admin/Language/el/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'σελίδες', 'settings' => 'ρυθμίσεις', 'theme' => 'θέμα', + 'about' => 'about', 'add' => 'προσθήκη', 'new' => 'νέο', 'edit' => 'επεξεργασία', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'αναίρεση δημοσίευσης', 'delete' => 'διαγραφή', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'λίστες αποκλεισμένων', 'users' => 'χρήστες', diff --git a/modules/Admin/Language/el/Navigation.php b/modules/Admin/Language/el/Navigation.php index 2325bd38..e454c121 100644 --- a/modules/Admin/Language/el/Navigation.php +++ b/modules/Admin/Language/el/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Ρυθμίσεις', 'settings-general' => 'Γενικά', 'settings-theme' => 'Θέμα', + 'about' => 'About', 'account' => [ 'my-account' => 'Ο λογαριασμός μου', 'change-password' => 'Αλλαγή κωδικού πρόσβασης', diff --git a/modules/Admin/Language/es/AboutCastopod.php b/modules/Admin/Language/es/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/es/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/es/Breadcrumb.php b/modules/Admin/Language/es/Breadcrumb.php index 621ca94e..63fc38d9 100644 --- a/modules/Admin/Language/es/Breadcrumb.php +++ b/modules/Admin/Language/es/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'páginas', 'settings' => 'configuración', 'theme' => 'tema', + 'about' => 'about', 'add' => 'añadir', 'new' => 'nuevo', 'edit' => 'editar', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'anular publicación', 'delete' => 'borrar', + 'remove' => 'remove', 'fediverse' => 'fediverso', 'block-lists' => 'listas de bloqueo', 'users' => 'usuarios', diff --git a/modules/Admin/Language/es/Navigation.php b/modules/Admin/Language/es/Navigation.php index 43c58893..fefb73e5 100644 --- a/modules/Admin/Language/es/Navigation.php +++ b/modules/Admin/Language/es/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Configuración', 'settings-general' => 'General', 'settings-theme' => 'Tema', + 'about' => 'About', 'account' => [ 'my-account' => 'Mi cuenta', 'change-password' => 'Cambiar contraseña', diff --git a/modules/Admin/Language/fa/AboutCastopod.php b/modules/Admin/Language/fa/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/fa/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/fa/Breadcrumb.php b/modules/Admin/Language/fa/Breadcrumb.php index f3269bfa..b1742abf 100644 --- a/modules/Admin/Language/fa/Breadcrumb.php +++ b/modules/Admin/Language/fa/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pages', 'settings' => 'settings', 'theme' => 'theme', + 'about' => 'about', 'add' => 'add', 'new' => 'new', 'edit' => 'edit', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'unpublish', 'delete' => 'delete', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'block lists', 'users' => 'users', diff --git a/modules/Admin/Language/fa/Navigation.php b/modules/Admin/Language/fa/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/fa/Navigation.php +++ b/modules/Admin/Language/fa/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/fr/AboutCastopod.php b/modules/Admin/Language/fr/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/fr/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php index 375caa16..6f78f95d 100644 --- a/modules/Admin/Language/fr/Breadcrumb.php +++ b/modules/Admin/Language/fr/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pages', 'settings' => 'paramètres', 'theme' => 'thème', + 'about' => 'about', 'add' => 'ajouter', 'new' => 'créer', 'edit' => 'modifier', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'dépublier', 'delete' => 'supprimer', + 'remove' => 'remove', 'fediverse' => 'fédiverse', 'block-lists' => 'listes de blocage', 'users' => 'utilisateurs', diff --git a/modules/Admin/Language/fr/Navigation.php b/modules/Admin/Language/fr/Navigation.php index 8e870a14..a0cd50c0 100644 --- a/modules/Admin/Language/fr/Navigation.php +++ b/modules/Admin/Language/fr/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Paramètres', 'settings-general' => 'Général', 'settings-theme' => 'Thème', + 'about' => 'About', 'account' => [ 'my-account' => 'Mon compte', 'change-password' => 'Modifier le mot de passe', diff --git a/modules/Admin/Language/gd/AboutCastopod.php b/modules/Admin/Language/gd/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/gd/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/gd/Breadcrumb.php b/modules/Admin/Language/gd/Breadcrumb.php index f3269bfa..b1742abf 100644 --- a/modules/Admin/Language/gd/Breadcrumb.php +++ b/modules/Admin/Language/gd/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pages', 'settings' => 'settings', 'theme' => 'theme', + 'about' => 'about', 'add' => 'add', 'new' => 'new', 'edit' => 'edit', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'unpublish', 'delete' => 'delete', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'block lists', 'users' => 'users', diff --git a/modules/Admin/Language/gd/Navigation.php b/modules/Admin/Language/gd/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/gd/Navigation.php +++ b/modules/Admin/Language/gd/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/gl/AboutCastopod.php b/modules/Admin/Language/gl/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/gl/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php index 7aa07fba..4716a004 100644 --- a/modules/Admin/Language/gl/Breadcrumb.php +++ b/modules/Admin/Language/gl/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'páxinas', 'settings' => 'axustes', 'theme' => 'decorado', + 'about' => 'about', 'add' => 'engadir', 'new' => 'novo', 'edit' => 'editar', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'retirar publicación', 'delete' => 'eliminar', + 'remove' => 'remove', 'fediverse' => 'fediverso', 'block-lists' => 'listas de bloqueo', 'users' => 'usuarias', diff --git a/modules/Admin/Language/gl/Navigation.php b/modules/Admin/Language/gl/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/gl/Navigation.php +++ b/modules/Admin/Language/gl/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/id/AboutCastopod.php b/modules/Admin/Language/id/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/id/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/id/Breadcrumb.php b/modules/Admin/Language/id/Breadcrumb.php index 676e47b7..371cdea5 100644 --- a/modules/Admin/Language/id/Breadcrumb.php +++ b/modules/Admin/Language/id/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pages', 'settings' => 'settings', 'theme' => 'theme', + 'about' => 'about', 'add' => 'add', 'new' => 'new', 'edit' => 'edit', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'unpublish', 'delete' => 'delete', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'block lists', 'users' => 'pengguna', diff --git a/modules/Admin/Language/id/Navigation.php b/modules/Admin/Language/id/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/id/Navigation.php +++ b/modules/Admin/Language/id/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/it/AboutCastopod.php b/modules/Admin/Language/it/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/it/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/it/Breadcrumb.php b/modules/Admin/Language/it/Breadcrumb.php index 9876ee9b..d1922c5e 100644 --- a/modules/Admin/Language/it/Breadcrumb.php +++ b/modules/Admin/Language/it/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pagine', 'settings' => 'impostazioni', 'theme' => 'tema', + 'about' => 'about', 'add' => 'aggiungi', 'new' => 'nuovo', 'edit' => 'modifica', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'annulla pubblicazione', 'delete' => 'elimina', + 'remove' => 'remove', 'fediverse' => 'fediverso', 'block-lists' => 'elenco bloccati', 'users' => 'utenti', diff --git a/modules/Admin/Language/it/Navigation.php b/modules/Admin/Language/it/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/it/Navigation.php +++ b/modules/Admin/Language/it/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/ko/AboutCastopod.php b/modules/Admin/Language/ko/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/ko/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/ko/Breadcrumb.php b/modules/Admin/Language/ko/Breadcrumb.php new file mode 100644 index 00000000..b1742abf --- /dev/null +++ b/modules/Admin/Language/ko/Breadcrumb.php @@ -0,0 +1,54 @@ + 'breadcrumb', + config('Admin') + ->gateway => 'Home', + 'podcasts' => 'podcasts', + 'episodes' => 'episodes', + 'subscriptions' => 'subscriptions', + 'contributors' => 'contributors', + 'pages' => 'pages', + 'settings' => 'settings', + 'theme' => 'theme', + 'about' => 'about', + 'add' => 'add', + 'new' => 'new', + 'edit' => 'edit', + 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'publish-date-edit' => 'edit publication date', + 'unpublish' => 'unpublish', + 'delete' => 'delete', + 'remove' => 'remove', + 'fediverse' => 'fediverse', + 'block-lists' => 'block lists', + 'users' => 'users', + 'my-account' => 'my account', + 'change-password' => 'change password', + 'import' => 'feed import', + 'platforms' => 'platforms', + 'social' => 'social networks', + 'funding' => 'funding', + 'analytics' => 'analytics', + 'locations' => 'locations', + 'webpages' => 'web pages', + 'unique-listeners' => 'unique listeners', + 'players' => 'players', + 'listening-time' => 'listening time', + 'time-periods' => 'time periods', + 'soundbites' => 'soundbites', + 'video-clips' => 'video clips', + 'embed' => 'embeddable player', + 'notifications' => 'notifications', + 'suspend' => 'suspend', +]; diff --git a/modules/Admin/Language/ko/Charts.php b/modules/Admin/Language/ko/Charts.php new file mode 100644 index 00000000..4b33530e --- /dev/null +++ b/modules/Admin/Language/ko/Charts.php @@ -0,0 +1,40 @@ + 'Episode downloads by service (for the past week)', + 'by_player_weekly' => 'Episode downloads by player (for the past week)', + 'by_player_yearly' => 'Episode downloads by player (for the past year)', + 'by_device_weekly' => 'Episode downloads by device (for the past week)', + 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', + 'podcast_by_region' => 'Episode downloads by region (for the past week)', + 'unique_daily_listeners' => 'Daily unique listeners', + 'unique_monthly_listeners' => 'Monthly unique listeners', + 'by_browser' => 'Web pages usage by browser (for the past week)', + 'podcast_by_day' => 'Episode daily downloads', + 'podcast_by_month' => 'Episode monthly downloads', + 'episode_by_day' => 'Episode daily downloads (first 60 days)', + 'episode_by_month' => 'Episode monthly downloads', + 'episodes_by_day' => + '5 latest episodes downloads (during their first 60 days)', + 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_yearly' => 'Episode downloads by country (for the past year)', + 'by_domain_weekly' => 'Web pages visits by source (for the past week)', + 'by_domain_yearly' => 'Web pages visits by source (for the past year)', + 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + 'podcast_bots' => 'Bots (crawlers)', + 'daily_listening_time' => 'Daily cumulative listening time', + 'monthly_listening_time' => 'Monthly cumulative listening time', + 'by_weekday' => 'By week day (for the past 60 days)', + 'by_hour' => 'By time of day (for the past 60 days)', + 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', + 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', +]; diff --git a/modules/Admin/Language/ko/Common.php b/modules/Admin/Language/ko/Common.php new file mode 100644 index 00000000..596c8bcd --- /dev/null +++ b/modules/Admin/Language/ko/Common.php @@ -0,0 +1,51 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'more' => 'More', + 'no_data' => 'No data found!', + 'close' => 'Close', + 'edit' => 'Edit', + 'copy' => 'Copy', + 'copied' => 'Copied!', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', + 'forms' => [ + 'editor' => [ + 'write' => 'Write', + 'preview' => 'Preview', + 'help' => 'Powered by markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Press to select', + 'loadingText' => 'Loading…', + 'noResultsText' => 'No results found', + 'noChoicesText' => 'No choices to choose from', + 'maxItemText' => 'Cannot add more items', + ], + 'upload_file' => 'Upload a file', + 'remote_url' => 'Remote URL', + ], + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'size_limit' => 'Size limit: {0}.', + 'choose_interact' => 'Choose how to interact', + 'view' => 'View', +]; diff --git a/modules/Admin/Language/ko/Countries.php b/modules/Admin/Language/ko/Countries.php new file mode 100644 index 00000000..4cd5d9c8 --- /dev/null +++ b/modules/Admin/Language/ko/Countries.php @@ -0,0 +1,264 @@ + 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia, Plurinational State of', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, the Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => "Côte d'Ivoire", + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cape Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia, Federated States of', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran, Islamic Republic of', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao People's Democratic Republic", + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'N/A' => 'Not Applicable (local IP…)', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Swaziland', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See (Vatican City State)', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/ko/Dashboard.php b/modules/Admin/Language/ko/Dashboard.php new file mode 100644 index 00000000..881073fd --- /dev/null +++ b/modules/Admin/Language/ko/Dashboard.php @@ -0,0 +1,28 @@ + 'Admin dashboard', + 'welcome_message' => 'Welcome to the admin area!', + 'podcasts' => [ + 'title' => 'Podcasts', + 'not_found' => 'No published podcast', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'episodes' => [ + 'title' => 'Episodes', + 'not_found' => 'No published episode', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'storage' => [ + 'title' => 'Storage', + 'subtitle' => '{totalUploaded} out of {totalStorage}', + ], +]; diff --git a/modules/Admin/Language/ko/Episode.php b/modules/Admin/Language/ko/Episode.php new file mode 100644 index 00000000..91313a7c --- /dev/null +++ b/modules/Admin/Language/ko/Episode.php @@ -0,0 +1,213 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'edit' => 'Edit', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'publish_date_edit' => 'Edit publication date', + 'unpublish' => 'Unpublish', + 'publish_error' => 'Episode is already published.', + 'publish_edit_error' => 'Episode is already published.', + 'publish_cancel_error' => 'Episode is already published.', + 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', + 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', + 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'unpublish_error' => 'Episode is not published.', + 'delete' => 'Delete', + 'go_to_page' => 'Go to page', + 'create' => 'Add an episode', + 'publication_status' => [ + 'published' => 'Published', + 'with_podcast' => 'Published', + 'scheduled' => 'Scheduled', + 'not_published' => 'Not published', + ], + 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Search for an episode', + 'clear' => 'Clear search', + 'submit' => 'Search', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# episode} + other {# episodes} + }', + 'episode' => 'Episode', + 'visibility' => 'Visibility', + 'comments' => 'Comments', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'Episode has been successfully created!', + 'editSuccess' => 'Episode has been successfully updated!', + 'publishSuccess' => '{publication_status, select, + published {Episode successfully published!} + scheduled {Episode publication successfully scheduled!} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not published.} + }', + 'publishCancelSuccess' => 'Episode publication successfully cancelled!', + 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', + 'scheduleDateError' => 'Schedule date must be set!', + 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'deleteSuccess' => 'Episode successfully deleted!', + 'deleteError' => 'Failed to delete episode {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_path}. You may manually remove it from your disk.', + 'sameSlugError' => 'An episode with the chosen slug already exists.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapters', + 'chapters_hint' => 'File must be in JSON Chapters format.', + 'chapters_download' => 'Download chapters', + 'chapters_file' => 'Chapters file', + 'chapters_remote_url' => 'Remote url for chapters file', + 'chapters_file_delete' => 'Delete chapters file', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the episode', + 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', + 'block' => 'Episode should be hidden from public catalogues', + 'block_hint' => + 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'submit_create' => 'Create episode', + 'submit_edit' => 'Save episode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Back to episode dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + 'with_podcast' => 'Publish alongside podcast', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', + 'message_warning_submit' => 'Publish anyways', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'New publication date', + 'new_publication_date_hint' => 'Must be set to a past date.', + 'submit' => 'Edit publication date', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + 'understand' => 'I understand, I want to delete the episode', + 'submit' => 'Delete', + ], + 'embed' => [ + 'title' => 'Embeddable player', + 'label' => + 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', + 'clipboard_iframe' => 'Copy embeddable player to clipboard', + 'clipboard_url' => 'Copy address to clipboard', + 'dark' => 'Dark', + 'dark-transparent' => 'Dark transparent', + 'light' => 'Light', + 'light-transparent' => 'Light transparent', + ], +]; diff --git a/modules/Admin/Language/ko/EpisodeNavigation.php b/modules/Admin/Language/ko/EpisodeNavigation.php new file mode 100644 index 00000000..1406e301 --- /dev/null +++ b/modules/Admin/Language/ko/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'View episode page', + 'dashboard' => 'Episode dashboard', + 'episode-view' => 'Home', + 'episode-edit' => 'Edit episode', + 'episode-persons-manage' => 'Manage persons', + 'embed-add' => 'Embeddable player', + 'clips' => 'Clips', + 'video-clips-list' => 'Video clips', + 'video-clips-create' => 'New video clip', + 'soundbites-list' => 'Soundbites', + 'soundbites-create' => 'New soundbite', +]; diff --git a/modules/Admin/Language/ko/Fediverse.php b/modules/Admin/Language/ko/Fediverse.php new file mode 100644 index 00000000..0e4ca66d --- /dev/null +++ b/modules/Admin/Language/ko/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'The account could not be found!', + 'blockActorSuccess' => '{actor} has been blocked!', + 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockDomainSuccess' => '{domain} has been blocked!', + 'unblockDomainSuccess' => '{domain} has been unblocked!', + ], + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/modules/Admin/Language/ko/Home.php b/modules/Admin/Language/ko/Home.php new file mode 100644 index 00000000..3ff4c04d --- /dev/null +++ b/modules/Admin/Language/ko/Home.php @@ -0,0 +1,14 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found', +]; diff --git a/modules/Admin/Language/ko/Install.php b/modules/Admin/Language/ko/Install.php new file mode 100644 index 00000000..36e373a2 --- /dev/null +++ b/modules/Admin/Language/ko/Install.php @@ -0,0 +1,61 @@ + 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Admin/Language/ko/Navigation.php b/modules/Admin/Language/ko/Navigation.php new file mode 100644 index 00000000..610f1434 --- /dev/null +++ b/modules/Admin/Language/ko/Navigation.php @@ -0,0 +1,42 @@ + 'Toggle sidebar', + 'go_to_website' => 'Go to website', + 'go_to_admin' => 'Go to admin', + 'dashboard' => 'Dashboard', + 'admin' => 'Home', + 'podcasts' => 'Podcasts', + 'podcast-list' => 'All podcasts', + 'podcast-create' => 'New podcast', + 'podcast-import' => 'Import a podcast', + 'persons' => 'Persons', + 'person-list' => 'All persons', + 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', + 'users' => 'Users', + 'user-list' => 'All users', + 'user-create' => 'New user', + 'pages' => 'Pages', + 'page-list' => 'All pages', + 'page-create' => 'New Page', + 'settings' => 'Settings', + 'settings-general' => 'General', + 'settings-theme' => 'Theme', + 'about' => 'About', + 'account' => [ + 'my-account' => 'My account', + 'change-password' => 'Change password', + 'logout' => 'Logout', + ], +]; diff --git a/modules/Admin/Language/ko/Notifications.php b/modules/Admin/Language/ko/Notifications.php new file mode 100644 index 00000000..2b139d51 --- /dev/null +++ b/modules/Admin/Language/ko/Notifications.php @@ -0,0 +1,19 @@ + 'Notifications', + 'reply' => '{actor_username} replied to your post', + 'favourite' => '{actor_username} favourited your post', + 'reblog' => '{actor_username} shared your post', + 'follow' => '{actor_username} started following you', + 'no_notifications' => 'No notifications', + 'mark_all_as_read' => 'Mark all as read', +]; diff --git a/modules/Admin/Language/ko/Page.php b/modules/Admin/Language/ko/Page.php new file mode 100644 index 00000000..b6f49de5 --- /dev/null +++ b/modules/Admin/Language/ko/Page.php @@ -0,0 +1,30 @@ + 'Back to home', + 'page' => 'Page', + 'all_pages' => 'All pages', + 'create' => 'New page', + 'go_to_page' => 'Go to page', + 'edit' => 'Edit page', + 'delete' => 'Delete page', + 'form' => [ + 'title' => 'Title', + 'permalink' => 'Permalink', + 'content' => 'Content', + 'submit_create' => 'Create page', + 'submit_edit' => 'Save', + ], + 'messages' => [ + 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'editSuccess' => 'The page was successfully updated!', + ], +]; diff --git a/modules/Admin/Language/ko/Pager.php b/modules/Admin/Language/ko/Pager.php new file mode 100644 index 00000000..e25ee638 --- /dev/null +++ b/modules/Admin/Language/ko/Pager.php @@ -0,0 +1,21 @@ + 'Page navigation', + 'first' => 'First', + 'previous' => 'Previous', + 'next' => 'Next', + 'last' => 'Last', + 'older' => 'Older', + 'newer' => 'Newer', + 'invalidTemplate' => '{0} is not a valid Pager template.', + 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', +]; diff --git a/modules/Admin/Language/ko/Person.php b/modules/Admin/Language/ko/Person.php new file mode 100644 index 00000000..a652be9f --- /dev/null +++ b/modules/Admin/Language/ko/Person.php @@ -0,0 +1,65 @@ + 'Persons', + 'all_persons' => 'All persons', + 'no_person' => 'Nobody found!', + 'create' => 'Create a person', + 'view' => 'View person', + 'edit' => 'Edit person', + 'delete' => 'Delete person', + 'messages' => [ + 'createSuccess' => 'Person has been successfully created!', + 'editSuccess' => 'Person has been successfully updated!', + 'deleteSuccess' => 'Person has been removed!', + ], + 'form' => [ + 'avatar' => 'Avatar', + 'avatar_size_hint' => + 'Avatar must be squared and at least 400px wide and tall.', + 'full_name' => 'Full name', + 'full_name_hint' => 'This is the full name or alias of the person.', + 'unique_name' => 'Unique name', + 'unique_name_hint' => 'Used for URLs', + 'information_url' => 'Information URL', + 'information_url_hint' => + 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', + 'submit_create' => 'Create person', + 'submit_edit' => 'Save person', + ], + 'podcast_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this podcast', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'episode_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this episode', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'credits' => 'Credits', +]; diff --git a/modules/Admin/Language/ko/Platforms.php b/modules/Admin/Language/ko/Platforms.php new file mode 100644 index 00000000..ab17d599 --- /dev/null +++ b/modules/Admin/Language/ko/Platforms.php @@ -0,0 +1,30 @@ + 'Platforms', + 'home_url' => 'Go to {platformName} website', + 'submit_url' => 'Submit your podcast on {platformName}', + 'visible' => 'Display in podcast homepage?', + 'on_embed' => 'Display on embeddable player?', + 'remove' => 'Remove {platformName}', + 'submit' => 'Save', + 'messages' => [ + 'updateSuccess' => 'Platform links have been successfully updated!', + 'removeLinkSuccess' => 'The platform link has been removed.', + 'removeLinkError' => + 'The platform link could not be removed. Try again.', + ], + 'description' => [ + 'podcasting' => 'The podcast ID on this platform', + 'social' => 'The podcast account ID on this platform', + 'funding' => 'Call to action message', + ], +]; diff --git a/modules/Admin/Language/ko/Podcast.php b/modules/Admin/Language/ko/Podcast.php new file mode 100644 index 00000000..426b763b --- /dev/null +++ b/modules/Admin/Language/ko/Podcast.php @@ -0,0 +1,310 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found!', + 'create' => 'Create podcast', + 'import' => 'Import podcast', + 'new_episode' => 'New Episode', + 'view' => 'View podcast', + 'edit' => 'Edit podcast', + 'publish' => 'Publish podcast', + 'publish_edit' => 'Edit publication', + 'delete' => 'Delete podcast', + 'see_episodes' => 'See episodes', + 'see_contributors' => 'See contributors', + 'go_to_page' => 'Go to page', + 'latest_episodes' => 'Latest episodes', + 'see_all_episodes' => 'See all episodes', + 'draft' => 'Draft', + 'messages' => [ + 'createSuccess' => 'Podcast successfully created!', + 'editSuccess' => 'Podcast has been successfully updated!', + 'importSuccess' => 'Podcast has been successfully imported!', + 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, + cover {cover} + banner {banner} + other {media} + }.', + 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, + one {# episode was} + other {# episodes were} + } added to the podcast!', + 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', + 'publishError' => 'This podcast is either already published or scheduled for publication.', + 'publishEditError' => 'This podcast is not scheduled for publication.', + 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', + 'scheduleDateError' => 'Schedule date must be set!', + ], + 'form' => [ + 'identity_section_title' => 'Podcast identity', + 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'cover' => 'Podcast cover', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'banner' => 'Podcast banner', + 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_delete' => 'Delete podcast banner', + 'title' => 'Title', + 'handle' => 'Handle', + 'handle_hint' => + 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'type' => [ + 'label' => 'Type', + 'episodic' => 'Episodic', + 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', + 'serial' => 'Serial', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + ], + 'description' => 'Description', + 'classification_section_title' => 'Classification', + 'classification_section_subtitle' => + 'These fields will impact your audience and competition.', + 'language' => 'Language', + 'category' => 'Category', + 'category_placeholder' => 'Select a category…', + 'other_categories' => 'Other categories', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does it contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'author_section_title' => 'Author', + 'author_section_subtitle' => 'Who is managing the podcast?', + 'owner_name' => 'Owner name', + 'owner_name_hint' => + 'For administrative use only. Visible in the public RSS feed.', + 'owner_email' => 'Owner email', + 'owner_email_hint' => + 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'publisher' => 'Publisher', + 'publisher_hint' => + 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'copyright' => 'Copyright', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this podcast about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real place or fictional', + 'monetization_section_title' => 'Monetization', + 'monetization_section_subtitle' => + 'Earn money thanks to your audience.', + 'premium' => 'Premium', + 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'payment_pointer_hint' => + 'This is your where you will receive money thanks to Web Monetization', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the podcast', + 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'new_feed_url' => 'New feed URL', + 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', + 'old_feed_url' => 'Old feed URL', + 'update_feed' => 'Update feed', + 'update_feed_tip' => 'Import this podcast\'s latest episodes', + 'partnership' => 'Partnership', + 'partner_id' => 'ID', + 'partner_link_url' => 'Link URL', + 'partner_image_url' => 'Image URL', + 'partner_id_hint' => 'Your own partner ID', + 'partner_link_url_hint' => 'The generic partner link address', + 'partner_image_url_hint' => 'The generic partner image address', + 'status_section_title' => 'Status', + 'block' => 'Podcast should be hidden from public catalogues', + 'block_hint' => + 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'complete' => 'Podcast will not be having new episodes', + 'lock' => 'Prevent podcast from being copied', + 'lock_hint' => + 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', + 'submit_create' => 'Create podcast', + 'submit_edit' => 'Save podcast', + ], + 'category_options' => [ + 'uncategorized' => 'uncategorized', + 'arts' => 'Arts', + 'business' => 'Business', + 'comedy' => 'Comedy', + 'education' => 'Education', + 'fiction' => 'Fiction', + 'government' => 'Government', + 'health_and_fitness' => 'Health & Fitness', + 'history' => 'History', + 'kids_and_family' => 'Kids & Family', + 'leisure' => 'Leisure', + 'music' => 'Music', + 'news' => 'News', + 'religion_and_spirituality' => 'Religion & Spirituality', + 'science' => 'Science', + 'society_and_culture' => 'Society & Culture', + 'sports' => 'Sports', + 'technology' => 'Technology', + 'true_crime' => 'True Crime', + 'tv_and_film' => 'TV & Film', + 'books' => 'Books', + 'design' => 'Design', + 'fashion_and_beauty' => 'Fashion & Beauty', + 'food' => 'Food', + 'performing_arts' => 'Performing Arts', + 'visual_arts' => 'Visual Arts', + 'careers' => 'Careers', + 'entrepreneurship' => 'Entrepreneurship', + 'investing' => 'Investing', + 'management' => 'Management', + 'marketing' => 'Marketing', + 'non_profit' => 'Non-Profit', + 'comedy_interviews' => 'Comedy Interviews', + 'improv' => 'Improv', + 'stand_up' => 'Stand-Up', + 'courses' => 'Courses', + 'how_to' => 'How To', + 'language_learning' => 'Language Learning', + 'self_improvement' => 'Self-Improvement', + 'comedy_fiction' => 'Comedy Fiction', + 'drama' => 'Drama', + 'science_fiction' => 'Science Fiction', + 'alternative_health' => 'Alternative Health', + 'fitness' => 'Fitness', + 'medicine' => 'Medicine', + 'mental_health' => 'Mental Health', + 'nutrition' => 'Nutrition', + 'sexuality' => 'Sexuality', + 'education_for_kids' => 'Education for Kids', + 'parenting' => 'Parenting', + 'pets_and_animals' => 'Pets & Animals', + 'stories_for_kids' => 'Stories for Kids', + 'animation_and_manga' => 'Animation & Manga', + 'automotive' => 'Automotive', + 'aviation' => 'Aviation', + 'crafts' => 'Crafts', + 'games' => 'Games', + 'hobbies' => 'Hobbies', + 'home_and_garden' => 'Home & Garden', + 'video_games' => 'Video Games', + 'music_commentary' => 'Music Commentary', + 'music_history' => 'Music History', + 'music_interviews' => 'Music Interviews', + 'business_news' => 'Business News', + 'daily_news' => 'Daily News', + 'entertainment_news' => 'Entertainment News', + 'news_commentary' => 'News Commentary', + 'politics' => 'Politics', + 'sports_news' => 'Sports News', + 'tech_news' => 'Tech News', + 'buddhism' => 'Buddhism', + 'christianity' => 'Christianity', + 'hinduism' => 'Hinduism', + 'islam' => 'Islam', + 'judaism' => 'Judaism', + 'religion' => 'Religion', + 'spirituality' => 'Spirituality', + 'astronomy' => 'Astronomy', + 'chemistry' => 'Chemistry', + 'earth_sciences' => 'Earth Sciences', + 'life_sciences' => 'Life Sciences', + 'mathematics' => 'Mathematics', + 'natural_sciences' => 'Natural Sciences', + 'nature' => 'Nature', + 'physics' => 'Physics', + 'social_sciences' => 'Social Sciences', + 'documentary' => 'Documentary', + 'personal_journals' => 'Personal Journals', + 'philosophy' => 'Philosophy', + 'places_and_travel' => 'Places & Travel', + 'relationships' => 'Relationships', + 'baseball' => 'Baseball', + 'basketball' => 'Basketball', + 'cricket' => 'Cricket', + 'fantasy_sports' => 'Fantasy Sports', + 'football' => 'Football', + 'golf' => 'Golf', + 'hockey' => 'Hockey', + 'rugby' => 'Rugby', + 'running' => 'Running', + 'soccer' => 'Soccer', + 'swimming' => 'Swimming', + 'tennis' => 'Tennis', + 'volleyball' => 'Volleyball', + 'wilderness' => 'Wilderness', + 'wrestling' => 'Wrestling', + 'after_shows' => 'After Shows', + 'film_history' => 'Film History', + 'film_interviews' => 'Film Interviews', + 'film_reviews' => 'Film Reviews', + 'tv_reviews' => 'TV Reviews', + ], + 'publish_form' => [ + 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'submit' => 'Publish', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', + 'message_warning_submit' => 'Publish anyway', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'not_published' => 'This podcast is not yet published.', + 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", + 'understand' => 'I understand, I want the podcast to be permanently deleted', + 'submit' => 'Delete', + ], + 'by' => 'By {publisher}', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', +]; diff --git a/modules/Admin/Language/ko/PodcastImport.php b/modules/Admin/Language/ko/PodcastImport.php new file mode 100644 index 00000000..7c3ef67d --- /dev/null +++ b/modules/Admin/Language/ko/PodcastImport.php @@ -0,0 +1,37 @@ + + 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', + 'old_podcast_section_title' => 'The podcast to import', + 'old_podcast_section_subtitle' => + 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', + 'imported_feed_url' => 'Feed URL', + 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', + 'new_podcast_section_title' => 'The new podcast', + 'advanced_params_section_title' => 'Advanced parameters', + 'advanced_params_section_subtitle' => + 'Keep the default values if you have no idea of what the fields are for.', + 'slug_field' => 'Field to be used to calculate episode slug', + 'description_field' => + 'Source field used for episode description / show notes', + 'force_renumber' => 'Force episodes renumbering', + 'force_renumber_hint' => + 'Use this if your podcast does not have episode numbers but wish to set them during import.', + 'season_number' => 'Season number', + 'season_number_hint' => + 'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.', + 'max_episodes' => 'Maximum number of episodes to import', + 'max_episodes_hint' => 'Leave blank to import all episodes', + 'lock_import' => + 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.', + 'submit' => 'Import podcast', +]; diff --git a/modules/Admin/Language/ko/PodcastNavigation.php b/modules/Admin/Language/ko/PodcastNavigation.php new file mode 100644 index 00000000..b4d7ddc0 --- /dev/null +++ b/modules/Admin/Language/ko/PodcastNavigation.php @@ -0,0 +1,38 @@ + 'Go to podcast page', + 'dashboard' => 'Podcast dashboard', + 'podcast-view' => 'Home', + 'podcast-edit' => 'Edit podcast', + 'podcast-persons-manage' => 'Manage persons', + 'episodes' => 'Episodes', + 'episode-list' => 'All episodes', + 'episode-create' => 'New episode', + 'analytics' => 'Analytics', + 'podcast-analytics' => 'Audience overview', + 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-players' => 'Players', + 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-time-periods' => 'Time periods', + 'premium' => 'Premium', + 'subscription-list' => 'All subscriptions', + 'subscription-add' => 'Add subscription', + 'contributors' => 'Contributors', + 'contributor-list' => 'All contributors', + 'contributor-add' => 'Add contributor', + 'platforms' => 'External platforms', + 'platforms-podcasting' => 'Podcasting', + 'platforms-social' => 'Social networks', + 'platforms-funding' => 'Funding', +]; diff --git a/modules/Admin/Language/ko/Settings.php b/modules/Admin/Language/ko/Settings.php new file mode 100644 index 00000000..4a70dcba --- /dev/null +++ b/modules/Admin/Language/ko/Settings.php @@ -0,0 +1,58 @@ + 'General settings', + 'instance' => [ + 'title' => 'Instance', + 'site_icon' => 'Site icon', + 'site_icon_delete' => 'Delete site icon', + 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_name' => 'Site name', + 'site_description' => 'Site description', + 'submit' => 'Save', + 'editSuccess' => 'Instance has been updated successfully!', + 'deleteIconSuccess' => 'Site icon has been remove successfully!', + ], + 'images' => [ + 'title' => 'Images', + 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'regenerate' => 'Regenerate images', + 'regenerationSuccess' => 'All images have been regenerated successfully!', + ], + 'housekeeping' => [ + 'title' => 'Housekeeping', + 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', + 'reset_counts' => 'Reset counts', + 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', + 'rewrite_media' => 'Rewrite media metadata', + 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', + 'rename_episodes_files' => 'Rename episode audio files', + 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'clear_cache' => 'Clear all cache', + 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'run' => 'Run housekeeping', + 'runSuccess' => 'Housekeeping has been run successfully!', + ], + 'theme' => [ + 'title' => 'Theme', + 'accent_section_title' => 'Accent color', + 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', + 'pine' => 'Pine', + 'crimson' => 'Crimson', + 'amber' => 'Amber', + 'lake' => 'Lake', + 'jacaranda' => 'Jacaranda', + 'onyx' => 'Onyx', + 'submit' => 'Save', + 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + ], +]; diff --git a/modules/Admin/Language/ko/Soundbite.php b/modules/Admin/Language/ko/Soundbite.php new file mode 100644 index 00000000..a3f828fe --- /dev/null +++ b/modules/Admin/Language/ko/Soundbite.php @@ -0,0 +1,31 @@ + [ + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', + ], + 'messages' => [ + 'createSuccess' => 'Soundbite has been successfully created!', + 'deleteSuccess' => 'Soundbite has been successfully removed!', + ], + 'form' => [ + 'title' => 'New soundbite', + 'soundbite_title' => 'Soundbite title', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'submit' => 'Create soundbite', + ], + 'play' => 'Play soundbite', + 'stop' => 'Stop soundbite', + 'create' => 'New soundbite', + 'delete' => 'Delete soundbite', +]; diff --git a/modules/Admin/Language/ko/Validation.php b/modules/Admin/Language/ko/Validation.php new file mode 100644 index 00000000..750b1968 --- /dev/null +++ b/modules/Admin/Language/ko/Validation.php @@ -0,0 +1,18 @@ + + '{field} is either not an image, or it is not wide or tall enough.', + 'is_image_ratio' => + '{field} is either not an image or not of the right ratio.', + 'validate_url' => + 'The {field} field must be a valid URL (eg. https://example.com/).', +]; diff --git a/modules/Admin/Language/ko/VideoClip.php b/modules/Admin/Language/ko/VideoClip.php new file mode 100644 index 00000000..638de697 --- /dev/null +++ b/modules/Admin/Language/ko/VideoClip.php @@ -0,0 +1,72 @@ + [ + 'title' => 'Video clips', + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Clip is waiting to be processed.', + 'pending' => 'pending', + 'pending_hint' => 'Clip will be generated shortly.', + 'running' => 'running', + 'running_hint' => 'Clip is being generated.', + 'failed' => 'failed', + 'failed_hint' => 'Clip could not be generated: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Clip was generated successfully!', + ], + 'clip' => 'Clip', + 'duration' => 'Job duration', + ], + 'title' => 'Video clip: {videoClipLabel}', + 'download_clip' => 'Download clip', + 'create' => 'New video clip', + 'go_to_page' => 'Go to clip page', + 'retry' => 'Retry clip generation', + 'delete' => 'Delete clip', + 'logs' => 'Job logs', + 'messages' => [ + 'alreadyExistingError' => 'The video clip you are trying to create already exists!', + 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', + 'deleteSuccess' => 'Video clip has been successfully removed!', + ], + 'format' => [ + 'landscape' => 'Landscape', + 'portrait' => 'Portrait', + 'squared' => 'Squared', + ], + 'form' => [ + 'title' => 'New video clip', + 'params_section_title' => 'Video clip parameters', + 'clip_title' => 'Clip title', + 'format' => [ + 'label' => 'Choose a format', + 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', + 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', + 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + ], + 'theme' => 'Select a theme', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'trim_start' => 'Trim start', + 'trim_end' => 'Trim end', + 'submit' => 'Create video clip', + ], + 'requirements' => [ + 'title' => 'Missing requirements', + 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'ffmpeg' => 'FFmpeg', + 'gd' => 'Graphics Draw (GD)', + 'freetype' => 'Freetype library for GD', + 'transcript' => 'Transcript file (.srt)', + ], +]; diff --git a/modules/Admin/Language/nl/AboutCastopod.php b/modules/Admin/Language/nl/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/nl/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php index a5c08f43..f7821de4 100644 --- a/modules/Admin/Language/nl/Breadcrumb.php +++ b/modules/Admin/Language/nl/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'paginas', 'settings' => 'instellingen', 'theme' => 'thema', + 'about' => 'about', 'add' => 'toevoegen', 'new' => 'nieuw', 'edit' => 'bewerken', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'publicatie ongedaan maken', 'delete' => 'verwijder', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'blokkeerlijst', 'users' => 'gebruikers', diff --git a/modules/Admin/Language/nl/Navigation.php b/modules/Admin/Language/nl/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/nl/Navigation.php +++ b/modules/Admin/Language/nl/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/nn-NO/AboutCastopod.php b/modules/Admin/Language/nn-NO/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/nn-NO/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php index d59e34ef..c191408e 100644 --- a/modules/Admin/Language/nn-NO/Breadcrumb.php +++ b/modules/Admin/Language/nn-NO/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'sider', 'settings' => 'innstillingar', 'theme' => 'bunad', + 'about' => 'about', 'add' => 'legg til', 'new' => 'ny', 'edit' => 'rediger', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'avpubliser', 'delete' => 'slett', + 'remove' => 'remove', 'fediverse' => 'fødiverset', 'block-lists' => 'blokkeringslister', 'users' => 'brukarar', diff --git a/modules/Admin/Language/nn-NO/Navigation.php b/modules/Admin/Language/nn-NO/Navigation.php index ce1b2185..75bd5b42 100644 --- a/modules/Admin/Language/nn-NO/Navigation.php +++ b/modules/Admin/Language/nn-NO/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Innstillingar', 'settings-general' => 'Generelt', 'settings-theme' => 'Bunad', + 'about' => 'About', 'account' => [ 'my-account' => 'Kontoen min', 'change-password' => 'Endre passord', diff --git a/modules/Admin/Language/oc/AboutCastopod.php b/modules/Admin/Language/oc/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/oc/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/oc/Breadcrumb.php b/modules/Admin/Language/oc/Breadcrumb.php index f3269bfa..b1742abf 100644 --- a/modules/Admin/Language/oc/Breadcrumb.php +++ b/modules/Admin/Language/oc/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pages', 'settings' => 'settings', 'theme' => 'theme', + 'about' => 'about', 'add' => 'add', 'new' => 'new', 'edit' => 'edit', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'unpublish', 'delete' => 'delete', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'block lists', 'users' => 'users', diff --git a/modules/Admin/Language/oc/Navigation.php b/modules/Admin/Language/oc/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/oc/Navigation.php +++ b/modules/Admin/Language/oc/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/pl/AboutCastopod.php b/modules/Admin/Language/pl/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/pl/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php index d472ef10..3d906747 100644 --- a/modules/Admin/Language/pl/Breadcrumb.php +++ b/modules/Admin/Language/pl/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'strony', 'settings' => 'ustawienia', 'theme' => 'motyw', + 'about' => 'about', 'add' => 'dodaj', 'new' => 'nowy', 'edit' => 'edytuj', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'cofnij publikację', 'delete' => 'usuń', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'listy blokowanych', 'users' => 'użytkownicy', diff --git a/modules/Admin/Language/pl/Navigation.php b/modules/Admin/Language/pl/Navigation.php index d4a44104..3b2b74ca 100644 --- a/modules/Admin/Language/pl/Navigation.php +++ b/modules/Admin/Language/pl/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Ustawienia', 'settings-general' => 'Ogólne', 'settings-theme' => 'Motyw', + 'about' => 'About', 'account' => [ 'my-account' => 'Moje konto', 'change-password' => 'Zmień hasło', diff --git a/modules/Admin/Language/pt-BR/AboutCastopod.php b/modules/Admin/Language/pt-BR/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/pt-BR/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-BR/Breadcrumb.php index 028fb11c..47646fdd 100644 --- a/modules/Admin/Language/pt-BR/Breadcrumb.php +++ b/modules/Admin/Language/pt-BR/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'páginas', 'settings' => 'configurações', 'theme' => 'tema', + 'about' => 'about', 'add' => 'adicionar', 'new' => 'novo', 'edit' => 'editar', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'despublicar', 'delete' => 'excluir', + 'remove' => 'remove', 'fediverse' => 'fediverso', 'block-lists' => 'listas de bloqueio', 'users' => 'usuários', diff --git a/modules/Admin/Language/pt-BR/Navigation.php b/modules/Admin/Language/pt-BR/Navigation.php index c0e86154..92b351ae 100644 --- a/modules/Admin/Language/pt-BR/Navigation.php +++ b/modules/Admin/Language/pt-BR/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Confirgurações', 'settings-general' => 'Geral', 'settings-theme' => 'Tema', + 'about' => 'About', 'account' => [ 'my-account' => 'Minha conta', 'change-password' => 'Alterar senha', diff --git a/modules/Admin/Language/pt/AboutCastopod.php b/modules/Admin/Language/pt/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/pt/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/pt/Breadcrumb.php b/modules/Admin/Language/pt/Breadcrumb.php index f3269bfa..b1742abf 100644 --- a/modules/Admin/Language/pt/Breadcrumb.php +++ b/modules/Admin/Language/pt/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pages', 'settings' => 'settings', 'theme' => 'theme', + 'about' => 'about', 'add' => 'add', 'new' => 'new', 'edit' => 'edit', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'unpublish', 'delete' => 'delete', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'block lists', 'users' => 'users', diff --git a/modules/Admin/Language/pt/Navigation.php b/modules/Admin/Language/pt/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/pt/Navigation.php +++ b/modules/Admin/Language/pt/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/ru/AboutCastopod.php b/modules/Admin/Language/ru/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/ru/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/ru/Breadcrumb.php b/modules/Admin/Language/ru/Breadcrumb.php index 33432cfd..72874de6 100644 --- a/modules/Admin/Language/ru/Breadcrumb.php +++ b/modules/Admin/Language/ru/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'страниц', 'settings' => 'настройки', 'theme' => 'тема', + 'about' => 'about', 'add' => 'добавить', 'new' => 'новая', 'edit' => 'изменить', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'снять с публикации', 'delete' => 'удалить', + 'remove' => 'remove', 'fediverse' => 'Федивёрс', 'block-lists' => 'список блокируемых', 'users' => 'пользователи', diff --git a/modules/Admin/Language/ru/Navigation.php b/modules/Admin/Language/ru/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/ru/Navigation.php +++ b/modules/Admin/Language/ru/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/sk/AboutCastopod.php b/modules/Admin/Language/sk/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/sk/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php index 3c742281..4afaa5d4 100644 --- a/modules/Admin/Language/sk/Breadcrumb.php +++ b/modules/Admin/Language/sk/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'stránky', 'settings' => 'nastavenia', 'theme' => 'vzhľad', + 'about' => 'about', 'add' => 'pridať', 'new' => 'pridať', 'edit' => 'upraviť', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'zrušiť zverejnenie', 'delete' => 'vymazať', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'zoznamy blokovaných', 'users' => 'používatelia', diff --git a/modules/Admin/Language/sk/Navigation.php b/modules/Admin/Language/sk/Navigation.php index f2c9e53a..45badfd7 100644 --- a/modules/Admin/Language/sk/Navigation.php +++ b/modules/Admin/Language/sk/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Nastavenia', 'settings-general' => 'Všeobecné', 'settings-theme' => 'Vzhľad', + 'about' => 'About', 'account' => [ 'my-account' => 'Môj účet', 'change-password' => 'Zmeniť heslo', diff --git a/modules/Admin/Language/sv/AboutCastopod.php b/modules/Admin/Language/sv/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/sv/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/sv/Breadcrumb.php b/modules/Admin/Language/sv/Breadcrumb.php index f3269bfa..b1742abf 100644 --- a/modules/Admin/Language/sv/Breadcrumb.php +++ b/modules/Admin/Language/sv/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => 'pages', 'settings' => 'settings', 'theme' => 'theme', + 'about' => 'about', 'add' => 'add', 'new' => 'new', 'edit' => 'edit', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'unpublish', 'delete' => 'delete', + 'remove' => 'remove', 'fediverse' => 'fediverse', 'block-lists' => 'block lists', 'users' => 'users', diff --git a/modules/Admin/Language/sv/Navigation.php b/modules/Admin/Language/sv/Navigation.php index 68d4609d..610f1434 100644 --- a/modules/Admin/Language/sv/Navigation.php +++ b/modules/Admin/Language/sv/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', + 'about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/zh-Hans/AboutCastopod.php b/modules/Admin/Language/zh-Hans/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/zh-Hans/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-Hans/Breadcrumb.php index 80105ec3..9d90fe90 100644 --- a/modules/Admin/Language/zh-Hans/Breadcrumb.php +++ b/modules/Admin/Language/zh-Hans/Breadcrumb.php @@ -19,6 +19,7 @@ return [ 'pages' => '页', 'settings' => '设置', 'theme' => '主题', + 'about' => 'about', 'add' => '添加', 'new' => '新建', 'edit' => '编辑', @@ -28,6 +29,7 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => '取消发布', 'delete' => '删除', + 'remove' => 'remove', 'fediverse' => '联邦宇宙', 'block-lists' => '封禁列表', 'users' => '用户', diff --git a/modules/Admin/Language/zh-Hans/Navigation.php b/modules/Admin/Language/zh-Hans/Navigation.php index 9cf34c78..4be56290 100644 --- a/modules/Admin/Language/zh-Hans/Navigation.php +++ b/modules/Admin/Language/zh-Hans/Navigation.php @@ -33,6 +33,7 @@ return [ 'settings' => '设置', 'settings-general' => '通用', 'settings-theme' => '主题', + 'about' => 'About', 'account' => [ 'my-account' => '我的帐户', 'change-password' => '修改密码', diff --git a/modules/Auth/Language/ar/Auth.php b/modules/Auth/Language/ar/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/ar/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/br/Auth.php b/modules/Auth/Language/br/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/br/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/ca/Auth.php b/modules/Auth/Language/ca/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/ca/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/de/Auth.php b/modules/Auth/Language/de/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/de/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/el/Auth.php b/modules/Auth/Language/el/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/el/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/es/Auth.php b/modules/Auth/Language/es/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/es/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/fa/Auth.php b/modules/Auth/Language/fa/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/fa/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/fr/Auth.php b/modules/Auth/Language/fr/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/fr/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/gd/Auth.php b/modules/Auth/Language/gd/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/gd/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/gl/Auth.php b/modules/Auth/Language/gl/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/gl/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/id/Auth.php b/modules/Auth/Language/id/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/id/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/it/Auth.php b/modules/Auth/Language/it/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/it/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/ko/Auth.php b/modules/Auth/Language/ko/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/ko/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/nl/Auth.php b/modules/Auth/Language/nl/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/nl/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/nn-NO/Auth.php b/modules/Auth/Language/nn-NO/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/nn-NO/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/oc/Auth.php b/modules/Auth/Language/oc/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/oc/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/pl/Auth.php b/modules/Auth/Language/pl/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/pl/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/pt-BR/Auth.php b/modules/Auth/Language/pt-BR/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/pt-BR/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/pt/Auth.php b/modules/Auth/Language/pt/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/pt/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/ru/Auth.php b/modules/Auth/Language/ru/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/ru/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/sk/Auth.php b/modules/Auth/Language/sk/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/sk/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/sv/Auth.php b/modules/Auth/Language/sv/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/sv/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/zh-Hans/Auth.php b/modules/Auth/Language/zh-Hans/Auth.php new file mode 100644 index 00000000..09e3cd6b --- /dev/null +++ b/modules/Auth/Language/zh-Hans/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Install/Language/ko/Install.php b/modules/Install/Language/ko/Install.php new file mode 100644 index 00000000..1f66ef11 --- /dev/null +++ b/modules/Install/Language/ko/Install.php @@ -0,0 +1,62 @@ + 'Castopod installer', + 'manual_config' => 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/PremiumPodcasts/Language/ko/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/ko/PremiumPodcasts.php new file mode 100644 index 00000000..18c0dd4e --- /dev/null +++ b/modules/PremiumPodcasts/Language/ko/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Podcast contains premium episodes', + 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', + 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', + 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', + 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'subscribe' => 'Subscribe', + 'lock' => 'Lock', + 'unlock' => 'Unlock', + 'unlock_form' => [ + 'title' => 'Premium content', + 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'token' => 'Enter your key', + 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'submit' => 'Unlock all episodes!', + 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'subscribe_cta' => 'Subscribe now!', + ], + 'messages' => [ + 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', + 'unlockBadAttempt' => 'Your key does not seem to be working…', + 'lockSuccess' => 'Podcast was successfully locked!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/ko/Subscription.php b/modules/PremiumPodcasts/Language/ko/Subscription.php new file mode 100644 index 00000000..f8af256f --- /dev/null +++ b/modules/PremiumPodcasts/Language/ko/Subscription.php @@ -0,0 +1,100 @@ + 'Podcast subscriptions', + 'add' => 'New subscription', + 'view' => 'View subscription', + 'edit' => 'Edit subscription', + 'regenerate_token' => 'Regenerate token', + 'suspend' => 'Suspend subscription', + 'resume' => 'Resume subscription', + 'delete' => 'Delete subscription', + 'status' => [ + 'active' => 'Active', + 'suspended' => 'Suspended', + 'expired' => 'Expired', + ], + 'list' => [ + 'number' => 'Number', + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'unlimited' => 'Unlimited', + 'downloads' => 'Downloads', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'submit_add' => 'Add subscription', + 'submit_edit' => 'Edit subscription', + ], + 'form_link_add' => [ + 'link' => 'Subscription page link', + 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'submit' => 'Save link', + ], + 'suspend_form' => [ + 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'reason' => 'Reason', + 'reason_placeholder' => 'Why are you suspending the subscription?', + "submit" => 'Suspend subscription', + ], + 'delete_form' => [ + 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'understand' => 'I understand, remove the subscription permanently', + 'submit' => 'Remove subscription', + ], + 'messages' => [ + 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', + 'addError' => 'Subscription could not be added.', + 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'editError' => 'Subscription could not be edited.', + 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenError' => 'Token could not be regenerated.', + 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', + 'deleteError' => 'Subscription could not be removed.', + 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', + 'suspendError' => 'Subscription could not be suspended.', + 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', + 'resumeError' => 'Subscription could not be resumed.', + 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', + 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + ], + 'emails' => [ + 'greeting' => 'Hey,', + 'token' => 'Your token: {0}', + 'unique_feed_link' => 'Your unique feed link: {0}', + 'how_to_use' => 'How to use?', + 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', + 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'welcome_subject' => 'Welcome to {podcastTitle}', + 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', + 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', + 'welcome_expires' => 'Your subscription was set to expire on {0}.', + 'welcome_never_expires' => 'Your subscription was set to never expire.', + 'reset_subject' => 'Your token was reset!', + 'reset_token' => 'Your access to {podcastTitle} has been reset!', + 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'edited_subject' => 'Your subscription has been updated!', + 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', + 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'suspended_subject' => 'Your subscription has been suspended!', + 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended_reason' => 'That is for the following reason: {0}', + 'resumed_subject' => 'Your subscription has been resumed!', + 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'deleted_subject' => 'Your subscription has been removed!', + 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'footer' => '{castopod} hosted on {host}', + ], +]; From f9572e4125ed53c215cc4a3c4d1a32708e6febe3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 20 Oct 2022 08:17:21 +0000 Subject: [PATCH 015/477] chore(release): 1.0.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 1.0.0 (2022-10-20) ### Bug Fixes * **a11y:** replace active tab color to contrast with background on podcast and episode pages ([f3785e1](https://code.castopod.org/adaures/castopod/commit/f3785e140147d085a2fb6a62ded87cdfe360f442)) * **activity-pub:** cache issues when navigating to activity stream urls ([7bcbfb3](https://code.castopod.org/adaures/castopod/commit/7bcbfb32f7cca08d111be46c7f1640e372d4a4b0)) * **activity-pub:** get database records using new model instances ([92536dd](https://code.castopod.org/adaures/castopod/commit/92536ddb3812214a9c5682b92e547e5c1998a5d7)) * **activitypub:** add conditions for possibly missing actor properties + add user-agent to requests ([8fbf948](https://code.castopod.org/adaures/castopod/commit/8fbf948fbba22ffd33966a1b2ccd42e8f7c1f8a2)) * **activitypub:** add target actor id to like / announce activities to send directly to note's actor ([962dd30](https://code.castopod.org/adaures/castopod/commit/962dd305f5d3f6eadc68f400e0e8f953827fe20d)) * **activitypub:** add target_actor_id for create activity to broadcast post reply ([0128a21](https://code.castopod.org/adaures/castopod/commit/0128a21ec55dcc0a2fbf4081dadb4c4737735ba1)) * **activitypub:** allow cors on get requests for routes exposing acitivitypub objects ([2f24809](https://code.castopod.org/adaures/castopod/commit/2f2480998f9abb34f02ab186c65d462a74b4e640)) * **activitypub:** set created_by to null for reblog if no user + update episode oembed data ([209dfbd](https://code.castopod.org/adaures/castopod/commit/209dfbd134e1a2cc02e7c24c158d786fa4dda61d)) * add admin-audio-player to vite config to have admin player show up ([93cb9b2](https://code.castopod.org/adaures/castopod/commit/93cb9b24701c09b92820204a67c1fc1b3c044708)) * add application/octet-stream mimetype to mp3 and m4a extensions to prevent ext_in error ([339bef8](https://code.castopod.org/adaures/castopod/commit/339bef878e54983d86e91e6ff7a931a843d321b3)), closes [#145](https://code.castopod.org/adaures/castopod/issues/145) * add category_label component to include parent category in about podcast page ([74e7d68](https://code.castopod.org/adaures/castopod/commit/74e7d68ac834885c4b89ee6e7d60db2157165799)) * add explicit int conversion when formatting episode duration ([1253096](https://code.castopod.org/adaures/castopod/commit/1253096197a0d30692bdafa7152f250cd9a71acf)) * add head request to analytics_hit route ([f0a2f0b](https://code.castopod.org/adaures/castopod/commit/f0a2f0bea491ca91976b351bb79837e95c9d094b)) * add href to castopod website on login page ([cc54257](https://code.castopod.org/adaures/castopod/commit/cc5425735184ad738aa0f38540f18e8971f8f56e)) * add missing explicit badge for podcasts and episodes ([cdf9f9d](https://code.castopod.org/adaures/castopod/commit/cdf9f9d53f2597f19455cb65c51da4677bb99327)) * add open graph size for podcast images to replace the inadequate large format ([33aae1f](https://code.castopod.org/adaures/castopod/commit/33aae1f7934e4962116e94e477dbf48e24971f5f)) * add public/media folder to castopod bundle ([8053d35](https://code.castopod.org/adaures/castopod/commit/8053d3521b481872711dabaaf265d08b9bfbaa87)), closes [#52](https://code.castopod.org/adaures/castopod/issues/52) * add translation key for audio-clipper trim labels ([db191ac](https://code.castopod.org/adaures/castopod/commit/db191ac31bd16bad2a72afdb8b25c685adf86a6e)) * add underline and semibold font weight for prose links to have them stand out ([d4d8671](https://code.castopod.org/adaures/castopod/commit/d4d867121c50bded4176a53d7154cf1bb347e306)) * add where condition to get episode count without deleted episodes ([7661734](https://code.castopod.org/adaures/castopod/commit/7661734ed296654630f3668132671117519145dd)), closes [#67](https://code.castopod.org/adaures/castopod/issues/67) * **admin:** save block and lock switches ([b66c0af](https://code.castopod.org/adaures/castopod/commit/b66c0afc8fab2e338402a9a4f8105e5f5459e208)) * **analytics:** redirect to mp3 file even when referer was not set ([9fc388d](https://code.castopod.org/adaures/castopod/commit/9fc388d154f29c335dedcd624abe8c1751762c07)) * **analytics:** remove charts empty values + remove useless language cache ([1678794](https://code.castopod.org/adaures/castopod/commit/16787941539ba4014281a366789ea896a9cd2afc)) * **analytics:** set duration field to precise decimal as episode's audio file duration ([d772685](https://code.castopod.org/adaures/castopod/commit/d77268540569b2be9d91d5e09aefb3ff5ac2b071)) * **analytics:** set initial value for duration and bandwidth ([ee50539](https://code.castopod.org/adaures/castopod/commit/ee5053959154b1a2e5fbe4b43162968425206a26)) * **analytics:** update migrations to set decimal precision for latitude and longitude ([714d6b5](https://code.castopod.org/adaures/castopod/commit/714d6b5d4950e52cf1c3170bb59954f98ffd48bd)) * **analytics:** update service management so that it works with new OPAWG slug values ([7fe9d42](https://code.castopod.org/adaures/castopod/commit/7fe9d42500ade2c6fa3ff4365b4affc475af0e51)) * **audio-clipper:** add mouse position offset when stretching clip to prevent content from jumping ([602654b](https://code.castopod.org/adaures/castopod/commit/602654b99b33ee8c29da080058a0aaea976cd484)) * **audio-clipper:** show audio playing progress + put waveform behind audio clipper ([01a09dc](https://code.castopod.org/adaures/castopod/commit/01a09dc447b81c5412ceb45d6706a867939fd4dd)) * **avatar:** use default avatar when no avatar url has been set ([9d23c7e](https://code.castopod.org/adaures/castopod/commit/9d23c7e7e142c6cf1a1418e37e41d711064593c4)), closes [#111](https://code.castopod.org/adaures/castopod/issues/111) * **bundle:** include modules and themes when copying files with rsync ([cd5bb88](https://code.castopod.org/adaures/castopod/commit/cd5bb8835c6e259408a8c13a2196a347e161da83)) * **bundle:** update vite input files path + add `set -e` in bash scripts to fail if command fails ([0ee53c7](https://code.castopod.org/adaures/castopod/commit/0ee53c71ffadb8a6ddb1febd9f912bc99f5f7a0b)) * **cache:** add locale for podcast and episode pages + clear some persisting cache in models ([9cec8a8](https://code.castopod.org/adaures/castopod/commit/9cec8a81ccbb7239402fe6633dbc31979272302a)), closes [#42](https://code.castopod.org/adaures/castopod/issues/42) [#61](https://code.castopod.org/adaures/castopod/issues/61) * **cache:** delete posts and comments pages cache when updating platform links ([f7c3e5b](https://code.castopod.org/adaures/castopod/commit/f7c3e5bf4ad43389bf8d58d2c4aaf16b81cbce00)), closes [#169](https://code.castopod.org/adaures/castopod/issues/169) * **cache:** return a non cached view when connected ([e2e7358](https://code.castopod.org/adaures/castopod/commit/e2e735815d805a48eed2ea3288d060d0ddb253a3)) * **cache:** suffix cache names with authenticated for credits, map and pages ([418a70b](https://code.castopod.org/adaures/castopod/commit/418a70b2a670d8ba0ab6c15fa5faa41f6be55e53)) * cast actor_id to pass as int to set_interact_as_actor() function ([56a8e5d](https://code.castopod.org/adaures/castopod/commit/56a8e5d7dd615322aeb007e730801c65d0b02e5c)) * **category:** remove uncategorized option to enforce users in choosing a category ([8c64f25](https://code.castopod.org/adaures/castopod/commit/8c64f25a0e72fec03d25544797d32623b2276fce)) * change image size requirement hints ([ea20206](https://code.castopod.org/adaures/castopod/commit/ea20206ee674eb54dd3ea188d2a2e2d41425df65)) * change message upon cancellation of episode publication ([9859c74](https://code.castopod.org/adaures/castopod/commit/9859c7434c2a3478ce035f7a4de20f594d63f5b0)) * check for database connection and podcasts table existence before redirecting to install ([eb74e81](https://code.castopod.org/adaures/castopod/commit/eb74e81c3d93581e310b391cd029e62a0d690a8a)) * check that additional files are valid when creating episode ([eac5bc8](https://code.castopod.org/adaures/castopod/commit/eac5bc876de125e1fe08d1b89f767a04fc0fbfb6)) * check that note has a preview_card_id before displaying it ([acb8b3a](https://code.castopod.org/adaures/castopod/commit/acb8b3a40172ccb184ffe544760601d756692e6c)), closes [#114](https://code.castopod.org/adaures/castopod/issues/114) * clear cache when deleting podcast banner ([99bb40b](https://code.castopod.org/adaures/castopod/commit/99bb40b8bc17b8ee2cd8468a82e46ea280c92cb6)) * comment all cache clean after page update to prevent analytics cache deletion ([e6197a4](https://code.castopod.org/adaures/castopod/commit/e6197a4972a3cce3d67dd7972bb54f8720b8e5b7)) * **comments:** add comment view partials for public pages ([fcecbe1](https://code.castopod.org/adaures/castopod/commit/fcecbe1c68b0d28d19454fba65caf3ab769fbc75)) * correct chart data ([4d3e9c8](https://code.castopod.org/adaures/castopod/commit/4d3e9c8c02cdc882e9fe1c29625695b6f83c820a)) * correct percona compatibility issue ([e53f819](https://code.castopod.org/adaures/castopod/commit/e53f819264b2d6902996f11ffcbb7c99295a90ef)) * correct php-fpm issues ([1ef55d7](https://code.castopod.org/adaures/castopod/commit/1ef55d7315bb44abe05f02ec8a84b6b6a557a9a0)) * correct referrer bug ([ed69b2f](https://code.castopod.org/adaures/castopod/commit/ed69b2f5004ed1cd18bac824c08a0df01f5d2637)) * correction for servers with low int precision ([31b7828](https://code.castopod.org/adaures/castopod/commit/31b7828e77519ef43e9bcfcbdf6c21712f97a571)) * **cors:** add preflight option routes for episode, podcast and status objects ([a281abf](https://code.castopod.org/adaures/castopod/commit/a281abfda475388a07943c169dab460cc2d4f944)) * declare typed properties in PHPDoc for php<7.4 ([14dd44d](https://code.castopod.org/adaures/castopod/commit/14dd44d03d6db0d9ae4198db8e65c92a0e45cb31)), closes [#23](https://code.castopod.org/adaures/castopod/issues/23) * define podcast_id and platform_slug as foreign keys in podcasts_plaforms table ([6e9451a](https://code.castopod.org/adaures/castopod/commit/6e9451a1103b43750fa70ad576de36af25ca29cb)) * define podcastNamespaceLink value ([0d744d2](https://code.castopod.org/adaures/castopod/commit/0d744d212df0d070ceea185068eaf2746e1ccd48)) * **email:** set the correct url in the activation and forgot emails ([10fc6f1](https://code.castopod.org/adaures/castopod/commit/10fc6f17c6838a58348f32ccfd0cf05f9d3e172c)), closes [#204](https://code.castopod.org/adaures/castopod/issues/204) * **embeddable-player:** enable any ancestor when X-Frame-Options is set on server ([44a4962](https://code.castopod.org/adaures/castopod/commit/44a4962e0b7e3ed87e9914b4e7792a0d52330ff8)) * **embed:** open embedded player's links in new tab ([4aa73d7](https://code.castopod.org/adaures/castopod/commit/4aa73d71e3b8c0a6c3f75f4d1d45c4d693aba64c)) * **episode-form:** show warning to set `memory_limit`, `upload_max_filesize` & `post_max_size` ([3b3c218](https://code.castopod.org/adaures/castopod/commit/3b3c218b9c868e9f12c54d7670e69d84c9ee79c0)), closes [#5](https://code.castopod.org/adaures/castopod/issues/5) [#86](https://code.castopod.org/adaures/castopod/issues/86) * **episode-unpublish:** set consistent posts_counts' increments/decrements for actors and episodes ([8acdafd](https://code.castopod.org/adaures/castopod/commit/8acdafd26044e50a4d6ee451bf24ad66003c5bb3)), closes [#233](https://code.castopod.org/adaures/castopod/issues/233) * **episodeCount:** add missing brackets to French language file ([c1b4112](https://code.castopod.org/adaures/castopod/commit/c1b411265ad9b06e95a8b097ecf73445b88dcb45)) * **episode:** replace guid's empty string value to null ([441052a](https://code.castopod.org/adaures/castopod/commit/441052af8d99e6e317edefd1e58ad71799357088)) * **episodes-page:** handle defaultQuery being null when no podcast episodes ([15183b7](https://code.castopod.org/adaures/castopod/commit/15183b7eab57dac007bcdfa8c3651239de1ae05a)), closes [#100](https://code.castopod.org/adaures/castopod/issues/100) * **episodes-table:** set descriptions to be not null ([6774ec1](https://code.castopod.org/adaures/castopod/commit/6774ec10fa78527be6b7548ca1dc34ad0ada090c)) * **episodes:** add publication status + set publication date to null when none has been set ([d882981](https://code.castopod.org/adaures/castopod/commit/d882981b3a86c81921ce6b07d4cf61fc13983689)), closes [#70](https://code.castopod.org/adaures/castopod/issues/70) * escape characters for `min` in format_duration_symbol ([3b6722a](https://code.castopod.org/adaures/castopod/commit/3b6722a42b9e4330e5235d4ceed41c777159f4dc)) * escape generated feed tag values and remove new lines from public pages meta description ([6238a43](https://code.castopod.org/adaures/castopod/commit/6238a43863210afe8988ad7cf251e6bfc6c8557c)), closes [#57](https://code.castopod.org/adaures/castopod/issues/57) [#46](https://code.castopod.org/adaures/castopod/issues/46) * expire default query cache upon scheduled episode publication ([b72e7c8](https://code.castopod.org/adaures/castopod/commit/b72e7c8691c887e41107baea0a4d50a39eaf8c8b)), closes [#81](https://code.castopod.org/adaures/castopod/issues/81) * explicitly cast seconds to int in iso8601_duration helper function ([779653f](https://code.castopod.org/adaures/castopod/commit/779653f75b140942f731cbb238bc0667cc461307)) * **fediverse:** set default castopod avatar url when actor avatar is not present ([460f52f](https://code.castopod.org/adaures/castopod/commit/460f52f70e493d619c28632db6c698e88f0ebb5f)) * **fediverse:** set model instances as non shared to prevent overlapping ([91128fa](https://code.castopod.org/adaures/castopod/commit/91128fad7a68e1f4e5acacba90b6899288699e61)) * fix layout bugs in admin and update translation files ([a834171](https://code.castopod.org/adaures/castopod/commit/a83417180cf61cdfadc5509b0aaa2fdb66592be3)), closes [#40](https://code.castopod.org/adaures/castopod/issues/40) * **follow:** add missing helpers to Actor controller ([ee53a73](https://code.castopod.org/adaures/castopod/commit/ee53a732dc12ebbf5706e14969749a12cfd9d559)) * **get_browser_language:** return defaultLocale if browser doesn't send user preferred language ([9cc2996](https://code.castopod.org/adaures/castopod/commit/9cc299626181048b85b629bbe7f5806a1f5d21ff)) * handle HEAD requests on podcast_feed route ([74b2640](https://code.castopod.org/adaures/castopod/commit/74b2640f2a25c4cd6fd8835fc492c2a6893d4950)), closes [#79](https://code.castopod.org/adaures/castopod/issues/79) * **home:** remove hardcoded prefix in getAllPodcasts query ([92d5cc5](https://code.castopod.org/adaures/castopod/commit/92d5cc50a3e533875cd894dccc417918102d4b7f)) * **housekeeping:** replace the use of GLOB_BRACE with looping over file extensions ([42d92d0](https://code.castopod.org/adaures/castopod/commit/42d92d0c8dfe0c567c28f5bfdda129890fa4c2ec)), closes [#154](https://code.castopod.org/adaures/castopod/issues/154) * **housekeeping:** set default sizes value + ignore illegal IFD size error to proceed with script ([f21ca57](https://code.castopod.org/adaures/castopod/commit/f21ca57603cfa503699b7e09a155e18d876d65fe)) * **housekeeping:** use EpisodeModel's builder to reset comments count ([65e9c0b](https://code.castopod.org/adaures/castopod/commit/65e9c0b05ea4992884149cb4a4b071bf31a20a1a)) * **htaccess:** add ? after index.php in RewriteRule ([d9d139e](https://code.castopod.org/adaures/castopod/commit/d9d139eefa03c28d1a064b3b32c9036193497e57)), closes [#152](https://code.castopod.org/adaures/castopod/issues/152) * **http-signature:** update SIGNATURE_PATTERN allowing signature keys to be sent in any order ([b7f285e](https://code.castopod.org/adaures/castopod/commit/b7f285e4e24247fedb94f030356fa6f291f525cc)) * **images:** set default mimetype if none is specified when getting size info ([6e4acc6](https://code.castopod.org/adaures/castopod/commit/6e4acc64ad256178cee7905402b48bafcd49f84c)) * **import-with-escaped-characters:** remove \CodeIgniter\HTTP\URI in download_file, closes [#103](https://code.castopod.org/adaures/castopod/issues/103) ([35b5be0](https://code.castopod.org/adaures/castopod/commit/35b5be095ff54d27acec1610a846ec0cdbdf1d65)) * **import:** add extension when downloading file without + truncate slug if too long ([c5f18bb](https://code.castopod.org/adaures/castopod/commit/c5f18bb6dc08a758ff735454bbe9cfa45a68c09b)) * **import:** add validation for handle field to prevent Router.invalidParameterType error ([5bf7200](https://code.castopod.org/adaures/castopod/commit/5bf7200fb390f2447b29f24b495f24483cf7b205)), closes [#119](https://code.castopod.org/adaures/castopod/issues/119) * **import:** cast description's SimpleXMLElement to string ([02d17be](https://code.castopod.org/adaures/castopod/commit/02d17be4ffe229fc6657207d31eba0543b5f1a4c)) * **import:** remove query string from files url ([109c4aa](https://code.castopod.org/adaures/castopod/commit/109c4aa1afb72dd8b99c0302d74a7fef5a38638e)) * **import:** save media files during podcast import + set missing media fields ([a9989d8](https://code.castopod.org/adaures/castopod/commit/a9989d841a634f8cf6c04df25f40bb1e7d4fcdcc)) * **import:** set default episode type if not set ([d7250ab](https://code.castopod.org/adaures/castopod/commit/d7250ab03f9b032830c575ad58b51c8d60b7a49a)) * **import:** set episode and season numbers to null when not present in item tag ([3211398](https://code.castopod.org/adaures/castopod/commit/3211398c78b1b28b76a46427ee07874bbf84a85d)) * **import:** use tag when no is present ([20e607a](https://code.castopod.org/adaures/castopod/commit/20e607afb755bc75056041738fa7cbf6723d754c)) * include missing variables on public ui's episode page and remote_actions ([193b373](https://code.castopod.org/adaures/castopod/commit/193b373bc94a5270acae99b637aa84b6cb2dedfe)) * **input-component:** unset required attribute to prevent rendering it when false ([db9ac13](https://code.castopod.org/adaures/castopod/commit/db9ac13860bce58235a5da275910bea605a00626)) * **install:** add password validation when creating super admin ([5a2ca0c](https://code.castopod.org/adaures/castopod/commit/5a2ca0cc4ae85cc15960201c86f131cb822f714f)) * **install:** redirect manually to install wizard on first visit ([2ceaaca](https://code.castopod.org/adaures/castopod/commit/2ceaaca44f1b82fc64d961e2fb4f4aaeade7e736)) * **install:** redirect to host_url install route on instanceConfig validation error ([99250b1](https://code.castopod.org/adaures/castopod/commit/99250b1868657c249a447399c7ebc69e00d43d1a)) * **install:** redirect to input baseUrl after instance config ([2426af7](https://code.castopod.org/adaures/castopod/commit/2426af7de8c9d426aaf534ff17b67f71c2e9f374)), closes [#53](https://code.castopod.org/adaures/castopod/issues/53) * **install:** set message block on forms to show error messages ([3a0a20d](https://code.castopod.org/adaures/castopod/commit/3a0a20d59cdae7f166325efb750eaa6e9800ba6e)), closes [#157](https://code.castopod.org/adaures/castopod/issues/157) * **interact-as:** set actor_id instead of podcast id upon login event ([5dfade7](https://code.castopod.org/adaures/castopod/commit/5dfade7cf37f339c56d2e577c679b88a1b1d9336)), closes [#104](https://code.castopod.org/adaures/castopod/issues/104) * **json-ld:** add missing properties to PodcastSeries object ([e97266c](https://code.castopod.org/adaures/castopod/commit/e97266c5d4883a10f68b3685ecc0d1942f54d658)) * keep subtitle line breaks when parsing srt file to json ([cfb3da6](https://code.castopod.org/adaures/castopod/commit/cfb3da6592f2de23cb1a7ac420f19fc77fa338aa)) * **layouts:** replace holy-grail layout with tailwind config + widen public podcast layout ([be5a287](https://code.castopod.org/adaures/castopod/commit/be5a28787fdb180b64d9bf570120eff7072ab9aa)) * **map:** update episode markers query to discard unpublished episodes ([b3caac4](https://code.castopod.org/adaures/castopod/commit/b3caac45b12a23e4289d00133d2ad7915d084c44)) * **markdown-editor:** remove unnecessary buttons for podcast and episode editors + add extensions ([9c4f60e](https://code.castopod.org/adaures/castopod/commit/9c4f60e00bcbd4f784f12d2a6fed357ad402ee2e)) * **md-editor:** build new markdown editor with lit + github/markdown-toolbar-element ([9ec1cb9](https://code.castopod.org/adaures/castopod/commit/9ec1cb93da6f41124c48b8cf14ee6942e865bede)), closes [#93](https://code.castopod.org/adaures/castopod/issues/93) [#94](https://code.castopod.org/adaures/castopod/issues/94) [#120](https://code.castopod.org/adaures/castopod/issues/120) * **migrations:** ignore invalid utf8 chars for media files metadata + update transcript parser ([45e8f99](https://code.castopod.org/adaures/castopod/commit/45e8f99e753cc02ec105e6f4d7fe026a205724f8)) * minor corrections ([13be386](https://code.castopod.org/adaures/castopod/commit/13be386842e94d9def1f7de4720931d8f6935171)) * move analytics to helper ([d311917](https://code.castopod.org/adaures/castopod/commit/d31191732e41aa106234b5ebe6e54ee02f0ce603)) * move html escaping on credits page ([fbffdbd](https://code.castopod.org/adaures/castopod/commit/fbffdbde78544c83138ee6234c62d43056f407b6)) * **multiselect:** add missing class names in choices options for purge to work properly ([719538d](https://code.castopod.org/adaures/castopod/commit/719538d0ccb28af3c3c5e1a4b6468d4b772fe819)) * **notifications:** add trigger after activities update + update insert trigger ([e5d16e8](https://code.castopod.org/adaures/castopod/commit/e5d16e87119021fa5a43470d67ddfe5128e57f74)) * **notifications:** notify actors after activities insert / update using model callback methods ([e08555a](https://code.castopod.org/adaures/castopod/commit/e08555a4e9a6c15eeba18273c63403f82eddae35)) * **open-graph:** replace non existant episode description to podcast description in podcast page ([b02584e](https://code.castopod.org/adaures/castopod/commit/b02584ee609af1ad1b5680cc28208d113eb0410b)) * overwrite common lang function to escape returned string ([4c490c1](https://code.castopod.org/adaures/castopod/commit/4c490c15bb6642ad0b2aaddf08d8af25de99b4b0)), closes [#196](https://code.castopod.org/adaures/castopod/issues/196) [#198](https://code.castopod.org/adaures/castopod/issues/198) * overwrite getActorById to return app's Actor entity ([f2bc2f7](https://code.castopod.org/adaures/castopod/commit/f2bc2f7e01aa166faa627df6fe4d5ed4887c16e5)) * **package.json:** update destination of postcss generation scripts ([21413f8](https://code.castopod.org/adaures/castopod/commit/21413f8af3b8a0ac01d8c6f15bcd7a63e524e964)) * **pages:** add locale to page cache ([8f999ce](https://code.castopod.org/adaures/castopod/commit/8f999ce2f7ee1416c30cf58c84f67b3d11b3f142)) * **partner:** set correct image URL ([61554be](https://code.castopod.org/adaures/castopod/commit/61554be12a64d59ab99fab810b1b05632b408f3a)) * pass timezone to relative time component to show the localized time in the UI ([b9db936](https://code.castopod.org/adaures/castopod/commit/b9db936461d4cb914958bb3256bb910bbd7ba815)) * **persons:** prevent overflow of persons list by adding horizontal scroll ([9e8995d](https://code.castopod.org/adaures/castopod/commit/9e8995dc6e039032cc65f87895cf770f99e8b244)) * **persons:** set person picture as optional for better ux ([7fdea63](https://code.castopod.org/adaures/castopod/commit/7fdea63de7e572810082c84fff3013af580df58b)), closes [#125](https://code.castopod.org/adaures/castopod/issues/125) * **platforms:** display platform link only when visible is toggled on ([6e503c8](https://code.castopod.org/adaures/castopod/commit/6e503c8d6182987e48892370623183f871bbd1c1)), closes [#39](https://code.castopod.org/adaures/castopod/issues/39) * **player-styling:** revert vite to 2.8 to reference the player css ([e07d3af](https://code.castopod.org/adaures/castopod/commit/e07d3afea9af85b8361227e000fb64b502781668)) * **podcast-activity:** check if transcript and chapters are set before including them in audio ([5855a25](https://code.castopod.org/adaures/castopod/commit/5855a250936f91641efef77650890a18d8e9917f)) * **podcast-import:** move guid attribute declaration for Episode entity to include slug data ([5d02ae3](https://code.castopod.org/adaures/castopod/commit/5d02ae39908a9d743627135b372bf981134c4328)) * **podcast:** use markdown description value for editor + set prose class to about description ([f304d97](https://code.castopod.org/adaures/castopod/commit/f304d97b14e0ef383509cb3bba50beb55bf701ba)), closes [#156](https://code.castopod.org/adaures/castopod/issues/156) * prefill description footer input when creating a new episode ([9ea5ca3](https://code.castopod.org/adaures/castopod/commit/9ea5ca31697c70d176294f8aea37bd57d471fcf7)) * **premium-podcasts:** display unlock button in embed when premium episode ([ca109ba](https://code.castopod.org/adaures/castopod/commit/ca109ba3a8a08e661fd2484454b1983c3418f15d)) * **premium-podcasts:** remove cache in unlock form + redirect to podcast if podcast is not premium ([242352c](https://code.castopod.org/adaures/castopod/commit/242352c4d9cd936de14e8e8a5d78ebf1287b1f95)) * **premium-podcasts:** return different cached page when podcast is unlocked ([b1303c5](https://code.castopod.org/adaures/castopod/commit/b1303c525517498b0edfb9885ff36e08c72628b5)) * **pwa:** add scope to webmanifests to allow installing an app per podcast ([74c683e](https://code.castopod.org/adaures/castopod/commit/74c683eb44398a84443ec17903c3e002bb5ea9b9)) * **pwa:** set app display as standalone in the webmanifests ([7aa37d2](https://code.castopod.org/adaures/castopod/commit/7aa37d24ac13a1ee160c01a56b43621d7efcfbbc)) * re-order graph values ([35f633b](https://code.castopod.org/adaures/castopod/commit/35f633b4c71c087d1ddc9bba9e9bbe18de09204f)) * redirect to non cached views when authenticated in public views ([482b47b](https://code.castopod.org/adaures/castopod/commit/482b47ba6bdab7f27fc5704a559567228e07cd14)) * **release:** add missing version number to castopod-host package ([8f3e9d9](https://code.castopod.org/adaures/castopod/commit/8f3e9d90c14545d3f84d4469b26a53db4554b4dc)) * remove cache from remote follow form to display error messages ([90e4443](https://code.castopod.org/adaures/castopod/commit/90e44437bdf37d8024ef609b2f7336dbdfc3b974)) * remove defer from js script declaration as it is a module ([18ae557](https://code.castopod.org/adaures/castopod/commit/18ae557e97f1cef775cd1e75fb1fedee7f1c0cc9)) * remove fixed size from podcast sidebar + rearrange account info + space out import radio inputs ([776eec6](https://code.castopod.org/adaures/castopod/commit/776eec6f0d533d6c92ebec16f7a9dbfcde1f41f4)) * remove heavy image cover data from audio file metadata ([f74403b](https://code.castopod.org/adaures/castopod/commit/f74403bd7a5089b760603abe36264e7615be0e78)) * remove required for other_categories field and add podcast_id to latest podcasts query ([5417be0](https://code.castopod.org/adaures/castopod/commit/5417be0049288489a19c7b575aa77bd1e2bc0243)) * remove required property to persons picture ([c546be3](https://code.castopod.org/adaures/castopod/commit/c546be385b243014243ae93356006cd126d2f00d)), closes [#125](https://code.castopod.org/adaures/castopod/issues/125) * remove value escaping for form inputs and textareas ([bc6dea2](https://code.castopod.org/adaures/castopod/commit/bc6dea2f8ad1cf0aee0eaa93151332fbac7fb771)) * rename field status to task_status to get scheduled activities ([4ff82a5](https://code.castopod.org/adaures/castopod/commit/4ff82a5f0a38dbbc9e272fca7df70ea5a190e334)) * rename issue_templates labels ([9f00305](https://code.castopod.org/adaures/castopod/commit/9f00305844e5a168e89d727fe29892b4ad5e48d6)) * rename MyAccount controller file ([e109df3](https://code.castopod.org/adaures/castopod/commit/e109df3004a3a98d72de39532e062fff9917f50f)), closes [#60](https://code.castopod.org/adaures/castopod/issues/60) * rename podcast name to podcast handle to clarify field usage ([9dd4c77](https://code.castopod.org/adaures/castopod/commit/9dd4c7741eb1b7cb5fc214ff674697f3aa986df0)), closes [#126](https://code.castopod.org/adaures/castopod/issues/126) * reorder fields as composite primary keys for analytics tables ([9660aa9](https://code.castopod.org/adaures/castopod/commit/9660aa97c8ffd4fe61f3a388d52b9ac5dd8e1d63)) * replace deletedField with published_at for episodes ([14d7d07](https://code.castopod.org/adaures/castopod/commit/14d7d078225cdc8980759273a5dc4163d9f84b06)) * replace getWebEnclosureUrl with getEnclosureWebUrl ([8122cea](https://code.castopod.org/adaures/castopod/commit/8122ceaf8a70050f14b3078f28b024e7d7cdb9ac)) * replace hardcoded style links with vite service + set default value for remote transcript url ([3f2e056](https://code.castopod.org/adaures/castopod/commit/3f2e05608e43d47bbb518a9acfaf56ec3eefafb4)), closes [#149](https://code.castopod.org/adaures/castopod/issues/149) [#150](https://code.castopod.org/adaures/castopod/issues/150) * replace website key for webpages in breadcrumb translate file ([50e32ff](https://code.castopod.org/adaures/castopod/commit/50e32ff75636c1d4c5d945a267e884cb26ad7191)) * restore default podcast icon on public website ([342778b](https://code.castopod.org/adaures/castopod/commit/342778bac3c684328d72633961df1a2ebdc1330e)) * revert to beta.1's codeigniter4 version ([e831411](https://code.castopod.org/adaures/castopod/commit/e83141127080ccde44987195db46ba97fd6cc2ca)) * rewrite regenerate image function to use saveSizes method from Image entity ([3889912](https://code.castopod.org/adaures/castopod/commit/38899124ec27e94a8c798bc2db528f9f785eec20)) * **router:** check if Accept header is set before getting value ([10a2ae0](https://code.castopod.org/adaures/castopod/commit/10a2ae02484672d6a0fbc6e7b943519c5ec16cb6)), closes [#228](https://code.castopod.org/adaures/castopod/issues/228) * **router:** trim URI slash to match same routes for URIs with and without trailing slash ([9e9375f](https://code.castopod.org/adaures/castopod/commit/9e9375f9a2cd6102f827b36ec521f4c86a557c00)) * **rss-import:** add Castopod user-agent, handle redirects for downloaded files, add Content namespace ([214243b](https://code.castopod.org/adaures/castopod/commit/214243b3fec4937e45ef1ceaba1149004cdf3b44)) * **rss:** cast number type values to string in rss_helper ([7180ae9](https://code.castopod.org/adaures/castopod/commit/7180ae9ec700930b69c04ed91f8eceea16ad77ce)), closes [#148](https://code.castopod.org/adaures/castopod/issues/148) * **rss:** do not escape podcast and episode titles in the xml ([0dd3b7e](https://code.castopod.org/adaures/castopod/commit/0dd3b7e0bf00d5a9eb80c93cba1efcada59ec3c1)), closes [#138](https://code.castopod.org/adaures/castopod/issues/138) [#71](https://code.castopod.org/adaures/castopod/issues/71) * **rss:** remove escaping for publisher and owner name ([6fc6347](https://code.castopod.org/adaures/castopod/commit/6fc6347846c126618cb7ff50164181650308d0c0)) * **rss:** round episode durations and soundbites ([c9fb987](https://code.castopod.org/adaures/castopod/commit/c9fb987fcfbe17069ec68fdbc823777079ce574b)), closes [#214](https://code.castopod.org/adaures/castopod/issues/214) * **rss:** set ❬itunes:author❭ tag to owner_name if publisher not specified ([2271c14](https://code.castopod.org/adaures/castopod/commit/2271c1445b1ded12bc53b5d23b5e59d12b17c71a)), closes [#96](https://code.castopod.org/adaures/castopod/issues/96) * **rss:** use originalPath instead of originalMediaPath in Image library ([b4012b7](https://code.castopod.org/adaures/castopod/commit/b4012b7d2ed6b34b69ad767570dd33f0dc7db920)) * save transcript and chapters files to podcasts folder ([63f49c7](https://code.castopod.org/adaures/castopod/commit/63f49c719f672b615c5a8893d3868dffcd332e47)) * **search-episodes:** add fallback sql query using LIKE for search query with less than 4 characters ([e66bf44](https://code.castopod.org/adaures/castopod/commit/e66bf44341175bc5a10fbf7dfa00b351e76136c2)), closes [#236](https://code.castopod.org/adaures/castopod/issues/236) * **security:** add csrf filter + prevent xss attacks by escaping user input ([cd2e1e1](https://code.castopod.org/adaures/castopod/commit/cd2e1e1dc37c53d32d00971c451c4800b8fd6107)) * set cache expiration to next note publish to show note on publication date ([0a66de3](https://code.castopod.org/adaures/castopod/commit/0a66de3e6c17d4ac94ee8e13bd00ceaf64b1303e)) * set episode description footer to null when empty value ([3a7d97d](https://code.castopod.org/adaures/castopod/commit/3a7d97d660046d80698611311ff3708110d2af82)) * set episode duration translation to hardcoded english ([c39efc9](https://code.castopod.org/adaures/castopod/commit/c39efc9489180662edcebd142d4476c0617ea97f)), closes [#64](https://code.castopod.org/adaures/castopod/issues/64) * set episode guid upon episode creation ([ad8b153](https://code.castopod.org/adaures/castopod/commit/ad8b153f2a3b1a3b1751bf63785c4950e1516e6b)), closes [#48](https://code.castopod.org/adaures/castopod/issues/48) * set episode numbers during import + remove all custom form_helpers + minor ui issues ([99a3b8d](https://code.castopod.org/adaures/castopod/commit/99a3b8d33e00482da50dd62bdaa9215a351a56e4)) * set interact_as_actor for user upon password reset ([ad8f5f5](https://code.castopod.org/adaures/castopod/commit/ad8f5f5a0fac7b0b9cc10a0b86200f014aca7553)), closes [#178](https://code.castopod.org/adaures/castopod/issues/178) * set localized slug_field key as string in french language ([17fb29b](https://code.castopod.org/adaures/castopod/commit/17fb29b20993b7deee4e252e0e3a4a2459ee0d98)) * set location to null when getting empty string ([71b1b5f](https://code.castopod.org/adaures/castopod/commit/71b1b5f775af475b1dc78328330e277f565e41b6)) * set storage limit as disk_total_space instead of free space ([7512e2e](https://code.castopod.org/adaures/castopod/commit/7512e2ed1ff5656cd63a4fc2524296dbb8b4164a)) * **settings:** add .jpg extension to site-icon file input to display all jpeg images ([f611a16](https://code.castopod.org/adaures/castopod/commit/f611a16cd0c1a389e1c5a287eaec9d2a927a4bb6)) * **socialinteract:** move social interact uri into uri attribute + update social data upon import ([12b2200](https://code.castopod.org/adaures/castopod/commit/12b22008a237185cb736fc29352fab22421dad16)) * sort episodes by published_at with unpublished episodes at the begining ([1686f84](https://code.castopod.org/adaures/castopod/commit/1686f840d16f2bd3d71d7f222a59b8e6a838fd6e)), closes [#249](https://code.castopod.org/adaures/castopod/issues/249) * sort episodic podcasts by season ([d7b6794](https://code.castopod.org/adaures/castopod/commit/d7b6794f68f9a01fd606a407c6eb4c12d15dee74)) * **themes:** update themes stylesheet route and remove css extension ([e4e7e00](https://code.castopod.org/adaures/castopod/commit/e4e7e0005e931967dd6162588f1c5913dbf4603e)) * **types:** update fake seeders types + fix bugs ([76a4bf3](https://code.castopod.org/adaures/castopod/commit/76a4bf344160df679db29e236e7df7822970fb60)) * **ui:** remove empty tooltip when hovering on sponsor button ([40aa661](https://code.castopod.org/adaures/castopod/commit/40aa661289e1d1517fffcea5d257183bc9c458e4)) * unpublish episode before deleting it + add validation step before deletion ([f75bd76](https://code.castopod.org/adaures/castopod/commit/f75bd76458eeb01a2d37912695e33f77d03b7a69)), closes [#112](https://code.castopod.org/adaures/castopod/issues/112) [#55](https://code.castopod.org/adaures/castopod/issues/55) * update .htaccess for shared hosting config ([2379826](https://code.castopod.org/adaures/castopod/commit/2379826352e2f4b5060910bf9f29268610102f2e)) * update broken contributor dropdown fields ([e5b7515](https://code.castopod.org/adaures/castopod/commit/e5b75150234bd7f19e01def93425d3bda7379dd3)) * update condition in AnalyticsTrait ([fbc0967](https://code.castopod.org/adaures/castopod/commit/fbc0967caa81630d514ddb1b93b0834ebb4d913b)) * update condition in home controller to redirect to install page ([33f1b91](https://code.castopod.org/adaures/castopod/commit/33f1b91d55dd0652c979d50fc85879dbf88a4a42)) * update conditions when checking for empty max_episodes and season_number ([fbad0b5](https://code.castopod.org/adaures/castopod/commit/fbad0b59f68c65eba2fdcd5a8d3b312b622e9a45)) * update form_textarea to prevent escaping value ([78548b5](https://code.castopod.org/adaures/castopod/commit/78548b5cd75ea7d6688d1945ff5449ea4f6bec68)) * update iso-369 language table seeder ([0c90db4](https://code.castopod.org/adaures/castopod/commit/0c90db44c40de5af5b0b32b54489bda9424d9ef6)) * update ivoox podcasting icon ([f2b69a4](https://code.castopod.org/adaures/castopod/commit/f2b69a47339c887f57883ec612f3d200e512ac1c)) * update MarkdownEditor component + restyle Button and other components ([b05d177](https://code.castopod.org/adaures/castopod/commit/b05d177f1b7f44fef043ac5eb41f07133a2cf52d)) * update purgecss content path for php helper files ([eb70bb4](https://code.castopod.org/adaures/castopod/commit/eb70bb4f7078ff347aeb8f5dcc7896311d289466)), closes [#59](https://code.castopod.org/adaures/castopod/issues/59) * update translations for settings' tasks to include what they should be used for ([06b1a8b](https://code.castopod.org/adaures/castopod/commit/06b1a8b29b6ce5d81c5570d250bdac4e0c9ee5ca)) * use slash instead of backslash to call layout ([a80adb2](https://code.castopod.org/adaures/castopod/commit/a80adb22958fc0a38374cbce2d950a0042e699eb)) * use UTC_TIMESTAMP() to get current utc date instead of NOW() in sql queries ([4e22a0d](https://code.castopod.org/adaures/castopod/commit/4e22a0d5e4b60941d41071f059aac80cbaf38fbf)) * **users:** remove required roles input when editing user + prevent owner's roles from being edited ([1c8af75](https://code.castopod.org/adaures/castopod/commit/1c8af7550ba27d8c8473ae96acd21ad7731fd863)), closes [#239](https://code.castopod.org/adaures/castopod/issues/239) * **ux:** allow for empty message upon episode publication and warn user on submit ([33d01b8](https://code.castopod.org/adaures/castopod/commit/33d01b8d4fd6ebf24e9f011aa705c456c846956c)), closes [#129](https://code.castopod.org/adaures/castopod/issues/129) * **ux:** have podcast dashboard card link to podcast dashboard if only one podcast in instance ([7dabee5](https://code.castopod.org/adaures/castopod/commit/7dabee58a187abe92358d962da506a836e29cda3)) * **ux:** redirect user to install page on database error in home page ([9017e30](https://code.castopod.org/adaures/castopod/commit/9017e30bf41bed8c2be65091bbc5fb1e63aef87a)) * validate slug length when submitting episode form + clean permalink edit prefix ([b07ac09](https://code.castopod.org/adaures/castopod/commit/b07ac093b2cae646f9a897bc9dfeeaef6eda6561)) * **video-clips:** check if created video exists before recreating it and failing ([dff1208](https://code.castopod.org/adaures/castopod/commit/dff12087251b2b89e195604202094b5ddd9a0936)) * **video-clips:** clear video clip cache after process has finished ([3ae6232](https://code.castopod.org/adaures/castopod/commit/3ae62325856f6ff331a5d9ed901b9fa097ca7055)) * **video-clips:** create unique temporary files for resources to be deleted after generation ([7f7c878](https://code.castopod.org/adaures/castopod/commit/7f7c878cb6ecf7b4a967b2af87da82bc6593081e)) * **video-clips:** set audio codec to aac, fixing audio issue on twitter ([3c22c68](https://code.castopod.org/adaures/castopod/commit/3c22c68ee81f77bd7fcf7e2739ee6af016407843)) * **video-clips:** set longer podcast and episode lengths for squared format ([c030113](https://code.castopod.org/adaures/castopod/commit/c0301134c2048dc29eb2b995e4d5c22c49444100)) * **video-clips:** tweak portrait parameters to have subtitles display without overflowing ([2385b1a](https://code.castopod.org/adaures/castopod/commit/2385b1a2926d1344569836e18cb30adb4c604664)) * **video-clips:** update condition to check if ffmpeg is installed ([b57f0b6](https://code.castopod.org/adaures/castopod/commit/b57f0b6eb65dccf22cb4d55f93d18ca36857d7fc)), closes [#163](https://code.castopod.org/adaures/castopod/issues/163) * **xml-editor:** escape xml editor's content + restyle form sections to prevent overflowing ([588590b](https://code.castopod.org/adaures/castopod/commit/588590bd2c0346e2465ff8f1930580d76a3bf068)) * **xml-editor:** prettify xml even without root node ([ca55c24](https://code.castopod.org/adaures/castopod/commit/ca55c248d0562a8529071c1f10be12f40ef50dda)) ### Features * **activitypub:** add Podcast actor and PodcastEpisode object with comments ([9e1e5d2](https://code.castopod.org/adaures/castopod/commit/9e1e5d2e862d6a3345d11ca7f96b955c76bfa013)) * add about page in admin with instance info + database update button ([d0836f3](https://code.castopod.org/adaures/castopod/commit/d0836f3ee360a836f815c59ea755f288501dc517)) * add alternate rss feed link tag to podcast page head ([a973c09](https://code.castopod.org/adaures/castopod/commit/a973c097d54a3d0186c4079b9d4d3e81aae38505)), closes [#35](https://code.castopod.org/adaures/castopod/issues/35) * add analytics and unknown useragents ([ec92e65](https://code.castopod.org/adaures/castopod/commit/ec92e65aa42e09b1df04600b52a0c679dfc494bb)) * add audio-clipper toolbar + add video-clip-previewer ([0255753](https://code.castopod.org/adaures/castopod/commit/02557539e6eb48fc23ee2ee3b0c75aee3310965b)) * add audio-clipper webcomponent (wip) ([21d4251](https://code.castopod.org/adaures/castopod/commit/21d4251b9bcd5acb0f8a1761bc4edc34a3dbc228)) * add autofocus to input field "Email or username" on login page ([19caed4](https://code.castopod.org/adaures/castopod/commit/19caed4bce0daab9ccf6ab9645f44b60eb87de88)) * add basic stats on podcast about page ([1670558](https://code.castopod.org/adaures/castopod/commit/1670558473dba47219d470ff21d6224db6ab42ba)) * add breadcrumb in admin area ([7fb1de2](https://code.castopod.org/adaures/castopod/commit/7fb1de2cf3c97c4cd7afe3bd71bbe66041786ecd)), closes [#17](https://code.castopod.org/adaures/castopod/issues/17) * add cache to ActivityPub sql queries + cache activity and note pages ([2d297f4](https://code.castopod.org/adaures/castopod/commit/2d297f45b3d7ef6e8711875a0b9b908e878115fa)) * add CDN url ([972bcbf](https://code.castopod.org/adaures/castopod/commit/972bcbf65ee119b8641ca3c4e5c0e8cf9ca8dd4f)), closes [#37](https://code.castopod.org/adaures/castopod/issues/37) * add codemirror to display xml editor for custom rss field ([f15f262](https://code.castopod.org/adaures/castopod/commit/f15f26240cd5311fa9d07779f364b6639a501dec)) * add cumulative listening time charts ([588b4d2](https://code.castopod.org/adaures/castopod/commit/588b4d28da00bc12d02126e23181690f54d81716)) * add default icons to Alert component ([0d98001](https://code.castopod.org/adaures/castopod/commit/0d9800123b135e4fa1a2acd14a5e039c12174333)) * add DropdownMenu component + remove global audio player in admin ([abb7fba](https://code.castopod.org/adaures/castopod/commit/abb7fbac276d77b7d31a0aeba75d464f3ba3ad46)) * add episode_numbering() component helper to display episode and season numbers ([3f4a6bd](https://code.castopod.org/adaures/castopod/commit/3f4a6bd0b9f870f16107a41b102b6bf734868198)) * add french translation ([196920d](https://code.castopod.org/adaures/castopod/commit/196920d62f1810b4c35f800d17d7f93627319091)) * add heading component + update ecs rules to fix views ([23bdc6f](https://code.castopod.org/adaures/castopod/commit/23bdc6f8e36b7e8dfbe32755a54dea59ad913432)) * add housekeeping task to run after migrations ([89dee41](https://code.castopod.org/adaures/castopod/commit/89dee41d583e57251ea9315402a757f03571d7ad)) * add install wizard form to bootstrap database and create the first superadmin user ([cba871c](https://code.castopod.org/adaures/castopod/commit/cba871c5df9f7120c44d9952456ebbd0d220669e)), closes [#2](https://code.castopod.org/adaures/castopod/issues/2) * add instructions on production error page to ease Castopod debugging process ([9eab54e](https://code.castopod.org/adaures/castopod/commit/9eab54e0853ccb8300d9f9b743cd84aefbf06549)), closes [#224](https://code.castopod.org/adaures/castopod/issues/224) * add ISO 3166 country codes ([97cd94b](https://code.castopod.org/adaures/castopod/commit/97cd94b47494b66faf43fbbe0748872da80020a4)) * add js audio player on podcast, admin and embeddable player pages + fix admon episodes ux ([0e14eb4](https://code.castopod.org/adaures/castopod/commit/0e14eb4d3f526b0fd256a6144f3fbfc3fe52a357)), closes [#131](https://code.castopod.org/adaures/castopod/issues/131) * add label to sponsor button on podcast page ([c29c018](https://code.castopod.org/adaures/castopod/commit/c29c018c7a543fc9398b5d7d11f086123e2b33f2)), closes [#162](https://code.castopod.org/adaures/castopod/issues/162) * add legalNoticeURL to app config for setting an external url to legal notice ([711843a](https://code.castopod.org/adaures/castopod/commit/711843a0c81e1e2ec7a015431786df4ef32d5092)) * add lock podcast according to the Podcastindex podcast-namespace to prevent unauthozized import ([72b3012](https://code.castopod.org/adaures/castopod/commit/72b301272e0b70ded3e2b237391909e3f152ad0b)) * add map analytics, add episodes analytics, clean analytics page layout, translate countries ([07eae83](https://code.castopod.org/adaures/castopod/commit/07eae83a00d860e149359fae67d549488403d88b)) * add media entity and link documents, images and audio files to it ([6ecf286](https://code.castopod.org/adaures/castopod/commit/6ecf2866cfcde31a0840f15c3340808ce14b44cf)) * add notifications inbox for actors ([999999e](https://code.castopod.org/adaures/castopod/commit/999999e3efab7b1aad7568e4fd114dc7bac04f38)), closes [#215](https://code.castopod.org/adaures/castopod/issues/215) * add Noto Sans Mono font to use for durations + button to access new video clip form in list ([7609bb6](https://code.castopod.org/adaures/castopod/commit/7609bb60330539aa91bfdafbb35c2d585624218a)) * add npm for js dependencies + move src/ files to root folder ([cbb83a6](https://code.castopod.org/adaures/castopod/commit/cbb83a6f308ac9357e9fb0cca5edae9d3fee5b48)) * add Open Graph and Twitter meta tags ([af970b8](https://code.castopod.org/adaures/castopod/commit/af970b8bac949e4c63047e04aca1b7403a4e8deb)), closes [#41](https://code.castopod.org/adaures/castopod/issues/41) * add pages table to store custom instance pages (eg. legal-notice, cookie policy, etc.) ([9c224a8](https://code.castopod.org/adaures/castopod/commit/9c224a8ac6dd95f3c6c087a300fc8bac48e8090f)), closes [#24](https://code.castopod.org/adaures/castopod/issues/24) * add permanent delete feature for podcasts 🎉 ([dbb4030](https://code.castopod.org/adaures/castopod/commit/dbb4030da49f9ea1f61759fb7c66d71fc29ea4a1)), closes [#89](https://code.castopod.org/adaures/castopod/issues/89) * add platform models ([a333d29](https://code.castopod.org/adaures/castopod/commit/a333d291966229a909c0851fd8b890ed97c48ceb)) * add platforms form in podcast settings ([043f49c](https://code.castopod.org/adaures/castopod/commit/043f49c784bc007ca0fa756ca4ed2d3b08843ad9)) * add platforms tables ([ce59344](https://code.castopod.org/adaures/castopod/commit/ce5934419a516c9926dd3fd0ace3c11a95b60722)) * add podcast banner field for each podcast + refactor images configuration ([4a8147b](https://code.castopod.org/adaures/castopod/commit/4a8147bfbbd98d9badfc57a0f2a18bdd5812e802)) * add premium podcasts to manage subscriptions for premium episodes ([3234500](https://code.castopod.org/adaures/castopod/commit/3234500e2d967438ad140f65da801a543f43775d)), closes [#193](https://code.castopod.org/adaures/castopod/issues/193) * add publish feature for podcasts and set draft by default ([3d363f2](https://code.castopod.org/adaures/castopod/commit/3d363f2efe99836ac05c305a2fa683e342f06561)), closes [#128](https://code.castopod.org/adaures/castopod/issues/128) [#220](https://code.castopod.org/adaures/castopod/issues/220) * add remote_url alternative for transcript and chapters files ([3143c9a](https://code.castopod.org/adaures/castopod/commit/3143c9ad36e4cf1364205cf2be39c0c96f80fdd2)) * add replied to post or comment to reply element ([d0f9c60](https://code.castopod.org/adaures/castopod/commit/d0f9c6018f1af527099f3e26b5d824710fa11caf)) * add schema.org json-ld objects to podcasts, episodes, posts and comments pages ([902f959](https://code.castopod.org/adaures/castopod/commit/902f959b30a10839684f093eb86edebc5d826a0b)) * add task to housekeeping setting for resetting all instance counts ([9303e51](https://code.castopod.org/adaures/castopod/commit/9303e51bc50d730a8026f58984e83b840360ee88)) * add unique listeners analytics ([3a49258](https://code.castopod.org/adaures/castopod/commit/3a4925816f3268230640525ad7af507aab8eecb9)) * add update rss feed feature for podcasts to import their latest episodes ([5eb9dc1](https://code.castopod.org/adaures/castopod/commit/5eb9dc168eb9af04767829b76242c9120f55d46d)), closes [#183](https://code.castopod.org/adaures/castopod/issues/183) * add user permissions and basic groups to handle authorizations ([d58e518](https://code.castopod.org/adaures/castopod/commit/d58e51874a4722921b75b0049117015c2380406e)), closes [#3](https://code.castopod.org/adaures/castopod/issues/3) [#18](https://code.castopod.org/adaures/castopod/issues/18) * add WebSub module for pushing feed updates to open hubs ([10d3f73](https://code.castopod.org/adaures/castopod/commit/10d3f73786ba141e27a822b2585c4a244ee92c14)) * **admin:** add instance wide dashboard with storage and bandwidth usage ([b1a6c02](https://code.castopod.org/adaures/castopod/commit/b1a6c02e56fdc01a7ff69fa7e7dd8ea71380b7ba)), closes [#216](https://code.castopod.org/adaures/castopod/issues/216) * **admin:** add search form in podcast episodes list ([6be5d12](https://code.castopod.org/adaures/castopod/commit/6be5d12877342a7c56e25ea8dd15a975c6ce45ac)), closes [#26](https://code.castopod.org/adaures/castopod/issues/26) * **admin:** make header stick on scroll and show title + action buttons using css only ([d60498c](https://code.castopod.org/adaures/castopod/commit/d60498c1beb970a14eeb3bbe02d1b1d8116624b0)) * **admin:** update admin layout for better ux + update brand pine colors ([d86142e](https://code.castopod.org/adaures/castopod/commit/d86142ebe7cd7582835f180b79fbeaaaba703528)) * allow cross origin requests on episode comments ([e12f95a](https://code.castopod.org/adaures/castopod/commit/e12f95aca13c6d54489a9cfd99d4cd2490fe83ab)) * **analytics-gdpr:** update cached personal data to expire at midnight ([0188b67](https://code.castopod.org/adaures/castopod/commit/0188b67354a756f0c926edd7b46623ab5b20c12b)) * **analytics:** add 'other' group to pie charts in order to display more accurate data ([73acef9](https://code.castopod.org/adaures/castopod/commit/73acef933ff3485987afc5157de022910876fc12)) * **analytics:** add charts and data export ([78625c4](https://code.castopod.org/adaures/castopod/commit/78625c471b4f03a09bd42f72b82217e1f2d01cef)) * **analytics:** add current date and secret salt to analytics hash for improved privacy ([6f2e7c0](https://code.castopod.org/adaures/castopod/commit/6f2e7c009c24830d4f08633bfbde3b75f40bf215)) * **analytics:** add service name from rss user-agent ([7202b98](https://code.castopod.org/adaures/castopod/commit/7202b9867bd59aafa8c338a4230fb5e5c55b24c6)) * **analytics:** add weekday and hour bar charts ([8ab3132](https://code.castopod.org/adaures/castopod/commit/8ab313296bb4a254ab05e90b17d896039839b784)) * **api:** add rest api with podcasts read endpoints ([e64001d](https://code.castopod.org/adaures/castopod/commit/e64001d00604bcf587ec5e9a631282f212df450d)), closes [#210](https://code.castopod.org/adaures/castopod/issues/210) * apply colour theme to embed player ([9548337](https://code.castopod.org/adaures/castopod/commit/9548337a7c49879e8b58c2dfece46e3cfc9517eb)), closes [#201](https://code.castopod.org/adaures/castopod/issues/201) * **auth:** add auth.enable2FA config to enable two-factor authentication ([7213ed2](https://code.castopod.org/adaures/castopod/commit/7213ed290c977ce8723f6d92addadc03913576ee)) * build hashed static files to renew browser cache ([37c54d2](https://code.castopod.org/adaures/castopod/commit/37c54d247749bdf8f528babd4a78f24d48051063)), closes [#107](https://code.castopod.org/adaures/castopod/issues/107) * **cache:** add podcast and episode pages to cache + clear them after insert or update ([da0f047](https://code.castopod.org/adaures/castopod/commit/da0f0472819007e02e5da37399f2377772c618b9)) * **categories:** create model, entity, migrations and seeds ([f73b042](https://code.castopod.org/adaures/castopod/commit/f73b042cc091be82abdbbca8992080875d526972)) * **clips:** setup clip entities and model + save video clip to have it generated in the background ([2f6fdf9](https://code.castopod.org/adaures/castopod/commit/2f6fdf9091d52ca49709fc82621ba1c6dd0e817d)) * **comments:** add comments to episodes + update naming of status to post ([bb4752c](https://code.castopod.org/adaures/castopod/commit/bb4752c35e086664f5fd75fdc0d56546a1e356f6)) * **comments:** add like / undo like to comment + add comment page ([0c187ef](https://code.castopod.org/adaures/castopod/commit/0c187ef7a9278a60bcc6e5ee4d69d948b51e5c54)) * **components:** add custom view renderer with ComponentRenderer adapted from bonfire2 ([a95de8b](https://code.castopod.org/adaures/castopod/commit/a95de8bab010f6b01c598da72191abe97e473687)) * create optimized & resized images upon upload ([02e4441](https://code.castopod.org/adaures/castopod/commit/02e4441f98f27e9534e5b9b63279153d14632ccd)), closes [#6](https://code.castopod.org/adaures/castopod/issues/6) * **custom-rss:** add custom xml tag injection in rss feed for ❬channel❭ and ❬item❭ ([6ecdaad](https://code.castopod.org/adaures/castopod/commit/6ecdaad911d06b7f7a2b7d24710968c7eb9118f6)) * **datetime-picker:** set material_green theme to flatpickr ([3ce6541](https://code.castopod.org/adaures/castopod/commit/3ce6541003260677e722a916ad6bc83ef47c4371)) * **devcontainer:** add devcontainer settings for dev environment ([69e7266](https://code.castopod.org/adaures/castopod/commit/69e72667365247b63430dee88194e8f0d7c28edc)) * display castopod version in admin footer ([9f2574e](https://code.castopod.org/adaures/castopod/commit/9f2574e6fbb61dac4e1a4252dff30017685da5f0)), closes [#68](https://code.castopod.org/adaures/castopod/issues/68) * display legal disclaimer and warning on podcast import page ([2f07992](https://code.castopod.org/adaures/castopod/commit/2f07992e5508b34b91f194eebfac80c51e80e90a)), closes [#34](https://code.castopod.org/adaures/castopod/issues/34) * edit + delete podcast and episode ([ac5f0c7](https://code.castopod.org/adaures/castopod/commit/ac5f0c732806e955c01e05b7867801bc938c6bd5)) * **embeddable-player:** add embeddable player widget ([141788f](https://code.castopod.org/adaures/castopod/commit/141788fa089f9dedc8956c64ca515a4a4625f904)) * enhance admin ui with responsive design and ux improvements ([2d44b45](https://code.castopod.org/adaures/castopod/commit/2d44b457a02205d2e7da258d7029b8bc5da39533)), closes [#31](https://code.castopod.org/adaures/castopod/issues/31) [#9](https://code.castopod.org/adaures/castopod/issues/9) * enhance ui using javascript in admin area ([c0e66d5](https://code.castopod.org/adaures/castopod/commit/c0e66d5f7012026e145d106f4d6bd3ba792a1b77)) * **episode-unpublish:** remove episode comments upon unpublish ([78acd7f](https://code.castopod.org/adaures/castopod/commit/78acd7f5c057c82507d801c424040296dbaba586)) * **episode:** add form to allow editing episode's publication date to a past date ([d783d16](https://code.castopod.org/adaures/castopod/commit/d783d16eb73d3f896a3dea39a766b4e963e53abf)), closes [#97](https://code.castopod.org/adaures/castopod/issues/97) * **episodes:** add create form and view pages for episode ([f3b2c8b](https://code.castopod.org/adaures/castopod/commit/f3b2c8b84f3d93bef734e34dbe8ed729535e45e9)), closes [#1](https://code.castopod.org/adaures/castopod/issues/1) * **episodes:** add migrations, model and entity for episodes table ([0444821](https://code.castopod.org/adaures/castopod/commit/044482174ede555ce19a2d8c6f48771cc8e7d27b)) * **episodes:** replace all audio file URL parameters with base64 encoded data ([e1f65cd](https://code.castopod.org/adaures/castopod/commit/e1f65cd3b53353a30d4ab6eb5312393cf04a1676)) * **episodes:** replace soft delete with permanent delete ([eb9ff52](https://code.castopod.org/adaures/castopod/commit/eb9ff522c25af8ceb2ed08614b581757ee791d42)) * **episodes:** schedule episode with future publication_date by using cache expiration time ([4f1e773](https://code.castopod.org/adaures/castopod/commit/4f1e773c0f9e4c2597f6c1b0a4773dfb34b2f203)), closes [#47](https://code.castopod.org/adaures/castopod/issues/47) * **fediverse:** implement activitypub protocols + update user interface ([2f525c0](https://code.castopod.org/adaures/castopod/commit/2f525c0f6e44d320bff16e22c223481923ba683e)), closes [#69](https://code.castopod.org/adaures/castopod/issues/69) [#65](https://code.castopod.org/adaures/castopod/issues/65) [#85](https://code.castopod.org/adaures/castopod/issues/85) [#51](https://code.castopod.org/adaures/castopod/issues/51) [#91](https://code.castopod.org/adaures/castopod/issues/91) [#92](https://code.castopod.org/adaures/castopod/issues/92) [#88](https://code.castopod.org/adaures/castopod/issues/88) * **fonts:** replace Montserrat with Inter for better readablity ([bfa11d0](https://code.castopod.org/adaures/castopod/commit/bfa11d007d04b8ac714c8cf3b8050a6aaf177a26)) * **GDPR:** add GDPR.yml file to public/.well-known/ ([86bccc3](https://code.castopod.org/adaures/castopod/commit/86bccc3d5cc9562b89196f1766ac91cdc8ad786d)) * **gdpr:** add purpose for granting access to premium content ([47d6d81](https://code.castopod.org/adaures/castopod/commit/47d6d81b798ec3ed467e0f4339c98c8a6b80cecd)) * **home:** sort podcasts by recent activity + add dropdown menu to choose between sorting options ([7b89da6](https://code.castopod.org/adaures/castopod/commit/7b89da6106c150708782d39ed2742fe416c41e89)), closes [#164](https://code.castopod.org/adaures/castopod/issues/164) * **housekeeping:** add clear_cache option to flush redis or files cache ([99bfac0](https://code.castopod.org/adaures/castopod/commit/99bfac0b428a4bc6fe8bfd10a355dfd93f42ba5c)) * **i18n:** add 7 new languages + update german translations ([d021abb](https://code.castopod.org/adaures/castopod/commit/d021abb52f5525d93810e25df2b453c918d7bc8b)) * **i18n:** add german language as supported locale + create Language files from english source ([c220b31](https://code.castopod.org/adaures/castopod/commit/c220b310ed59cad188af044b1fed0c39efc7da5b)) * **i18n:** add Norwegian Nynorsk to supported locales ([ced61fc](https://code.castopod.org/adaures/castopod/commit/ced61fc2364f954c1f6e0208b572faf5741498a8)) * **i18n:** add Polish translation ([2d83b44](https://code.castopod.org/adaures/castopod/commit/2d83b44add9e4e00766a1f326377ed892f48ad73)) * **i18n:** add Spanish to supported locales ([e340b54](https://code.castopod.org/adaures/castopod/commit/e340b54a84d7dcdf9ba910fe7ff39c453fac0968)) * **i18n:** add support for German and Brazilian Portuguese languages ([c9b9fe4](https://code.castopod.org/adaures/castopod/commit/c9b9fe4ee893de9a1df7f8269c39d08a90d205d6)) * **i18n:** add support for Simplified Chinese (zh-Hans) and Catalan (ca) locales ([48d1443](https://code.castopod.org/adaures/castopod/commit/48d14434727c3310a391160c7af02c56b7e20425)) * **icons:** add default icons for podcasting, social and funding platforms + remove complex icons ([5bcdfeb](https://code.castopod.org/adaures/castopod/commit/5bcdfebe6489b5d6b90f3c828b014ec4e9a7e7e1)), closes [#166](https://code.castopod.org/adaures/castopod/issues/166) [#167](https://code.castopod.org/adaures/castopod/issues/167) [#170](https://code.castopod.org/adaures/castopod/issues/170) * **icons:** add podnews icon to podcasting platforms ([5f42355](https://code.castopod.org/adaures/castopod/commit/5f423557c2b78fd7c38c5e0caab6c6c80d21e36e)), closes [#190](https://code.castopod.org/adaures/castopod/issues/190) * import podcast from an rss feed url ([9a5d5a1](https://code.castopod.org/adaures/castopod/commit/9a5d5a15b4945eb319da9e999c4ca60a0a4f6d2d)), closes [#21](https://code.castopod.org/adaures/castopod/issues/21) * integrate stylized form components and update podcast edit page ([6536729](https://code.castopod.org/adaures/castopod/commit/653672954606a23796e8a7bda3c34fd6b92f84e0)) * make displayed publication time as relative time using @github/time-elements ([230e139](https://code.castopod.org/adaures/castopod/commit/230e139e43324b9ebef06ca8f6e13b3d9a7bdc70)) * make episode description more visible on episode pages ([90533be](https://code.castopod.org/adaures/castopod/commit/90533be0298249e5527870c01329fce5f94ec2dc)), closes [#171](https://code.castopod.org/adaures/castopod/issues/171) * **map:** display geolocated episodes on a map page ([4357cc2](https://code.castopod.org/adaures/castopod/commit/4357cc25ccc585ce398035c1c25d566b6a9df775)) * **media:** clean media api + create an entity per media type ([fafaa7e](https://code.castopod.org/adaures/castopod/commit/fafaa7e689b17f09a2b056081fa1f4fc53bf716b)) * **media:** save audio, images, transcripts and chapters to media for episode and persons ([58e2a00](https://code.castopod.org/adaures/castopod/commit/58e2a00a87fa7d5b188e13cc521d94f0cfddba50)) * **meta-tags:** add activitypub alternate links to podcast, episode, comment and post pages ([bd61752](https://code.castopod.org/adaures/castopod/commit/bd61752be2f574323b05d1d0aee0df55adf9a74e)) * minor corrections to some tables ([3bf9420](https://code.castopod.org/adaures/castopod/commit/3bf9420b5956a501b3b24405d243a71a928d6086)) * **monetization:** add Web Monetization support ([96a6026](https://code.castopod.org/adaures/castopod/commit/96a6026f1db452085360f5fe248de82a2ec06468)) * **nodeinfo2:** add .well-known route for nodeinfo2 containing metadata about the castopod instance ([88fddc8](https://code.castopod.org/adaures/castopod/commit/88fddc81d730978f2a4d8a671936b54041e3fe45)) * **partner:** add link and image in episode description ([ad07bb9](https://code.castopod.org/adaures/castopod/commit/ad07bb9330dc9493813368e969e1f3a3def44614)) * **person:** add podcastindex.org namespace person tag ([8acd011](https://code.castopod.org/adaures/castopod/commit/8acd011f13e99492ef4b44b327685bb006fe5f8f)) * **platforms:** add AntennaPod ([53e9cfd](https://code.castopod.org/adaures/castopod/commit/53e9cfd61c794b1539e9d4691d3c4e73c4b7aaa7)) * **platforms:** add Fediverse and some funding platforms, add link on logo ([afc3d50](https://code.castopod.org/adaures/castopod/commit/afc3d50289bb4173e0697d109ffe72f6814b93d1)) * **platforms:** add helloasso ([16cb993](https://code.castopod.org/adaures/castopod/commit/16cb993ee6e28987a840fc27a9c2c73794c67697)) * **platforms:** add missing newpodcastapps.com's platforms ([92dd370](https://code.castopod.org/adaures/castopod/commit/92dd370e2f9a464edd26cddcde96d0e16f91548d)) * **platforms:** add pod.link ([3d7a232](https://code.castopod.org/adaures/castopod/commit/3d7a2320ddd116e4a311605421126aff57243219)) * **platforms:** add Podcast Index ([ad52b1c](https://code.castopod.org/adaures/castopod/commit/ad52b1cc2b7d0bc844970214d205961a7196b4a9)) * **platforms:** add podfriend ([9fdc8d3](https://code.castopod.org/adaures/castopod/commit/9fdc8d32930234c7ffd2be6892be57febcef1086)) * **podcast-form:** add new_feed_url field to set an url when changing domain or host ([e7eec48](https://code.castopod.org/adaures/castopod/commit/e7eec48e7bc06a9aa907db01ed3e5b536e7dd8be)) * **podcast-form:** update routes and redirect to podcast page ([12ce905](https://code.castopod.org/adaures/castopod/commit/12ce905799002dc9c07e6de092342d30ba9fd7d8)) * **podcast:** create a podcast using form ([1202ba3](https://code.castopod.org/adaures/castopod/commit/1202ba3545f521097c60a6a2af95e70527cd1d34)) * **podcasting 2.0:** update podcast:social tag to adhere to latest spec ([a597cf4](https://code.castopod.org/adaures/castopod/commit/a597cf4ecfa6807a3413177d99c816056a7e7c45)) * prefill season and episode numbers + set episode number as mandatory for serial podcasts ([07d740b](https://code.castopod.org/adaures/castopod/commit/07d740b79f9283e389e723954f680f909ce5de4a)), closes [#134](https://code.castopod.org/adaures/castopod/issues/134) [#136](https://code.castopod.org/adaures/castopod/issues/136) * **public-ui:** adapt public podcast and episode pages to wireframes ([40a0535](https://code.castopod.org/adaures/castopod/commit/40a0535fc1bc12a24994b651f5e00b35995cbdda)), closes [#30](https://code.castopod.org/adaures/castopod/issues/30) [#13](https://code.castopod.org/adaures/castopod/issues/13) * **pwa:** add service-worker + webmanifest for each podcasts to have them install on devices ([fee2c1c](https://code.castopod.org/adaures/castopod/commit/fee2c1c0d0d03c4ff0a6a207b0a5e0c22bb7b13a)) * redesign public podcast and episode pages + remove any information clutter for better ux ([9321400](https://code.castopod.org/adaures/castopod/commit/932140077c671f0486a2cd08ceb6126c7ecde87f)) * replace form helper functions with components in admin template ([e64548b](https://code.castopod.org/adaures/castopod/commit/e64548b982ba47ff35f2272e2e30dd85eeba950b)) * replace slug field with interactive permalink component ([578022b](https://code.castopod.org/adaures/castopod/commit/578022b8c5163ffaf8db5870ed5ec9d5d9536477)) * restyle episode and person cards + add focus style to interactive elements for a11y ([a505a1d](https://code.castopod.org/adaures/castopod/commit/a505a1de56e8e3056379bd60d0595f432e294728)) * **rss:** add ˂podcast:guid˃ tag for channel ([1fab10e](https://code.castopod.org/adaures/castopod/commit/1fab10eb0d63bb7c3edf34ffe691e2aec2c2e43c)) * **rss:** add podcast-namespace tags for platforms + previousUrl tag ([dbba8dc](https://code.castopod.org/adaures/castopod/commit/dbba8dc58133967c778514268cbfed8098ed1dbc)), closes [#73](https://code.castopod.org/adaures/castopod/issues/73) [#75](https://code.castopod.org/adaures/castopod/issues/75) [#76](https://code.castopod.org/adaures/castopod/issues/76) [#80](https://code.castopod.org/adaures/castopod/issues/80) * **rss:** add podcast:comments tag to link to episode comments ([32e8c7c](https://code.castopod.org/adaures/castopod/commit/32e8c7c16a61ffe08e2f3bfbdeda556811a0358c)) * **rss:** add podcast:location tag ([c0a2282](https://code.castopod.org/adaures/castopod/commit/c0a22829bd87d48535a86e60c6cd7280e44683a2)) * **rss:** add rss feed route without the `.xml` extension ([94c0b7c](https://code.castopod.org/adaures/castopod/commit/94c0b7c15920dae9ade5cdc79c7996dbfe82ba05)), closes [#247](https://code.castopod.org/adaures/castopod/issues/247) * **rss:** add soundbites according to the podcastindex specs ([6b34617](https://code.castopod.org/adaures/castopod/commit/6b34617d07c70522cb941e96d91d9987493413eb)), closes [#83](https://code.castopod.org/adaures/castopod/issues/83) * **rss:** add transcript and chapters support ([e769d83](https://code.castopod.org/adaures/castopod/commit/e769d83a932c169e52a630a17cd4dd8ac5cebaf6)), closes [#72](https://code.castopod.org/adaures/castopod/issues/72) [#82](https://code.castopod.org/adaures/castopod/issues/82) * **rss:** generate rss feed from podcast entity ([c815ecd](https://code.castopod.org/adaures/castopod/commit/c815ecd6640931fee0895f80908a3ddfac482666)) * **rss:** update monetization tag so that it meets PodcastIndex requirements ([4c7ecbe](https://code.castopod.org/adaures/castopod/commit/4c7ecbee83950e5f9f2482cedaab18a1ac9bfc9e)) * **select:** enhance select input with choices.js ([910d457](https://code.castopod.org/adaures/castopod/commit/910d457cf843e0fc334b3505a4727d51633395ac)) * set app parameter forceGlobalSecureRequests = true forcing requests to go through https ([d9dff1b](https://code.castopod.org/adaures/castopod/commit/d9dff1b8bf89c8b526ad6cb89f98a1f160d49117)) * set podcast / episode description in the pages description meta tag ([1c4a504](https://code.castopod.org/adaures/castopod/commit/1c4a50442bea2d3449efce9c5ff1c80743152f55)), closes [#44](https://code.castopod.org/adaures/castopod/issues/44) * **settings:** add general config for instance (site name, description and icon) ([5c56f3e](https://code.castopod.org/adaures/castopod/commit/5c56f3e6f00a61af2ccf50811c155c325f2b10fa)) * **settings:** add theme settings to set an accent color for all public pages ([5c529a8](https://code.castopod.org/adaures/castopod/commit/5c529a83aa6d6147d94e5aee996e6b0ab02f0ce4)) * simplify podcast page's layout for better ux ([2c0efc6](https://code.castopod.org/adaures/castopod/commit/2c0efc6563604dd067be88cfc9ddd88a01745e64)) * **soundbites:** add soundbite list and creation forms with audio-clipper component ([de19317](https://code.castopod.org/adaures/castopod/commit/de19317138a2106deb825c1eed7dda036ed7dac3)) * style file inputs using tailwind's file class ([8208ab6](https://code.castopod.org/adaures/castopod/commit/8208ab6785aae8c49f78eb9ac8cd53d77ec8e5e5)) * **themes:** add ViewThemes library to set views in root themes folder ([7a27676](https://code.castopod.org/adaures/castopod/commit/7a276764e6a1ee3619d9d3488f6163215db75338)) * **themes:** set different default banner per theme ([11c916f](https://code.castopod.org/adaures/castopod/commit/11c916fe433eb749ac32230c48e256057564cbb0)) * **themes:** set generic css variables for colors to enable instance themes ([a746a78](https://code.castopod.org/adaures/castopod/commit/a746a781b4bfc78209cf8302c6d7bb3cb452e446)) * toggle podcast sidebar on smaller screens ([f0205ec](https://code.castopod.org/adaures/castopod/commit/f0205ec274414e881cba40d6776126f05eaee583)) * **transcript:** parse srt subtitles into json file + add max file size info below audio file input ([0098761](https://code.castopod.org/adaures/castopod/commit/00987610a068c8d6cdd4421ea16585fa037eb61a)) * **ui:** create ViewComponents library to enable building class and view files components ([94872f2](https://code.castopod.org/adaures/castopod/commit/94872f2338e6025c2f3770be256160838dae9003)) * update analytics so to meet IABv2 requirements ([03e23a2](https://code.castopod.org/adaures/castopod/commit/03e23a28bf9b1b73fba55352c36a8cd6cc8ae729)), closes [#10](https://code.castopod.org/adaures/castopod/issues/10) * update pine colors + create charts components ([a50abc1](https://code.castopod.org/adaures/castopod/commit/a50abc138d4997b564e3065b37504cda5ce62da6)) * **users:** add myth-auth to handle users crud + add admin gateway only accessible by login ([c63a077](https://code.castopod.org/adaures/castopod/commit/c63a077618c61b4cde7f25ffc650a4b0e1495f44)), closes [#11](https://code.castopod.org/adaures/castopod/issues/11) * **ux:** remove admin dashboard and redirect directly to podcast list ([27c48b8](https://code.castopod.org/adaures/castopod/commit/27c48b8fa930b33e5e15f0c8685e468e857ca9cd)) * **video-clip:** add video-clip page with video preview + logs ([42538dd](https://code.castopod.org/adaures/castopod/commit/42538dd7577be0ffe59b4fdfadbd76cc89e5ef30)) * **video-clip:** generate video clips in the bg using a cron job + add video clip page + tidy up UI ([db0e427](https://code.castopod.org/adaures/castopod/commit/db0e4272bd6d307c562e1f961d2747cb62de0f35)) * **video-clips:** add dimensions for portrait and squared formats ([3af404d](https://code.castopod.org/adaures/castopod/commit/3af404da3dd1901c78cc7e1778fc225f6716207d)) * **video-clips:** add new themes + add castopod logo as a watermark ([1d1490b](https://code.castopod.org/adaures/castopod/commit/1d1490b06a1f5ecb10b3b98a72efc55d09c10944)) * **video-clips:** add route for scheduled video clips + list video clips with status ([2065ebb](https://code.castopod.org/adaures/castopod/commit/2065ebbee5e3d0f890ac90b55ca984f1d62a184c)) * **video-clips:** allow episodeNumbering text to stand in the indent of episodeTitle paragraph ([71a063d](https://code.castopod.org/adaures/castopod/commit/71a063dac311cb21639801fbae6af7c5106c2699)) * **video-clips:** generate a 16:9 video using ffmpeg ([35aa7ea](https://code.castopod.org/adaures/castopod/commit/35aa7ea5d9a339b3e6f745137282268d69fe2231)) * **video-clips:** generate subtitles clip using transcript json to have subtitles accross video ([3ce07e4](https://code.castopod.org/adaures/castopod/commit/3ce07e455d171e29be30d8ad45055510eb8d363c)) * **video-clips:** replace hardcoded colors with config's theme colors ([e462abf](https://code.castopod.org/adaures/castopod/commit/e462abf6d660e41d2170c52caf45704008de58e9)) * **vite:** add vite config to decouple it from CI_ENVIRONMENT ([8721719](https://code.castopod.org/adaures/castopod/commit/8721719cd7cf32e94823541eafaba1e9309355a8)) * write id3v2 tags to episode's audio file ([4651d01](https://code.castopod.org/adaures/castopod/commit/4651d01a84ff3ea8433a8ae26cfd750a1ec9e88d)) ### Performance Improvements * **cache:** update CI4 to use cache's deleteMatching method ([54b84f9](https://code.castopod.org/adaures/castopod/commit/54b84f96843af13f579fea49102c8c2ef81b0a54)) * **cache:** use deleteMatching method to prevent forgetting cached elements in models ([76afc0c](https://code.castopod.org/adaures/castopod/commit/76afc0cfa2feb087697bae4bc138e4956873dd62)) * defer javascript + lazy load images for faster page loads ([f0685e4](https://code.castopod.org/adaures/castopod/commit/f0685e44799dfb494592ff97841c0ae035381db8)) * **docker:** add redis caching service for development ([05ace8c](https://code.castopod.org/adaures/castopod/commit/05ace8cff2ef02d19abd40097ac5546dca6a54ca)) ### Reverts * **install:** redirect to install in homepage if no database was set ([73f094d](https://code.castopod.org/adaures/castopod/commit/73f094daf26a8cf75e39ebff1eeb7f9039276312)) * set deprecated config options back in App config ([433745f](https://code.castopod.org/adaures/castopod/commit/433745f194c73407999b207090478563283876a5)) * **soundbites:** remove soundbite table from episode's public page ([5dc0f19](https://code.castopod.org/adaures/castopod/commit/5dc0f19656de0d764f627d6ae78a9e306c901835)) * use basic input file for episodes audio files instead of button for better UX ([d5f22fb](https://code.castopod.org/adaures/castopod/commit/d5f22fbb38c43d9b37df401eff655958a57cb40a)) ### BREAKING CHANGES * **analytics:** analytics_podcasts_by_player table and analytics_podcasts procedure were updated --- CHANGELOG.md | 1010 ++++++++++++++++++++++++++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package-lock.json | 4 +- package.json | 2 +- 5 files changed, 1015 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6d4cebb..8a646b1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,1013 @@ +# 1.0.0 (2022-10-20) + +### Bug Fixes + +- **a11y:** replace active tab color to contrast with background on podcast and + episode pages + ([f3785e1](https://code.castopod.org/adaures/castopod/commit/f3785e140147d085a2fb6a62ded87cdfe360f442)) +- **activity-pub:** cache issues when navigating to activity stream urls + ([7bcbfb3](https://code.castopod.org/adaures/castopod/commit/7bcbfb32f7cca08d111be46c7f1640e372d4a4b0)) +- **activity-pub:** get database records using new model instances + ([92536dd](https://code.castopod.org/adaures/castopod/commit/92536ddb3812214a9c5682b92e547e5c1998a5d7)) +- **activitypub:** add conditions for possibly missing actor properties + add + user-agent to requests + ([8fbf948](https://code.castopod.org/adaures/castopod/commit/8fbf948fbba22ffd33966a1b2ccd42e8f7c1f8a2)) +- **activitypub:** add target actor id to like / announce activities to send + directly to note's actor + ([962dd30](https://code.castopod.org/adaures/castopod/commit/962dd305f5d3f6eadc68f400e0e8f953827fe20d)) +- **activitypub:** add target_actor_id for create activity to broadcast post + reply + ([0128a21](https://code.castopod.org/adaures/castopod/commit/0128a21ec55dcc0a2fbf4081dadb4c4737735ba1)) +- **activitypub:** allow cors on get requests for routes exposing acitivitypub + objects + ([2f24809](https://code.castopod.org/adaures/castopod/commit/2f2480998f9abb34f02ab186c65d462a74b4e640)) +- **activitypub:** set created_by to null for reblog if no user + update episode + oembed data + ([209dfbd](https://code.castopod.org/adaures/castopod/commit/209dfbd134e1a2cc02e7c24c158d786fa4dda61d)) +- add admin-audio-player to vite config to have admin player show up + ([93cb9b2](https://code.castopod.org/adaures/castopod/commit/93cb9b24701c09b92820204a67c1fc1b3c044708)) +- add application/octet-stream mimetype to mp3 and m4a extensions to prevent + ext_in error + ([339bef8](https://code.castopod.org/adaures/castopod/commit/339bef878e54983d86e91e6ff7a931a843d321b3)), + closes [#145](https://code.castopod.org/adaures/castopod/issues/145) +- add category_label component to include parent category in about podcast page + ([74e7d68](https://code.castopod.org/adaures/castopod/commit/74e7d68ac834885c4b89ee6e7d60db2157165799)) +- add explicit int conversion when formatting episode duration + ([1253096](https://code.castopod.org/adaures/castopod/commit/1253096197a0d30692bdafa7152f250cd9a71acf)) +- add head request to analytics_hit route + ([f0a2f0b](https://code.castopod.org/adaures/castopod/commit/f0a2f0bea491ca91976b351bb79837e95c9d094b)) +- add href to castopod website on login page + ([cc54257](https://code.castopod.org/adaures/castopod/commit/cc5425735184ad738aa0f38540f18e8971f8f56e)) +- add missing explicit badge for podcasts and episodes + ([cdf9f9d](https://code.castopod.org/adaures/castopod/commit/cdf9f9d53f2597f19455cb65c51da4677bb99327)) +- add open graph size for podcast images to replace the inadequate large format + ([33aae1f](https://code.castopod.org/adaures/castopod/commit/33aae1f7934e4962116e94e477dbf48e24971f5f)) +- add public/media folder to castopod bundle + ([8053d35](https://code.castopod.org/adaures/castopod/commit/8053d3521b481872711dabaaf265d08b9bfbaa87)), + closes [#52](https://code.castopod.org/adaures/castopod/issues/52) +- add translation key for audio-clipper trim labels + ([db191ac](https://code.castopod.org/adaures/castopod/commit/db191ac31bd16bad2a72afdb8b25c685adf86a6e)) +- add underline and semibold font weight for prose links to have them stand out + ([d4d8671](https://code.castopod.org/adaures/castopod/commit/d4d867121c50bded4176a53d7154cf1bb347e306)) +- add where condition to get episode count without deleted episodes + ([7661734](https://code.castopod.org/adaures/castopod/commit/7661734ed296654630f3668132671117519145dd)), + closes [#67](https://code.castopod.org/adaures/castopod/issues/67) +- **admin:** save block and lock switches + ([b66c0af](https://code.castopod.org/adaures/castopod/commit/b66c0afc8fab2e338402a9a4f8105e5f5459e208)) +- **analytics:** redirect to mp3 file even when referer was not set + ([9fc388d](https://code.castopod.org/adaures/castopod/commit/9fc388d154f29c335dedcd624abe8c1751762c07)) +- **analytics:** remove charts empty values + remove useless language cache + ([1678794](https://code.castopod.org/adaures/castopod/commit/16787941539ba4014281a366789ea896a9cd2afc)) +- **analytics:** set duration field to precise decimal as episode's audio file + duration + ([d772685](https://code.castopod.org/adaures/castopod/commit/d77268540569b2be9d91d5e09aefb3ff5ac2b071)) +- **analytics:** set initial value for duration and bandwidth + ([ee50539](https://code.castopod.org/adaures/castopod/commit/ee5053959154b1a2e5fbe4b43162968425206a26)) +- **analytics:** update migrations to set decimal precision for latitude and + longitude + ([714d6b5](https://code.castopod.org/adaures/castopod/commit/714d6b5d4950e52cf1c3170bb59954f98ffd48bd)) +- **analytics:** update service management so that it works with new OPAWG slug + values + ([7fe9d42](https://code.castopod.org/adaures/castopod/commit/7fe9d42500ade2c6fa3ff4365b4affc475af0e51)) +- **audio-clipper:** add mouse position offset when stretching clip to prevent + content from jumping + ([602654b](https://code.castopod.org/adaures/castopod/commit/602654b99b33ee8c29da080058a0aaea976cd484)) +- **audio-clipper:** show audio playing progress + put waveform behind audio + clipper + ([01a09dc](https://code.castopod.org/adaures/castopod/commit/01a09dc447b81c5412ceb45d6706a867939fd4dd)) +- **avatar:** use default avatar when no avatar url has been set + ([9d23c7e](https://code.castopod.org/adaures/castopod/commit/9d23c7e7e142c6cf1a1418e37e41d711064593c4)), + closes [#111](https://code.castopod.org/adaures/castopod/issues/111) +- **bundle:** include modules and themes when copying files with rsync + ([cd5bb88](https://code.castopod.org/adaures/castopod/commit/cd5bb8835c6e259408a8c13a2196a347e161da83)) +- **bundle:** update vite input files path + add `set -e` in bash scripts to + fail if command fails + ([0ee53c7](https://code.castopod.org/adaures/castopod/commit/0ee53c71ffadb8a6ddb1febd9f912bc99f5f7a0b)) +- **cache:** add locale for podcast and episode pages + clear some persisting + cache in models + ([9cec8a8](https://code.castopod.org/adaures/castopod/commit/9cec8a81ccbb7239402fe6633dbc31979272302a)), + closes [#42](https://code.castopod.org/adaures/castopod/issues/42) + [#61](https://code.castopod.org/adaures/castopod/issues/61) +- **cache:** delete posts and comments pages cache when updating platform links + ([f7c3e5b](https://code.castopod.org/adaures/castopod/commit/f7c3e5bf4ad43389bf8d58d2c4aaf16b81cbce00)), + closes [#169](https://code.castopod.org/adaures/castopod/issues/169) +- **cache:** return a non cached view when connected + ([e2e7358](https://code.castopod.org/adaures/castopod/commit/e2e735815d805a48eed2ea3288d060d0ddb253a3)) +- **cache:** suffix cache names with authenticated for credits, map and pages + ([418a70b](https://code.castopod.org/adaures/castopod/commit/418a70b2a670d8ba0ab6c15fa5faa41f6be55e53)) +- cast actor_id to pass as int to set_interact_as_actor() function + ([56a8e5d](https://code.castopod.org/adaures/castopod/commit/56a8e5d7dd615322aeb007e730801c65d0b02e5c)) +- **category:** remove uncategorized option to enforce users in choosing a + category + ([8c64f25](https://code.castopod.org/adaures/castopod/commit/8c64f25a0e72fec03d25544797d32623b2276fce)) +- change image size requirement hints + ([ea20206](https://code.castopod.org/adaures/castopod/commit/ea20206ee674eb54dd3ea188d2a2e2d41425df65)) +- change message upon cancellation of episode publication + ([9859c74](https://code.castopod.org/adaures/castopod/commit/9859c7434c2a3478ce035f7a4de20f594d63f5b0)) +- check for database connection and podcasts table existence before redirecting + to install + ([eb74e81](https://code.castopod.org/adaures/castopod/commit/eb74e81c3d93581e310b391cd029e62a0d690a8a)) +- check that additional files are valid when creating episode + ([eac5bc8](https://code.castopod.org/adaures/castopod/commit/eac5bc876de125e1fe08d1b89f767a04fc0fbfb6)) +- check that note has a preview_card_id before displaying it + ([acb8b3a](https://code.castopod.org/adaures/castopod/commit/acb8b3a40172ccb184ffe544760601d756692e6c)), + closes [#114](https://code.castopod.org/adaures/castopod/issues/114) +- clear cache when deleting podcast banner + ([99bb40b](https://code.castopod.org/adaures/castopod/commit/99bb40b8bc17b8ee2cd8468a82e46ea280c92cb6)) +- comment all cache clean after page update to prevent analytics cache deletion + ([e6197a4](https://code.castopod.org/adaures/castopod/commit/e6197a4972a3cce3d67dd7972bb54f8720b8e5b7)) +- **comments:** add comment view partials for public pages + ([fcecbe1](https://code.castopod.org/adaures/castopod/commit/fcecbe1c68b0d28d19454fba65caf3ab769fbc75)) +- correct chart data + ([4d3e9c8](https://code.castopod.org/adaures/castopod/commit/4d3e9c8c02cdc882e9fe1c29625695b6f83c820a)) +- correct percona compatibility issue + ([e53f819](https://code.castopod.org/adaures/castopod/commit/e53f819264b2d6902996f11ffcbb7c99295a90ef)) +- correct php-fpm issues + ([1ef55d7](https://code.castopod.org/adaures/castopod/commit/1ef55d7315bb44abe05f02ec8a84b6b6a557a9a0)) +- correct referrer bug + ([ed69b2f](https://code.castopod.org/adaures/castopod/commit/ed69b2f5004ed1cd18bac824c08a0df01f5d2637)) +- correction for servers with low int precision + ([31b7828](https://code.castopod.org/adaures/castopod/commit/31b7828e77519ef43e9bcfcbdf6c21712f97a571)) +- **cors:** add preflight option routes for episode, podcast and status objects + ([a281abf](https://code.castopod.org/adaures/castopod/commit/a281abfda475388a07943c169dab460cc2d4f944)) +- declare typed properties in PHPDoc for php<7.4 + ([14dd44d](https://code.castopod.org/adaures/castopod/commit/14dd44d03d6db0d9ae4198db8e65c92a0e45cb31)), + closes [#23](https://code.castopod.org/adaures/castopod/issues/23) +- define podcast_id and platform_slug as foreign keys in podcasts_plaforms table + ([6e9451a](https://code.castopod.org/adaures/castopod/commit/6e9451a1103b43750fa70ad576de36af25ca29cb)) +- define podcastNamespaceLink value + ([0d744d2](https://code.castopod.org/adaures/castopod/commit/0d744d212df0d070ceea185068eaf2746e1ccd48)) +- **email:** set the correct url in the activation and forgot emails + ([10fc6f1](https://code.castopod.org/adaures/castopod/commit/10fc6f17c6838a58348f32ccfd0cf05f9d3e172c)), + closes [#204](https://code.castopod.org/adaures/castopod/issues/204) +- **embeddable-player:** enable any ancestor when X-Frame-Options is set on + server + ([44a4962](https://code.castopod.org/adaures/castopod/commit/44a4962e0b7e3ed87e9914b4e7792a0d52330ff8)) +- **embed:** open embedded player's links in new tab + ([4aa73d7](https://code.castopod.org/adaures/castopod/commit/4aa73d71e3b8c0a6c3f75f4d1d45c4d693aba64c)) +- **episode-form:** show warning to set `memory_limit`, `upload_max_filesize` & + `post_max_size` + ([3b3c218](https://code.castopod.org/adaures/castopod/commit/3b3c218b9c868e9f12c54d7670e69d84c9ee79c0)), + closes [#5](https://code.castopod.org/adaures/castopod/issues/5) + [#86](https://code.castopod.org/adaures/castopod/issues/86) +- **episode-unpublish:** set consistent posts_counts' increments/decrements for + actors and episodes + ([8acdafd](https://code.castopod.org/adaures/castopod/commit/8acdafd26044e50a4d6ee451bf24ad66003c5bb3)), + closes [#233](https://code.castopod.org/adaures/castopod/issues/233) +- **episodeCount:** add missing brackets to French language file + ([c1b4112](https://code.castopod.org/adaures/castopod/commit/c1b411265ad9b06e95a8b097ecf73445b88dcb45)) +- **episode:** replace guid's empty string value to null + ([441052a](https://code.castopod.org/adaures/castopod/commit/441052af8d99e6e317edefd1e58ad71799357088)) +- **episodes-page:** handle defaultQuery being null when no podcast episodes + ([15183b7](https://code.castopod.org/adaures/castopod/commit/15183b7eab57dac007bcdfa8c3651239de1ae05a)), + closes [#100](https://code.castopod.org/adaures/castopod/issues/100) +- **episodes-table:** set descriptions to be not null + ([6774ec1](https://code.castopod.org/adaures/castopod/commit/6774ec10fa78527be6b7548ca1dc34ad0ada090c)) +- **episodes:** add publication status + set publication date to null when none + has been set + ([d882981](https://code.castopod.org/adaures/castopod/commit/d882981b3a86c81921ce6b07d4cf61fc13983689)), + closes [#70](https://code.castopod.org/adaures/castopod/issues/70) +- escape characters for `min` in format_duration_symbol + ([3b6722a](https://code.castopod.org/adaures/castopod/commit/3b6722a42b9e4330e5235d4ceed41c777159f4dc)) +- escape generated feed tag values and remove new lines from public pages meta + description + ([6238a43](https://code.castopod.org/adaures/castopod/commit/6238a43863210afe8988ad7cf251e6bfc6c8557c)), + closes [#57](https://code.castopod.org/adaures/castopod/issues/57) + [#46](https://code.castopod.org/adaures/castopod/issues/46) +- expire default query cache upon scheduled episode publication + ([b72e7c8](https://code.castopod.org/adaures/castopod/commit/b72e7c8691c887e41107baea0a4d50a39eaf8c8b)), + closes [#81](https://code.castopod.org/adaures/castopod/issues/81) +- explicitly cast seconds to int in iso8601_duration helper function + ([779653f](https://code.castopod.org/adaures/castopod/commit/779653f75b140942f731cbb238bc0667cc461307)) +- **fediverse:** set default castopod avatar url when actor avatar is not + present + ([460f52f](https://code.castopod.org/adaures/castopod/commit/460f52f70e493d619c28632db6c698e88f0ebb5f)) +- **fediverse:** set model instances as non shared to prevent overlapping + ([91128fa](https://code.castopod.org/adaures/castopod/commit/91128fad7a68e1f4e5acacba90b6899288699e61)) +- fix layout bugs in admin and update translation files + ([a834171](https://code.castopod.org/adaures/castopod/commit/a83417180cf61cdfadc5509b0aaa2fdb66592be3)), + closes [#40](https://code.castopod.org/adaures/castopod/issues/40) +- **follow:** add missing helpers to Actor controller + ([ee53a73](https://code.castopod.org/adaures/castopod/commit/ee53a732dc12ebbf5706e14969749a12cfd9d559)) +- **get_browser_language:** return defaultLocale if browser doesn't send user + preferred language + ([9cc2996](https://code.castopod.org/adaures/castopod/commit/9cc299626181048b85b629bbe7f5806a1f5d21ff)) +- handle HEAD requests on podcast_feed route + ([74b2640](https://code.castopod.org/adaures/castopod/commit/74b2640f2a25c4cd6fd8835fc492c2a6893d4950)), + closes [#79](https://code.castopod.org/adaures/castopod/issues/79) +- **home:** remove hardcoded prefix in getAllPodcasts query + ([92d5cc5](https://code.castopod.org/adaures/castopod/commit/92d5cc50a3e533875cd894dccc417918102d4b7f)) +- **housekeeping:** replace the use of GLOB_BRACE with looping over file + extensions + ([42d92d0](https://code.castopod.org/adaures/castopod/commit/42d92d0c8dfe0c567c28f5bfdda129890fa4c2ec)), + closes [#154](https://code.castopod.org/adaures/castopod/issues/154) +- **housekeeping:** set default sizes value + ignore illegal IFD size error to + proceed with script + ([f21ca57](https://code.castopod.org/adaures/castopod/commit/f21ca57603cfa503699b7e09a155e18d876d65fe)) +- **housekeeping:** use EpisodeModel's builder to reset comments count + ([65e9c0b](https://code.castopod.org/adaures/castopod/commit/65e9c0b05ea4992884149cb4a4b071bf31a20a1a)) +- **htaccess:** add ? after index.php in RewriteRule + ([d9d139e](https://code.castopod.org/adaures/castopod/commit/d9d139eefa03c28d1a064b3b32c9036193497e57)), + closes [#152](https://code.castopod.org/adaures/castopod/issues/152) +- **http-signature:** update SIGNATURE_PATTERN allowing signature keys to be + sent in any order + ([b7f285e](https://code.castopod.org/adaures/castopod/commit/b7f285e4e24247fedb94f030356fa6f291f525cc)) +- **images:** set default mimetype if none is specified when getting size info + ([6e4acc6](https://code.castopod.org/adaures/castopod/commit/6e4acc64ad256178cee7905402b48bafcd49f84c)) +- **import-with-escaped-characters:** remove \CodeIgniter\HTTP\URI in + download_file, closes + [#103](https://code.castopod.org/adaures/castopod/issues/103) + ([35b5be0](https://code.castopod.org/adaures/castopod/commit/35b5be095ff54d27acec1610a846ec0cdbdf1d65)) +- **import:** add extension when downloading file without + truncate slug if too + long + ([c5f18bb](https://code.castopod.org/adaures/castopod/commit/c5f18bb6dc08a758ff735454bbe9cfa45a68c09b)) +- **import:** add validation for handle field to prevent + Router.invalidParameterType error + ([5bf7200](https://code.castopod.org/adaures/castopod/commit/5bf7200fb390f2447b29f24b495f24483cf7b205)), + closes [#119](https://code.castopod.org/adaures/castopod/issues/119) +- **import:** cast description's SimpleXMLElement to string + ([02d17be](https://code.castopod.org/adaures/castopod/commit/02d17be4ffe229fc6657207d31eba0543b5f1a4c)) +- **import:** remove query string from files url + ([109c4aa](https://code.castopod.org/adaures/castopod/commit/109c4aa1afb72dd8b99c0302d74a7fef5a38638e)) +- **import:** save media files during podcast import + set missing media fields + ([a9989d8](https://code.castopod.org/adaures/castopod/commit/a9989d841a634f8cf6c04df25f40bb1e7d4fcdcc)) +- **import:** set default episode type if not set + ([d7250ab](https://code.castopod.org/adaures/castopod/commit/d7250ab03f9b032830c575ad58b51c8d60b7a49a)) +- **import:** set episode and season numbers to null when not present in item + tag + ([3211398](https://code.castopod.org/adaures/castopod/commit/3211398c78b1b28b76a46427ee07874bbf84a85d)) +- **import:** use tag when no is present + ([20e607a](https://code.castopod.org/adaures/castopod/commit/20e607afb755bc75056041738fa7cbf6723d754c)) +- include missing variables on public ui's episode page and remote_actions + ([193b373](https://code.castopod.org/adaures/castopod/commit/193b373bc94a5270acae99b637aa84b6cb2dedfe)) +- **input-component:** unset required attribute to prevent rendering it when + false + ([db9ac13](https://code.castopod.org/adaures/castopod/commit/db9ac13860bce58235a5da275910bea605a00626)) +- **install:** add password validation when creating super admin + ([5a2ca0c](https://code.castopod.org/adaures/castopod/commit/5a2ca0cc4ae85cc15960201c86f131cb822f714f)) +- **install:** redirect manually to install wizard on first visit + ([2ceaaca](https://code.castopod.org/adaures/castopod/commit/2ceaaca44f1b82fc64d961e2fb4f4aaeade7e736)) +- **install:** redirect to host_url install route on instanceConfig validation + error + ([99250b1](https://code.castopod.org/adaures/castopod/commit/99250b1868657c249a447399c7ebc69e00d43d1a)) +- **install:** redirect to input baseUrl after instance config + ([2426af7](https://code.castopod.org/adaures/castopod/commit/2426af7de8c9d426aaf534ff17b67f71c2e9f374)), + closes [#53](https://code.castopod.org/adaures/castopod/issues/53) +- **install:** set message block on forms to show error messages + ([3a0a20d](https://code.castopod.org/adaures/castopod/commit/3a0a20d59cdae7f166325efb750eaa6e9800ba6e)), + closes [#157](https://code.castopod.org/adaures/castopod/issues/157) +- **interact-as:** set actor_id instead of podcast id upon login event + ([5dfade7](https://code.castopod.org/adaures/castopod/commit/5dfade7cf37f339c56d2e577c679b88a1b1d9336)), + closes [#104](https://code.castopod.org/adaures/castopod/issues/104) +- **json-ld:** add missing properties to PodcastSeries object + ([e97266c](https://code.castopod.org/adaures/castopod/commit/e97266c5d4883a10f68b3685ecc0d1942f54d658)) +- keep subtitle line breaks when parsing srt file to json + ([cfb3da6](https://code.castopod.org/adaures/castopod/commit/cfb3da6592f2de23cb1a7ac420f19fc77fa338aa)) +- **layouts:** replace holy-grail layout with tailwind config + widen public + podcast layout + ([be5a287](https://code.castopod.org/adaures/castopod/commit/be5a28787fdb180b64d9bf570120eff7072ab9aa)) +- **map:** update episode markers query to discard unpublished episodes + ([b3caac4](https://code.castopod.org/adaures/castopod/commit/b3caac45b12a23e4289d00133d2ad7915d084c44)) +- **markdown-editor:** remove unnecessary buttons for podcast and episode + editors + add extensions + ([9c4f60e](https://code.castopod.org/adaures/castopod/commit/9c4f60e00bcbd4f784f12d2a6fed357ad402ee2e)) +- **md-editor:** build new markdown editor with lit + + github/markdown-toolbar-element + ([9ec1cb9](https://code.castopod.org/adaures/castopod/commit/9ec1cb93da6f41124c48b8cf14ee6942e865bede)), + closes [#93](https://code.castopod.org/adaures/castopod/issues/93) + [#94](https://code.castopod.org/adaures/castopod/issues/94) + [#120](https://code.castopod.org/adaures/castopod/issues/120) +- **migrations:** ignore invalid utf8 chars for media files metadata + update + transcript parser + ([45e8f99](https://code.castopod.org/adaures/castopod/commit/45e8f99e753cc02ec105e6f4d7fe026a205724f8)) +- minor corrections + ([13be386](https://code.castopod.org/adaures/castopod/commit/13be386842e94d9def1f7de4720931d8f6935171)) +- move analytics to helper + ([d311917](https://code.castopod.org/adaures/castopod/commit/d31191732e41aa106234b5ebe6e54ee02f0ce603)) +- move html escaping on credits page + ([fbffdbd](https://code.castopod.org/adaures/castopod/commit/fbffdbde78544c83138ee6234c62d43056f407b6)) +- **multiselect:** add missing class names in choices options for purge to work + properly + ([719538d](https://code.castopod.org/adaures/castopod/commit/719538d0ccb28af3c3c5e1a4b6468d4b772fe819)) +- **notifications:** add trigger after activities update + update insert trigger + ([e5d16e8](https://code.castopod.org/adaures/castopod/commit/e5d16e87119021fa5a43470d67ddfe5128e57f74)) +- **notifications:** notify actors after activities insert / update using model + callback methods + ([e08555a](https://code.castopod.org/adaures/castopod/commit/e08555a4e9a6c15eeba18273c63403f82eddae35)) +- **open-graph:** replace non existant episode description to podcast + description in podcast page + ([b02584e](https://code.castopod.org/adaures/castopod/commit/b02584ee609af1ad1b5680cc28208d113eb0410b)) +- overwrite common lang function to escape returned string + ([4c490c1](https://code.castopod.org/adaures/castopod/commit/4c490c15bb6642ad0b2aaddf08d8af25de99b4b0)), + closes [#196](https://code.castopod.org/adaures/castopod/issues/196) + [#198](https://code.castopod.org/adaures/castopod/issues/198) +- overwrite getActorById to return app's Actor entity + ([f2bc2f7](https://code.castopod.org/adaures/castopod/commit/f2bc2f7e01aa166faa627df6fe4d5ed4887c16e5)) +- **package.json:** update destination of postcss generation scripts + ([21413f8](https://code.castopod.org/adaures/castopod/commit/21413f8af3b8a0ac01d8c6f15bcd7a63e524e964)) +- **pages:** add locale to page cache + ([8f999ce](https://code.castopod.org/adaures/castopod/commit/8f999ce2f7ee1416c30cf58c84f67b3d11b3f142)) +- **partner:** set correct image URL + ([61554be](https://code.castopod.org/adaures/castopod/commit/61554be12a64d59ab99fab810b1b05632b408f3a)) +- pass timezone to relative time component to show the localized time in the UI + ([b9db936](https://code.castopod.org/adaures/castopod/commit/b9db936461d4cb914958bb3256bb910bbd7ba815)) +- **persons:** prevent overflow of persons list by adding horizontal scroll + ([9e8995d](https://code.castopod.org/adaures/castopod/commit/9e8995dc6e039032cc65f87895cf770f99e8b244)) +- **persons:** set person picture as optional for better ux + ([7fdea63](https://code.castopod.org/adaures/castopod/commit/7fdea63de7e572810082c84fff3013af580df58b)), + closes [#125](https://code.castopod.org/adaures/castopod/issues/125) +- **platforms:** display platform link only when visible is toggled on + ([6e503c8](https://code.castopod.org/adaures/castopod/commit/6e503c8d6182987e48892370623183f871bbd1c1)), + closes [#39](https://code.castopod.org/adaures/castopod/issues/39) +- **player-styling:** revert vite to 2.8 to reference the player css + ([e07d3af](https://code.castopod.org/adaures/castopod/commit/e07d3afea9af85b8361227e000fb64b502781668)) +- **podcast-activity:** check if transcript and chapters are set before + including them in audio + ([5855a25](https://code.castopod.org/adaures/castopod/commit/5855a250936f91641efef77650890a18d8e9917f)) +- **podcast-import:** move guid attribute declaration for Episode entity to + include slug data + ([5d02ae3](https://code.castopod.org/adaures/castopod/commit/5d02ae39908a9d743627135b372bf981134c4328)) +- **podcast:** use markdown description value for editor + set prose class to + about description + ([f304d97](https://code.castopod.org/adaures/castopod/commit/f304d97b14e0ef383509cb3bba50beb55bf701ba)), + closes [#156](https://code.castopod.org/adaures/castopod/issues/156) +- prefill description footer input when creating a new episode + ([9ea5ca3](https://code.castopod.org/adaures/castopod/commit/9ea5ca31697c70d176294f8aea37bd57d471fcf7)) +- **premium-podcasts:** display unlock button in embed when premium episode + ([ca109ba](https://code.castopod.org/adaures/castopod/commit/ca109ba3a8a08e661fd2484454b1983c3418f15d)) +- **premium-podcasts:** remove cache in unlock form + redirect to podcast if + podcast is not premium + ([242352c](https://code.castopod.org/adaures/castopod/commit/242352c4d9cd936de14e8e8a5d78ebf1287b1f95)) +- **premium-podcasts:** return different cached page when podcast is unlocked + ([b1303c5](https://code.castopod.org/adaures/castopod/commit/b1303c525517498b0edfb9885ff36e08c72628b5)) +- **pwa:** add scope to webmanifests to allow installing an app per podcast + ([74c683e](https://code.castopod.org/adaures/castopod/commit/74c683eb44398a84443ec17903c3e002bb5ea9b9)) +- **pwa:** set app display as standalone in the webmanifests + ([7aa37d2](https://code.castopod.org/adaures/castopod/commit/7aa37d24ac13a1ee160c01a56b43621d7efcfbbc)) +- re-order graph values + ([35f633b](https://code.castopod.org/adaures/castopod/commit/35f633b4c71c087d1ddc9bba9e9bbe18de09204f)) +- redirect to non cached views when authenticated in public views + ([482b47b](https://code.castopod.org/adaures/castopod/commit/482b47ba6bdab7f27fc5704a559567228e07cd14)) +- **release:** add missing version number to castopod-host package + ([8f3e9d9](https://code.castopod.org/adaures/castopod/commit/8f3e9d90c14545d3f84d4469b26a53db4554b4dc)) +- remove cache from remote follow form to display error messages + ([90e4443](https://code.castopod.org/adaures/castopod/commit/90e44437bdf37d8024ef609b2f7336dbdfc3b974)) +- remove defer from js script declaration as it is a module + ([18ae557](https://code.castopod.org/adaures/castopod/commit/18ae557e97f1cef775cd1e75fb1fedee7f1c0cc9)) +- remove fixed size from podcast sidebar + rearrange account info + space out + import radio inputs + ([776eec6](https://code.castopod.org/adaures/castopod/commit/776eec6f0d533d6c92ebec16f7a9dbfcde1f41f4)) +- remove heavy image cover data from audio file metadata + ([f74403b](https://code.castopod.org/adaures/castopod/commit/f74403bd7a5089b760603abe36264e7615be0e78)) +- remove required for other_categories field and add podcast_id to latest + podcasts query + ([5417be0](https://code.castopod.org/adaures/castopod/commit/5417be0049288489a19c7b575aa77bd1e2bc0243)) +- remove required property to persons picture + ([c546be3](https://code.castopod.org/adaures/castopod/commit/c546be385b243014243ae93356006cd126d2f00d)), + closes [#125](https://code.castopod.org/adaures/castopod/issues/125) +- remove value escaping for form inputs and textareas + ([bc6dea2](https://code.castopod.org/adaures/castopod/commit/bc6dea2f8ad1cf0aee0eaa93151332fbac7fb771)) +- rename field status to task_status to get scheduled activities + ([4ff82a5](https://code.castopod.org/adaures/castopod/commit/4ff82a5f0a38dbbc9e272fca7df70ea5a190e334)) +- rename issue_templates labels + ([9f00305](https://code.castopod.org/adaures/castopod/commit/9f00305844e5a168e89d727fe29892b4ad5e48d6)) +- rename MyAccount controller file + ([e109df3](https://code.castopod.org/adaures/castopod/commit/e109df3004a3a98d72de39532e062fff9917f50f)), + closes [#60](https://code.castopod.org/adaures/castopod/issues/60) +- rename podcast name to podcast handle to clarify field usage + ([9dd4c77](https://code.castopod.org/adaures/castopod/commit/9dd4c7741eb1b7cb5fc214ff674697f3aa986df0)), + closes [#126](https://code.castopod.org/adaures/castopod/issues/126) +- reorder fields as composite primary keys for analytics tables + ([9660aa9](https://code.castopod.org/adaures/castopod/commit/9660aa97c8ffd4fe61f3a388d52b9ac5dd8e1d63)) +- replace deletedField with published_at for episodes + ([14d7d07](https://code.castopod.org/adaures/castopod/commit/14d7d078225cdc8980759273a5dc4163d9f84b06)) +- replace getWebEnclosureUrl with getEnclosureWebUrl + ([8122cea](https://code.castopod.org/adaures/castopod/commit/8122ceaf8a70050f14b3078f28b024e7d7cdb9ac)) +- replace hardcoded style links with vite service + set default value for remote + transcript url + ([3f2e056](https://code.castopod.org/adaures/castopod/commit/3f2e05608e43d47bbb518a9acfaf56ec3eefafb4)), + closes [#149](https://code.castopod.org/adaures/castopod/issues/149) + [#150](https://code.castopod.org/adaures/castopod/issues/150) +- replace website key for webpages in breadcrumb translate file + ([50e32ff](https://code.castopod.org/adaures/castopod/commit/50e32ff75636c1d4c5d945a267e884cb26ad7191)) +- restore default podcast icon on public website + ([342778b](https://code.castopod.org/adaures/castopod/commit/342778bac3c684328d72633961df1a2ebdc1330e)) +- revert to beta.1's codeigniter4 version + ([e831411](https://code.castopod.org/adaures/castopod/commit/e83141127080ccde44987195db46ba97fd6cc2ca)) +- rewrite regenerate image function to use saveSizes method from Image entity + ([3889912](https://code.castopod.org/adaures/castopod/commit/38899124ec27e94a8c798bc2db528f9f785eec20)) +- **router:** check if Accept header is set before getting value + ([10a2ae0](https://code.castopod.org/adaures/castopod/commit/10a2ae02484672d6a0fbc6e7b943519c5ec16cb6)), + closes [#228](https://code.castopod.org/adaures/castopod/issues/228) +- **router:** trim URI slash to match same routes for URIs with and without + trailing slash + ([9e9375f](https://code.castopod.org/adaures/castopod/commit/9e9375f9a2cd6102f827b36ec521f4c86a557c00)) +- **rss-import:** add Castopod user-agent, handle redirects for downloaded + files, add Content namespace + ([214243b](https://code.castopod.org/adaures/castopod/commit/214243b3fec4937e45ef1ceaba1149004cdf3b44)) +- **rss:** cast number type values to string in rss_helper + ([7180ae9](https://code.castopod.org/adaures/castopod/commit/7180ae9ec700930b69c04ed91f8eceea16ad77ce)), + closes [#148](https://code.castopod.org/adaures/castopod/issues/148) +- **rss:** do not escape podcast and episode titles in the xml + ([0dd3b7e](https://code.castopod.org/adaures/castopod/commit/0dd3b7e0bf00d5a9eb80c93cba1efcada59ec3c1)), + closes [#138](https://code.castopod.org/adaures/castopod/issues/138) + [#71](https://code.castopod.org/adaures/castopod/issues/71) +- **rss:** remove escaping for publisher and owner name + ([6fc6347](https://code.castopod.org/adaures/castopod/commit/6fc6347846c126618cb7ff50164181650308d0c0)) +- **rss:** round episode durations and soundbites + ([c9fb987](https://code.castopod.org/adaures/castopod/commit/c9fb987fcfbe17069ec68fdbc823777079ce574b)), + closes [#214](https://code.castopod.org/adaures/castopod/issues/214) +- **rss:** set ❬itunes:author❭ tag to owner_name if publisher not specified + ([2271c14](https://code.castopod.org/adaures/castopod/commit/2271c1445b1ded12bc53b5d23b5e59d12b17c71a)), + closes [#96](https://code.castopod.org/adaures/castopod/issues/96) +- **rss:** use originalPath instead of originalMediaPath in Image library + ([b4012b7](https://code.castopod.org/adaures/castopod/commit/b4012b7d2ed6b34b69ad767570dd33f0dc7db920)) +- save transcript and chapters files to podcasts folder + ([63f49c7](https://code.castopod.org/adaures/castopod/commit/63f49c719f672b615c5a8893d3868dffcd332e47)) +- **search-episodes:** add fallback sql query using LIKE for search query with + less than 4 characters + ([e66bf44](https://code.castopod.org/adaures/castopod/commit/e66bf44341175bc5a10fbf7dfa00b351e76136c2)), + closes [#236](https://code.castopod.org/adaures/castopod/issues/236) +- **security:** add csrf filter + prevent xss attacks by escaping user input + ([cd2e1e1](https://code.castopod.org/adaures/castopod/commit/cd2e1e1dc37c53d32d00971c451c4800b8fd6107)) +- set cache expiration to next note publish to show note on publication date + ([0a66de3](https://code.castopod.org/adaures/castopod/commit/0a66de3e6c17d4ac94ee8e13bd00ceaf64b1303e)) +- set episode description footer to null when empty value + ([3a7d97d](https://code.castopod.org/adaures/castopod/commit/3a7d97d660046d80698611311ff3708110d2af82)) +- set episode duration translation to hardcoded english + ([c39efc9](https://code.castopod.org/adaures/castopod/commit/c39efc9489180662edcebd142d4476c0617ea97f)), + closes [#64](https://code.castopod.org/adaures/castopod/issues/64) +- set episode guid upon episode creation + ([ad8b153](https://code.castopod.org/adaures/castopod/commit/ad8b153f2a3b1a3b1751bf63785c4950e1516e6b)), + closes [#48](https://code.castopod.org/adaures/castopod/issues/48) +- set episode numbers during import + remove all custom form_helpers + minor ui + issues + ([99a3b8d](https://code.castopod.org/adaures/castopod/commit/99a3b8d33e00482da50dd62bdaa9215a351a56e4)) +- set interact_as_actor for user upon password reset + ([ad8f5f5](https://code.castopod.org/adaures/castopod/commit/ad8f5f5a0fac7b0b9cc10a0b86200f014aca7553)), + closes [#178](https://code.castopod.org/adaures/castopod/issues/178) +- set localized slug_field key as string in french language + ([17fb29b](https://code.castopod.org/adaures/castopod/commit/17fb29b20993b7deee4e252e0e3a4a2459ee0d98)) +- set location to null when getting empty string + ([71b1b5f](https://code.castopod.org/adaures/castopod/commit/71b1b5f775af475b1dc78328330e277f565e41b6)) +- set storage limit as disk_total_space instead of free space + ([7512e2e](https://code.castopod.org/adaures/castopod/commit/7512e2ed1ff5656cd63a4fc2524296dbb8b4164a)) +- **settings:** add .jpg extension to site-icon file input to display all jpeg + images + ([f611a16](https://code.castopod.org/adaures/castopod/commit/f611a16cd0c1a389e1c5a287eaec9d2a927a4bb6)) +- **socialinteract:** move social interact uri into uri attribute + update + social data upon import + ([12b2200](https://code.castopod.org/adaures/castopod/commit/12b22008a237185cb736fc29352fab22421dad16)) +- sort episodes by published_at with unpublished episodes at the begining + ([1686f84](https://code.castopod.org/adaures/castopod/commit/1686f840d16f2bd3d71d7f222a59b8e6a838fd6e)), + closes [#249](https://code.castopod.org/adaures/castopod/issues/249) +- sort episodic podcasts by season + ([d7b6794](https://code.castopod.org/adaures/castopod/commit/d7b6794f68f9a01fd606a407c6eb4c12d15dee74)) +- **themes:** update themes stylesheet route and remove css extension + ([e4e7e00](https://code.castopod.org/adaures/castopod/commit/e4e7e0005e931967dd6162588f1c5913dbf4603e)) +- **types:** update fake seeders types + fix bugs + ([76a4bf3](https://code.castopod.org/adaures/castopod/commit/76a4bf344160df679db29e236e7df7822970fb60)) +- **ui:** remove empty tooltip when hovering on sponsor button + ([40aa661](https://code.castopod.org/adaures/castopod/commit/40aa661289e1d1517fffcea5d257183bc9c458e4)) +- unpublish episode before deleting it + add validation step before deletion + ([f75bd76](https://code.castopod.org/adaures/castopod/commit/f75bd76458eeb01a2d37912695e33f77d03b7a69)), + closes [#112](https://code.castopod.org/adaures/castopod/issues/112) + [#55](https://code.castopod.org/adaures/castopod/issues/55) +- update .htaccess for shared hosting config + ([2379826](https://code.castopod.org/adaures/castopod/commit/2379826352e2f4b5060910bf9f29268610102f2e)) +- update broken contributor dropdown fields + ([e5b7515](https://code.castopod.org/adaures/castopod/commit/e5b75150234bd7f19e01def93425d3bda7379dd3)) +- update condition in AnalyticsTrait + ([fbc0967](https://code.castopod.org/adaures/castopod/commit/fbc0967caa81630d514ddb1b93b0834ebb4d913b)) +- update condition in home controller to redirect to install page + ([33f1b91](https://code.castopod.org/adaures/castopod/commit/33f1b91d55dd0652c979d50fc85879dbf88a4a42)) +- update conditions when checking for empty max_episodes and season_number + ([fbad0b5](https://code.castopod.org/adaures/castopod/commit/fbad0b59f68c65eba2fdcd5a8d3b312b622e9a45)) +- update form_textarea to prevent escaping value + ([78548b5](https://code.castopod.org/adaures/castopod/commit/78548b5cd75ea7d6688d1945ff5449ea4f6bec68)) +- update iso-369 language table seeder + ([0c90db4](https://code.castopod.org/adaures/castopod/commit/0c90db44c40de5af5b0b32b54489bda9424d9ef6)) +- update ivoox podcasting icon + ([f2b69a4](https://code.castopod.org/adaures/castopod/commit/f2b69a47339c887f57883ec612f3d200e512ac1c)) +- update MarkdownEditor component + restyle Button and other components + ([b05d177](https://code.castopod.org/adaures/castopod/commit/b05d177f1b7f44fef043ac5eb41f07133a2cf52d)) +- update purgecss content path for php helper files + ([eb70bb4](https://code.castopod.org/adaures/castopod/commit/eb70bb4f7078ff347aeb8f5dcc7896311d289466)), + closes [#59](https://code.castopod.org/adaures/castopod/issues/59) +- update translations for settings' tasks to include what they should be used + for + ([06b1a8b](https://code.castopod.org/adaures/castopod/commit/06b1a8b29b6ce5d81c5570d250bdac4e0c9ee5ca)) +- use slash instead of backslash to call layout + ([a80adb2](https://code.castopod.org/adaures/castopod/commit/a80adb22958fc0a38374cbce2d950a0042e699eb)) +- use UTC_TIMESTAMP() to get current utc date instead of NOW() in sql queries + ([4e22a0d](https://code.castopod.org/adaures/castopod/commit/4e22a0d5e4b60941d41071f059aac80cbaf38fbf)) +- **users:** remove required roles input when editing user + prevent owner's + roles from being edited + ([1c8af75](https://code.castopod.org/adaures/castopod/commit/1c8af7550ba27d8c8473ae96acd21ad7731fd863)), + closes [#239](https://code.castopod.org/adaures/castopod/issues/239) +- **ux:** allow for empty message upon episode publication and warn user on + submit + ([33d01b8](https://code.castopod.org/adaures/castopod/commit/33d01b8d4fd6ebf24e9f011aa705c456c846956c)), + closes [#129](https://code.castopod.org/adaures/castopod/issues/129) +- **ux:** have podcast dashboard card link to podcast dashboard if only one + podcast in instance + ([7dabee5](https://code.castopod.org/adaures/castopod/commit/7dabee58a187abe92358d962da506a836e29cda3)) +- **ux:** redirect user to install page on database error in home page + ([9017e30](https://code.castopod.org/adaures/castopod/commit/9017e30bf41bed8c2be65091bbc5fb1e63aef87a)) +- validate slug length when submitting episode form + clean permalink edit + prefix + ([b07ac09](https://code.castopod.org/adaures/castopod/commit/b07ac093b2cae646f9a897bc9dfeeaef6eda6561)) +- **video-clips:** check if created video exists before recreating it and + failing + ([dff1208](https://code.castopod.org/adaures/castopod/commit/dff12087251b2b89e195604202094b5ddd9a0936)) +- **video-clips:** clear video clip cache after process has finished + ([3ae6232](https://code.castopod.org/adaures/castopod/commit/3ae62325856f6ff331a5d9ed901b9fa097ca7055)) +- **video-clips:** create unique temporary files for resources to be deleted + after generation + ([7f7c878](https://code.castopod.org/adaures/castopod/commit/7f7c878cb6ecf7b4a967b2af87da82bc6593081e)) +- **video-clips:** set audio codec to aac, fixing audio issue on twitter + ([3c22c68](https://code.castopod.org/adaures/castopod/commit/3c22c68ee81f77bd7fcf7e2739ee6af016407843)) +- **video-clips:** set longer podcast and episode lengths for squared format + ([c030113](https://code.castopod.org/adaures/castopod/commit/c0301134c2048dc29eb2b995e4d5c22c49444100)) +- **video-clips:** tweak portrait parameters to have subtitles display without + overflowing + ([2385b1a](https://code.castopod.org/adaures/castopod/commit/2385b1a2926d1344569836e18cb30adb4c604664)) +- **video-clips:** update condition to check if ffmpeg is installed + ([b57f0b6](https://code.castopod.org/adaures/castopod/commit/b57f0b6eb65dccf22cb4d55f93d18ca36857d7fc)), + closes [#163](https://code.castopod.org/adaures/castopod/issues/163) +- **xml-editor:** escape xml editor's content + restyle form sections to prevent + overflowing + ([588590b](https://code.castopod.org/adaures/castopod/commit/588590bd2c0346e2465ff8f1930580d76a3bf068)) +- **xml-editor:** prettify xml even without root node + ([ca55c24](https://code.castopod.org/adaures/castopod/commit/ca55c248d0562a8529071c1f10be12f40ef50dda)) + +### Features + +- **activitypub:** add Podcast actor and PodcastEpisode object with comments + ([9e1e5d2](https://code.castopod.org/adaures/castopod/commit/9e1e5d2e862d6a3345d11ca7f96b955c76bfa013)) +- add about page in admin with instance info + database update button + ([d0836f3](https://code.castopod.org/adaures/castopod/commit/d0836f3ee360a836f815c59ea755f288501dc517)) +- add alternate rss feed link tag to podcast page head + ([a973c09](https://code.castopod.org/adaures/castopod/commit/a973c097d54a3d0186c4079b9d4d3e81aae38505)), + closes [#35](https://code.castopod.org/adaures/castopod/issues/35) +- add analytics and unknown useragents + ([ec92e65](https://code.castopod.org/adaures/castopod/commit/ec92e65aa42e09b1df04600b52a0c679dfc494bb)) +- add audio-clipper toolbar + add video-clip-previewer + ([0255753](https://code.castopod.org/adaures/castopod/commit/02557539e6eb48fc23ee2ee3b0c75aee3310965b)) +- add audio-clipper webcomponent (wip) + ([21d4251](https://code.castopod.org/adaures/castopod/commit/21d4251b9bcd5acb0f8a1761bc4edc34a3dbc228)) +- add autofocus to input field "Email or username" on login page + ([19caed4](https://code.castopod.org/adaures/castopod/commit/19caed4bce0daab9ccf6ab9645f44b60eb87de88)) +- add basic stats on podcast about page + ([1670558](https://code.castopod.org/adaures/castopod/commit/1670558473dba47219d470ff21d6224db6ab42ba)) +- add breadcrumb in admin area + ([7fb1de2](https://code.castopod.org/adaures/castopod/commit/7fb1de2cf3c97c4cd7afe3bd71bbe66041786ecd)), + closes [#17](https://code.castopod.org/adaures/castopod/issues/17) +- add cache to ActivityPub sql queries + cache activity and note pages + ([2d297f4](https://code.castopod.org/adaures/castopod/commit/2d297f45b3d7ef6e8711875a0b9b908e878115fa)) +- add CDN url + ([972bcbf](https://code.castopod.org/adaures/castopod/commit/972bcbf65ee119b8641ca3c4e5c0e8cf9ca8dd4f)), + closes [#37](https://code.castopod.org/adaures/castopod/issues/37) +- add codemirror to display xml editor for custom rss field + ([f15f262](https://code.castopod.org/adaures/castopod/commit/f15f26240cd5311fa9d07779f364b6639a501dec)) +- add cumulative listening time charts + ([588b4d2](https://code.castopod.org/adaures/castopod/commit/588b4d28da00bc12d02126e23181690f54d81716)) +- add default icons to Alert component + ([0d98001](https://code.castopod.org/adaures/castopod/commit/0d9800123b135e4fa1a2acd14a5e039c12174333)) +- add DropdownMenu component + remove global audio player in admin + ([abb7fba](https://code.castopod.org/adaures/castopod/commit/abb7fbac276d77b7d31a0aeba75d464f3ba3ad46)) +- add episode_numbering() component helper to display episode and season numbers + ([3f4a6bd](https://code.castopod.org/adaures/castopod/commit/3f4a6bd0b9f870f16107a41b102b6bf734868198)) +- add french translation + ([196920d](https://code.castopod.org/adaures/castopod/commit/196920d62f1810b4c35f800d17d7f93627319091)) +- add heading component + update ecs rules to fix views + ([23bdc6f](https://code.castopod.org/adaures/castopod/commit/23bdc6f8e36b7e8dfbe32755a54dea59ad913432)) +- add housekeeping task to run after migrations + ([89dee41](https://code.castopod.org/adaures/castopod/commit/89dee41d583e57251ea9315402a757f03571d7ad)) +- add install wizard form to bootstrap database and create the first superadmin + user + ([cba871c](https://code.castopod.org/adaures/castopod/commit/cba871c5df9f7120c44d9952456ebbd0d220669e)), + closes [#2](https://code.castopod.org/adaures/castopod/issues/2) +- add instructions on production error page to ease Castopod debugging process + ([9eab54e](https://code.castopod.org/adaures/castopod/commit/9eab54e0853ccb8300d9f9b743cd84aefbf06549)), + closes [#224](https://code.castopod.org/adaures/castopod/issues/224) +- add ISO 3166 country codes + ([97cd94b](https://code.castopod.org/adaures/castopod/commit/97cd94b47494b66faf43fbbe0748872da80020a4)) +- add js audio player on podcast, admin and embeddable player pages + fix admon + episodes ux + ([0e14eb4](https://code.castopod.org/adaures/castopod/commit/0e14eb4d3f526b0fd256a6144f3fbfc3fe52a357)), + closes [#131](https://code.castopod.org/adaures/castopod/issues/131) +- add label to sponsor button on podcast page + ([c29c018](https://code.castopod.org/adaures/castopod/commit/c29c018c7a543fc9398b5d7d11f086123e2b33f2)), + closes [#162](https://code.castopod.org/adaures/castopod/issues/162) +- add legalNoticeURL to app config for setting an external url to legal notice + ([711843a](https://code.castopod.org/adaures/castopod/commit/711843a0c81e1e2ec7a015431786df4ef32d5092)) +- add lock podcast according to the Podcastindex podcast-namespace to prevent + unauthozized import + ([72b3012](https://code.castopod.org/adaures/castopod/commit/72b301272e0b70ded3e2b237391909e3f152ad0b)) +- add map analytics, add episodes analytics, clean analytics page layout, + translate countries + ([07eae83](https://code.castopod.org/adaures/castopod/commit/07eae83a00d860e149359fae67d549488403d88b)) +- add media entity and link documents, images and audio files to it + ([6ecf286](https://code.castopod.org/adaures/castopod/commit/6ecf2866cfcde31a0840f15c3340808ce14b44cf)) +- add notifications inbox for actors + ([999999e](https://code.castopod.org/adaures/castopod/commit/999999e3efab7b1aad7568e4fd114dc7bac04f38)), + closes [#215](https://code.castopod.org/adaures/castopod/issues/215) +- add Noto Sans Mono font to use for durations + button to access new video clip + form in list + ([7609bb6](https://code.castopod.org/adaures/castopod/commit/7609bb60330539aa91bfdafbb35c2d585624218a)) +- add npm for js dependencies + move src/ files to root folder + ([cbb83a6](https://code.castopod.org/adaures/castopod/commit/cbb83a6f308ac9357e9fb0cca5edae9d3fee5b48)) +- add Open Graph and Twitter meta tags + ([af970b8](https://code.castopod.org/adaures/castopod/commit/af970b8bac949e4c63047e04aca1b7403a4e8deb)), + closes [#41](https://code.castopod.org/adaures/castopod/issues/41) +- add pages table to store custom instance pages (eg. legal-notice, cookie + policy, etc.) + ([9c224a8](https://code.castopod.org/adaures/castopod/commit/9c224a8ac6dd95f3c6c087a300fc8bac48e8090f)), + closes [#24](https://code.castopod.org/adaures/castopod/issues/24) +- add permanent delete feature for podcasts 🎉 + ([dbb4030](https://code.castopod.org/adaures/castopod/commit/dbb4030da49f9ea1f61759fb7c66d71fc29ea4a1)), + closes [#89](https://code.castopod.org/adaures/castopod/issues/89) +- add platform models + ([a333d29](https://code.castopod.org/adaures/castopod/commit/a333d291966229a909c0851fd8b890ed97c48ceb)) +- add platforms form in podcast settings + ([043f49c](https://code.castopod.org/adaures/castopod/commit/043f49c784bc007ca0fa756ca4ed2d3b08843ad9)) +- add platforms tables + ([ce59344](https://code.castopod.org/adaures/castopod/commit/ce5934419a516c9926dd3fd0ace3c11a95b60722)) +- add podcast banner field for each podcast + refactor images configuration + ([4a8147b](https://code.castopod.org/adaures/castopod/commit/4a8147bfbbd98d9badfc57a0f2a18bdd5812e802)) +- add premium podcasts to manage subscriptions for premium episodes + ([3234500](https://code.castopod.org/adaures/castopod/commit/3234500e2d967438ad140f65da801a543f43775d)), + closes [#193](https://code.castopod.org/adaures/castopod/issues/193) +- add publish feature for podcasts and set draft by default + ([3d363f2](https://code.castopod.org/adaures/castopod/commit/3d363f2efe99836ac05c305a2fa683e342f06561)), + closes [#128](https://code.castopod.org/adaures/castopod/issues/128) + [#220](https://code.castopod.org/adaures/castopod/issues/220) +- add remote_url alternative for transcript and chapters files + ([3143c9a](https://code.castopod.org/adaures/castopod/commit/3143c9ad36e4cf1364205cf2be39c0c96f80fdd2)) +- add replied to post or comment to reply element + ([d0f9c60](https://code.castopod.org/adaures/castopod/commit/d0f9c6018f1af527099f3e26b5d824710fa11caf)) +- add schema.org json-ld objects to podcasts, episodes, posts and comments pages + ([902f959](https://code.castopod.org/adaures/castopod/commit/902f959b30a10839684f093eb86edebc5d826a0b)) +- add task to housekeeping setting for resetting all instance counts + ([9303e51](https://code.castopod.org/adaures/castopod/commit/9303e51bc50d730a8026f58984e83b840360ee88)) +- add unique listeners analytics + ([3a49258](https://code.castopod.org/adaures/castopod/commit/3a4925816f3268230640525ad7af507aab8eecb9)) +- add update rss feed feature for podcasts to import their latest episodes + ([5eb9dc1](https://code.castopod.org/adaures/castopod/commit/5eb9dc168eb9af04767829b76242c9120f55d46d)), + closes [#183](https://code.castopod.org/adaures/castopod/issues/183) +- add user permissions and basic groups to handle authorizations + ([d58e518](https://code.castopod.org/adaures/castopod/commit/d58e51874a4722921b75b0049117015c2380406e)), + closes [#3](https://code.castopod.org/adaures/castopod/issues/3) + [#18](https://code.castopod.org/adaures/castopod/issues/18) +- add WebSub module for pushing feed updates to open hubs + ([10d3f73](https://code.castopod.org/adaures/castopod/commit/10d3f73786ba141e27a822b2585c4a244ee92c14)) +- **admin:** add instance wide dashboard with storage and bandwidth usage + ([b1a6c02](https://code.castopod.org/adaures/castopod/commit/b1a6c02e56fdc01a7ff69fa7e7dd8ea71380b7ba)), + closes [#216](https://code.castopod.org/adaures/castopod/issues/216) +- **admin:** add search form in podcast episodes list + ([6be5d12](https://code.castopod.org/adaures/castopod/commit/6be5d12877342a7c56e25ea8dd15a975c6ce45ac)), + closes [#26](https://code.castopod.org/adaures/castopod/issues/26) +- **admin:** make header stick on scroll and show title + action buttons using + css only + ([d60498c](https://code.castopod.org/adaures/castopod/commit/d60498c1beb970a14eeb3bbe02d1b1d8116624b0)) +- **admin:** update admin layout for better ux + update brand pine colors + ([d86142e](https://code.castopod.org/adaures/castopod/commit/d86142ebe7cd7582835f180b79fbeaaaba703528)) +- allow cross origin requests on episode comments + ([e12f95a](https://code.castopod.org/adaures/castopod/commit/e12f95aca13c6d54489a9cfd99d4cd2490fe83ab)) +- **analytics-gdpr:** update cached personal data to expire at midnight + ([0188b67](https://code.castopod.org/adaures/castopod/commit/0188b67354a756f0c926edd7b46623ab5b20c12b)) +- **analytics:** add 'other' group to pie charts in order to display more + accurate data + ([73acef9](https://code.castopod.org/adaures/castopod/commit/73acef933ff3485987afc5157de022910876fc12)) +- **analytics:** add charts and data export + ([78625c4](https://code.castopod.org/adaures/castopod/commit/78625c471b4f03a09bd42f72b82217e1f2d01cef)) +- **analytics:** add current date and secret salt to analytics hash for improved + privacy + ([6f2e7c0](https://code.castopod.org/adaures/castopod/commit/6f2e7c009c24830d4f08633bfbde3b75f40bf215)) +- **analytics:** add service name from rss user-agent + ([7202b98](https://code.castopod.org/adaures/castopod/commit/7202b9867bd59aafa8c338a4230fb5e5c55b24c6)) +- **analytics:** add weekday and hour bar charts + ([8ab3132](https://code.castopod.org/adaures/castopod/commit/8ab313296bb4a254ab05e90b17d896039839b784)) +- **api:** add rest api with podcasts read endpoints + ([e64001d](https://code.castopod.org/adaures/castopod/commit/e64001d00604bcf587ec5e9a631282f212df450d)), + closes [#210](https://code.castopod.org/adaures/castopod/issues/210) +- apply colour theme to embed player + ([9548337](https://code.castopod.org/adaures/castopod/commit/9548337a7c49879e8b58c2dfece46e3cfc9517eb)), + closes [#201](https://code.castopod.org/adaures/castopod/issues/201) +- **auth:** add auth.enable2FA config to enable two-factor authentication + ([7213ed2](https://code.castopod.org/adaures/castopod/commit/7213ed290c977ce8723f6d92addadc03913576ee)) +- build hashed static files to renew browser cache + ([37c54d2](https://code.castopod.org/adaures/castopod/commit/37c54d247749bdf8f528babd4a78f24d48051063)), + closes [#107](https://code.castopod.org/adaures/castopod/issues/107) +- **cache:** add podcast and episode pages to cache + clear them after insert or + update + ([da0f047](https://code.castopod.org/adaures/castopod/commit/da0f0472819007e02e5da37399f2377772c618b9)) +- **categories:** create model, entity, migrations and seeds + ([f73b042](https://code.castopod.org/adaures/castopod/commit/f73b042cc091be82abdbbca8992080875d526972)) +- **clips:** setup clip entities and model + save video clip to have it + generated in the background + ([2f6fdf9](https://code.castopod.org/adaures/castopod/commit/2f6fdf9091d52ca49709fc82621ba1c6dd0e817d)) +- **comments:** add comments to episodes + update naming of status to post + ([bb4752c](https://code.castopod.org/adaures/castopod/commit/bb4752c35e086664f5fd75fdc0d56546a1e356f6)) +- **comments:** add like / undo like to comment + add comment page + ([0c187ef](https://code.castopod.org/adaures/castopod/commit/0c187ef7a9278a60bcc6e5ee4d69d948b51e5c54)) +- **components:** add custom view renderer with ComponentRenderer adapted from + bonfire2 + ([a95de8b](https://code.castopod.org/adaures/castopod/commit/a95de8bab010f6b01c598da72191abe97e473687)) +- create optimized & resized images upon upload + ([02e4441](https://code.castopod.org/adaures/castopod/commit/02e4441f98f27e9534e5b9b63279153d14632ccd)), + closes [#6](https://code.castopod.org/adaures/castopod/issues/6) +- **custom-rss:** add custom xml tag injection in rss feed for ❬channel❭ and + ❬item❭ + ([6ecdaad](https://code.castopod.org/adaures/castopod/commit/6ecdaad911d06b7f7a2b7d24710968c7eb9118f6)) +- **datetime-picker:** set material_green theme to flatpickr + ([3ce6541](https://code.castopod.org/adaures/castopod/commit/3ce6541003260677e722a916ad6bc83ef47c4371)) +- **devcontainer:** add devcontainer settings for dev environment + ([69e7266](https://code.castopod.org/adaures/castopod/commit/69e72667365247b63430dee88194e8f0d7c28edc)) +- display castopod version in admin footer + ([9f2574e](https://code.castopod.org/adaures/castopod/commit/9f2574e6fbb61dac4e1a4252dff30017685da5f0)), + closes [#68](https://code.castopod.org/adaures/castopod/issues/68) +- display legal disclaimer and warning on podcast import page + ([2f07992](https://code.castopod.org/adaures/castopod/commit/2f07992e5508b34b91f194eebfac80c51e80e90a)), + closes [#34](https://code.castopod.org/adaures/castopod/issues/34) +- edit + delete podcast and episode + ([ac5f0c7](https://code.castopod.org/adaures/castopod/commit/ac5f0c732806e955c01e05b7867801bc938c6bd5)) +- **embeddable-player:** add embeddable player widget + ([141788f](https://code.castopod.org/adaures/castopod/commit/141788fa089f9dedc8956c64ca515a4a4625f904)) +- enhance admin ui with responsive design and ux improvements + ([2d44b45](https://code.castopod.org/adaures/castopod/commit/2d44b457a02205d2e7da258d7029b8bc5da39533)), + closes [#31](https://code.castopod.org/adaures/castopod/issues/31) + [#9](https://code.castopod.org/adaures/castopod/issues/9) +- enhance ui using javascript in admin area + ([c0e66d5](https://code.castopod.org/adaures/castopod/commit/c0e66d5f7012026e145d106f4d6bd3ba792a1b77)) +- **episode-unpublish:** remove episode comments upon unpublish + ([78acd7f](https://code.castopod.org/adaures/castopod/commit/78acd7f5c057c82507d801c424040296dbaba586)) +- **episode:** add form to allow editing episode's publication date to a past + date + ([d783d16](https://code.castopod.org/adaures/castopod/commit/d783d16eb73d3f896a3dea39a766b4e963e53abf)), + closes [#97](https://code.castopod.org/adaures/castopod/issues/97) +- **episodes:** add create form and view pages for episode + ([f3b2c8b](https://code.castopod.org/adaures/castopod/commit/f3b2c8b84f3d93bef734e34dbe8ed729535e45e9)), + closes [#1](https://code.castopod.org/adaures/castopod/issues/1) +- **episodes:** add migrations, model and entity for episodes table + ([0444821](https://code.castopod.org/adaures/castopod/commit/044482174ede555ce19a2d8c6f48771cc8e7d27b)) +- **episodes:** replace all audio file URL parameters with base64 encoded data + ([e1f65cd](https://code.castopod.org/adaures/castopod/commit/e1f65cd3b53353a30d4ab6eb5312393cf04a1676)) +- **episodes:** replace soft delete with permanent delete + ([eb9ff52](https://code.castopod.org/adaures/castopod/commit/eb9ff522c25af8ceb2ed08614b581757ee791d42)) +- **episodes:** schedule episode with future publication_date by using cache + expiration time + ([4f1e773](https://code.castopod.org/adaures/castopod/commit/4f1e773c0f9e4c2597f6c1b0a4773dfb34b2f203)), + closes [#47](https://code.castopod.org/adaures/castopod/issues/47) +- **fediverse:** implement activitypub protocols + update user interface + ([2f525c0](https://code.castopod.org/adaures/castopod/commit/2f525c0f6e44d320bff16e22c223481923ba683e)), + closes [#69](https://code.castopod.org/adaures/castopod/issues/69) + [#65](https://code.castopod.org/adaures/castopod/issues/65) + [#85](https://code.castopod.org/adaures/castopod/issues/85) + [#51](https://code.castopod.org/adaures/castopod/issues/51) + [#91](https://code.castopod.org/adaures/castopod/issues/91) + [#92](https://code.castopod.org/adaures/castopod/issues/92) + [#88](https://code.castopod.org/adaures/castopod/issues/88) +- **fonts:** replace Montserrat with Inter for better readablity + ([bfa11d0](https://code.castopod.org/adaures/castopod/commit/bfa11d007d04b8ac714c8cf3b8050a6aaf177a26)) +- **GDPR:** add GDPR.yml file to public/.well-known/ + ([86bccc3](https://code.castopod.org/adaures/castopod/commit/86bccc3d5cc9562b89196f1766ac91cdc8ad786d)) +- **gdpr:** add purpose for granting access to premium content + ([47d6d81](https://code.castopod.org/adaures/castopod/commit/47d6d81b798ec3ed467e0f4339c98c8a6b80cecd)) +- **home:** sort podcasts by recent activity + add dropdown menu to choose + between sorting options + ([7b89da6](https://code.castopod.org/adaures/castopod/commit/7b89da6106c150708782d39ed2742fe416c41e89)), + closes [#164](https://code.castopod.org/adaures/castopod/issues/164) +- **housekeeping:** add clear_cache option to flush redis or files cache + ([99bfac0](https://code.castopod.org/adaures/castopod/commit/99bfac0b428a4bc6fe8bfd10a355dfd93f42ba5c)) +- **i18n:** add 7 new languages + update german translations + ([d021abb](https://code.castopod.org/adaures/castopod/commit/d021abb52f5525d93810e25df2b453c918d7bc8b)) +- **i18n:** add german language as supported locale + create Language files from + english source + ([c220b31](https://code.castopod.org/adaures/castopod/commit/c220b310ed59cad188af044b1fed0c39efc7da5b)) +- **i18n:** add Norwegian Nynorsk to supported locales + ([ced61fc](https://code.castopod.org/adaures/castopod/commit/ced61fc2364f954c1f6e0208b572faf5741498a8)) +- **i18n:** add Polish translation + ([2d83b44](https://code.castopod.org/adaures/castopod/commit/2d83b44add9e4e00766a1f326377ed892f48ad73)) +- **i18n:** add Spanish to supported locales + ([e340b54](https://code.castopod.org/adaures/castopod/commit/e340b54a84d7dcdf9ba910fe7ff39c453fac0968)) +- **i18n:** add support for German and Brazilian Portuguese languages + ([c9b9fe4](https://code.castopod.org/adaures/castopod/commit/c9b9fe4ee893de9a1df7f8269c39d08a90d205d6)) +- **i18n:** add support for Simplified Chinese (zh-Hans) and Catalan (ca) + locales + ([48d1443](https://code.castopod.org/adaures/castopod/commit/48d14434727c3310a391160c7af02c56b7e20425)) +- **icons:** add default icons for podcasting, social and funding platforms + + remove complex icons + ([5bcdfeb](https://code.castopod.org/adaures/castopod/commit/5bcdfebe6489b5d6b90f3c828b014ec4e9a7e7e1)), + closes [#166](https://code.castopod.org/adaures/castopod/issues/166) + [#167](https://code.castopod.org/adaures/castopod/issues/167) + [#170](https://code.castopod.org/adaures/castopod/issues/170) +- **icons:** add podnews icon to podcasting platforms + ([5f42355](https://code.castopod.org/adaures/castopod/commit/5f423557c2b78fd7c38c5e0caab6c6c80d21e36e)), + closes [#190](https://code.castopod.org/adaures/castopod/issues/190) +- import podcast from an rss feed url + ([9a5d5a1](https://code.castopod.org/adaures/castopod/commit/9a5d5a15b4945eb319da9e999c4ca60a0a4f6d2d)), + closes [#21](https://code.castopod.org/adaures/castopod/issues/21) +- integrate stylized form components and update podcast edit page + ([6536729](https://code.castopod.org/adaures/castopod/commit/653672954606a23796e8a7bda3c34fd6b92f84e0)) +- make displayed publication time as relative time using @github/time-elements + ([230e139](https://code.castopod.org/adaures/castopod/commit/230e139e43324b9ebef06ca8f6e13b3d9a7bdc70)) +- make episode description more visible on episode pages + ([90533be](https://code.castopod.org/adaures/castopod/commit/90533be0298249e5527870c01329fce5f94ec2dc)), + closes [#171](https://code.castopod.org/adaures/castopod/issues/171) +- **map:** display geolocated episodes on a map page + ([4357cc2](https://code.castopod.org/adaures/castopod/commit/4357cc25ccc585ce398035c1c25d566b6a9df775)) +- **media:** clean media api + create an entity per media type + ([fafaa7e](https://code.castopod.org/adaures/castopod/commit/fafaa7e689b17f09a2b056081fa1f4fc53bf716b)) +- **media:** save audio, images, transcripts and chapters to media for episode + and persons + ([58e2a00](https://code.castopod.org/adaures/castopod/commit/58e2a00a87fa7d5b188e13cc521d94f0cfddba50)) +- **meta-tags:** add activitypub alternate links to podcast, episode, comment + and post pages + ([bd61752](https://code.castopod.org/adaures/castopod/commit/bd61752be2f574323b05d1d0aee0df55adf9a74e)) +- minor corrections to some tables + ([3bf9420](https://code.castopod.org/adaures/castopod/commit/3bf9420b5956a501b3b24405d243a71a928d6086)) +- **monetization:** add Web Monetization support + ([96a6026](https://code.castopod.org/adaures/castopod/commit/96a6026f1db452085360f5fe248de82a2ec06468)) +- **nodeinfo2:** add .well-known route for nodeinfo2 containing metadata about + the castopod instance + ([88fddc8](https://code.castopod.org/adaures/castopod/commit/88fddc81d730978f2a4d8a671936b54041e3fe45)) +- **partner:** add link and image in episode description + ([ad07bb9](https://code.castopod.org/adaures/castopod/commit/ad07bb9330dc9493813368e969e1f3a3def44614)) +- **person:** add podcastindex.org namespace person tag + ([8acd011](https://code.castopod.org/adaures/castopod/commit/8acd011f13e99492ef4b44b327685bb006fe5f8f)) +- **platforms:** add AntennaPod + ([53e9cfd](https://code.castopod.org/adaures/castopod/commit/53e9cfd61c794b1539e9d4691d3c4e73c4b7aaa7)) +- **platforms:** add Fediverse and some funding platforms, add link on logo + ([afc3d50](https://code.castopod.org/adaures/castopod/commit/afc3d50289bb4173e0697d109ffe72f6814b93d1)) +- **platforms:** add helloasso + ([16cb993](https://code.castopod.org/adaures/castopod/commit/16cb993ee6e28987a840fc27a9c2c73794c67697)) +- **platforms:** add missing newpodcastapps.com's platforms + ([92dd370](https://code.castopod.org/adaures/castopod/commit/92dd370e2f9a464edd26cddcde96d0e16f91548d)) +- **platforms:** add pod.link + ([3d7a232](https://code.castopod.org/adaures/castopod/commit/3d7a2320ddd116e4a311605421126aff57243219)) +- **platforms:** add Podcast Index + ([ad52b1c](https://code.castopod.org/adaures/castopod/commit/ad52b1cc2b7d0bc844970214d205961a7196b4a9)) +- **platforms:** add podfriend + ([9fdc8d3](https://code.castopod.org/adaures/castopod/commit/9fdc8d32930234c7ffd2be6892be57febcef1086)) +- **podcast-form:** add new_feed_url field to set an url when changing domain or + host + ([e7eec48](https://code.castopod.org/adaures/castopod/commit/e7eec48e7bc06a9aa907db01ed3e5b536e7dd8be)) +- **podcast-form:** update routes and redirect to podcast page + ([12ce905](https://code.castopod.org/adaures/castopod/commit/12ce905799002dc9c07e6de092342d30ba9fd7d8)) +- **podcast:** create a podcast using form + ([1202ba3](https://code.castopod.org/adaures/castopod/commit/1202ba3545f521097c60a6a2af95e70527cd1d34)) +- **podcasting 2.0:** update podcast:social tag to adhere to latest spec + ([a597cf4](https://code.castopod.org/adaures/castopod/commit/a597cf4ecfa6807a3413177d99c816056a7e7c45)) +- prefill season and episode numbers + set episode number as mandatory for + serial podcasts + ([07d740b](https://code.castopod.org/adaures/castopod/commit/07d740b79f9283e389e723954f680f909ce5de4a)), + closes [#134](https://code.castopod.org/adaures/castopod/issues/134) + [#136](https://code.castopod.org/adaures/castopod/issues/136) +- **public-ui:** adapt public podcast and episode pages to wireframes + ([40a0535](https://code.castopod.org/adaures/castopod/commit/40a0535fc1bc12a24994b651f5e00b35995cbdda)), + closes [#30](https://code.castopod.org/adaures/castopod/issues/30) + [#13](https://code.castopod.org/adaures/castopod/issues/13) +- **pwa:** add service-worker + webmanifest for each podcasts to have them + install on devices + ([fee2c1c](https://code.castopod.org/adaures/castopod/commit/fee2c1c0d0d03c4ff0a6a207b0a5e0c22bb7b13a)) +- redesign public podcast and episode pages + remove any information clutter for + better ux + ([9321400](https://code.castopod.org/adaures/castopod/commit/932140077c671f0486a2cd08ceb6126c7ecde87f)) +- replace form helper functions with components in admin template + ([e64548b](https://code.castopod.org/adaures/castopod/commit/e64548b982ba47ff35f2272e2e30dd85eeba950b)) +- replace slug field with interactive permalink component + ([578022b](https://code.castopod.org/adaures/castopod/commit/578022b8c5163ffaf8db5870ed5ec9d5d9536477)) +- restyle episode and person cards + add focus style to interactive elements for + a11y + ([a505a1d](https://code.castopod.org/adaures/castopod/commit/a505a1de56e8e3056379bd60d0595f432e294728)) +- **rss:** add ˂podcast:guid˃ tag for channel + ([1fab10e](https://code.castopod.org/adaures/castopod/commit/1fab10eb0d63bb7c3edf34ffe691e2aec2c2e43c)) +- **rss:** add podcast-namespace tags for platforms + previousUrl tag + ([dbba8dc](https://code.castopod.org/adaures/castopod/commit/dbba8dc58133967c778514268cbfed8098ed1dbc)), + closes [#73](https://code.castopod.org/adaures/castopod/issues/73) + [#75](https://code.castopod.org/adaures/castopod/issues/75) + [#76](https://code.castopod.org/adaures/castopod/issues/76) + [#80](https://code.castopod.org/adaures/castopod/issues/80) +- **rss:** add podcast:comments tag to link to episode comments + ([32e8c7c](https://code.castopod.org/adaures/castopod/commit/32e8c7c16a61ffe08e2f3bfbdeda556811a0358c)) +- **rss:** add podcast:location tag + ([c0a2282](https://code.castopod.org/adaures/castopod/commit/c0a22829bd87d48535a86e60c6cd7280e44683a2)) +- **rss:** add rss feed route without the `.xml` extension + ([94c0b7c](https://code.castopod.org/adaures/castopod/commit/94c0b7c15920dae9ade5cdc79c7996dbfe82ba05)), + closes [#247](https://code.castopod.org/adaures/castopod/issues/247) +- **rss:** add soundbites according to the podcastindex specs + ([6b34617](https://code.castopod.org/adaures/castopod/commit/6b34617d07c70522cb941e96d91d9987493413eb)), + closes [#83](https://code.castopod.org/adaures/castopod/issues/83) +- **rss:** add transcript and chapters support + ([e769d83](https://code.castopod.org/adaures/castopod/commit/e769d83a932c169e52a630a17cd4dd8ac5cebaf6)), + closes [#72](https://code.castopod.org/adaures/castopod/issues/72) + [#82](https://code.castopod.org/adaures/castopod/issues/82) +- **rss:** generate rss feed from podcast entity + ([c815ecd](https://code.castopod.org/adaures/castopod/commit/c815ecd6640931fee0895f80908a3ddfac482666)) +- **rss:** update monetization tag so that it meets PodcastIndex requirements + ([4c7ecbe](https://code.castopod.org/adaures/castopod/commit/4c7ecbee83950e5f9f2482cedaab18a1ac9bfc9e)) +- **select:** enhance select input with choices.js + ([910d457](https://code.castopod.org/adaures/castopod/commit/910d457cf843e0fc334b3505a4727d51633395ac)) +- set app parameter forceGlobalSecureRequests = true forcing requests to go + through https + ([d9dff1b](https://code.castopod.org/adaures/castopod/commit/d9dff1b8bf89c8b526ad6cb89f98a1f160d49117)) +- set podcast / episode description in the pages description meta tag + ([1c4a504](https://code.castopod.org/adaures/castopod/commit/1c4a50442bea2d3449efce9c5ff1c80743152f55)), + closes [#44](https://code.castopod.org/adaures/castopod/issues/44) +- **settings:** add general config for instance (site name, description and + icon) + ([5c56f3e](https://code.castopod.org/adaures/castopod/commit/5c56f3e6f00a61af2ccf50811c155c325f2b10fa)) +- **settings:** add theme settings to set an accent color for all public pages + ([5c529a8](https://code.castopod.org/adaures/castopod/commit/5c529a83aa6d6147d94e5aee996e6b0ab02f0ce4)) +- simplify podcast page's layout for better ux + ([2c0efc6](https://code.castopod.org/adaures/castopod/commit/2c0efc6563604dd067be88cfc9ddd88a01745e64)) +- **soundbites:** add soundbite list and creation forms with audio-clipper + component + ([de19317](https://code.castopod.org/adaures/castopod/commit/de19317138a2106deb825c1eed7dda036ed7dac3)) +- style file inputs using tailwind's file class + ([8208ab6](https://code.castopod.org/adaures/castopod/commit/8208ab6785aae8c49f78eb9ac8cd53d77ec8e5e5)) +- **themes:** add ViewThemes library to set views in root themes folder + ([7a27676](https://code.castopod.org/adaures/castopod/commit/7a276764e6a1ee3619d9d3488f6163215db75338)) +- **themes:** set different default banner per theme + ([11c916f](https://code.castopod.org/adaures/castopod/commit/11c916fe433eb749ac32230c48e256057564cbb0)) +- **themes:** set generic css variables for colors to enable instance themes + ([a746a78](https://code.castopod.org/adaures/castopod/commit/a746a781b4bfc78209cf8302c6d7bb3cb452e446)) +- toggle podcast sidebar on smaller screens + ([f0205ec](https://code.castopod.org/adaures/castopod/commit/f0205ec274414e881cba40d6776126f05eaee583)) +- **transcript:** parse srt subtitles into json file + add max file size info + below audio file input + ([0098761](https://code.castopod.org/adaures/castopod/commit/00987610a068c8d6cdd4421ea16585fa037eb61a)) +- **ui:** create ViewComponents library to enable building class and view files + components + ([94872f2](https://code.castopod.org/adaures/castopod/commit/94872f2338e6025c2f3770be256160838dae9003)) +- update analytics so to meet IABv2 requirements + ([03e23a2](https://code.castopod.org/adaures/castopod/commit/03e23a28bf9b1b73fba55352c36a8cd6cc8ae729)), + closes [#10](https://code.castopod.org/adaures/castopod/issues/10) +- update pine colors + create charts components + ([a50abc1](https://code.castopod.org/adaures/castopod/commit/a50abc138d4997b564e3065b37504cda5ce62da6)) +- **users:** add myth-auth to handle users crud + add admin gateway only + accessible by login + ([c63a077](https://code.castopod.org/adaures/castopod/commit/c63a077618c61b4cde7f25ffc650a4b0e1495f44)), + closes [#11](https://code.castopod.org/adaures/castopod/issues/11) +- **ux:** remove admin dashboard and redirect directly to podcast list + ([27c48b8](https://code.castopod.org/adaures/castopod/commit/27c48b8fa930b33e5e15f0c8685e468e857ca9cd)) +- **video-clip:** add video-clip page with video preview + logs + ([42538dd](https://code.castopod.org/adaures/castopod/commit/42538dd7577be0ffe59b4fdfadbd76cc89e5ef30)) +- **video-clip:** generate video clips in the bg using a cron job + add video + clip page + tidy up UI + ([db0e427](https://code.castopod.org/adaures/castopod/commit/db0e4272bd6d307c562e1f961d2747cb62de0f35)) +- **video-clips:** add dimensions for portrait and squared formats + ([3af404d](https://code.castopod.org/adaures/castopod/commit/3af404da3dd1901c78cc7e1778fc225f6716207d)) +- **video-clips:** add new themes + add castopod logo as a watermark + ([1d1490b](https://code.castopod.org/adaures/castopod/commit/1d1490b06a1f5ecb10b3b98a72efc55d09c10944)) +- **video-clips:** add route for scheduled video clips + list video clips with + status + ([2065ebb](https://code.castopod.org/adaures/castopod/commit/2065ebbee5e3d0f890ac90b55ca984f1d62a184c)) +- **video-clips:** allow episodeNumbering text to stand in the indent of + episodeTitle paragraph + ([71a063d](https://code.castopod.org/adaures/castopod/commit/71a063dac311cb21639801fbae6af7c5106c2699)) +- **video-clips:** generate a 16:9 video using ffmpeg + ([35aa7ea](https://code.castopod.org/adaures/castopod/commit/35aa7ea5d9a339b3e6f745137282268d69fe2231)) +- **video-clips:** generate subtitles clip using transcript json to have + subtitles accross video + ([3ce07e4](https://code.castopod.org/adaures/castopod/commit/3ce07e455d171e29be30d8ad45055510eb8d363c)) +- **video-clips:** replace hardcoded colors with config's theme colors + ([e462abf](https://code.castopod.org/adaures/castopod/commit/e462abf6d660e41d2170c52caf45704008de58e9)) +- **vite:** add vite config to decouple it from CI_ENVIRONMENT + ([8721719](https://code.castopod.org/adaures/castopod/commit/8721719cd7cf32e94823541eafaba1e9309355a8)) +- write id3v2 tags to episode's audio file + ([4651d01](https://code.castopod.org/adaures/castopod/commit/4651d01a84ff3ea8433a8ae26cfd750a1ec9e88d)) + +### Performance Improvements + +- **cache:** update CI4 to use cache's deleteMatching method + ([54b84f9](https://code.castopod.org/adaures/castopod/commit/54b84f96843af13f579fea49102c8c2ef81b0a54)) +- **cache:** use deleteMatching method to prevent forgetting cached elements in + models + ([76afc0c](https://code.castopod.org/adaures/castopod/commit/76afc0cfa2feb087697bae4bc138e4956873dd62)) +- defer javascript + lazy load images for faster page loads + ([f0685e4](https://code.castopod.org/adaures/castopod/commit/f0685e44799dfb494592ff97841c0ae035381db8)) +- **docker:** add redis caching service for development + ([05ace8c](https://code.castopod.org/adaures/castopod/commit/05ace8cff2ef02d19abd40097ac5546dca6a54ca)) + +### Reverts + +- **install:** redirect to install in homepage if no database was set + ([73f094d](https://code.castopod.org/adaures/castopod/commit/73f094daf26a8cf75e39ebff1eeb7f9039276312)) +- set deprecated config options back in App config + ([433745f](https://code.castopod.org/adaures/castopod/commit/433745f194c73407999b207090478563283876a5)) +- **soundbites:** remove soundbite table from episode's public page + ([5dc0f19](https://code.castopod.org/adaures/castopod/commit/5dc0f19656de0d764f627d6ae78a9e306c901835)) +- use basic input file for episodes audio files instead of button for better UX + ([d5f22fb](https://code.castopod.org/adaures/castopod/commit/d5f22fbb38c43d9b37df401eff655958a57cb40a)) + +### BREAKING CHANGES + +- **analytics:** analytics_podcasts_by_player table and analytics_podcasts + procedure were updated + # [1.0.0-beta.24](https://code.castopod.org/adaures/castopod/compare/v1.0.0-beta.23...v1.0.0-beta.24) (2022-10-14) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index b52f7ea4..0b096b0f 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.0.0-beta.24'); +defined('CP_VERSION') || define('CP_VERSION', '1.0.0'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 7b06b0d8..bee66770 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "podlibre/castopod-host", - "version": "1.0.0-beta24", + "version": "1.0.0", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package-lock.json b/package-lock.json index f5089385..1e8e6b2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "castopod-host", - "version": "1.0.0-beta.24", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "castopod-host", - "version": "1.0.0-beta.24", + "version": "1.0.0", "license": "AGPL-3.0-or-later", "dependencies": { "@amcharts/amcharts4": "^4.10.29", diff --git a/package.json b/package.json index 34432201..8b04354a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod-host", - "version": "1.0.0-beta.24", + "version": "1.0.0", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 3419369af0fd4b6b1c8577dea7a47fa180bfc587 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 24 Oct 2022 15:41:08 +0000 Subject: [PATCH 016/477] docs(docker): add tags for specific versions and latest builds update gitlabci: do not run docker build if CP_VERSION.env file is not present --- .gitlab-ci.yml | 13 +++++-------- docs/src/getting-started/docker.md | 6 ++++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 32748899..266e8598 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -165,11 +165,8 @@ docker: strategy: depend variables: PARENT_PIPELINE_ID: $CI_PIPELINE_ID - only: - refs: - - develop - - main - - beta - - alpha - variables: - - $CI_PROJECT_NAMESPACE == "adaures" + rules: + - if: ($CI_COMMIT_BRANCH == "alpha" || $CI_COMMIT_BRANCH == "alpha" || $CI_COMMIT_BRANCH == "beta") && $CI_PROJECT_NAMESPACE == "adaures" + exists: + - CP_VERSION.env + - if: ($CI_COMMIT_BRANCH == "develop" && $CI_PROJECT_NAMESPACE == "adaures") diff --git a/docs/src/getting-started/docker.md b/docs/src/getting-started/docker.md index 04ff2134..e75dd1c9 100644 --- a/docs/src/getting-started/docker.md +++ b/docs/src/getting-started/docker.md @@ -21,6 +21,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +35,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +53,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media From c94bd7cf8130171ef147b15a8e1be44b27a8a3d8 Mon Sep 17 00:00:00 2001 From: Romain de Laage Date: Thu, 20 Oct 2022 12:28:01 +0200 Subject: [PATCH 017/477] build(docker): run automatic database migration in entrypoint --- docker/production/app/entrypoint.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/production/app/entrypoint.sh b/docker/production/app/entrypoint.sh index 7246b533..b24dcab0 100644 --- a/docker/production/app/entrypoint.sh +++ b/docker/production/app/entrypoint.sh @@ -194,5 +194,8 @@ fi echo "Using config:" cat /opt/castopod/.env +cd /opt/castopod +php spark castopod:database-update + /usr/sbin/crond -f /crontab.txt -L /dev/stdout & /usr/local/sbin/php-fpm From 259fe5f697a833e268cde88e959bc19bd662edf6 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 1 Nov 2022 15:15:39 +0000 Subject: [PATCH 018/477] fix(platforms): trim platform url before validation and storage --> Having a URL with spaces in the beginning or end would cause the platform to be deleted --- app/Models/PlatformModel.php | 7 +++++++ modules/Admin/Controllers/PodcastPlatformController.php | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/Models/PlatformModel.php b/app/Models/PlatformModel.php index 29c7259f..74242821 100644 --- a/app/Models/PlatformModel.php +++ b/app/Models/PlatformModel.php @@ -145,6 +145,8 @@ class PlatformModel extends Model /** * @param mixed[] $podcastsPlatformsData + * + * @return int|false Number of rows inserted or FALSE on failure */ public function savePodcastPlatforms( int $podcastId, @@ -165,6 +167,11 @@ class PlatformModel extends Model $this->db->query($deleteJoinQuery, [$podcastId, $platformType]); + if ($podcastsPlatformsData === []) { + // no rows inserted + return 0; + } + return $this->db ->table('podcasts_platforms') ->insertBatch($podcastsPlatformsData); diff --git a/modules/Admin/Controllers/PodcastPlatformController.php b/modules/Admin/Controllers/PodcastPlatformController.php index 61936420..cfc76aa2 100644 --- a/modules/Admin/Controllers/PodcastPlatformController.php +++ b/modules/Admin/Controllers/PodcastPlatformController.php @@ -70,7 +70,7 @@ class PodcastPlatformController extends BaseController $this->request->getPost('platforms') as $platformSlug => $podcastPlatform ) { - $podcastPlatformUrl = $podcastPlatform['url']; + $podcastPlatformUrl = trim((string) $podcastPlatform['url']); if ($podcastPlatformUrl === null) { continue; } @@ -79,11 +79,12 @@ class PodcastPlatformController extends BaseController continue; } + $podcastPlatformAccountId = trim((string) $podcastPlatform['account_id']); $podcastsPlatformsData[] = [ 'platform_slug' => $platformSlug, 'podcast_id' => $this->podcast->id, 'link_url' => $podcastPlatformUrl, - 'account_id' => $podcastPlatform['account_id'] === '' ? null : $podcastPlatform['account_id'], + 'account_id' => $podcastPlatformAccountId === '' ? null : $podcastPlatformAccountId, 'is_visible' => array_key_exists('visible', $podcastPlatform) && $podcastPlatform['visible'] === 'yes', From 1192a228efcddc401f7210890323b5a972a38789 Mon Sep 17 00:00:00 2001 From: Romain de Laage Date: Tue, 1 Nov 2022 17:55:39 +0000 Subject: [PATCH 019/477] build(docker): add dedicated ffmpeg image to run video clips' scheduled tasks --- docker/production/.gitlab-ci.yml | 3 + docker/production/app/Dockerfile | 10 +-- docker/production/video-clipper/Dockerfile | 32 ++++++++++ docker/production/video-clipper/entrypoint.sh | 62 +++++++++++++++++++ docs/src/getting-started/docker.md | 29 ++++++++- 5 files changed, 126 insertions(+), 10 deletions(-) create mode 100644 docker/production/video-clipper/Dockerfile create mode 100644 docker/production/video-clipper/entrypoint.sh diff --git a/docker/production/.gitlab-ci.yml b/docker/production/.gitlab-ci.yml index 2a8c05e7..d99889d0 100644 --- a/docker/production/.gitlab-ci.yml +++ b/docker/production/.gitlab-ci.yml @@ -12,6 +12,7 @@ docker-build-rolling: - cp ${DOCKER_HUB_CONFIG} /kaniko/.docker/config.json - /kaniko/executor --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${TAG} - /kaniko/executor --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${TAG} + - /kaniko/executor --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${TAG} needs: - pipeline: $PARENT_PIPELINE_ID job: bundle @@ -29,6 +30,7 @@ docker-build-main-release: - export CP_VERSION=$(cat CP_VERSION.env) - /kaniko/executor --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${CP_VERSION} --destination ${DOCKER_IMAGE_WEB_SERVER}:latest - /kaniko/executor --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${CP_VERSION} --destination ${DOCKER_IMAGE_APP}:latest + - /kaniko/executor --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${CP_VERSION} --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:latest needs: - pipeline: $PARENT_PIPELINE_ID job: release @@ -48,6 +50,7 @@ docker-build-alpha-beta-release: - export CP_VERSION=$(cat CP_VERSION.env) - /kaniko/executor --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${CP_VERSION} --destination ${DOCKER_IMAGE_WEB_SERVER}:${TAG} - /kaniko/executor --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${CP_VERSION} --destination ${DOCKER_IMAGE_APP}:${TAG} + - /kaniko/executor --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${CP_VERSION} --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${TAG} needs: - pipeline: $PARENT_PIPELINE_ID job: release diff --git a/docker/production/app/Dockerfile b/docker/production/app/Dockerfile index bf281d05..2fc667d8 100644 --- a/docker/production/app/Dockerfile +++ b/docker/production/app/Dockerfile @@ -1,10 +1,3 @@ -FROM docker.io/alpine:3.16 AS ffmpeg-downloader - -RUN apk add --no-cache curl && \ - curl https://johnvansickle.com/ffmpeg/releases/ffmpeg-5.1.1-amd64-static.tar.xz -o ffmpeg.tar.xz && \ - mkdir ffmpeg && \ - tar -xJf ffmpeg.tar.xz -C ffmpeg --strip-components 1 - FROM docker.io/php:8.1-fpm-alpine3.16 COPY docker/production/app/entrypoint.sh /entrypoint.sh @@ -12,9 +5,9 @@ COPY docker/production/app/entrypoint.sh /entrypoint.sh COPY docker/production/app/uploads.ini /usr/local/etc/php/conf.d/uploads.ini RUN echo "* * * * * /usr/local/bin/php /opt/castopod/public/index.php scheduled-activities" > /crontab.txt && \ - echo "* * * * 10 /usr/local/bin/php /opt/castopod/public/index.php scheduled-video-clips" >> /crontab.txt && \ echo "* * * * * /usr/local/bin/php /opt/castopod/public/index.php scheduled-websub-publish" >> /crontab.txt +# TODO: remove freetype (package and gd support) and ffmpeg RUN apk add --no-cache libpng icu-libs freetype libwebp libjpeg-turbo libxpm ffmpeg && \ apk add --no-cache --virtual .php-ext-build-dep freetype-dev libpng-dev libjpeg-turbo-dev libwebp-dev zlib-dev libxpm-dev icu-dev && \ docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-xpm && \ @@ -23,7 +16,6 @@ RUN apk add --no-cache libpng icu-libs freetype libwebp libjpeg-turbo libxpm ffm apk del .php-ext-build-dep COPY castopod /opt/castopod -COPY --from=ffmpeg-downloader /ffmpeg/ffmpeg /ffmpeg/ffprobe /ffmpeg/qt-faststart /usr/local/bin/ RUN chmod 544 /entrypoint.sh && \ chmod 444 /crontab.txt && \ diff --git a/docker/production/video-clipper/Dockerfile b/docker/production/video-clipper/Dockerfile new file mode 100644 index 00000000..d01ee076 --- /dev/null +++ b/docker/production/video-clipper/Dockerfile @@ -0,0 +1,32 @@ +FROM docker.io/php:8.1-bullseye + +ENV SUPERCRONIC_VERSION=v0.2.1 + +COPY docker/production/video-clipper/entrypoint.sh /entrypoint.sh + +RUN echo "*/2 * * * * /usr/local/bin/php /opt/castopod/public/index.php scheduled-video-clips" >> /crontab.txt + +RUN apt update && \ + apt install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev libicu-dev && \ + docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-xpm && \ + docker-php-ext-install mysqli gd intl && \ + docker-php-ext-enable mysqli gd intl + +RUN apt update && \ + apt install -y ffmpeg curl && \ + curl -OL https://github.com/aptible/supercronic/releases/download/$SUPERCRONIC_VERSION/supercronic-linux-amd64 && \ + mv supercronic-linux-amd64 /usr/local/bin/supercronic && \ + chmod +x /usr/local/bin/supercronic + +COPY castopod /opt/castopod + +RUN chmod 544 /entrypoint.sh && \ + chmod 444 /crontab.txt + +WORKDIR /opt/castopod + +VOLUME /opt/castopod/public/media + +ENTRYPOINT [ "sh", "-c" ] + +CMD [ "/entrypoint.sh" ] diff --git a/docker/production/video-clipper/entrypoint.sh b/docker/production/video-clipper/entrypoint.sh new file mode 100644 index 00000000..638e3dfc --- /dev/null +++ b/docker/production/video-clipper/entrypoint.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +if [ -z "${CP_DATABASE_HOSTNAME}" ] +then + echo "CP_DATABASE_HOSTNAME is empty, using default" + CP_DATABASE_HOSTNAME="mariadb" +fi + +if [ -z "${CP_DATABASE_PREFIX}" ] +then + echo "CP_DATABASE_PREFIX is empty, using default" + CP_DATABASE_PREFIX="cp_" +fi + +if [ -z "${CP_DATABASE_NAME}" ] +then + if [ -z "${MYSQL_DATABASE}" ] + then + echo "When CP_DATABASE_NAME is empty, MYSQL_DATABASE must be set" + exit 1 + fi + + echo "CP_DATABASE_NAME is empty, using mysql variable" + CP_DATABASE_NAME="${MYSQL_DATABASE}" +fi + +if [ -z "${CP_DATABASE_USERNAME}" ] +then + if [ -z "${MYSQL_USER}" ] + then + echo "When CP_DATABASE_USERNAME is empty, MYSQL_USER must be set" + exit 1 + fi + + echo "CP_DATABASE_USERNAME is empty, using mysql variable" + CP_DATABASE_USERNAME="${MYSQL_USER}" +fi + +if [ -z "${CP_DATABASE_PASSWORD}" ] +then + if [ -z "${MYSQL_PASSWORD}" ] + then + echo "When CP_DATABASE_PASSWORD is empty, MYSQL_PASSWORD must be set" + exit 1 + fi + + echo "CP_DATABASE_PASSWORD is empty, using mysql variable" + CP_DATABASE_PASSWORD="${MYSQL_PASSWORD}" +fi + +cat << EOF >> /opt/castopod/.env +database.default.hostname="${CP_DATABASE_HOSTNAME}" +database.default.database="${CP_DATABASE_NAME}" +database.default.username="${CP_DATABASE_USERNAME}" +database.default.password="${CP_DATABASE_PASSWORD}" +database.default.DBPrefix="${CP_DATABASE_PREFIX}" +EOF + +echo "Using config:" +cat /opt/castopod/.env + +supercronic /crontab.txt diff --git a/docs/src/getting-started/docker.md b/docs/src/getting-started/docker.md index e75dd1c9..b2ef420f 100644 --- a/docs/src/getting-started/docker.md +++ b/docs/src/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -85,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -117,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | From a6395b5ce04d1ef347ab4c59d758bec253e2eb4f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 1 Nov 2022 18:10:12 +0000 Subject: [PATCH 020/477] chore(release): 1.0.1 [skip ci] ## [1.0.1](https://code.castopod.org/adaures/castopod/compare/v1.0.0...v1.0.1) (2022-11-01) ### Bug Fixes * **platforms:** trim platform url before validation and storage ([259fe5f](https://code.castopod.org/adaures/castopod/commit/259fe5f697a833e268cde88e959bc19bd662edf6)) --- CHANGELOG.md | 7 +++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a646b1b..612078fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.0.1](https://code.castopod.org/adaures/castopod/compare/v1.0.0...v1.0.1) (2022-11-01) + +### Bug Fixes + +- **platforms:** trim platform url before validation and storage + ([259fe5f](https://code.castopod.org/adaures/castopod/commit/259fe5f697a833e268cde88e959bc19bd662edf6)) + # 1.0.0 (2022-10-20) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 0b096b0f..65637ce3 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.0.0'); +defined('CP_VERSION') || define('CP_VERSION', '1.0.1'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index bee66770..9aadfb12 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "podlibre/castopod-host", - "version": "1.0.0", + "version": "1.0.1", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package-lock.json b/package-lock.json index 1e8e6b2b..e390c981 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "castopod-host", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "castopod-host", - "version": "1.0.0", + "version": "1.0.1", "license": "AGPL-3.0-or-later", "dependencies": { "@amcharts/amcharts4": "^4.10.29", diff --git a/package.json b/package.json index 8b04354a..dfbb3f78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod-host", - "version": "1.0.0", + "version": "1.0.1", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From c69c0fbb402762781fe5cb29228fe1b00eb759aa Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 2 Nov 2022 14:38:17 +0000 Subject: [PATCH 021/477] build(docker): replace libjpeg-dev with libjpeg62-turbo-dev in development image --- docker/development/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index b99f9539..824074a9 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -38,7 +38,7 @@ RUN apt-get update \ libicu-dev \ libpng-dev \ libwebp-dev \ - libjpeg-dev \ + libjpeg62-turbo-dev \ libfreetype6-dev \ zlib1g-dev \ libzip-dev \ From 67b6e30d2401670cee8424291f7f8812e78a823b Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 2 Nov 2022 17:10:40 +0000 Subject: [PATCH 022/477] build(docker): add --cleanup flag to each kaniko build flag is used to clean the filesystem at the end of the build --- docker/production/.gitlab-ci.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docker/production/.gitlab-ci.yml b/docker/production/.gitlab-ci.yml index d99889d0..67b26ccc 100644 --- a/docker/production/.gitlab-ci.yml +++ b/docker/production/.gitlab-ci.yml @@ -10,9 +10,9 @@ docker-build-rolling: TAG: $CI_COMMIT_BRANCH script: - cp ${DOCKER_HUB_CONFIG} /kaniko/.docker/config.json - - /kaniko/executor --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${TAG} - - /kaniko/executor --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${TAG} - - /kaniko/executor --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${TAG} + - /kaniko/executor --cleanup --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${TAG} + - /kaniko/executor --cleanup --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${TAG} + - /kaniko/executor --cleanup --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${TAG} needs: - pipeline: $PARENT_PIPELINE_ID job: bundle @@ -28,9 +28,9 @@ docker-build-main-release: script: - cp ${DOCKER_HUB_CONFIG} /kaniko/.docker/config.json - export CP_VERSION=$(cat CP_VERSION.env) - - /kaniko/executor --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${CP_VERSION} --destination ${DOCKER_IMAGE_WEB_SERVER}:latest - - /kaniko/executor --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${CP_VERSION} --destination ${DOCKER_IMAGE_APP}:latest - - /kaniko/executor --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${CP_VERSION} --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:latest + - /kaniko/executor --cleanup --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${CP_VERSION} --destination ${DOCKER_IMAGE_WEB_SERVER}:latest + - /kaniko/executor --cleanup --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${CP_VERSION} --destination ${DOCKER_IMAGE_APP}:latest + - /kaniko/executor --cleanup --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${CP_VERSION} --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:latest needs: - pipeline: $PARENT_PIPELINE_ID job: release @@ -48,9 +48,9 @@ docker-build-alpha-beta-release: script: - cp ${DOCKER_HUB_CONFIG} /kaniko/.docker/config.json - export CP_VERSION=$(cat CP_VERSION.env) - - /kaniko/executor --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${CP_VERSION} --destination ${DOCKER_IMAGE_WEB_SERVER}:${TAG} - - /kaniko/executor --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${CP_VERSION} --destination ${DOCKER_IMAGE_APP}:${TAG} - - /kaniko/executor --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${CP_VERSION} --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${TAG} + - /kaniko/executor --cleanup --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${CP_VERSION} --destination ${DOCKER_IMAGE_WEB_SERVER}:${TAG} + - /kaniko/executor --cleanup --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${CP_VERSION} --destination ${DOCKER_IMAGE_APP}:${TAG} + - /kaniko/executor --cleanup --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${CP_VERSION} --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${TAG} needs: - pipeline: $PARENT_PIPELINE_ID job: release From 82310a2e0b426e84501090bdd9c0cf592d1c0d53 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 3 Nov 2022 15:37:44 +0000 Subject: [PATCH 023/477] fix(platforms): convert special characters to htmlentities to validate url remove validate_url custom validator and replace with CI4's valid_url_strict --- app/Config/Validation.php | 2 -- app/Validation/Rules.php | 28 ------------------- .../Controllers/PodcastImportController.php | 2 +- .../Controllers/PodcastPlatformController.php | 2 +- modules/Admin/Language/ar/Validation.php | 2 -- modules/Admin/Language/br/Validation.php | 2 -- modules/Admin/Language/ca/Validation.php | 2 -- modules/Admin/Language/de/Validation.php | 2 -- modules/Admin/Language/el/Validation.php | 2 -- modules/Admin/Language/en/Validation.php | 2 -- modules/Admin/Language/es/Validation.php | 2 -- modules/Admin/Language/fa/Validation.php | 2 -- modules/Admin/Language/fr/Validation.php | 2 -- modules/Admin/Language/gd/Validation.php | 2 -- modules/Admin/Language/gl/Validation.php | 2 -- modules/Admin/Language/id/Validation.php | 2 -- modules/Admin/Language/it/Validation.php | 2 -- modules/Admin/Language/ko/Validation.php | 2 -- modules/Admin/Language/nl/Validation.php | 2 -- modules/Admin/Language/nn-NO/Validation.php | 2 -- modules/Admin/Language/oc/Validation.php | 2 -- modules/Admin/Language/pl/Validation.php | 2 -- modules/Admin/Language/pt-BR/Validation.php | 2 -- modules/Admin/Language/pt/Validation.php | 2 -- modules/Admin/Language/ru/Validation.php | 2 -- modules/Admin/Language/sk/Validation.php | 2 -- modules/Admin/Language/sv/Validation.php | 2 -- modules/Admin/Language/zh-Hans/Validation.php | 2 -- .../Install/Controllers/InstallController.php | 4 +-- 29 files changed, 4 insertions(+), 82 deletions(-) delete mode 100644 app/Validation/Rules.php diff --git a/app/Config/Validation.php b/app/Config/Validation.php index d9157b1a..56b7c429 100644 --- a/app/Config/Validation.php +++ b/app/Config/Validation.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace Config; use App\Validation\FileRules as AppFileRules; -use App\Validation\Rules as AppRules; use CodeIgniter\Config\BaseConfig; use CodeIgniter\Validation\CreditCardRules; use CodeIgniter\Validation\FileRules; @@ -24,7 +23,6 @@ class Validation extends BaseConfig FormatRules::class, FileRules::class, CreditCardRules::class, - AppRules::class, AppFileRules::class, ]; diff --git a/app/Validation/Rules.php b/app/Validation/Rules.php deleted file mode 100644 index 6ef0984e..00000000 --- a/app/Validation/Rules.php +++ /dev/null @@ -1,28 +0,0 @@ - 'required|regex_match[/^[a-zA-Z0-9\_]{1,32}$/]', - 'imported_feed_url' => 'required|validate_url', + 'imported_feed_url' => 'required|valid_url_strict', 'season_number' => 'is_natural_no_zero|permit_empty', 'max_episodes' => 'is_natural_no_zero|permit_empty', ]; diff --git a/modules/Admin/Controllers/PodcastPlatformController.php b/modules/Admin/Controllers/PodcastPlatformController.php index cfc76aa2..82cdfc77 100644 --- a/modules/Admin/Controllers/PodcastPlatformController.php +++ b/modules/Admin/Controllers/PodcastPlatformController.php @@ -75,7 +75,7 @@ class PodcastPlatformController extends BaseController continue; } - if (! $validation->check($podcastPlatformUrl, 'validate_url')) { + if (! $validation->check(htmlentities($podcastPlatformUrl), 'valid_url_strict')) { continue; } diff --git a/modules/Admin/Language/ar/Validation.php b/modules/Admin/Language/ar/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/ar/Validation.php +++ b/modules/Admin/Language/ar/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/br/Validation.php b/modules/Admin/Language/br/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/br/Validation.php +++ b/modules/Admin/Language/br/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/ca/Validation.php b/modules/Admin/Language/ca/Validation.php index 6740204a..bcc1dde2 100644 --- a/modules/Admin/Language/ca/Validation.php +++ b/modules/Admin/Language/ca/Validation.php @@ -13,6 +13,4 @@ return [ '{field} no és una imatge, o no és prou ample o alt.', 'is_image_ratio' => '{field} no és una imatge o no té la proporció correcta.', - 'validate_url' => - 'El camp {field} ha de ser una adreça URL vàlida (p. ex., https://exemple.com/).', ]; diff --git a/modules/Admin/Language/de/Validation.php b/modules/Admin/Language/de/Validation.php index f973bf67..9881d307 100644 --- a/modules/Admin/Language/de/Validation.php +++ b/modules/Admin/Language/de/Validation.php @@ -13,6 +13,4 @@ return [ '{field} ist entweder kein Bild, oder es ist nicht breit oder hoch genug.', 'is_image_ratio' => '{field} ist entweder kein Bild oder nicht das richtige Verhältnis.', - 'validate_url' => - 'Das {field} -Feld muss eine gültige URL sein (z.B. https://example.com/).', ]; diff --git a/modules/Admin/Language/el/Validation.php b/modules/Admin/Language/el/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/el/Validation.php +++ b/modules/Admin/Language/el/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/en/Validation.php b/modules/Admin/Language/en/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/en/Validation.php +++ b/modules/Admin/Language/en/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/es/Validation.php b/modules/Admin/Language/es/Validation.php index 7b2d4379..2f234a7f 100644 --- a/modules/Admin/Language/es/Validation.php +++ b/modules/Admin/Language/es/Validation.php @@ -13,6 +13,4 @@ return [ '{field} no es una imagen, o no es suficientemente ancha o alta.', 'is_image_ratio' => '{field} no es una imagen o no es de la proporción correcta.', - 'validate_url' => - 'El campo {field} debe ser una URL válida (ej. https://ejemplo.com/).', ]; diff --git a/modules/Admin/Language/fa/Validation.php b/modules/Admin/Language/fa/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/fa/Validation.php +++ b/modules/Admin/Language/fa/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/fr/Validation.php b/modules/Admin/Language/fr/Validation.php index e9989330..6a1a8566 100644 --- a/modules/Admin/Language/fr/Validation.php +++ b/modules/Admin/Language/fr/Validation.php @@ -13,6 +13,4 @@ return [ '{field} n’est pas une image ou n’a pas la taille minimale requise.', 'is_image_ratio' => '{field} n’est pas une image ou n’est pas au bon format.', - 'validate_url' => - 'Le champs {field} doit être une adresse valide (par exemple https://exemple.com/).', ]; diff --git a/modules/Admin/Language/gd/Validation.php b/modules/Admin/Language/gd/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/gd/Validation.php +++ b/modules/Admin/Language/gd/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/gl/Validation.php b/modules/Admin/Language/gl/Validation.php index 54aaef52..dbeaea55 100644 --- a/modules/Admin/Language/gl/Validation.php +++ b/modules/Admin/Language/gl/Validation.php @@ -13,6 +13,4 @@ return [ 'ou ben {field} non é unha imaxe ou non é suficientemente alta ou ancha.', 'is_image_ratio' => 'ou ben {field} non é unha imaxe ou non ten proporcións axeitadas.', - 'validate_url' => - 'O campo {field} ten que ser un URL válido (ex. https://exemplo.com/).', ]; diff --git a/modules/Admin/Language/id/Validation.php b/modules/Admin/Language/id/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/id/Validation.php +++ b/modules/Admin/Language/id/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/it/Validation.php b/modules/Admin/Language/it/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/it/Validation.php +++ b/modules/Admin/Language/it/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/ko/Validation.php b/modules/Admin/Language/ko/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/ko/Validation.php +++ b/modules/Admin/Language/ko/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/nl/Validation.php b/modules/Admin/Language/nl/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/nl/Validation.php +++ b/modules/Admin/Language/nl/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/nn-NO/Validation.php b/modules/Admin/Language/nn-NO/Validation.php index ed99da37..67faa809 100644 --- a/modules/Admin/Language/nn-NO/Validation.php +++ b/modules/Admin/Language/nn-NO/Validation.php @@ -13,6 +13,4 @@ return [ '{field} er anten ikkje eit bilete, eller er ikkje breitt og høgt nok.', 'is_image_ratio' => '{field} er anten ikkje eit bilete, eller har feil forhold mellom høgd og breidd.', - 'validate_url' => - '{field}-feltet må vera ei gyldig nettadresse (td. https://eksempel.no/).', ]; diff --git a/modules/Admin/Language/oc/Validation.php b/modules/Admin/Language/oc/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/oc/Validation.php +++ b/modules/Admin/Language/oc/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/pl/Validation.php b/modules/Admin/Language/pl/Validation.php index a71b5913..5b4e8db5 100644 --- a/modules/Admin/Language/pl/Validation.php +++ b/modules/Admin/Language/pl/Validation.php @@ -13,6 +13,4 @@ return [ '{field} nie jest obrazem, albo nie jest wystarczająco szeroki lub wysoki.', 'is_image_ratio' => '{field} nie jest obrazem, albo nie ma właściwych proporcji.', - 'validate_url' => - 'Pole {field} musi być prawidłowym adresem URL (np. https://przyklad.com/).', ]; diff --git a/modules/Admin/Language/pt-BR/Validation.php b/modules/Admin/Language/pt-BR/Validation.php index 76ca2ae7..93660630 100644 --- a/modules/Admin/Language/pt-BR/Validation.php +++ b/modules/Admin/Language/pt-BR/Validation.php @@ -13,6 +13,4 @@ return [ '{field} não é uma imagem ou não é largo ou alto o suficiente.', 'is_image_ratio' => '{field} não é uma imagem ou não tem a proporção correta.', - 'validate_url' => - 'O campo {field} deve ser uma URL válida (por exemplo, https://examplo.com/).', ]; diff --git a/modules/Admin/Language/pt/Validation.php b/modules/Admin/Language/pt/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/pt/Validation.php +++ b/modules/Admin/Language/pt/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/ru/Validation.php b/modules/Admin/Language/ru/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/ru/Validation.php +++ b/modules/Admin/Language/ru/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/sk/Validation.php b/modules/Admin/Language/sk/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/sk/Validation.php +++ b/modules/Admin/Language/sk/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/sv/Validation.php b/modules/Admin/Language/sv/Validation.php index 750b1968..3bc78cfe 100644 --- a/modules/Admin/Language/sv/Validation.php +++ b/modules/Admin/Language/sv/Validation.php @@ -13,6 +13,4 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', - 'validate_url' => - 'The {field} field must be a valid URL (eg. https://example.com/).', ]; diff --git a/modules/Admin/Language/zh-Hans/Validation.php b/modules/Admin/Language/zh-Hans/Validation.php index cfdeac6e..fa41468c 100644 --- a/modules/Admin/Language/zh-Hans/Validation.php +++ b/modules/Admin/Language/zh-Hans/Validation.php @@ -13,6 +13,4 @@ return [ '{field} 不是一张图片,或者宽或高度不够。', 'is_image_ratio' => '{field} 不是图片或比例不正确。', - 'validate_url' => - '{field} 字段必须是有效的 URL(例如 https://example.com/)。', ]; diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index 82be50da..20cbc056 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -154,8 +154,8 @@ class InstallController extends Controller public function attemptInstanceConfig(): RedirectResponse { $rules = [ - 'hostname' => 'required|validate_url', - 'media_base_url' => 'permit_empty|validate_url', + 'hostname' => 'required|valid_url_strict', + 'media_base_url' => 'permit_empty|valid_url_strict', 'admin_gateway' => 'required', 'auth_gateway' => 'required|differs[admin_gateway]', ]; From ed7c247bcbbb450e5ff96418930d3b37ce912cc4 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 3 Nov 2022 16:34:57 +0000 Subject: [PATCH 024/477] fix(notifications): add manage-notifications permission to podcast --- docs/src/getting-started/auth.md | 13 +++++++------ modules/Admin/Config/Routes.php | 2 +- modules/Auth/Config/AuthGroups.php | 2 ++ modules/Auth/Language/en/Auth.php | 1 + 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/src/getting-started/auth.md b/docs/src/getting-started/auth.md index 00eeb819..6c0ccd75 100644 --- a/docs/src/getting-started/auth.md +++ b/docs/src/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -73,6 +73,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: | manage-contributors | Can manage contributors of podcast #{id}. | | manage-platforms | Can set/remove platform links of podcast #{id}. | | manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | | interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | | episodes.view | Can view dashboard and analytics of podcast #{id}. | | episodes.create | Can create episodes for podcast #{id}. | diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php index ce09a16f..a9048691 100644 --- a/modules/Admin/Config/Routes.php +++ b/modules/Admin/Config/Routes.php @@ -579,7 +579,7 @@ $routes->group( $routes->group('notifications', static function ($routes): void { $routes->get('/', 'NotificationController::list/$1', [ 'as' => 'notification-list', - 'filter' => 'permission:podcast#.view', + 'filter' => 'permission:podcast#.manage-notifications', ]); $routes->get('(:num)/mark-as-read', 'NotificationController::markAsRead/$1/$2', [ 'as' => 'notification-mark-as-read', diff --git a/modules/Auth/Config/AuthGroups.php b/modules/Auth/Config/AuthGroups.php index cfbcbada..0852afb9 100644 --- a/modules/Auth/Config/AuthGroups.php +++ b/modules/Auth/Config/AuthGroups.php @@ -150,6 +150,7 @@ class AuthGroups extends ShieldAuthGroups 'manage-contributors', 'manage-platforms', 'manage-publications', + 'manage-notifications', 'interact-as', 'episodes.view', 'episodes.create', @@ -182,6 +183,7 @@ class AuthGroups extends ShieldAuthGroups 'episodes.manage-clips', 'episodes.manage-publications', 'episodes.manage-comments', + 'episodes.manage-notifications', ], 'author' => [ 'view', diff --git a/modules/Auth/Language/en/Auth.php b/modules/Auth/Language/en/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/en/Auth.php +++ b/modules/Auth/Language/en/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', From 45d302be29d4fe80dddc08c132a6890e389e5f44 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 3 Nov 2022 16:37:39 +0000 Subject: [PATCH 025/477] docs(dev-setup): add missing environment keys for development .env --- docs/src/contributing/setup-development.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/src/contributing/setup-development.md b/docs/src/contributing/setup-development.md index 6aafb50b..5cbecd1c 100644 --- a/docs/src/contributing/setup-development.md +++ b/docs/src/contributing/setup-development.md @@ -52,6 +52,9 @@ to help you kickstart your contribution. database.default.database="castopod" database.default.username="castopod" database.default.password="castopod" + database.default.DBPrefix="dev_" + + analytics.salt="DEV_ANALYTICS_SALT" cache.handler="redis" cache.redis.host = "redis" From acb067a80ebd70b51bf8fe9f26d7944588da0d70 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 3 Nov 2022 16:58:03 +0000 Subject: [PATCH 026/477] chore: update ci4/shield to v1.0.0-beta.3 --- composer.json | 3 +- composer.lock | 163 +++++++++++++++++++++++++------------------------- 2 files changed, 83 insertions(+), 83 deletions(-) diff --git a/composer.json b/composer.json index 9aadfb12..be977cae 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ "codeigniter4/settings": "^v2.1.0", "chrisjean/php-ico": "^1.0.4", "melbahja/seo": "^v2.1.1", - "codeigniter4/shield": "dev-develop" + "codeigniter4/shield": "v1.0.0-beta.3" }, "require-dev": { "mikey179/vfsstream": "^v1.6.11", @@ -51,6 +51,7 @@ "rector:fix": "vendor/bin/rector process --ansi --memory-limit=2G", "style": "vendor/bin/ecs check --ansi", "style:fix": "vendor/bin/ecs check --fix --ansi", + "generate:auth-docs": "php spark auth:generate-docs", "post-install-cmd": [ "@php vendor/opawg/user-agents-php/src/UserAgentsGenerate.php > vendor/opawg/user-agents-php/src/UserAgents.php", "@php vendor/opawg/user-agents-php/src/UserAgentsRSSGenerate.php > vendor/opawg/user-agents-php/src/UserAgentsRSS.php", diff --git a/composer.lock b/composer.lock index 13285f33..90d0c673 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c6dd2c4c4588bd654fd4973c5b574606", + "content-hash": "cce1336454d39f470af759fd078e55a9", "packages": [ { "name": "adaures/ipcat-php", @@ -288,16 +288,16 @@ }, { "name": "codeigniter4/shield", - "version": "dev-develop", + "version": "v1.0.0-beta.3", "source": { "type": "git", "url": "https://github.com/codeigniter4/shield.git", - "reference": "f4cdfb672b600a032a6f0bfc0b7735411bee0cae" + "reference": "5e6d5175da45b06dbe7d1deda03458d79d45a951" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/shield/zipball/f4cdfb672b600a032a6f0bfc0b7735411bee0cae", - "reference": "f4cdfb672b600a032a6f0bfc0b7735411bee0cae", + "url": "https://api.github.com/repos/codeigniter4/shield/zipball/5e6d5175da45b06dbe7d1deda03458d79d45a951", + "reference": "5e6d5175da45b06dbe7d1deda03458d79d45a951", "shasum": "" }, "require": { @@ -312,7 +312,6 @@ "codeigniter4/framework": "^4.2.3", "mockery/mockery": "^1.0" }, - "default-branch": true, "type": "library", "autoload": { "files": [ @@ -348,7 +347,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/codeigniter4/shield" }, - "time": "2022-10-05T10:11:44+00:00" + "time": "2022-10-30T23:14:47+00:00" }, { "name": "composer/ca-bundle", @@ -420,16 +419,16 @@ }, { "name": "dflydev/dot-access-data", - "version": "v3.0.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "0992cc19268b259a39e86f296da5f0677841f42c" + "reference": "f41715465d65213d644d3141a6a93081be5d3549" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c", - "reference": "0992cc19268b259a39e86f296da5f0677841f42c", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", "shasum": "" }, "require": { @@ -440,7 +439,7 @@ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", "scrutinizer/ocular": "1.6.0", "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^3.14" + "vimeo/psalm": "^4.0.0" }, "type": "library", "extra": { @@ -482,9 +481,9 @@ "keywords": ["access", "data", "dot", "notation"], "support": { "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1" + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2" }, - "time": "2021-08-13T13:06:58+00:00" + "time": "2022-10-27T11:44:00+00:00" }, { "name": "essence/dom", @@ -772,12 +771,12 @@ "source": { "type": "git", "url": "https://github.com/JamesHeinrich/getID3.git", - "reference": "ee238d552571c6029898b087d5fc95df826418d6" + "reference": "4e7aca96e7f4cf5ce6e08bca998334f567259965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/ee238d552571c6029898b087d5fc95df826418d6", - "reference": "ee238d552571c6029898b087d5fc95df826418d6", + "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/4e7aca96e7f4cf5ce6e08bca998334f567259965", + "reference": "4e7aca96e7f4cf5ce6e08bca998334f567259965", "shasum": "" }, "require": { @@ -838,7 +837,7 @@ "issues": "https://github.com/JamesHeinrich/getID3/issues", "source": "https://github.com/JamesHeinrich/getID3/tree/2.0" }, - "time": "2021-12-15T17:29:14+00:00" + "time": "2022-10-28T11:52:26+00:00" }, { "name": "kint-php/kint", @@ -956,16 +955,16 @@ }, { "name": "league/commonmark", - "version": "2.3.5", + "version": "2.3.6", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "84d74485fdb7074f4f9dd6f02ab957b1de513257" + "reference": "857afc47ce113454bd629037213378ba3219dd40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84d74485fdb7074f4f9dd6f02ab957b1de513257", - "reference": "84d74485fdb7074f4f9dd6f02ab957b1de513257", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/857afc47ce113454bd629037213378ba3219dd40", + "reference": "857afc47ce113454bd629037213378ba3219dd40", "shasum": "" }, "require": { @@ -985,7 +984,7 @@ "erusev/parsedown": "^1.0", "ext-json": "*", "github/gfm": "0.29.0", - "michelf/php-markdown": "^1.4", + "michelf/php-markdown": "^1.4 || ^2.0", "nyholm/psr7": "^1.5", "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.21", @@ -1056,7 +1055,7 @@ "type": "tidelift" } ], - "time": "2022-07-29T10:59:45+00:00" + "time": "2022-10-30T16:45:38+00:00" }, { "name": "league/config", @@ -1669,16 +1668,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.38", + "version": "2.0.39", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "b03536539f43a4f9aa33c4f0b2f3a1c752088fcd" + "reference": "f3a0e2b715c40cf1fd270d444901b63311725d63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b03536539f43a4f9aa33c4f0b2f3a1c752088fcd", - "reference": "b03536539f43a4f9aa33c4f0b2f3a1c752088fcd", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f3a0e2b715c40cf1fd270d444901b63311725d63", + "reference": "f3a0e2b715c40cf1fd270d444901b63311725d63", "shasum": "" }, "require": { @@ -1755,7 +1754,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.38" + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.39" }, "funding": [ { @@ -1771,7 +1770,7 @@ "type": "tidelift" } ], - "time": "2022-09-02T17:04:26+00:00" + "time": "2022-10-24T10:49:03+00:00" }, { "name": "psr/cache", @@ -2545,16 +2544,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.10.11", + "version": "5.11.0", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "377ea566c5fb91e2fbec6ad0aadf21eb88e18cee" + "reference": "0a7b757e065f6e5033f286bbb9b64d180c816a05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/377ea566c5fb91e2fbec6ad0aadf21eb88e18cee", - "reference": "377ea566c5fb91e2fbec6ad0aadf21eb88e18cee", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/0a7b757e065f6e5033f286bbb9b64d180c816a05", + "reference": "0a7b757e065f6e5033f286bbb9b64d180c816a05", "shasum": "" }, "require": { @@ -2564,7 +2563,7 @@ "php": ">=7.2", "sebastianfeldmann/camino": "^0.9.2", "sebastianfeldmann/cli": "^3.3", - "sebastianfeldmann/git": "^3.8.1", + "sebastianfeldmann/git": "^3.8.5", "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" @@ -2612,7 +2611,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.10.11" + "source": "https://github.com/captainhookphp/captainhook/tree/5.11.0" }, "funding": [ { @@ -2620,7 +2619,7 @@ "type": "github" } ], - "time": "2022-07-26T20:11:41+00:00" + "time": "2022-10-27T19:11:19+00:00" }, { "name": "composer/pcre", @@ -3023,16 +3022,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.12.0", + "version": "v3.13.0", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "eae11d945e2885d86e1c080eec1bb30a2aa27998" + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/eae11d945e2885d86e1c080eec1bb30a2aa27998", - "reference": "eae11d945e2885d86e1c080eec1bb30a2aa27998", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a6232229a8309e8811dc751c28b91cb34b2943e1", + "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1", "shasum": "" }, "require": { @@ -3056,7 +3055,7 @@ }, "require-dev": { "justinrainbow/json-schema": "^5.2", - "keradus/cli-executor": "^1.5", + "keradus/cli-executor": "^2.0", "mikey179/vfsstream": "^1.6.10", "php-coveralls/php-coveralls": "^2.5.2", "php-cs-fixer/accessible-object": "^1.1", @@ -3095,8 +3094,8 @@ ], "description": "A tool to automatically fix PHP code style", "support": { - "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", - "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v3.12.0" + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.13.0" }, "funding": [ { @@ -3104,7 +3103,7 @@ "type": "github" } ], - "time": "2022-10-12T14:20:51+00:00" + "time": "2022-10-31T19:28:50+00:00" }, { "name": "mikey179/vfsstream", @@ -3358,16 +3357,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.8.9", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "3a72d9d9f2528fbd50c2d8fcf155fd9f74ade3f2" + "reference": "e08de53a5eec983de78a787a88e72518cf8fe43a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3a72d9d9f2528fbd50c2d8fcf155fd9f74ade3f2", - "reference": "3a72d9d9f2528fbd50c2d8fcf155fd9f74ade3f2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e08de53a5eec983de78a787a88e72518cf8fe43a", + "reference": "e08de53a5eec983de78a787a88e72518cf8fe43a", "shasum": "" }, "require": { @@ -3387,7 +3386,7 @@ "keywords": ["dev", "static analysis"], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.8.9" + "source": "https://github.com/phpstan/phpstan/tree/1.9.0" }, "funding": [ { @@ -3403,20 +3402,20 @@ "type": "tidelift" } ], - "time": "2022-10-13T13:40:18+00:00" + "time": "2022-11-03T07:26:48+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.17", + "version": "9.2.18", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" + "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", - "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a", + "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a", "shasum": "" }, "require": { @@ -3464,7 +3463,7 @@ "keywords": ["coverage", "testing", "xunit"], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18" }, "funding": [ { @@ -3472,7 +3471,7 @@ "type": "github" } ], - "time": "2022-08-30T12:24:04+00:00" + "time": "2022-10-27T13:35:33+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3692,16 +3691,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.25", + "version": "9.5.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d" + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", - "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", "shasum": "" }, "require": { @@ -3762,7 +3761,7 @@ "keywords": ["phpunit", "testing", "xunit"], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" }, "funding": [ { @@ -3778,7 +3777,7 @@ "type": "tidelift" } ], - "time": "2022-09-25T03:44:45+00:00" + "time": "2022-10-28T06:00:21+00:00" }, { "name": "psr/container", @@ -4872,16 +4871,16 @@ }, { "name": "sebastianfeldmann/git", - "version": "3.8.4", + "version": "3.8.5", "source": { "type": "git", "url": "https://github.com/sebastianfeldmann/git.git", - "reference": "b324b6ba21871709812e34ad278a82c2e1c2965b" + "reference": "14de823cba82e30a3759e9eab1ebbd0d6f5d542c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/b324b6ba21871709812e34ad278a82c2e1c2965b", - "reference": "b324b6ba21871709812e34ad278a82c2e1c2965b", + "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/14de823cba82e30a3759e9eab1ebbd0d6f5d542c", + "reference": "14de823cba82e30a3759e9eab1ebbd0d6f5d542c", "shasum": "" }, "require": { @@ -4917,7 +4916,7 @@ "keywords": ["git"], "support": { "issues": "https://github.com/sebastianfeldmann/git/issues", - "source": "https://github.com/sebastianfeldmann/git/tree/3.8.4" + "source": "https://github.com/sebastianfeldmann/git/tree/3.8.5" }, "funding": [ { @@ -4925,7 +4924,7 @@ "type": "github" } ], - "time": "2022-08-26T07:03:13+00:00" + "time": "2022-10-23T11:29:41+00:00" }, { "name": "symfony/config", @@ -5002,16 +5001,16 @@ }, { "name": "symfony/console", - "version": "v6.1.6", + "version": "v6.1.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "7fa3b9cf17363468795e539231a5c91b02b608fc" + "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7fa3b9cf17363468795e539231a5c91b02b608fc", - "reference": "7fa3b9cf17363468795e539231a5c91b02b608fc", + "url": "https://api.github.com/repos/symfony/console/zipball/a1282bd0c096e0bdb8800b104177e2ce404d8815", + "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815", "shasum": "" }, "require": { @@ -5069,7 +5068,7 @@ "homepage": "https://symfony.com", "keywords": ["cli", "command line", "console", "terminal"], "support": { - "source": "https://github.com/symfony/console/tree/v6.1.6" + "source": "https://github.com/symfony/console/tree/v6.1.7" }, "funding": [ { @@ -5085,7 +5084,7 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:04:03+00:00" + "time": "2022-10-26T21:42:49+00:00" }, { "name": "symfony/dependency-injection", @@ -5857,16 +5856,16 @@ }, { "name": "symfony/string", - "version": "v6.1.6", + "version": "v6.1.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "7e7e0ff180d4c5a6636eaad57b65092014b61864" + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7e7e0ff180d4c5a6636eaad57b65092014b61864", - "reference": "7e7e0ff180d4c5a6636eaad57b65092014b61864", + "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", + "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", "shasum": "" }, "require": { @@ -5909,7 +5908,7 @@ "homepage": "https://symfony.com", "keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.6" + "source": "https://github.com/symfony/string/tree/v6.1.7" }, "funding": [ { @@ -6686,7 +6685,7 @@ "stability-flags": { "james-heinrich/getid3": 20, "michalsn/codeigniter4-uuid": 20, - "codeigniter4/shield": 20 + "codeigniter4/shield": 10 }, "prefer-stable": true, "prefer-lowest": false, From e26215a11fc23aa0ad5ccff8ee97d6c6e8a09c1a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 3 Nov 2022 17:26:40 +0000 Subject: [PATCH 027/477] fix: extract podcast ids from user groups using a regex --- modules/Auth/Helpers/auth_helper.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/Auth/Helpers/auth_helper.php b/modules/Auth/Helpers/auth_helper.php index a87ac811..2d73d9d9 100644 --- a/modules/Auth/Helpers/auth_helper.php +++ b/modules/Auth/Helpers/auth_helper.php @@ -183,7 +183,9 @@ if (! function_exists('get_podcast_groups')) { $userPodcastIds = []; // extract all podcast ids from groups foreach ($podcastGroups as $podcastGroup) { - $userPodcastIds[] = substr((string) $podcastGroup, strpos((string) $podcastGroup, '#') + 1, 1); + // extract podcast id from group and add it to the list of ids + preg_match('~podcast#([0-9]+)-[a-z]+~', $podcastGroup, $matches); + $userPodcastIds[] = $matches[1]; } return $userPodcastIds; From 9f785db7ba674638a6f456aa3626f3f8100911f1 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 3 Nov 2022 17:41:50 +0000 Subject: [PATCH 028/477] fix(contributors): add prefix to podcast group to delete contributor --- modules/Auth/Controllers/ContributorController.php | 2 +- modules/Auth/Helpers/auth_helper.php | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/modules/Auth/Controllers/ContributorController.php b/modules/Auth/Controllers/ContributorController.php index d40f0581..2a022870 100644 --- a/modules/Auth/Controllers/ContributorController.php +++ b/modules/Auth/Controllers/ContributorController.php @@ -228,7 +228,7 @@ class ContributorController extends BaseController ->delete("podcast#{$this->podcast->id}_contributors"); // remove contributor from podcast group - $this->contributor->removeGroup(get_podcast_group($this->contributor, $this->podcast->id)); + $this->contributor->removeGroup(get_podcast_group($this->contributor, $this->podcast->id, false)); return redirect() ->route('contributor-list', [$this->podcast->id]) diff --git a/modules/Auth/Helpers/auth_helper.php b/modules/Auth/Helpers/auth_helper.php index 2d73d9d9..d424ef77 100644 --- a/modules/Auth/Helpers/auth_helper.php +++ b/modules/Auth/Helpers/auth_helper.php @@ -136,7 +136,7 @@ if (! function_exists('set_instance_group')) { } if (! function_exists('get_podcast_group')) { - function get_podcast_group(User $user, int $podcastId): ?string + function get_podcast_group(User $user, int $podcastId, bool $removePrefix = true): ?string { $podcastGroups = array_filter($user->getGroups() ?? [], static function ($group) use ($podcastId): bool { return str_starts_with($group, "podcast#{$podcastId}"); @@ -154,8 +154,12 @@ if (! function_exists('get_podcast_group')) { $user->removeGroup(...$podcastGroups); } - // strip the `podcast#{id}.` prefix when returning group - return substr((string) $podcastGroup, strlen('podcast#' . $podcastId . '-')); + if ($removePrefix) { + // strip the `podcast#{id}.` prefix when returning group + return substr((string) $podcastGroup, strlen('podcast#' . $podcastId . '-')); + } + + return $podcastGroup; } } @@ -184,7 +188,7 @@ if (! function_exists('get_podcast_groups')) { // extract all podcast ids from groups foreach ($podcastGroups as $podcastGroup) { // extract podcast id from group and add it to the list of ids - preg_match('~podcast#([0-9]+)-[a-z]+~', $podcastGroup, $matches); + preg_match('~podcast#(\d+)-[a-z]+~', (string) $podcastGroup, $matches); $userPodcastIds[] = $matches[1]; } From 379b9be2b99574fe4af4009b01128dba2c75f037 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 4 Nov 2022 10:19:52 +0000 Subject: [PATCH 029/477] fix(auth): disallow registration by default --- modules/Auth/Config/Auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/Auth/Config/Auth.php b/modules/Auth/Config/Auth.php index 24ef0c89..369ffd38 100644 --- a/modules/Auth/Config/Auth.php +++ b/modules/Auth/Config/Auth.php @@ -74,7 +74,7 @@ class Auth extends ShieldAuth * -------------------------------------------------------------------- * Determines whether users can register for the site. */ - public bool $allowRegistration = true; + public bool $allowRegistration = false; /** * -------------------------------------------------------------------- From fa90decdd155a3f7308baa76bc6a450a0bbb6025 Mon Sep 17 00:00:00 2001 From: crowdin Date: Fri, 4 Nov 2022 11:03:24 +0000 Subject: [PATCH 030/477] chore(i18n): new Crowdin updates --- app/Language/de/Podcast.php | 12 +- app/Language/nn-NO/Common.php | 2 +- app/Language/nn-NO/Podcast.php | 16 +- app/Language/sv/Comment.php | 32 +- app/Language/sv/Common.php | 30 +- app/Language/sv/Episode.php | 30 +- app/Language/sv/Fediverse.php | 34 +- app/Language/sv/Home.php | 12 +- app/Language/sv/Page.php | 6 +- app/Language/sv/Podcast.php | 52 +- app/Language/sv/Post.php | 40 +- docs/src/ar/getting-started/auth.md | 87 ++++ docs/src/ar/getting-started/docker.md | 35 +- docs/src/br/getting-started/auth.md | 87 ++++ docs/src/br/getting-started/docker.md | 35 +- docs/src/ca/getting-started/auth.md | 87 ++++ docs/src/ca/getting-started/docker.md | 41 +- docs/src/ca/index.md | 4 +- docs/src/de/getting-started/auth.md | 87 ++++ docs/src/de/getting-started/docker.md | 35 +- docs/src/de/getting-started/install.md | 2 + docs/src/el/getting-started/auth.md | 87 ++++ docs/src/el/getting-started/docker.md | 35 +- docs/src/es/getting-started/auth.md | 87 ++++ docs/src/es/getting-started/docker.md | 43 +- docs/src/es/getting-started/install.md | 11 +- docs/src/es/getting-started/update.md | 8 +- docs/src/es/index.md | 2 +- docs/src/fa/getting-started/auth.md | 87 ++++ docs/src/fa/getting-started/docker.md | 35 +- docs/src/fr/getting-started/auth.md | 87 ++++ docs/src/fr/getting-started/docker.md | 35 +- docs/src/gd/getting-started/auth.md | 87 ++++ docs/src/gd/getting-started/docker.md | 35 +- docs/src/gd/index.md | 5 + docs/src/gl/getting-started/auth.md | 87 ++++ docs/src/gl/getting-started/docker.md | 35 +- docs/src/id/getting-started/auth.md | 87 ++++ docs/src/id/getting-started/docker.md | 35 +- docs/src/it/getting-started/auth.md | 87 ++++ docs/src/it/getting-started/docker.md | 35 +- docs/src/ko/getting-started/auth.md | 87 ++++ docs/src/ko/getting-started/docker.md | 35 +- docs/src/nl/getting-started/auth.md | 87 ++++ docs/src/nl/getting-started/docker.md | 35 +- docs/src/nn-NO/getting-started/auth.md | 87 ++++ docs/src/nn-NO/getting-started/docker.md | 35 +- docs/src/nn-NO/index.md | 5 + docs/src/oc/getting-started/auth.md | 87 ++++ docs/src/oc/getting-started/docker.md | 35 +- docs/src/oc/index.md | 5 + docs/src/pl/getting-started/auth.md | 87 ++++ docs/src/pl/getting-started/docker.md | 35 +- docs/src/pt-BR/getting-started/auth.md | 87 ++++ docs/src/pt-BR/getting-started/docker.md | 35 +- docs/src/pt-BR/getting-started/install.md | 2 + docs/src/pt/getting-started/auth.md | 87 ++++ docs/src/pt/getting-started/docker.md | 35 +- docs/src/pt/getting-started/install.md | 2 + docs/src/ru/getting-started/auth.md | 87 ++++ docs/src/ru/getting-started/docker.md | 35 +- docs/src/ru/getting-started/install.md | 2 + docs/src/sk/getting-started/auth.md | 87 ++++ docs/src/sk/getting-started/docker.md | 35 +- docs/src/sv/getting-started/auth.md | 87 ++++ docs/src/sv/getting-started/docker.md | 99 ++-- docs/src/sv/getting-started/install.md | 173 +++---- docs/src/sv/getting-started/security.md | 26 +- docs/src/sv/getting-started/update.md | 111 ++-- docs/src/sv/index.md | 356 ++++++------- docs/src/zh-Hans/getting-started/auth.md | 87 ++++ docs/src/zh-Hans/getting-started/docker.md | 41 +- docs/src/zh-Hans/getting-started/install.md | 2 + docs/src/zh-Hans/getting-started/update.md | 75 ++- docs/src/zh-Hans/index.md | 10 +- modules/Admin/Language/de/AboutCastopod.php | 16 +- modules/Admin/Language/de/Breadcrumb.php | 12 +- modules/Admin/Language/de/Charts.php | 4 +- modules/Admin/Language/de/Dashboard.php | 18 +- modules/Admin/Language/de/Episode.php | 52 +- modules/Admin/Language/de/Navigation.php | 2 +- modules/Admin/Language/de/Notifications.php | 14 +- modules/Admin/Language/de/Person.php | 2 +- modules/Admin/Language/de/Podcast.php | 44 +- modules/Admin/Language/de/PodcastImport.php | 2 +- .../Admin/Language/de/PodcastNavigation.php | 4 +- modules/Admin/Language/de/Settings.php | 6 +- modules/Admin/Language/gl/AboutCastopod.php | 16 +- modules/Admin/Language/gl/Breadcrumb.php | 10 +- modules/Admin/Language/gl/Episode.php | 16 +- modules/Admin/Language/sk/Breadcrumb.php | 10 +- modules/Admin/Language/sk/Countries.php | 112 +++-- modules/Admin/Language/sk/Episode.php | 64 +-- .../Admin/Language/sk/EpisodeNavigation.php | 2 +- modules/Admin/Language/sv/AboutCastopod.php | 12 +- modules/Admin/Language/sv/Breadcrumb.php | 76 +-- modules/Admin/Language/sv/Charts.php | 52 +- modules/Admin/Language/sv/Common.php | 62 +-- modules/Admin/Language/sv/Countries.php | 282 +++++------ modules/Admin/Language/sv/Dashboard.php | 18 +- modules/Admin/Language/sv/Episode.php | 292 +++++------ .../Admin/Language/sv/EpisodeNavigation.php | 22 +- modules/Admin/Language/sv/Fediverse.php | 28 +- modules/Admin/Language/sv/Home.php | 4 +- modules/Admin/Language/sv/Install.php | 56 +-- modules/Admin/Language/sv/Navigation.php | 52 +- modules/Admin/Language/sv/Notifications.php | 14 +- modules/Admin/Language/sv/Page.php | 28 +- modules/Admin/Language/sv/Pager.php | 18 +- modules/Admin/Language/sv/Person.php | 74 +-- modules/Admin/Language/sv/Platforms.php | 26 +- modules/Admin/Language/sv/Podcast.php | 472 +++++++++--------- modules/Admin/Language/sv/PodcastImport.php | 36 +- .../Admin/Language/sv/PodcastNavigation.php | 50 +- modules/Admin/Language/sv/Settings.php | 72 +-- modules/Admin/Language/sv/Soundbite.php | 26 +- modules/Admin/Language/sv/Validation.php | 4 +- modules/Admin/Language/sv/VideoClip.php | 86 ++-- .../Admin/Language/zh-Hans/AboutCastopod.php | 16 +- modules/Admin/Language/zh-Hans/Breadcrumb.php | 6 +- modules/Admin/Language/zh-Hans/Episode.php | 14 +- modules/Admin/Language/zh-Hans/Navigation.php | 2 +- modules/Auth/Language/ar/Auth.php | 1 + modules/Auth/Language/ar/Contributor.php | 10 +- modules/Auth/Language/ar/User.php | 15 +- modules/Auth/Language/br/Auth.php | 1 + modules/Auth/Language/br/Contributor.php | 10 +- modules/Auth/Language/br/User.php | 15 +- modules/Auth/Language/ca/Auth.php | 1 + modules/Auth/Language/ca/Contributor.php | 10 +- modules/Auth/Language/ca/User.php | 15 +- modules/Auth/Language/de/Auth.php | 59 +-- modules/Auth/Language/de/Contributor.php | 10 +- modules/Auth/Language/de/User.php | 15 +- modules/Auth/Language/el/Auth.php | 1 + modules/Auth/Language/el/Contributor.php | 10 +- modules/Auth/Language/el/User.php | 15 +- modules/Auth/Language/es/Auth.php | 1 + modules/Auth/Language/es/Contributor.php | 10 +- modules/Auth/Language/es/User.php | 15 +- modules/Auth/Language/fa/Auth.php | 1 + modules/Auth/Language/fa/Contributor.php | 10 +- modules/Auth/Language/fa/User.php | 15 +- modules/Auth/Language/fr/Auth.php | 1 + modules/Auth/Language/fr/Contributor.php | 10 +- modules/Auth/Language/fr/User.php | 15 +- modules/Auth/Language/gd/Auth.php | 1 + modules/Auth/Language/gd/Contributor.php | 10 +- modules/Auth/Language/gd/User.php | 15 +- modules/Auth/Language/gl/Auth.php | 1 + modules/Auth/Language/gl/Contributor.php | 10 +- modules/Auth/Language/gl/User.php | 15 +- modules/Auth/Language/id/Auth.php | 1 + modules/Auth/Language/id/Contributor.php | 10 +- modules/Auth/Language/id/User.php | 15 +- modules/Auth/Language/it/Auth.php | 1 + modules/Auth/Language/it/Contributor.php | 10 +- modules/Auth/Language/it/User.php | 15 +- modules/Auth/Language/ko/Auth.php | 1 + modules/Auth/Language/ko/Contributor.php | 47 ++ modules/Auth/Language/ko/MyAccount.php | 18 + modules/Auth/Language/ko/User.php | 60 +++ modules/Auth/Language/nl/Auth.php | 1 + modules/Auth/Language/nl/Contributor.php | 10 +- modules/Auth/Language/nl/User.php | 15 +- modules/Auth/Language/nn-NO/Auth.php | 1 + modules/Auth/Language/nn-NO/Contributor.php | 10 +- modules/Auth/Language/nn-NO/User.php | 15 +- modules/Auth/Language/oc/Auth.php | 1 + modules/Auth/Language/oc/Contributor.php | 10 +- modules/Auth/Language/oc/User.php | 15 +- modules/Auth/Language/pl/Auth.php | 1 + modules/Auth/Language/pl/Contributor.php | 10 +- modules/Auth/Language/pl/User.php | 15 +- modules/Auth/Language/pt-BR/Auth.php | 1 + modules/Auth/Language/pt-BR/Contributor.php | 10 +- modules/Auth/Language/pt-BR/User.php | 15 +- modules/Auth/Language/pt/Auth.php | 1 + modules/Auth/Language/pt/Contributor.php | 10 +- modules/Auth/Language/pt/User.php | 15 +- modules/Auth/Language/ru/Auth.php | 1 + modules/Auth/Language/ru/Contributor.php | 10 +- modules/Auth/Language/ru/User.php | 15 +- modules/Auth/Language/sk/Auth.php | 1 + modules/Auth/Language/sk/Contributor.php | 10 +- modules/Auth/Language/sk/User.php | 15 +- modules/Auth/Language/sv/Auth.php | 97 ++-- modules/Auth/Language/sv/Contributor.php | 10 +- modules/Auth/Language/sv/User.php | 15 +- modules/Auth/Language/zh-Hans/Auth.php | 101 ++-- modules/Auth/Language/zh-Hans/Contributor.php | 10 +- modules/Auth/Language/zh-Hans/User.php | 15 +- modules/Install/Language/sv/Install.php | 56 +-- .../Language/de/Subscription.php | 54 +- .../Language/sv/PremiumPodcasts.php | 36 +- .../Language/sv/Subscription.php | 142 +++--- 196 files changed, 5321 insertions(+), 2182 deletions(-) create mode 100644 docs/src/ar/getting-started/auth.md create mode 100644 docs/src/br/getting-started/auth.md create mode 100644 docs/src/ca/getting-started/auth.md create mode 100644 docs/src/de/getting-started/auth.md create mode 100644 docs/src/el/getting-started/auth.md create mode 100644 docs/src/es/getting-started/auth.md create mode 100644 docs/src/fa/getting-started/auth.md create mode 100644 docs/src/fr/getting-started/auth.md create mode 100644 docs/src/gd/getting-started/auth.md create mode 100644 docs/src/gl/getting-started/auth.md create mode 100644 docs/src/id/getting-started/auth.md create mode 100644 docs/src/it/getting-started/auth.md create mode 100644 docs/src/ko/getting-started/auth.md create mode 100644 docs/src/nl/getting-started/auth.md create mode 100644 docs/src/nn-NO/getting-started/auth.md create mode 100644 docs/src/oc/getting-started/auth.md create mode 100644 docs/src/pl/getting-started/auth.md create mode 100644 docs/src/pt-BR/getting-started/auth.md create mode 100644 docs/src/pt/getting-started/auth.md create mode 100644 docs/src/ru/getting-started/auth.md create mode 100644 docs/src/sk/getting-started/auth.md create mode 100644 docs/src/sv/getting-started/auth.md create mode 100644 docs/src/zh-Hans/getting-started/auth.md create mode 100644 modules/Auth/Language/ko/Contributor.php create mode 100644 modules/Auth/Language/ko/MyAccount.php create mode 100644 modules/Auth/Language/ko/User.php diff --git a/app/Language/de/Podcast.php b/app/Language/de/Podcast.php index d4f19356..238b680d 100644 --- a/app/Language/de/Podcast.php +++ b/app/Language/de/Podcast.php @@ -18,12 +18,12 @@ return [ 'follow' => 'Folgen', 'followTitle' => 'Folge {actorDisplayName} im Fediversum', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# Follower} + other {# Follower} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# Beitrag} + other {# Beiträge} }', 'activity' => 'Aktivitäten', 'episodes' => 'Episoden', @@ -32,8 +32,8 @@ return [ 'stats' => [ 'title' => 'Statistiken', 'number_of_seasons' => '{0, plural, - one {# season} - other {# seasons} + one {# Staffel} + other {# Staffeln} }', 'number_of_episodes' => '{0, plural, one {# Episode} diff --git a/app/Language/nn-NO/Common.php b/app/Language/nn-NO/Common.php index d772c042..47310aef 100644 --- a/app/Language/nn-NO/Common.php +++ b/app/Language/nn-NO/Common.php @@ -26,5 +26,5 @@ return [ 'read_less' => 'Les mindre', 'see_more' => 'Sjå meir', 'see_less' => 'Sjå mindre', - 'legal_notice' => 'Legal notice', + 'legal_notice' => 'Juridisk merknad', ]; diff --git a/app/Language/nn-NO/Podcast.php b/app/Language/nn-NO/Podcast.php index ec81b1af..7f3b760f 100644 --- a/app/Language/nn-NO/Podcast.php +++ b/app/Language/nn-NO/Podcast.php @@ -18,12 +18,12 @@ return [ 'follow' => 'Fylg', 'followTitle' => 'Fylg {actorDisplayName} på fødiverset!', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# fylgjar} + other {# fylgjarar} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# innlegg} + other {# innlegg} }', 'activity' => 'Aktivitet', 'episodes' => 'Episodar', @@ -32,14 +32,14 @@ return [ 'stats' => [ 'title' => 'Statistikk', 'number_of_seasons' => '{0, plural, - one {# season} - other {# seasons} + one {# sesong} + other {# sesongar} }', 'number_of_episodes' => '{0, plural, one {# episode} - other {# episodes} + other {# episodar} }', - 'first_published_at' => 'First episode published on {0, date, medium}', + 'first_published_at' => 'Den fyrste episoden vart utgjeven {0, date, medium}', ], 'sponsor' => 'Sponsor', 'funding_links' => 'Finansieringslenker for {podcastTitle}', diff --git a/app/Language/sv/Comment.php b/app/Language/sv/Comment.php index 1dd8f5ea..5b619a3a 100644 --- a/app/Language/sv/Comment.php +++ b/app/Language/sv/Comment.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'title' => "{actorDisplayName}'s comment for {episodeTitle}", - 'back_to_comments' => 'Back to comments', + 'title' => "{actorDisplayName}s kommentar till {episodeTitle}", + 'back_to_comments' => 'Tillbaka till kommentarer', 'form' => [ - 'episode_message_placeholder' => 'Write a comment…', - 'reply_to_placeholder' => 'Reply to @{actorUsername}', - 'submit' => 'Send', - 'submit_reply' => 'Reply', + 'episode_message_placeholder' => 'Skriv en kommentar…', + 'reply_to_placeholder' => 'Svara på @{actorUsername}', + 'submit' => 'Skicka', + 'submit_reply' => 'Svara', ], 'likes' => '{numberOfLikes, plural, - one {# like} - other {# likes} + one {# gillar} + other {# gillar} }', 'replies' => '{numberOfReplies, plural, - one {# reply} - other {# replies} + one {# svar} + other {# svar} }', - 'like' => 'Like', - 'reply' => 'Reply', - 'view_replies' => 'View replies ({numberOfReplies})', - 'block_actor' => 'Block user @{actorUsername}', - 'block_domain' => 'Block domain @{actorDomain}', - 'delete' => 'Delete comment', + 'like' => 'Gilla', + 'reply' => 'Svara', + 'view_replies' => 'Visa svar ({numberOfReplies})', + 'block_actor' => 'Blockera användare @{actorUsername}', + 'block_domain' => 'Blockera domän @{actorDomain}', + 'delete' => 'Radera kommentar', ]; diff --git a/app/Language/sv/Common.php b/app/Language/sv/Common.php index 1258afcc..c173b343 100644 --- a/app/Language/sv/Common.php +++ b/app/Language/sv/Common.php @@ -9,22 +9,22 @@ declare(strict_types=1); */ return [ - 'yes' => 'Yes', - 'no' => 'No', - 'cancel' => 'Cancel', - 'optional' => 'Optional', - 'close' => 'Close', - 'home' => 'Home', + 'yes' => 'Ja', + 'no' => 'Nej', + 'cancel' => 'Avbryt', + 'optional' => 'Valfritt', + 'close' => 'Stäng', + 'home' => 'Hem', 'explicit' => 'Explicit', - 'powered_by' => 'Powered by {castopod}', - 'go_back' => 'Go back', + 'powered_by' => 'Drivs av {castopod}', + 'go_back' => 'Gå tillbaka', 'play_episode_button' => [ - 'play' => 'Play', - 'playing' => 'Playing', + 'play' => 'Spela', + 'playing' => 'Spelar', ], - 'read_more' => 'Read more', - 'read_less' => 'Read less', - 'see_more' => 'See more', - 'see_less' => 'See less', - 'legal_notice' => 'Legal notice', + 'read_more' => 'Läs mer', + 'read_less' => 'Läs mindre', + 'see_more' => 'Se mer', + 'see_less' => 'Se mindre', + 'legal_notice' => 'Villkor', ]; diff --git a/app/Language/sv/Episode.php b/app/Language/sv/Episode.php index ebe39336..3571750c 100644 --- a/app/Language/sv/Episode.php +++ b/app/Language/sv/Episode.php @@ -9,25 +9,25 @@ declare(strict_types=1); */ return [ - 'season' => 'Season {seasonNumber}', + 'season' => 'Säsong {seasonNumber}', 'season_abbr' => 'S{seasonNumber}', - 'number' => 'Episode {episodeNumber}', - 'number_abbr' => 'Ep. {episodeNumber}', - 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', - 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', + 'number' => 'Avsnitt {episodeNumber}', + 'number_abbr' => 'Av. {episodeNumber}', + 'season_episode' => 'Säsong {seasonNumber} avsnitt {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}:A{episodeNumber}', 'persons' => '{personsCount, plural, one {# person} - other {# persons} + other {# personer} }', - 'persons_list' => 'Persons', - 'back_to_episodes' => 'Back to episodes of {podcast}', - 'comments' => 'Comments', - 'activity' => 'Activity', - 'description' => 'Episode description', + 'persons_list' => 'Personer', + 'back_to_episodes' => 'Tillbaka till avsnitten av {podcast}', + 'comments' => 'Kommentarer', + 'activity' => 'Aktivitet', + 'description' => 'Beskrivning av avsnitt', 'number_of_comments' => '{numberOfComments, plural, - one {# comment} - other {# comments} + one {# kommentar} + other {# kommentarer} }', - 'all_podcast_episodes' => 'All podcast episodes', - 'back_to_podcast' => 'Go back to podcast', + 'all_podcast_episodes' => 'Alla podcast avsnitt', + 'back_to_podcast' => 'Gå tillbaka till podcasten', ]; diff --git a/app/Language/sv/Fediverse.php b/app/Language/sv/Fediverse.php index 32f54c07..162260ec 100644 --- a/app/Language/sv/Fediverse.php +++ b/app/Language/sv/Fediverse.php @@ -9,29 +9,29 @@ declare(strict_types=1); */ return [ - 'your_handle' => 'Your handle', - 'your_handle_hint' => 'Enter the @username@domain you want to act from.', + 'your_handle' => 'Ditt handtag', + 'your_handle_hint' => 'Ange @användarnamn@domän som du vill agera från.', 'follow' => [ - 'label' => 'Follow', - 'title' => 'Follow {actorDisplayName}', - 'subtitle' => 'You are going to follow:', - 'accountNotFound' => 'The account could not be found.', - 'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…', - 'submit' => 'Proceed to follow', + 'label' => 'Följ', + 'title' => 'Följ {actorDisplayName}', + 'subtitle' => 'Du kommer att följa:', + 'accountNotFound' => 'Det gick inte att hitta kontot.', + 'remoteFollowNotAllowed' => 'Verkar som om kontots server inte tillåter fjärråtkomst följare…', + 'submit' => 'Fortsätt för att följa', ], 'favourite' => [ - 'title' => "Favourite {actorDisplayName}'s post", - 'subtitle' => 'You are going to favourite:', - 'submit' => 'Proceed to favourite', + 'title' => "Favorit {actorDisplayName}s inlägg", + 'subtitle' => 'Du kommer att favorisera:', + 'submit' => 'Fortsätt för att favorisera', ], 'reblog' => [ - 'title' => "Share {actorDisplayName}'s post", - 'subtitle' => 'You are going to share:', - 'submit' => 'Proceed to share', + 'title' => "Dela {actorDisplayName}s inlägg", + 'subtitle' => 'Du kommer att dela:', + 'submit' => 'Fortsätt för att dela', ], 'reply' => [ - 'title' => "Reply to {actorDisplayName}'s post", - 'subtitle' => 'You are going to reply to:', - 'submit' => 'Proceed to reply', + 'title' => "Svara på {actorDisplayName}s inlägg", + 'subtitle' => 'Du kommer att svara på:', + 'submit' => 'Fortsätt för att svara', ], ]; diff --git a/app/Language/sv/Home.php b/app/Language/sv/Home.php index 1518239b..618585a3 100644 --- a/app/Language/sv/Home.php +++ b/app/Language/sv/Home.php @@ -9,12 +9,12 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'sort_by' => 'Sort by', + 'all_podcasts' => 'Alla podcasts', + 'sort_by' => 'Sortera efter', 'sort_options' => [ - 'activity' => 'Recent activity', - 'created_desc' => 'Newest first', - 'created_asc' => 'Oldest first', + 'activity' => 'Senaste aktivitet', + 'created_desc' => 'Nyaste först', + 'created_asc' => 'Äldsta först', ], - 'no_podcast' => 'No podcast found', + 'no_podcast' => 'Ingen podcast hittades', ]; diff --git a/app/Language/sv/Page.php b/app/Language/sv/Page.php index 7cd60669..7c5ebc11 100644 --- a/app/Language/sv/Page.php +++ b/app/Language/sv/Page.php @@ -9,9 +9,9 @@ declare(strict_types=1); */ return [ - 'back_to_home' => 'Back to home', + 'back_to_home' => 'Tillbaka till startsidan', 'map' => [ - 'title' => 'Map', - 'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.', + 'title' => 'Karta', + 'description' => 'Upptäck podcast avsnitt på {siteName} som placeras på en karta! Res genom kartan och lyssna på avsnitt som talar om specifika platser.', ], ]; diff --git a/app/Language/sv/Podcast.php b/app/Language/sv/Podcast.php index 9b1e749a..067056f2 100644 --- a/app/Language/sv/Podcast.php +++ b/app/Language/sv/Podcast.php @@ -9,45 +9,45 @@ declare(strict_types=1); */ return [ - 'feed' => 'RSS Podcast feed', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'feed' => 'RSS Podcast flöde', + 'season' => 'Säsong {seasonNumber}', + 'list_of_episodes_year' => '{year} avsnitt ({episodeCount})', 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', - 'followTitle' => 'Follow {actorDisplayName} on the fediverse!', + 'Säsong {seasonNumber} avsnitt ({episodeCount})', + 'no_episode' => 'Inga avsnitt hittades!', + 'follow' => 'Följ', + 'followTitle' => 'Följ {actorDisplayName} på fediverse!', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# följare} + other {# följare} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# inlägg} + other {# inlägg} }', - 'activity' => 'Activity', - 'episodes' => 'Episodes', - 'episodes_title' => 'Episodes of {podcastTitle}', - 'about' => 'About', + 'activity' => 'Aktivitet', + 'episodes' => 'Avsnitt', + 'episodes_title' => 'Avsnitt av {podcastTitle}', + 'about' => 'Om', 'stats' => [ - 'title' => 'Stats', + 'title' => 'Statistik', 'number_of_seasons' => '{0, plural, - one {# season} - other {# seasons} + one {# säsong} + other {# säsonger} }', 'number_of_episodes' => '{0, plural, - one {# episode} - other {# episodes} + one {# avsnitt} + other {# avsnitt} }', - 'first_published_at' => 'First episode published on {0, date, medium}', + 'first_published_at' => 'Första avsnittet publicerades den {0, date, medium}', ], 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', + 'funding_links' => 'Finansiera länkar för {podcastTitle}', + 'find_on' => 'Hitta {podcastTitle} på', + 'listen_on' => 'Lyssna på', 'persons' => '{personsCount, plural, one {# person} - other {# persons} + other {# personer} }', - 'persons_list' => 'Persons', + 'persons_list' => 'Personer', ]; diff --git a/app/Language/sv/Post.php b/app/Language/sv/Post.php index 58d1cf80..cafe1ac4 100644 --- a/app/Language/sv/Post.php +++ b/app/Language/sv/Post.php @@ -9,32 +9,32 @@ declare(strict_types=1); */ return [ - 'title' => "{actorDisplayName}'s post", - 'back_to_actor_posts' => 'Back to {actor} posts', - 'actor_shared' => '{actor} shared', - 'reply_to' => 'Reply to @{actorUsername}', + 'title' => "{actorDisplayName}s inlägg", + 'back_to_actor_posts' => 'Tillbaka till {actor} inlägg', + 'actor_shared' => '{actor} delades', + 'reply_to' => 'Svara på @{actorUsername}', 'form' => [ - 'message_placeholder' => 'Write a message…', - 'episode_message_placeholder' => 'Write a message for the episode…', - 'episode_url_placeholder' => 'Episode URL', - 'reply_to_placeholder' => 'Reply to @{actorUsername}', - 'submit' => 'Send', - 'submit_reply' => 'Reply', + 'message_placeholder' => 'Skriv ett meddelande…', + 'episode_message_placeholder' => 'Skriv ett meddelande för avsnittet…', + 'episode_url_placeholder' => 'Avsnitt URL', + 'reply_to_placeholder' => 'Svara på @{actorUsername}', + 'submit' => 'Skicka', + 'submit_reply' => 'Svara', ], 'favourites' => '{numberOfFavourites, plural, - one {# favourite} - other {# favourites} + one {# favorit} + other {# favoriter} }', 'reblogs' => '{numberOfReblogs, plural, - one {# share} - other {# shares} + one {# delning} + other {# delningar} }', 'replies' => '{numberOfReplies, plural, - one {# reply} - other {# replies} + one {# svar} + other {# svar} }', - 'expand' => 'Expand post', - 'block_actor' => 'Block user @{actorUsername}', - 'block_domain' => 'Block domain @{actorDomain}', - 'delete' => 'Delete post', + 'expand' => 'Expandera inlägg', + 'block_actor' => 'Blockera användare @{actorUsername}', + 'block_domain' => 'Blockera domän @{actorDomain}', + 'delete' => 'Ta bort inlägg', ]; diff --git a/docs/src/ar/getting-started/auth.md b/docs/src/ar/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/ar/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/ar/getting-started/docker.md b/docs/src/ar/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/ar/getting-started/docker.md +++ b/docs/src/ar/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/br/getting-started/auth.md b/docs/src/br/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/br/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/br/getting-started/docker.md b/docs/src/br/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/br/getting-started/docker.md +++ b/docs/src/br/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/ca/getting-started/auth.md b/docs/src/ca/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/ca/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/ca/getting-started/docker.md b/docs/src/ca/getting-started/docker.md index 7b967d92..d1aea27f 100644 --- a/docs/src/ca/getting-started/docker.md +++ b/docs/src/ca/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Imatges Docker oficials -Castopod envia 2 imatges de Docker al Docker Hub durant el seu procés de creació -automatitzada: +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: - [** code>castopod/app**](https://hub.docker.com/r/castopod/app): el paquet incloent Castopod i totes les dependències - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una configuració de Nginx per a Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg A més, Castopod requereix una base de dades compatible amb MySQL. Es pot afegir una base de dades Redis com a gestor de memòria cau. @@ -21,6 +23,8 @@ una base de dades Redis com a gestor de memòria cau. - `develop` [no-estable], darrera versió de la branca de desenvolupament - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Exemple d'ús @@ -33,7 +37,7 @@ una base de dades Redis com a gestor de memòria cau. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ una base de dades Redis com a gestor de memòria cau. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ una base de dades Redis com a gestor de memòria cau. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -117,9 +136,19 @@ una base de dades Redis com a gestor de memòria cau. ## Variables d'entorn +- **castopod/video-clipper** + + | Nom de la variable | Tipus (`default`) | Default | + | -------------------------- | ----------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** - | Nom de la variable | Tipus (`default`) | Default | + | Nom de la variable | Type (`default`) | Default | | ---------------------------- | ----------------------- | ---------------- | | **`CP_BASEURL`** | string | `undefined` | | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | @@ -145,6 +174,6 @@ una base de dades Redis com a gestor de memòria cau. - **castopod/web-server** - | Nom de la variable | Type | Default | + | Variable name | Type | Default | | --------------------- | ------- | ------- | | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/ca/index.md b/docs/src/ca/index.md index a2df1fd6..d8ea821b 100644 --- a/docs/src/ca/index.md +++ b/docs/src/ca/index.md @@ -87,8 +87,8 @@ descentralització i així garantir que la creativitat dels podcasters pugui expressar-se. Aquest projecte és impulsat per la comunitat de codi obert, i concretament pels -moviments [Fediverse](https://fediverse.party/en/fediverse/) i [Podcasting -2.0](https://podcastindex .org/). +moviments [Fediverse](https://fediverse.party/en/fediverse/) i \[Podcasting +2.0\](https://podcastindex .org/). ## Comparació amb altres solucions diff --git a/docs/src/de/getting-started/auth.md b/docs/src/de/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/de/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/de/getting-started/docker.md b/docs/src/de/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/de/getting-started/docker.md +++ b/docs/src/de/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/de/getting-started/install.md b/docs/src/de/getting-started/install.md index c68be846..3c99e225 100644 --- a/docs/src/de/getting-started/install.md +++ b/docs/src/de/getting-started/install.md @@ -142,6 +142,8 @@ You may add your email configuration in your instance's `.env` like so: ```ini # […] +# […] + email.fromEmail="your_email_address" email.SMTPHost="your_smtp_host" email.SMTPUser="your_smtp_user" diff --git a/docs/src/el/getting-started/auth.md b/docs/src/el/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/el/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/el/getting-started/docker.md b/docs/src/el/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/el/getting-started/docker.md +++ b/docs/src/el/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/es/getting-started/auth.md b/docs/src/es/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/es/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/es/getting-started/docker.md b/docs/src/es/getting-started/docker.md index 2fb21b1b..849b2478 100644 --- a/docs/src/es/getting-started/docker.md +++ b/docs/src/es/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Imágenes oficiales de Docker -Castopod lanza 2 imágenes Docker al Docker Hub durante su proceso de -construcción automatizada: +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el paquete completo de Castopod con todas las dependencias. - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una configuración Nginx para Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Adicionalmente, Castopod requiere una base de datos compatible con MySQL. También se puede añadir una base de datos Redis como gestor de caché. @@ -21,6 +23,8 @@ También se puede añadir una base de datos Redis como gestor de caché. - `develop` [unstable], última rama de desarrollo construida - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Ejemplo de uso @@ -33,7 +37,7 @@ También se puede añadir una base de datos Redis como gestor de caché. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ También se puede añadir una base de datos Redis como gestor de caché. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ También se puede añadir una base de datos Redis como gestor de caché. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -113,13 +132,23 @@ También se puede añadir una base de datos Redis como gestor de caché. `https://castopod.mi_dominio.com/cp-install` para terminar de configurar Castopod! -5. Todo listo, empieza a hacer podcasting! 🎙️🚀 +5. Todo listo, empieza a hacer podcasting! 🎙️🚀 🎙️🚀 ## Variables de Entorno +- **castopod/video-clipper** + + | Nombre de la Variable | Tipo (`predeterminado`) | Default | + | -------------------------- | ----------------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** - | Nombre de la Variable | Tipo (`predeterminado`) | Default | + | Nombre de la variable | Type (`default`) | Default | | ---------------------------- | ----------------------- | ---------------- | | **`CP_URLBASE`** | string | `undefined` | | **`CP_MEDIA_URLBASE`** | ?string | `CP_BASEURL` | @@ -145,6 +174,6 @@ También se puede añadir una base de datos Redis como gestor de caché. - **castopod/web-server** - | Nombre de la variable | Type | Default | + | Variable name | Type | Default | | --------------------- | ------- | ------- | | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/es/getting-started/install.md b/docs/src/es/getting-started/install.md index b7febe86..6b271739 100644 --- a/docs/src/es/getting-started/install.md +++ b/docs/src/es/getting-started/install.md @@ -120,9 +120,7 @@ extensiones: > Estas tareas así definidas se ejecutarán **cada minuto**. Pero puedes > definir una frecuencia más acorde a tus necesidades: cada 5, 10 minutos o - > más. Ejemplo: si reemplazas el último asterisco por \*/30 se ejecutará cada - > 30 minutos. - > ([más ejemplos](https://blog.carreralinux.com.ar/2016/09/ejemplos-de-cron-tareas-linux/)) + > más. ### (recomendado) Asistente web de instalación @@ -150,10 +148,9 @@ You may add your email configuration in your instance's `.env` like so: ```ini # […] -email.fromEmail="your_email_address" -email.SMTPHost="your_smtp_host" -email.SMTPUser="your_smtp_user" -email.SMTPPass="your_smtp_password" +SMTPHost="your_smtp_host" +email. SMTPUser="your_smtp_user" +email. SMTPPass="your_smtp_password" ``` #### Email config options diff --git a/docs/src/es/getting-started/update.md b/docs/src/es/getting-started/update.md index 601afbeb..af9d1215 100644 --- a/docs/src/es/getting-started/update.md +++ b/docs/src/es/getting-started/update.md @@ -66,7 +66,7 @@ Releases may come with additional update instructions (see ## Fully Automated updates -> Próximamente... 👀 +> Próximamente... ## Preguntas Frecuentes (FAQ) @@ -80,9 +80,9 @@ file. ### No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer? -No problem! Just get the latest release as described above. Only, when going -through the release instructions (4), perform them sequentially, from the oldest -to the newest. +No problem! No problem! Just get the latest release as described above. Only, +when going through the release instructions (4), perform them sequentially, from +the oldest to the newest. > Puede que quieras hacer una copia de seguridad de tu instancia dependiendo del > tiempo que no hayas actualizado Castopod. diff --git a/docs/src/es/index.md b/docs/src/es/index.md index 7475549b..b0566d29 100644 --- a/docs/src/es/index.md +++ b/docs/src/es/index.md @@ -149,7 +149,7 @@ y usar Castopod si quieres alojar tus podcasts. ### Castopod vs. otras plataformas de podcast Hay muchas soluciones para alojar tus podcasts, algunas de las cuales son -realmente geniales y [muchas de ellas](https://podcastindex. org/apps) están +realmente geniales y \[muchas de ellas\](https://podcastindex. org/apps) están dando el salto al tren del Podcasting 2.0, ¡como ya ha hecho Castopod! Cada una de estas soluciones difiere entre sí, puedes compararlas en esta diff --git a/docs/src/fa/getting-started/auth.md b/docs/src/fa/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/fa/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/fa/getting-started/docker.md b/docs/src/fa/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/fa/getting-started/docker.md +++ b/docs/src/fa/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/fr/getting-started/auth.md b/docs/src/fr/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/fr/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/fr/getting-started/docker.md b/docs/src/fr/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/fr/getting-started/docker.md +++ b/docs/src/fr/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/gd/getting-started/auth.md b/docs/src/gd/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/gd/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/gd/getting-started/docker.md b/docs/src/gd/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/gd/getting-started/docker.md +++ b/docs/src/gd/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md index d89daccb..335197e0 100644 --- a/docs/src/gd/index.md +++ b/docs/src/gd/index.md @@ -285,6 +285,11 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/github/stars/ad-aures/castopod?style=social +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social [release]: https://code.castopod.org/adaures/castopod/-/releases [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md diff --git a/docs/src/gl/getting-started/auth.md b/docs/src/gl/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/gl/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/gl/getting-started/docker.md b/docs/src/gl/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/gl/getting-started/docker.md +++ b/docs/src/gl/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/id/getting-started/auth.md b/docs/src/id/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/id/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/id/getting-started/docker.md b/docs/src/id/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/id/getting-started/docker.md +++ b/docs/src/id/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/it/getting-started/auth.md b/docs/src/it/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/it/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/it/getting-started/docker.md b/docs/src/it/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/it/getting-started/docker.md +++ b/docs/src/it/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/ko/getting-started/auth.md b/docs/src/ko/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/ko/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/ko/getting-started/docker.md b/docs/src/ko/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/ko/getting-started/docker.md +++ b/docs/src/ko/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/nl/getting-started/auth.md b/docs/src/nl/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/nl/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/nl/getting-started/docker.md b/docs/src/nl/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/nl/getting-started/docker.md +++ b/docs/src/nl/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/nn-NO/getting-started/auth.md b/docs/src/nn-NO/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/nn-NO/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/nn-NO/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/nn-NO/getting-started/docker.md +++ b/docs/src/nn-NO/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md index 38881ecd..0c7598cc 100644 --- a/docs/src/nn-NO/index.md +++ b/docs/src/nn-NO/index.md @@ -286,6 +286,11 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/github/stars/ad-aures/castopod?style=social +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social [release]: https://code.castopod.org/adaures/castopod/-/releases [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md diff --git a/docs/src/oc/getting-started/auth.md b/docs/src/oc/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/oc/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/oc/getting-started/docker.md b/docs/src/oc/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/oc/getting-started/docker.md +++ b/docs/src/oc/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/oc/index.md b/docs/src/oc/index.md index d89daccb..335197e0 100644 --- a/docs/src/oc/index.md +++ b/docs/src/oc/index.md @@ -285,6 +285,11 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/github/stars/ad-aures/castopod?style=social +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social [release]: https://code.castopod.org/adaures/castopod/-/releases [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md diff --git a/docs/src/pl/getting-started/auth.md b/docs/src/pl/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/pl/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/pl/getting-started/docker.md b/docs/src/pl/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/pl/getting-started/docker.md +++ b/docs/src/pl/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/pt-BR/getting-started/auth.md b/docs/src/pt-BR/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/pt-BR/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/pt-BR/getting-started/docker.md b/docs/src/pt-BR/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/pt-BR/getting-started/docker.md +++ b/docs/src/pt-BR/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md index d27d6c59..760a0a6a 100644 --- a/docs/src/pt-BR/getting-started/install.md +++ b/docs/src/pt-BR/getting-started/install.md @@ -144,6 +144,8 @@ You may add your email configuration in your instance's `.env` like so: ```ini # […] +# […] + email.fromEmail="your_email_address" email.SMTPHost="your_smtp_host" email.SMTPUser="your_smtp_user" diff --git a/docs/src/pt/getting-started/auth.md b/docs/src/pt/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/pt/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/pt/getting-started/docker.md b/docs/src/pt/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/pt/getting-started/docker.md +++ b/docs/src/pt/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md index c68be846..3c99e225 100644 --- a/docs/src/pt/getting-started/install.md +++ b/docs/src/pt/getting-started/install.md @@ -142,6 +142,8 @@ You may add your email configuration in your instance's `.env` like so: ```ini # […] +# […] + email.fromEmail="your_email_address" email.SMTPHost="your_smtp_host" email.SMTPUser="your_smtp_user" diff --git a/docs/src/ru/getting-started/auth.md b/docs/src/ru/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/ru/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/ru/getting-started/docker.md b/docs/src/ru/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/ru/getting-started/docker.md +++ b/docs/src/ru/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md index c68be846..3c99e225 100644 --- a/docs/src/ru/getting-started/install.md +++ b/docs/src/ru/getting-started/install.md @@ -142,6 +142,8 @@ You may add your email configuration in your instance's `.env` like so: ```ini # […] +# […] + email.fromEmail="your_email_address" email.SMTPHost="your_smtp_host" email.SMTPUser="your_smtp_user" diff --git a/docs/src/sk/getting-started/auth.md b/docs/src/sk/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/sk/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/sk/getting-started/docker.md b/docs/src/sk/getting-started/docker.md index ededc582..e19320f2 100644 --- a/docs/src/sk/getting-started/docker.md +++ b/docs/src/sk/getting-started/docker.md @@ -5,13 +5,15 @@ sidebarDepth: 3 # Official Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg Additionally, Castopod requires a MySQL-compatible database. A Redis database can be added as a cache handler. @@ -21,6 +23,8 @@ can be added as a cache handler. - `develop` [unstable], latest development branch build - `beta` [stable], latest beta version build - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) ## Example usage @@ -33,7 +37,7 @@ can be added as a cache handler. services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -115,6 +134,16 @@ can be added as a cache handler. ## Environment Variables +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** | Variable name | Type (`default`) | Default | diff --git a/docs/src/sv/getting-started/auth.md b/docs/src/sv/getting-started/auth.md new file mode 100644 index 00000000..6c0ccd75 --- /dev/null +++ b/docs/src/sv/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/sv/getting-started/docker.md b/docs/src/sv/getting-started/docker.md index ededc582..c6fabe52 100644 --- a/docs/src/sv/getting-started/docker.md +++ b/docs/src/sv/getting-started/docker.md @@ -1,39 +1,43 @@ --- -title: Official Docker images +title: Officiella Docker images sidebarDepth: 3 --- -# Official Docker images +# Officiella Docker images -Castopod pushes 2 Docker images to the Docker Hub during its automated build +Castopod pushes 3 Docker images to the Docker Hub during its automated build process: -- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - with all of Castopod dependencies -- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - Nginx configuration for Castopod +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): apppaketet med + alla Castopod-beroenden +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): en + Nginx konfiguration för Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. +Dessutom kräver Castopod en MySQL-kompatibel databas. En Redis databas kan +läggas till som cachehanterare. -## Supported tags +## Taggar som stöds -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `utveckla` [unstable], senaste utvecklingsgrenen +- `beta` [stable], senaste betaversionen bygger +- `1.0.0-beta.x` [stable], specifik betaversion build (sedan `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) -## Example usage +## Exempel på användning -1. Install [docker](https://docs.docker.com/get-docker/) and - [docker-compose](https://docs.docker.com/compose/install/) -2. Create a `docker-compose.yml` file with the following: +1. Installera [docker](https://docs.docker.com/get-docker/) och + [docker-komponera](https://docs.docker.com/compose/install/) +2. Skapa en `docker-compose.yml` fil med följande: ```yml version: "3.7" services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -51,7 +55,7 @@ can be added as a cache handler. restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -83,6 +87,21 @@ can be added as a cache handler. networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -93,13 +112,14 @@ can be added as a cache handler. castopod-db: ``` - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + Du måste anpassa vissa variabler efter dina behov (t.ex. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` och `CP_ANALYTICS_SALT`). -3. Setup a reverse proxy for TLS (SSL/HTTPS) +3. Ställ in en omvänd proxy för TLS (SSL/HTTPS) - TLS is mandatory for ActivityPub to work. This job can easily be handled by - a reverse proxy, for example with [Caddy](https://caddyserver.com/): + TLS är obligatoriskt för ActivityPub att arbeta. Detta jobb kan enkelt + hanteras av en omvänd proxy, till exempel med + [Caddy](https://caddyserver.com/): ``` #castopod @@ -108,28 +128,39 @@ can be added as a cache handler. } ``` -4. Run `docker-compose up -d`, wait for it to initialize and head on to - `https://castopod.example.com/cp-install` to finish setting up Castopod! +4. Kör `docker-komponera upp -d`, vänta på att den initieras och gå vidare till + `https://castopod.example.com/cp-install` för att slutföra installationen av + Castopod! -5. You're all set, start podcasting! 🎙️🚀 +5. Ni är alla klara, börja podcasting! 🎙️🚀 -## Environment Variables +## Miljövariabler + +- **castopod/video-clipper** + + | Variabel namn | Type (`default`) | Standard | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?sträng | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | - **castopod/app** - | Variable name | Type (`default`) | Default | + | Variabelt namn | Type (`default`) | Standard | | ---------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | + | **`CP_BASEURL`** | sträng | `odefinierad` | | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_ANALYTICS_SALT`** | string | `odefinierad` | | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | - | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_CACHE_HANDLER`** | [`"file"` 或 `"redis"`] | `"file"` | | **`CP_REDIS_HOST`** | ?string | `"localhost"` | | **`CP_REDIS_PASSWORD`** | ?string | `null` | | **`CP_REDIS_PORT`** | ?number | `6379` | @@ -139,10 +170,10 @@ can be added as a cache handler. | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | - | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` eller `"ssl"`] | `"tls"` | - **castopod/web-server** - | Variable name | Type | Default | + | Variable name | Typ | Default | | --------------------- | ------- | ------- | | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md index c68be846..703b01bb 100644 --- a/docs/src/sv/getting-started/install.md +++ b/docs/src/sv/getting-started/install.md @@ -3,25 +3,26 @@ title: Installation sidebarDepth: 3 --- -# How to install Castopod? +# Hur man installerar Castopod? -Castopod was thought-out to be easy to install. Whether using dedicated or -shared hosting, you can install it on most PHP-MySQL compatible web servers. +Castopod var tänkt att vara lätt att installera. Oavsett om du använder +dedikerade eller delade webbhotell kan du installera det på de flesta +PHP-MySQL-kompatibla webbservrar. -::: tip Note +::: tips Anteckning -We've released official Docker images for Castopod! +Vi har släppt officiella Docker-bilder för Castopod! -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. +Om du föredrar att använda Docker, kan du hoppa över detta och gå direkt till +[dockerdokumentationen](./docker.md) för Castopod. ::: -## Requirements +## Krav - PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support +- MySQL version 5.7 eller högre eller MariaDB version 10.2 eller högre +- Stöd för HTTPS ### PHP v8.1 or higher @@ -30,114 +31,114 @@ PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) - [mbstring](https://php.net/manual/en/mbstring.installation.php) -- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, - **PNG** and **WEBP** libraries. +- [gd](https://www.php.net/manual/en/image.installation.php) med **JPEG**, + **PNG** och **WEBP** bibliotek. - [exif](https://www.php.net/manual/en/exif.installation.php) -Additionally, make sure that the following extensions are enabled in your PHP: +Se dessutom till att följande tillägg är aktiverade i din PHP: -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) +- json (aktiverad som standard - stäng inte av) +- xml (aktiverat som standard - stäng inte av) - [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) -### MySQL compatible database +### MySQL kompatibel databas -> We recommend using [MariaDB](https://mariadb.org). +> Vi rekommenderar att du använder [MariaDB](https://mariadb.org). -::: warning Warning +::: varning Varning -Castopod only works with supported MySQL 5.7 or higher compatible databases. It -will break with the previous MySQL v5.6 for example as its end of life was on -February 5, 2021. +Castopod fungerar endast med stödda MySQL 5.7 eller högre kompatibla databaser. +Den kommer att bryta med den tidigare MySQL v5.6 till exempel eftersom dess slut +var den 5 februari 2021. ::: -You will need the server hostname, database name, username and password to -complete the installation process. If you do not have these, please contact your -server administrator. +Du behöver serverns värdnamn, databasnamn, användarnamn och lösenord för att +slutföra installationen. Om du inte har dessa kontaktar du din +serveradministratör. -#### Privileges +#### Privilegier -User must have at least these privileges on the database for Castopod to work: -`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, -`REFERENCES`, `CREATE VIEW`. +Användare måste ha minst dessa rättigheter i databasen för att Castopod ska +fungera: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, +`UPDATE`, `REFERENCES`, `CREATE VIEW`. -### (Optional) FFmpeg v4.1.8 or higher for Video Clips +### (Valfritt) FFmpeg v4.1.8 eller högre för videoklipp -[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you -want to generate Video Clips. The following extensions must be installed: +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 eller högre krävs om du vill +generera videoklipp. Följande tillägg måste installeras: -- **FreeType 2** library for +- **FreeType 2** bibliotek för [gd](https://www.php.net/manual/en/image.installation.php). -### (Optional) Other recommendations +### (Valfritt) Andra rekommendationer -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. +- Redis för bättre cache-prestanda. +- CDN för statiska filer caching och bättre prestanda. +- e-post gateway för förlorade lösenord. -## Install instructions +## Installationsanvisningar -### Pre-requisites +### Förutsättningar -0. Get a Web Server with [requirements](#requirements) installed -1. Create a MySQL database for Castopod with a user having access and - modification privileges (for more info, see - [MySQL compatible database](#mysql-compatible-database)). -2. Activate HTTPS on your domain with an _SSL certificate_. -3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto - the web server if you haven’t already. - - ⚠️ Set the web server document root to the `public/` sub-folder within the - `castopod` folder. -4. Add **cron tasks** on your web server for various background processes - (replace the paths accordingly): +0. Skaffa en webbserver med [krav](#requirements) installerat +1. Skapa en MySQL-databas för Castopod med en användare som har åtkomst till och + modifieringsrättigheter (för mer info, se + [MySQL-kompatibel databas](#mysql-compatible-database)). +2. Aktivera HTTPS på din domän med ett _SSL-certifikat_. +3. Ladda ner och packa upp det senaste [Castopod Package](https://castopod.org/) + på webbservern om du inte redan har det. + - ⚠️ Sätt webbserverdokumentroten till `public/` undermappen i mappen + `castopod`. +4. Lägg till **cron-uppgifter** på din webbserver för olika bakgrundsprocesser + (byt ut sökvägarna därefter): - - For social features to work properly, this task is used to broadcast social - activities to your followers on the fediverse: + - För att sociala funktioner ska fungera korrekt, används denna uppgift för + att sända sociala aktiviteter till dina anhängare på fediverse: ```bash * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities ``` - - For having your episodes be broadcasted on open hubs upon publication using + - För att dina episoder ska sändas på öppna hubbar vid publicering med [WebSub](https://en.wikipedia.org/wiki/WebSub): ```bash * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish ``` - - For Video Clips to be created (see - [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)): + - För att videoklipp ska skapas (se + [FFmpeg krav](#ffmpeg-v418-or-higher-for-video-clips)): ```bash * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips ``` - > These tasks run **every minute**. You may set the frequency depending on - > your needs: every 5, 10 minutes or more. + > Dessa uppgifter körs **varje minut**. Du kan ställa in frekvensen beroende + > på dina behov: var 5, 10 minuter eller mer. -### (recommended) Install Wizard +### (rekommenderas) Installationsguide -1. Run the Castopod install script by going to the install wizard page - (`https://your_domain_name.com/cp-install`) in your favorite web browser. -2. Follow the instructions on your screen. -3. Start podcasting! +1. Kör Castopod install script genom att gå till installationsguiden sidan + (`https://your_domain_name.com/cp-install`) i din favorit webbläsare. +2. Följ instruktionerna på din enhet. +3. Börja podcasting! -::: info Note +::: info Notering -The install script writes a `.env` file in the package root. If you cannot go -through the install wizard, you can create and edit the `.env` file manually -based on the `.env.example` file. +Installationsskriptet skriver en `.env` -fil i paketroten. Om du inte kan gå via +installationsguiden kan du skapa och redigera `. nv` filen manuellt baserat på +`.env.example` filen. ::: ### Email/SMTP setup -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, +E-postkonfiguration krävs för att vissa funktioner ska fungera korrekt (t.ex. +att hämta ditt glömda lösenord, skicka instruktioner till premiumprenumeranter, …) -You may add your email configuration in your instance's `.env` like so: +Du kan lägga till din e-postkonfiguration i din instans `.env` som så: ```ini # […] @@ -148,33 +149,33 @@ email.SMTPUser="your_smtp_user" email.SMTPPass="your_smtp_password" ``` -#### Email config options +#### Alternativ för e-postkonfiguration -| Variable name | Type | Default | -| ---------------- | -------------------- | ------------ | -| **`fromEmail`** | string | `undefined` | -| **`fromName`** | string | `"Castopod"` | -| **`SMTPHost`** | string | `undefined` | -| **`SMTPUser`** | string | `undefined` | -| **`SMTPPass`** | string | `undefined` | -| **`SMTPPort`** | number | `25` | -| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +| Variabelt namn | Typ | Standard | +| ---------------- | ----------------------- | ------------- | +| **`fromEmail`** | sträng | `odefinierad` | +| **`fromName`** | sträng | `"Castopod"` | +| **`SMTPHost`** | sträng | `odefinierad` | +| **`SMTPUser`** | sträng | `odefinierad` | +| **`SMTPPass`** | sträng | `odefinierad` | +| **`SMTPPort`** | nummer | `25` | +| **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"` | -## Community packages +## Gemenskapspaket -If you don't want to bother with installing Castopod manually, you may use one -of the packages created and maintained by the open-source community. +Om du inte vill bry dig om att installera Castopod manuellt, kan du använda ett +av de paket som skapats och underhålls av open source-miljön. -### Install with YunoHost +### Installera med YunoHost -[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux -made up of free and open-source software packages. It manages the hardships of -self-hosting for you. +[YunoHost](https://yunohost.org/) är en distribution baserad på Debian GNU/Linux +som består av mjukvarupaket med fri och öppen källkod. Det hanterar +svårigheterna med self-hosting för dig.
- Install Castopod with YunoHost + Installera Castopod med YunoHost `About` page or by - running: +4. Uppdatera ditt databasschema från din `Castopod Admin` > `Om` sida eller kör: ```bash php spark castopod:database-update ``` -5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > - `Housekeeping` -6. ✨ Enjoy your fresh instance, you're all done! +5. Rensa din cache från `Castopod Admin` > `Inställningar` > `allmän` > + `Hushållning` +6. ✨ Njut av din färska instans, du är alla klara! -::: info Note +::: info Notering -Releases may come with additional update instructions (see -[releases page](https://code.castopod.org/adaures/castopod/-/releases)). +Utgåvor kan komma med ytterligare uppdateringsinstruktioner (se +[utgåvor sidan](https://code.castopod.org/adaures/castopod/-/releases)). - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + [Jag har inte uppdaterat min instans på länge… Vad ska jag göra?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) ::: -## Fully Automated updates +## Helt automatiserade uppdateringar -> Coming soon... 👀 +> Kommer snart... 👀 -## Frequently asked questions (FAQ) +## Vanliga frågor (FAQ) -### Where can I find my Castopod version? +### Var hittar jag min Castopod-version? -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. +Gå till din Castopod admin-panel, versionen visas längst ner till vänster hörn. -Alternatively, you can find the version in the `app > Config > Constants.php` -file. +Alternativt kan du hitta versionen i `appen > Config > Constants.php` filen. -### I haven't updated my instance in a long time… What should I do? +### Jag har inte uppdaterat min instans på länge… Vad ska jag göra? -No problem! Just get the latest release as described above. Only, when going -through the release instructions (4), perform them sequentially, from the oldest -to the newest. +Inga problem! Bara få den senaste versionen som beskrivs ovan. Endast när du går +genom utgivningsinstruktionerna (4), utför dem sekventiellt, från de äldsta till +de nyaste. -> You may want to backup your instance depending on how long you haven't updated -> Castopod. +> Du kanske vill säkerhetskopiera din instans beroende på hur länge du inte har +> uppdaterat Castopod. -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +Till exempel, om du är på `v1.0.0-alpha.42` och vill uppgradera till `v1.0.0-beta.1`: -0. (highly recommended) Make a backup of your files and database. +0. (rekommenderas starkt) Gör en säkerhetskopia av dina filer och databaser. -1. Download the latest release, overwrite your files whilst keeping `.env` and - `public/media`. +1. Ladda ner den senaste utgåvan, skriv över dina filer samtidigt som du + behåller `.env` och `public/media`. -2. Go through each release update instructions sequentially (from oldest to - newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, +2. Gå igenom varje utgåva uppdateringsinstruktioner sekventiellt (från äldsta + till nyaste) börjar med `v1.0.0-alpha. 3`, `v1.0.0-alpha.44`, `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. -3. ✨ Enjoy your fresh instance, you're all done! +3. ✨ Njut av din färska instans, du är alla klara! -### Should I make a backup before updating? +### Ska jag göra en säkerhetskopia innan jag uppdaterar? -We advise you do, so you don't lose everything if anything goes wrong! +Vi råder dig att göra, så att du inte förlorar allt om något går fel! -More generally, we advise you make regular backups of your Castopod files and -database to prevent you from losing it all… +Mer generellt, rekommenderar vi att du gör regelbundna säkerhetskopior av dina +Castopod filer och databas för att hindra dig från att förlora allt… diff --git a/docs/src/sv/index.md b/docs/src/sv/index.md index d89daccb..46d6ec05 100644 --- a/docs/src/sv/index.md +++ b/docs/src/sv/index.md @@ -2,239 +2,244 @@ sidebarDepth: 2 --- -# Welcome 👋 +# Välkommen 👋 [![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. +Castopod är en gratis hostingplattform med öppen källkod gjord för podcastare +som vill engagera och interagera med sin publik. -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. +Castopod är lätt att installera och byggdes ovanpå +[CodeIgniter4](https://codeigniter.com/), ett kraftfullt PHP-ramverk med ett +mycket litet fotavtryck. ::: info Status -Castopod is currently in **beta** but already quite stable and used by -podcasters around the world! +Castopod är för närvarande i **beta** men redan ganska stabil och används av +podcastare runt den världen! ::: -## Features +## Funktioner -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: +- 🌱  Gratis & öppen källkod (AGPL v3-licens) +- 🔐  Fokuserad på datasuveränitet: ditt innehåll, målgrupp och analys + tillhör dig, och du bara +-  Podcasting 2.0 funktioner: GUID, låst, avskrifter, finansiering, + kapitel, plats, personer, ljud, … +- 💬  Inbyggt socialt nätverk: + - 🚀  Castopod är en del av Fediverse, ett decentraliserat socialt + nätverk + - ❤️  Skapa inlägg, dela, favorit och kommentera avsnitt +- 📈  Inbyggd analys: + - ⚖️  GDPR / CCPA / LGPD kompatibel + -  Standard IABv2 målgruppsmätning + - 🏡  Lokalanalys, ingen tredje part involverad +- 📢  Inbyggda marknadsföringsverktyg: - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website + - 📱  PWA: installera som en fristående app + - 🎨  Anpassningsbara temafärger + - 🎬  Generera att dela videoklipp från avsnitt + - 🔉  Generera ljudbitar + - \_button_selector:  Inbäddbar spelare, bädda in dina avsnitt på + valfri webbplats - 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads + - 🔗  Finansierar länkar + - 📲  lista-att-klicka annonser - 🤝  value4value / WebMonetization - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, +- 📡  Publicera dina avsnitt överallt med RSS: + - 📱  På alla index och appar: Podcast Index, Apple Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](https://translate.castopod.org)! + - ⚡  Sänd dina avsnitt direkt med WebSub +- 📥  Podcast import: flytta din befintliga podcast till Castopod +- 📤  Flytta ut din podcast från Castopod +- :shuffle_tracks  Flera hyresgäst: värd så många podcasts du vill +- 👥  Flera användare: lägg till bidragslämnare och ange roller +- 🌎  i18n support: översatt till engelska, franska, polska, tyska, + brasilianska portugisiska & spanska… med + [mer att komma](https://translate.castopod.org)! ## Motivation -The podcasting ecosystem is decentralized by nature: you can create your podcast -as an RSS file, publish it on the web and have it shared everywhere online. +Den podcasting ekosystem är decentraliserad av naturen: du kan skapa din podcast +som en RSS-fil, publicera den på webben och få den delad överallt på nätet. -It is in fact one of the only media to have stayed this way for a long time. +Det är i själva verket en av de enda medierna som har stannat kvar på detta sätt +under en lång tid. -As usages are evolving, more and more people are getting into podcasts: whether -it is creators finding new ways to share their ideas, or listeners in the search -for better content. +I takt med att användningsområden utvecklas kommer fler och fler människor in i +podcasts: om det är skapare att hitta nya sätt att dela sina idéer, eller +lyssnare i sökningen för bättre innehåll. -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized medium. +När podcasting blir mer allmänt använd försöker vissa företag flytta den till +ett mer kontrollerat och centraliserat medium. -Castopod was created in an effort to provide an open and sustainable alternative -to hosting your podcasts, promoting decentralization to ensure that podcasters -creativity can express itself. +Castopod skapades i ett försök att ge ett öppet och hållbart alternativ för att +vara värd för dina podcasts, främja decentralisering för att säkerställa att +podcastare kreativitet kan uttrycka sig. -This project is pushed by the open-source community, and specifically by the -[Fediverse](https://fediverse.party/en/fediverse/) and -[Podcasting 2.0](https://podcastindex.org/) movements. +Detta projekt drivs av open source-communityn och specifikt av +[Fediverse](https://fediverse.party/en/fediverse/) och +[Podcasting 2.0](https://podcastindex.org/) rörelser. -## Comparison with other solutions +## Jämförelse med andra lösningar -We believe that a solution is not necessarily right for everyone, it highly -depends on your needs. So, here are comparisons with other tools to help you to -gauge whether Castopod is the right fit for you. +Vi tror att en lösning inte nödvändigtvis är rätt för alla, det mycket beror på +dina behov. Så, här är jämförelser med andra verktyg för att hjälpa dig att mäta +om Castopod är rätt passform för du. ### Castopod vs Wordpress -Castopod is often referred to as "the Wordpress for podcasts" because of the -similarities between the two. In some ways this is true. And actually, Castopod -was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption -from the community and the number of websites running it. +Castopod kallas ofta för "Wordpress för podcasts" på grund av de likheter mellan +de två. På vissa sätt är detta sant. Och faktiskt, Castopod var mycket +inspirerad av Wordpress ekosystem, se lätthet att adoptera från gemenskapen och +antalet webbplatser som kör den. -Just like Wordpress, Castopod is free & open source, built using PHP with a -MySQL database and is packaged in a way that you can easily install on most web -servers. +Precis som Wordpress är Castopod gratis & öppen källkod, byggd med PHP med en +MySQL-databas och är paketerad på ett sätt som du enkelt kan installera på de +flesta webb -servrar. -Wordpress is a great way to create your website and extend it with plugins to -get what you want. It is a full fledged CMS that helps you get any type of -website online. +Wordpress är ett bra sätt att skapa din webbplats och utöka den med plugins för +att få vad du vill. Det är en fullfjädrad CMS som hjälper dig att få någon typ +av webbplats online. -On the other hand, Castopod is meant to address the podcasters needs -specifically, focusing on podcasting, and nothing else. You don't need any -plugin to get you started on your podcasting journey. +Å andra sidan, Castopod är tänkt att ta itu med podcasters behöver specifikt, +med fokus på podcasting, och inget annat. Du behöver inte någon plugin för att +komma igång med din podcasting resa. -This allows optimizing the processes specific to podcasting: ranging from the -creation of your podcasts and the publication of new episodes all the way to -broadcasting, marketing and analytics. +Detta gör det möjligt att optimera de processer som är specifika för podcasting: +allt från skapandet av dina podcasts och publiceringen av nya avsnitt hela vägen +till sändning, marknadsföring och analys. -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! +Slutligen, beroende på dina behov, Wordpress och Castopod kan även leva sida vid +sida eftersom de delar samma krav! ### Castopod vs Funkwhale -Funkwhale is a self-hosted, modern free and open-source music server. Just as -Castopod, Funkwhale is on the fediverse, a decentralized social network allowing -interoperability between the two. +Funkwhale är en självvärd, modern gratis och öppen källkod musikserver. Precis +som Castopod, Funkwhale är på fediverse, ett decentraliserat socialt nätverk som +möjliggör interoperabilitet mellan de två. -Funkwhale was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. +Funkwhale byggdes ursprungligen runt musik. Och senare när projektet utvecklades +introducerades förmågan att vara värd för podcasts. -Unlike Funkwhale, Castopod has been designed and built around podcasting -exclusively. This allows easier implementation for features related to the -podcasting ecosystem, such as the podcasting 2.0 features (transcripts, -chapters, locations, persons, …). +Till skillnad från Funkwhale har Castopod designats och byggts kring podcasting +exklusivt. Detta möjliggör enklare implementering av funktioner relaterade till +podcasting ekosystem, såsom podcasting 2.0 funktioner (transkript, kapitel, +platser, personer, …). -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. +Så, du bör förmodligen använda Funkwhale om du vill vara värd för din musik, och +använda Castopod om du vill vara värd för dina podcasts. -### Castopod vs other podcast hosts +### Castopod vs andra podcast värdar -There are many solutions for you to host your podcasts, some of which are really -great and [a lot of them](https://podcastindex.org/apps) are jumping into the -Podcasting 2.0 wagon just like Castopod! +Det finns många lösningar för dig att vara värd för dina podcasts, några av dem +är verkligen bra och [en hel del av dem](https://podcastindex.org/apps) hoppar +in i Podcasting 2. vagn precis som Castopod! -Each of these solutions differ from one another, you may compare with the -[list of features](#features). +Var och en av dessa lösningar skiljer sig från varandra, kan du jämföra med +[listan över funktioner](#features). -That being said, there are two main differences with other podcasting solutions: +Med detta sagt, det finns två huvudsakliga skillnader med andra podcasting +lösningar: -- Castopod can be self-hosted and is the only solution that allows you to keep - full control over what you produce. Also, as it is open-source, you can even - customize it as you wish. +- Castopod kan vara själv värd och är den enda lösningen som gör att du kan + hålla full kontroll över vad du producerar. Dessutom, eftersom det är öppen + källkod, kan du även anpassa det som du vill. -- Castopod is the only solution that currently integrates both a decentralized - social network with ActivityPub as well as many of the podcasting 2.0 - features, hoping to bridge the gap between the two. +- Castopod är den enda lösningen som för närvarande integrerar både ett + decentraliserat socialt nätverk med ActivityPub samt många av podcasting 2. + funktioner, i hopp om att överbrygga gapet mellan de två. -## Contributing +## Hjälp till -Love Castopod and would like to help? Take a look at the following documentation -to get you started. +Älskar du Castopod och vill hjälpa till? Ta en titt på följande dokumentation +för att få dig igång. -### Code of conduct +### Uppförandekod -Castopod has adopted a Code of Conduct that we expect project participants to -adhere to. Please read the -[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -so that you can understand what actions will and will not be tolerated. +Castopod har antagit en uppförandekod som vi förväntar oss projektdeltagare att +hålla sig till. Läs +[CODE_OF_CONDUCT manualen](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +så att du kan förstå vilka åtgärder som kommer och inte kommer +att tolereras. -### Contributing guide +### Bidragande guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our -development process, how to propose bugfixes and improvements, and how to build -and test your changes to Castopod. +Läs vår [bidragande guide](./contributing/guidelines.md) för att lära dig om vår +utvecklingsprocess, hur du föreslår buggfixar och förbättringar, och hur du +bygger och testar dina ändringar till Castopod. -## Contributors ✨ +## Alla bidragsgivare ✨ -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): +Tack går till dessa underbara människor +([emoji nyckel](https://allcontributors.org/docs/en/emoji-key)): - - + + + - - - + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 :artist_palett: 🌍 💬 🧑 🏫 🚇 🤔 📆 memo:

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 :artist_palett: 🌍 💬 🧑 🏫 🚇 🤔 📆 memo:

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Bastien Luneteau

💻 🐛

Bastien Luneteau

💻 🐛

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

João Leandro

🌍 🤔

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

ghose (XoseM)

🌍

patryk Miś

🌍
@@ -243,48 +248,47 @@ Thanks goes to these wonderful people -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! +Detta projekt följer specifikationen +[för alla bidragsgivare](https://github.com/all-contributors/all-contributors) . +Bidrag av något slag välkomna! -## Contact +## Kontakt -You may reach us for help or ask any question you have on: +Du kan nå oss för hjälp eller ställa någon fråga du har på: -- [Discord](https://castopod.org/discord) (for direct interaction with - developers and the community) -- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for - feature requests & bug reports) +- [Discord](https://castopod.org/discord) (för direkt interaktion med + -utvecklare och gemenskapen) +- [Ärendespårare](https://code.castopod.org/adaures/castopod/-/issues) (för + funktionsförfrågningar & felrapporter) -Alternatively, you can follow us on social media platforms to get news about -Castopod: +Alternativt kan du följa oss på sociala medier för att få nyheter om Castopod: - [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) - [Twitter](https://twitter.com/castopod) - [LinkedIn](https://linkedin.com/company/castopod) - [Facebook](https://www.facebook.com/castopod) -## Sponsors +## Sponsorer -The ongoing development of Castopod is made possible with the support of its -backers. If you'd like to help, please consider -[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). +Den pågående utvecklingen av Castopod möjliggörs med stöd av sina backers. Om du +vill hjälpa till, överväg +[sponsra Castopods utveckling](https://opencollective.com/castopod/contribute).
Ad Aures Logo NLnet Logo
-## License +## Licens -[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) +[GNU Lesser General Public License](https://choosealicense.com/licenses/agpl-3.0/) Copyright © 2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release -https://img.shields.io/github/license/ad-aures/castopod?color=blue -https://img.shields.io/badge/contributions-welcome-brightgreen.svg -https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg -https://img.shields.io/github/stars/ad-aures/castopod?style=social +https://img.shields.io/github/license/ad-aures/castopod?color=blå +https://img.shields. o/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantik--release-e10079. +vg https://img.shields.io/github/stars/ad-aures/castopod?style=sociala [release]: https://code.castopod.org/adaures/castopod/-/releases [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md diff --git a/docs/src/zh-Hans/getting-started/auth.md b/docs/src/zh-Hans/getting-started/auth.md new file mode 100644 index 00000000..09dceb0c --- /dev/null +++ b/docs/src/zh-Hans/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: 验证 & 授权 +sidebarDepth: 3 +--- + +# 验证 & 授权 + +Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规则。 角色和权限 +在两个级别上定义: + +1. [实例范围](#1-instance-wide-roles-and-permissions) +2. [每个播客](#2-per-podcast-roles-and-permissions) + +## 1. 实例范围的角色和权限 + +### 实例角色 + + + +| 角色 | 描述 | 权限 | +| ---------- | ---------------------------- | ------------------------------------------------------------------------------------------ | +| 超级管理员 | 拥有对 Castopod 的完全控制。 | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| 管理 | 管理 Castopod 的内容。 | podcasts.create, podcasts.import, persons.manage, pages.manage | +| 播客 | Castopod 的普通用户。 | admin.access | + + + +### 实例权限 + + + +| 权限 | 描述 | +| ----------------------- | ------------------------------------------- | +| admin.access | 可以访问 Castopod 管理区域。 | +| admin.settings | 可以访问 Castopod 设置。 | +| users.manage | 可以管理 Castopod 用户。 | +| persons.manage | 可以管理人员。 | +| pages.manage | 可以管理页面。 | +| podcasts.view | 可以查看所有播客。 | +| podcasts.create | 可以创建新播客。 | +| podcasts.import | 可以导入播客。 | +| fediverse.manage-blocks | 可以阻止联邦宇宙参与者/域与 Castopod 交互。 | + + + +## 2. 每个播客角色与权限 + +### 每个播客角色 + + + +| 角色 | 描述 | 权限 | +| ------ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 管理员 | 完全控制播客 #{id}。 | \* | +| 编辑 | 管理播客 #{id} 的内容和出版物。 | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| 作者 | 管理播客 #{id} 的内容,但不能发布。 | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| 访客 | 播客 #{id} 的普通贡献者。 | view, episodes.view | + + + +### 每个播客权限 + + + +| 权限 | 描述 | +| ---------------------------- | --------------------------------------------------- | +| view | 可以查看播客 #{id} 的仪表板和分析。 | +| edit | 可以编辑播客 #{id}。 | +| 删除 | 可以删除播客 #{id}。 | +| manage-import | 可以同步导入的播客 #{id}。 | +| manage-persons | 可以管理播客 #{id} 的订阅。 | +| manage-subscriptions | 可以管理播客 #{id} 的订阅。 | +| manage-contributors | 可以管理播客 #{id} 的贡献者。 | +| manage-platforms | 可以设置/删除播客 #{id} 的平台链接。 | +| manage-publications | 可以发布播客 #{id}。 | +| manage-notifications | 可以查看播客 #{id} 的通知并将其标记为已读。 | +| interact-as | 可以在播客 #{id} 进行互动,以收藏、分享或回复帖子。 | +| episodes.view | 可以查看播客 #{id} 的仪表板和分析。 | +| episodes.create | 可以为播客 #{id} 创建剧集。 | +| episodes.edit | 可以编辑播客 #{id}。 | +| episodes.delete | 可以删除播客 #{id}。 | +| episodes.manage-persons | 可以管理播客 #{id} 的订阅。 | +| episodes.manage-clips | 可以管理播客 #{id} 的视频剪辑或声音片段。 | +| episodes.manage-publications | 可以发布播客 #{id}。 | +| episodes.manage-comments | 可以创建/删除播客 #{id} 的剧集评论。 | + + diff --git a/docs/src/zh-Hans/getting-started/docker.md b/docs/src/zh-Hans/getting-started/docker.md index 9e9135a7..e68fc89d 100644 --- a/docs/src/zh-Hans/getting-started/docker.md +++ b/docs/src/zh-Hans/getting-started/docker.md @@ -5,12 +5,14 @@ sidebarDepth: 3 # 官方 Docker 镜像 -Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker Hub : +Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub : - [**`castopod/app`**](https://hub.docker.com/r/castopod/app):应用程序包,包含 所有 Castopod 依赖关系 - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server):Castopod 的 Nginx 配置 +- [**`castopod/video-clipper`** ](https://hub.docker.com/r/castopod/video-clipper): + 感谢 ffmpeg 提供可选图像构建视频剪辑 此外,Castopod 需要一个与 MySQL 兼容的数据库。 Redis 数据库 可以添加为缓存处理器 。 @@ -20,6 +22,8 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker - `develop` [unstable], 最新开发分支版本 - `beta` [stable],最新的 beta 版本构建 - `1.0.0-beta.x` [stable],特定 beta 版本构建 (自 `1.0.0-beta.22` 起) +- `latest` [stable],最新版本构建 +- `1.x.x` [stable],特定版本构建(自 `1.0.0` 起) ## 用法示例: @@ -32,7 +36,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker services: app: - image: castopod/app:beta + image: castopod/app:latest container_name: "castopod-app" volumes: - castopod-media:/opt/castopod/public/media @@ -50,7 +54,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker restart: unless-stopped web-server: - image: castopod/web-server:beta + image: castopod/web-server:latest container_name: "castopod-web-server" volumes: - castopod-media:/var/www/html/media @@ -82,6 +86,21 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker networks: - castopod-app + # this container is optional + # add this if you want to use the videoclips feature + ffmpeg: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + volumes: castopod-media: castopod-db: @@ -92,7 +111,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker castopod-db: ``` - 你还需要调整一些变量。(例如:`CP_BASEURL`, `MYSQL_ROOT_PASSWORD`, + 你还需要调整一些变量。 (例如:`CP_BASEURL`, `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSSWORD` 和 `CP_ANALYTICS_SALT`) 3. 设置 TLS 反向代理 (SSL/HTTPS) @@ -114,9 +133,19 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker ## 环境变量 +- **castopod/video-clipper** + + | 变量名称 | 类型 (`默认值`) | Default | + | -------------------------- | --------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + - **castopod/app** - | 变量名称 | 类型 (`默认值`) | Default | + | 变量名称 | 类型 (`default`) | Default | | ---------------------------- | ----------------------- | ---------------- | | **`CP_BASEURL`** | string | `undefined` | | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | @@ -142,6 +171,6 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker - **castopod/web-server** - | 变量名称 | Type | Default | + | 变量名称 | Type | 默认 | | --------------------- | ------- | ------- | | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md index 16960906..57a4e6f7 100644 --- a/docs/src/zh-Hans/getting-started/install.md +++ b/docs/src/zh-Hans/getting-started/install.md @@ -132,6 +132,8 @@ Castopod 仅适用于受支持的 MySQL 5.7 或更高版本的兼容数据库。 ```ini # […] +# […] + email.fromEmail="你的邮件地址" email.SMTPHost="你的邮件主机" email.SMTPUser="你的邮件用户名" diff --git a/docs/src/zh-Hans/getting-started/update.md b/docs/src/zh-Hans/getting-started/update.md index 6e8b2b18..f8f7c4ef 100644 --- a/docs/src/zh-Hans/getting-started/update.md +++ b/docs/src/zh-Hans/getting-started/update.md @@ -8,62 +8,57 @@ sidebarDepth: 3 安装 Castopod 后,你可能希望将实例更新到最新版本 版本以享受最新功能 ✨, 修复错误 🐛 和性能提升 ⚡。 -## Update instructions +## 更新说明 -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. +0. ⚠️ 在更新之前,我们强烈建议你备份 Castopod 文件和数据库。 - - cf. - [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + - 参看. [我应该在更新前进行备份吗?](#should-i-make-a-backup-before-updating) -1. Go to the - [releases page](https://code.castopod.org/adaures/castopod/-/releases) and - see if your instance is up to date with the latest Castopod version +1. 前往 [发布页面](https://code.castopod.org/adaures/castopod/-/releases) 和 查 + 看您的实例是否是最新的 Castopod 版本 - - cf. - [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + - 参看 + [我在哪里可以找到我的 Castopod 版本?](#where-can-i-find-my-castopod-version) -2. Download the latest release package named `Castopod Package`, you may choose - between the `zip` or `tar.gz` archives +2. 下载名为`Castopod Package`的最新发布包,你可以在 `zip` 或 `tar.gz` 压缩包之间 + 选择 - - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - - Note that you can also download the latest package from - [castopod.org](https://castopod.org/) + - ⚠️ 请确保你下载的是 Castopod 软件包而 **不是** 源代码 + - 请注意,你还可以从 [castopod.org](https://castopod.org/) -3. On your server: +3. 在你的服务器上: - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server + - 删除除 `.env` 文件和 `public/media` 目录之外的所有文件 + - 将下载软件包中的新文件复制到你的服务器中 - ::: info Note + ::: 注意 You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). + Check [Security Concerns](./security.md). 检查 [安全问题](./security.md)。 ::: -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: +4. 从你的 `后台管理` > 更新你的数据库架构 `关于` 页或开始: ```bash php spark castopod:database-update ``` -5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > - `Housekeeping` -6. ✨ Enjoy your fresh instance, you're all done! +5. 从 `Castopod 管理页面` > `设置` > `通常` > `维护` 清理你的缓存 +6. ✨ 享受你的新实例, 你已经更新完毕! -::: info Note +::: 注意 -Releases may come with additional update instructions (see -[releases page](https://code.castopod.org/adaures/castopod/-/releases)). +新版本可能有额外的更新说明(请参阅 +[发布页面](https://code.castopod.org/adaures/castopod/-/releases))。 - cf. [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + 我该怎么办? ::: -## Fully Automated updates +## 全自动更新 > 即将到来... 👀 @@ -71,22 +66,19 @@ Releases may come with additional update instructions (see ### 在哪里可以找到我的 Castopod 版本号? -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. +跳转到你的 Castopod 管理面板,版本号显示在左下角。 -Alternatively, you can find the version in the `app > Config > Constants.php` -file. +或者,你可以在 `应用程序 > 配置 > Constants.php` 文件中找到版本号。 -### 我很长时间没有更新我的实例… 我该怎么办? +### 我很长时间没有更新我的实例… 我该怎么办? 我该怎么办? -No problem! Just get the latest release as described above. Only, when going -through the release instructions (4), perform them sequentially, from the oldest -to the newest. +没问题! 只需如上所述获取最新版本。 No problem! Just get the latest release as +described above. Only, when going through the release instructions (4), perform +them sequentially, from the oldest to the newest. > 你可能想要备份你的实例,这取决于您多久没有更新过 Castopod 。 -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: +例如,如果你在 `v1.0.0-alpha.42` 并想要升级到 `v1.0.0-beta.1` 0. (强烈推荐) 备份你的文件和数据库。 @@ -99,7 +91,6 @@ For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to ### 我是否应该在更新前备份? -We advise you do, so you don't lose everything if anything goes wrong! +我们建议你这样做,这样就不会在出现任何问题时丢失数据! -More generally, we advise you make regular backups of your Castopod files and -database to prevent you from losing it all… +更笼统地说,我们建议你定期备份您的 Castopod 文件和数据库,防止丢失所有内容…… diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md index 20a0b1a0..0cd5b07e 100644 --- a/docs/src/zh-Hans/index.md +++ b/docs/src/zh-Hans/index.md @@ -133,7 +133,8 @@ Funkwhale 最初是围绕音乐制作的。 后来,随着项目的发展,引 ## 贡献 -喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 +喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你 +入门。 ### 行为准则 @@ -143,8 +144,8 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能 ### 贡献指南 -阅读我们的 [贡献指南](./contributing/guidelines.md) ,了解我们的开发过程。提出错 -误修正和改进想法,以及如何构建和测试 Castopod 。 +阅读我们的 [贡献指南](./contributing/guidelines.md) ,了解我们的开发过程。 提出 +错 误修正和改进想法,以及如何构建和测试 Castopod 。 ## 贡献者 ✨ @@ -251,7 +252,8 @@ Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们, [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-present, [Ad Aures](https://adaures.com/). +Copyright © 2020-present, [Ad Aures](https://adaures.com/). Copyright © +2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/modules/Admin/Language/de/AboutCastopod.php b/modules/Admin/Language/de/AboutCastopod.php index 3fb62aff..7e8780ad 100644 --- a/modules/Admin/Language/de/AboutCastopod.php +++ b/modules/Admin/Language/de/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'Über Castopod', + 'host_name' => 'Hostname', + 'version' => 'Castopod Version', + 'php_version' => 'PHP Version', + 'os' => 'Betriebssystem', + 'languages' => 'Sprachen', + 'update_database' => 'Datenbank aktualisieren', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'Die Datenbank ist aktuell!', ], ]; diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php index 188481fb..037c53f5 100644 --- a/modules/Admin/Language/de/Breadcrumb.php +++ b/modules/Admin/Language/de/Breadcrumb.php @@ -14,22 +14,22 @@ return [ ->gateway => 'Startseite', 'podcasts' => 'Podcasts', 'episodes' => 'Folgen', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'Abonnements', 'contributors' => 'Administratoren', 'pages' => 'Seiten', 'settings' => 'Einstellungen', 'theme' => 'Erscheinungsbild', - 'about' => 'about', + 'about' => 'Über', 'add' => 'hinzufügen', 'new' => 'neu', 'edit' => 'bearbeiten', 'persons' => 'Mitwirkende', 'publish' => 'veröffentlichen', 'publish-edit' => 'Veröffentlichung bearbeiten', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'Veröffentlichungsdatum bearbeiten', 'unpublish' => 'Veröffentlichung aufheben', 'delete' => 'löschen', - 'remove' => 'remove', + 'remove' => 'Entfernen', 'fediverse' => 'Fediversum', 'block-lists' => 'Sperrlisten', 'users' => 'Benutzer', @@ -49,6 +49,6 @@ return [ 'soundbites' => 'Tonschnipsel', 'video-clips' => 'Videoclips', 'embed' => 'einbettbarer Spieler', - 'notifications' => 'notifications', - 'suspend' => 'suspend', + 'notifications' => 'Benachrichtigungen', + 'suspend' => 'Unterbrechen', ]; diff --git a/modules/Admin/Language/de/Charts.php b/modules/Admin/Language/de/Charts.php index c96b1dcb..efbf2ee4 100644 --- a/modules/Admin/Language/de/Charts.php +++ b/modules/Admin/Language/de/Charts.php @@ -35,6 +35,6 @@ return [ 'by_weekday' => 'Nach Wochentag (für die letzten 60 Tage)', 'by_hour' => 'Nach Tageszeit (für die letzten 60 Tage)', 'podcast_by_bandwidth' => 'Täglich genutzte Bandbreite (in MB)', - 'total_storage_by_month' => 'Monthly storage (in MB)', - 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_storage_by_month' => 'Monatlicher Speicher (in MB)', + 'total_bandwidth_by_month' => 'Monatlich genutzte Bandbreite (in MB)', ]; diff --git a/modules/Admin/Language/de/Dashboard.php b/modules/Admin/Language/de/Dashboard.php index 881073fd..48170243 100644 --- a/modules/Admin/Language/de/Dashboard.php +++ b/modules/Admin/Language/de/Dashboard.php @@ -9,20 +9,20 @@ declare(strict_types=1); */ return [ - 'home' => 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', + 'home' => 'Admin-Dashboard', + 'welcome_message' => 'Willkommen im Administrationsbereich!', 'podcasts' => [ 'title' => 'Podcasts', - 'not_found' => 'No published podcast', - 'last_published' => 'Last published on {lastPublicationDate}', + 'not_found' => 'Kein veröffentlichter Podcast', + 'last_published' => 'Zuletzt veröffentlicht am {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episodes', - 'not_found' => 'No published episode', - 'last_published' => 'Last published on {lastPublicationDate}', + 'title' => 'Episoden', + 'not_found' => 'Keine veröffentlichte Episode', + 'last_published' => 'Zuletzt veröffentlicht am {lastPublicationDate}', ], 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', + 'title' => 'Speicher', + 'subtitle' => '{totalUploaded} von {totalStorage}', ], ]; diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php index d20fd716..fd48ae94 100644 --- a/modules/Admin/Language/de/Episode.php +++ b/modules/Admin/Language/de/Episode.php @@ -24,25 +24,25 @@ return [ 'edit' => 'Bearbeiten', 'publish' => 'Veröffentllichen', 'publish_edit' => 'Veröffentlichung bearbeiten', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Veröffentlichungsdatum bearbeiten', 'unpublish' => 'Veröffentlichung zurücknehmen', 'publish_error' => 'Folge ist bereits veröffentlicht.', 'publish_edit_error' => 'Folge ist bereits veröffentlicht.', 'publish_cancel_error' => 'Folge ist bereits veröffentlicht.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'Die Folge wurde noch nicht veröffentlicht, Sie können das Veröffentlichungsdatum nicht bearbeiten.', + 'publish_date_edit_future_error' => 'Das Veröffentlichungsdatum der Folge kann nur auf ein vergangenes Datum gesetzt werden! Wenn Sie es neu planen möchten, heben Sie die Veröffentlichung zuerst auf.', + 'publish_date_edit_success' => 'Das Veröffentlichungsdatum der Folge wurde erfolgreich aktualisiert!', 'unpublish_error' => 'Folge ist nicht veröffentlicht.', 'delete' => 'Löschen', 'go_to_page' => 'Gehe zu Seite', 'create' => 'Folge hinzufügen', 'publication_status' => [ 'published' => 'Veröffentlicht', - 'with_podcast' => 'Published', + 'with_podcast' => 'Veröffentlicht', 'scheduled' => 'Geplant', 'not_published' => 'Nicht veröffentlicht', ], - 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'with_podcast_hint' => 'Wird zeitgleich mit dem Podcast veröffentlicht', 'list' => [ 'search' => [ 'placeholder' => 'Suche nach einer Episode', @@ -50,8 +50,8 @@ return [ 'submit' => 'Suche', ], 'number_of_episodes' => '{numberOfEpisodes, plural, - one {# episode} - other {# episodes} + one {# Folge} + other {# Folgen} }', 'episode' => 'Folge', 'visibility' => 'Sichtweite', @@ -62,14 +62,14 @@ return [ 'createSuccess' => 'Folge wurde erfolgreich erstellt!', 'editSuccess' => 'Folge wurde erfolgreich aktualisiert!', 'publishSuccess' => '{publication_status, select, - published {Episode successfully published!} - scheduled {Episode publication successfully scheduled!} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not published.} + published {Folge erfolgreich veröffentlicht!} + scheduled {Veröffentlichung der Folge erfolgreich geplant!} + with_podcast {Diese Folge wird zeitgleich mit dem Podcast veröffentlicht.} + other {Diese Folge ist nicht veröffentlicht.} }', 'publishCancelSuccess' => 'Veröffentlichung der Episode erfolgreich abgebrochen!', 'unpublishBeforeDeleteTip' => 'Du musst die Episode zurückziehen, bevor du sie löschst.', - 'scheduleDateError' => 'Schedule date must be set!', + 'scheduleDateError' => 'Veröffentlichungsdatum muss gesetzt sein!', 'deletePublishedEpisodeError' => 'Bitte ziehe die Episode zurück, bevor du sie löschst.', 'deleteSuccess' => 'Folge erfolgreich gelöscht!', 'deleteError' => 'Failed to delete episode {type, select, @@ -79,13 +79,13 @@ return [ audio {audio} other {media} }.', - 'deleteFileError' => 'Failed to delete {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} - } file {file_path}. You may manually remove it from your disk.', + 'deleteFileError' => 'Fehler beim Löschen der {type, select, + transcript {Abschrift} + chapters {Kapitel} + image {Cover} + audio {Audio} + other {Medien} + }-Datei {file_path}. Sie können es manuell von der Festplatte entfernen.', 'sameSlugError' => 'Eine Folge mit dem ausgewählten Slug existiert bereits.', ], 'form' => [ @@ -97,7 +97,7 @@ return [ 'cover' => 'Episoden-Cover', 'cover_hint' => 'Wenn Du kein Cover festlegst, wird stattdessen das Podcast-Cover verwendet.', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'cover_size_hint' => 'Das Cover muss quadratisch und mindestens 1400px breit und hoch sein.', 'title' => 'Titel', 'title_hint' => 'Nutze einen klaren und einprägsamen Episodennamen. Gib hier nicht die Episoden- oder Staffelnummern an.', @@ -169,7 +169,7 @@ return [ 'publication_method' => [ 'now' => 'Jetzt', 'schedule' => 'Zeitplan', - 'with_podcast' => 'Publish alongside podcast', + 'with_podcast' => 'Zusammen mit dem Podcast veröffentlichen', ], 'scheduled_publication_date' => 'Geplantes Veröffentlichungsdatum', 'scheduled_publication_date_clear' => 'Veröffentlichungsdatum löschen', @@ -183,9 +183,9 @@ return [ 'message_warning_submit' => 'Trotzdem veröffentlichen', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Neues Veröffentlichungsdatum', + 'new_publication_date_hint' => 'Muss auf ein vergangenes Datum gesetzt werden.', + 'submit' => 'Veröffentlichungsdatum bearbeiten', ], 'unpublish_form' => [ 'disclaimer' => @@ -197,7 +197,7 @@ return [ 'disclaimer' => "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", 'understand' => 'Ich verstehe, ich möchte die Folge löschen', - 'submit' => 'Delete', + 'submit' => 'Löschen', ], 'embed' => [ 'title' => 'Einbettbarer Spieler', diff --git a/modules/Admin/Language/de/Navigation.php b/modules/Admin/Language/de/Navigation.php index d2264e25..1c98e0e5 100644 --- a/modules/Admin/Language/de/Navigation.php +++ b/modules/Admin/Language/de/Navigation.php @@ -33,7 +33,7 @@ return [ 'settings' => 'Einstellungen', 'settings-general' => 'Allgemein', 'settings-theme' => 'Erscheinungsbild', - 'about' => 'About', + 'about' => 'Über', 'account' => [ 'my-account' => 'Mein Konto', 'change-password' => 'Passwort ändern', diff --git a/modules/Admin/Language/de/Notifications.php b/modules/Admin/Language/de/Notifications.php index 2b139d51..88439bb4 100644 --- a/modules/Admin/Language/de/Notifications.php +++ b/modules/Admin/Language/de/Notifications.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'Notifications', - 'reply' => '{actor_username} replied to your post', - 'favourite' => '{actor_username} favourited your post', - 'reblog' => '{actor_username} shared your post', - 'follow' => '{actor_username} started following you', - 'no_notifications' => 'No notifications', - 'mark_all_as_read' => 'Mark all as read', + 'title' => 'Benachrichtigungen', + 'reply' => '{actor_username} hat auf Ihren Beitrag geantwortet', + 'favourite' => '{actor_username} hat Ihren Beitrag favorisiert', + 'reblog' => '{actor_username} hat Ihren Beitrag geteilt', + 'follow' => '{actor_username} folgt Ihnen jetzt', + 'no_notifications' => 'Keine Benachrichtigungen', + 'mark_all_as_read' => 'Alle als gelesen markieren', ]; diff --git a/modules/Admin/Language/de/Person.php b/modules/Admin/Language/de/Person.php index 96724be0..d0c8de9c 100644 --- a/modules/Admin/Language/de/Person.php +++ b/modules/Admin/Language/de/Person.php @@ -24,7 +24,7 @@ return [ 'form' => [ 'avatar' => 'Profilbild', 'avatar_size_hint' => - 'Avatar must be squared and at least 400px wide and tall.', + 'Das Profilbild muss quadratisch und mindestens 400px breit und hoch sein.', 'full_name' => 'Vollständiger Name', 'full_name_hint' => 'Dies ist der vollständige Name oder der Alias der Person.', 'unique_name' => 'Eindeutiger Name', diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php index 8cff53a1..9121a8d4 100644 --- a/modules/Admin/Language/de/Podcast.php +++ b/modules/Admin/Language/de/Podcast.php @@ -16,7 +16,7 @@ return [ 'new_episode' => 'Neue Folge', 'view' => 'Podcast ansehen', 'edit' => 'Podcast bearbeiten', - 'publish' => 'Publish podcast', + 'publish' => 'Podcast veröffentlichen', 'publish_edit' => 'Edit publication', 'delete' => 'Podcast löschen', 'see_episodes' => 'Episoden ansehen', @@ -24,12 +24,12 @@ return [ 'go_to_page' => 'Gehe zur Seite', 'latest_episodes' => 'Neueste Folgen', 'see_all_episodes' => 'Alle Folgen anzeigen', - 'draft' => 'Draft', + 'draft' => 'Entwurf', 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', + 'createSuccess' => 'Podcast erfolgreich erstellt!', 'editSuccess' => 'Der Podcast wurde erfolgreich aktualisiert!', 'importSuccess' => 'Der Podcast wurde erfolgreich importiert!', - 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deleteSuccess' => 'Podcast @{podcast_handle} erfolgreich gelöscht!', 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, cover {cover} banner {banner} @@ -47,18 +47,18 @@ return [ one {# episode was} other {# episodes were} } added to the podcast!', - 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'podcastFeedUpToDate' => 'Der Podcast ist bereits auf dem neuesten Stand.', 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', 'publishError' => 'This podcast is either already published or scheduled for publication.', 'publishEditError' => 'This podcast is not scheduled for publication.', 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', - 'scheduleDateError' => 'Schedule date must be set!', + 'scheduleDateError' => 'Veröffentlichungsdatum muss gesetzt sein!', ], 'form' => [ 'identity_section_title' => 'Podcast-Identität', 'identity_section_subtitle' => 'Diese Felder erlauben es dir, Aufmerksamkeit zu bekommen.', 'cover' => 'Podcast-Cover', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'cover_size_hint' => 'Das Cover muss quadratisch und mindestens 1400px breit und hoch sein.', 'banner' => 'Podcast-Banner', 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', 'banner_delete' => 'Podcast-Banner löschen', @@ -120,8 +120,8 @@ return [ 'custom_rss_hint' => 'Dies wird innerhalb des ❬channel❭ Tags eingefügt.', 'new_feed_url' => 'Neue Feed-URL', 'new_feed_url_hint' => 'Benutzen Sie dieses Feld, wenn Sie zu einer anderen Domain oder Podcast-Plattform wechseln. Standardmäßig wird der Wert auf die aktuelle RSS URL gesetzt, wenn der Podcast importiert wird.', - 'old_feed_url' => 'Old feed URL', - 'update_feed' => 'Update feed', + 'old_feed_url' => 'Alte Feed-URL', + 'update_feed' => 'Feed aktualisieren', 'update_feed_tip' => 'Import this podcast\'s latest episodes', 'partnership' => 'Partnerschaft:en', 'partner_id' => 'ID', @@ -259,12 +259,12 @@ return [ 'post' => 'Your announcement post', 'post_hint' => "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'submit' => 'Publish', + 'message_placeholder' => 'Schreiben Sie Ihre Nachricht…', + 'submit' => 'Veröffentlichen', 'publication_date' => 'Publication date', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', + 'now' => 'Jetzt', + 'schedule' => 'Planen', ], 'scheduled_publication_date' => 'Scheduled publication date', 'scheduled_publication_date_hint' => @@ -273,18 +273,18 @@ return [ 'cancel_publication' => 'Cancel publication', 'message_warning' => 'You did not write a message for your announcement post!', 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', - 'message_warning_submit' => 'Publish anyway', + 'message_warning_submit' => 'Dennoch veröffentlichen', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', + 'draft_mode' => 'Entwurfsmodus', + 'not_published' => 'Dieser Podcast ist noch nicht veröffentlicht.', 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', ], 'delete_form' => [ 'disclaimer' => "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", - 'understand' => 'I understand, I want the podcast to be permanently deleted', - 'submit' => 'Delete', + 'understand' => 'Ich verstehe, ich möchte, dass der Podcast dauerhaft gelöscht wird', + 'submit' => 'Löschen', ], 'by' => 'Von {publisher}', 'season' => 'Staffel {seasonNumber}', @@ -294,12 +294,12 @@ return [ 'no_episode' => 'Keine Folge gefunden!', 'follow' => 'Folgen', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# Follower} + other {# Follower} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# Beitrag} + other {# Beiträge} }', 'activity' => 'Aktivitäten', 'episodes' => 'Folgen', diff --git a/modules/Admin/Language/de/PodcastImport.php b/modules/Admin/Language/de/PodcastImport.php index 20153bc7..7eb3d60a 100644 --- a/modules/Admin/Language/de/PodcastImport.php +++ b/modules/Admin/Language/de/PodcastImport.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'warning' => - 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', + 'Der Import kann lange dauern. Da die aktuelle Version keinen Fortschritt anzeigt, werden Sie bis zur Beendigung keine Veränderung sehen. Im Falle eines Timeouts, erhöhen Sie den `max_execution_time` Wert.', 'old_podcast_section_title' => 'Der zu importierende Podcast', 'old_podcast_section_subtitle' => 'Stellen Sie sicher, dass Sie die Rechte für diesen Podcast besitzen, bevor Sie ihn importieren. Vervielfältigung und Ausstrahlung eines Podcasts ohne die entsprechenden Rechte sind Piraterie und strafbar.', diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php index 088887f3..4feafcfb 100644 --- a/modules/Admin/Language/de/PodcastNavigation.php +++ b/modules/Admin/Language/de/PodcastNavigation.php @@ -26,8 +26,8 @@ return [ 'podcast-analytics-listening-time' => 'Hörzeit', 'podcast-analytics-time-periods' => 'Zeiträume', 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-list' => 'Alle Abonnements', + 'subscription-add' => 'Abonnement hinzufügen', 'contributors' => 'Administratoren', 'contributor-list' => 'Alle Unterstützer', 'contributor-add' => 'Administrator hinzufügen', diff --git a/modules/Admin/Language/de/Settings.php b/modules/Admin/Language/de/Settings.php index 9484c30e..551f4070 100644 --- a/modules/Admin/Language/de/Settings.php +++ b/modules/Admin/Language/de/Settings.php @@ -15,7 +15,7 @@ return [ 'site_icon' => 'Webseiten-Icon', 'site_icon_delete' => 'Lösche Webseiten-Icon', 'site_icon_hint' => 'Webseiten-Icons sind das, was Sie auf Ihrem Browser Tabs, Lesezeichenleiste und wenn Sie eine Website als Verknüpfung auf mobilen Geräten hinzufügen, sehen.', - 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_icon_helper' => 'Das Icon muss quadratisch und mindestens 512px breit und hoch sein.', 'site_name' => 'Seitenname', 'site_description' => 'Seitenbeschreibung', 'submit' => 'Speichern', @@ -35,8 +35,8 @@ return [ 'reset_counts_helper' => 'Diese Option wird alle Datenzähler neu berechnen und zurücksetzen (Anzahl der Follower, Beiträge, Kommentare, …).', 'rewrite_media' => 'Medien-Metadaten neu schreiben', 'rewrite_media_helper' => 'Diese Option wird alle überflüssigen Mediendateien löschen und neu erstellen (Bilder, Audiodateien, Transkripte, Kapitel …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'rename_episodes_files' => 'Audiodateien der Episode umbenennen', + 'rename_episodes_files_hint' => 'Diese Option wird alle Audiodateien der Episode mit einer zufälligen Zeichenkette umbenennen. Benutzen Sie diese Option, wenn einer Ihrer privaten Episoden-Links durchsickert, da diese dadurch versteckt werden.', 'clear_cache' => 'Alle Caches löschen', 'clear_cache_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/cache-Dateien.', 'run' => 'Systempflege starten', diff --git a/modules/Admin/Language/gl/AboutCastopod.php b/modules/Admin/Language/gl/AboutCastopod.php index 3fb62aff..3c26b13f 100644 --- a/modules/Admin/Language/gl/AboutCastopod.php +++ b/modules/Admin/Language/gl/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'Acerca de Castopod', + 'host_name' => 'Nome do servidor', + 'version' => 'Versión de Castopod', + 'php_version' => 'Versión de PHP', + 'os' => 'Sistema Operativo', + 'languages' => 'Idiomas', + 'update_database' => 'Anovar base de datos', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'A base de datos está ao día!', ], ]; diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php index 4716a004..60a9c487 100644 --- a/modules/Admin/Language/gl/Breadcrumb.php +++ b/modules/Admin/Language/gl/Breadcrumb.php @@ -14,22 +14,22 @@ return [ ->gateway => 'Inicio', 'podcasts' => 'podcasts', 'episodes' => 'episodios', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'subscricións', 'contributors' => 'contribúen', 'pages' => 'páxinas', 'settings' => 'axustes', 'theme' => 'decorado', - 'about' => 'about', + 'about' => 'acerca de', 'add' => 'engadir', 'new' => 'novo', 'edit' => 'editar', 'persons' => 'persoas', 'publish' => 'publicar', 'publish-edit' => 'editar publicación', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'editar data de publicación', 'unpublish' => 'retirar publicación', 'delete' => 'eliminar', - 'remove' => 'remove', + 'remove' => 'eliminar', 'fediverse' => 'fediverso', 'block-lists' => 'listas de bloqueo', 'users' => 'usuarias', @@ -50,5 +50,5 @@ return [ 'video-clips' => 'clips de vídeo', 'embed' => 'reprodutor para incluír', 'notifications' => 'notificacións', - 'suspend' => 'suspend', + 'suspend' => 'suspender', ]; diff --git a/modules/Admin/Language/gl/Episode.php b/modules/Admin/Language/gl/Episode.php index 9e2da4b4..aa6e2a88 100644 --- a/modules/Admin/Language/gl/Episode.php +++ b/modules/Admin/Language/gl/Episode.php @@ -24,14 +24,14 @@ return [ 'edit' => 'Editar', 'publish' => 'Publicar', 'publish_edit' => 'Editar publicación', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Editar data de publicación', 'unpublish' => 'Retirar publicación', 'publish_error' => 'O episodio xa está publicado.', 'publish_edit_error' => 'O episodio xa está publicado.', 'publish_cancel_error' => 'O episodio xa está publicado.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'O episodio aínda non se publicou, non podes editar a súa data de publicación.', + 'publish_date_edit_future_error' => 'A data de publicación do episodio só pode establecerse nun momento do pasado! Se queres reprogramalo, primeiro retira a súa publicación.', + 'publish_date_edit_success' => 'Actualizada correctamente a data de publicación do episodio!', 'unpublish_error' => 'O episodio non foi publicado.', 'delete' => 'Eliminar', 'go_to_page' => 'Ir á páxina', @@ -114,7 +114,7 @@ return [ 'bonus_hint' => 'Contido extra para o programa (por exemplo, info sobre a elaboración ou conversa casual cos participantes) ou contido promocional de outras creadoras', ], 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium' => 'Episodio dispoñible só para subscricións premium', 'parental_advisory' => [ 'label' => 'Aviso sobre o contido', 'hint' => 'Contén o episodio elementos explícitos?', @@ -183,9 +183,9 @@ return [ 'message_warning_submit' => 'Publicar igualmente', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Nova data de publicación', + 'new_publication_date_hint' => 'Ten que ser unha data do pasado.', + 'submit' => 'Editar data de publicación', ], 'unpublish_form' => [ 'disclaimer' => diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php index 4afaa5d4..e9daf15e 100644 --- a/modules/Admin/Language/sk/Breadcrumb.php +++ b/modules/Admin/Language/sk/Breadcrumb.php @@ -14,22 +14,22 @@ return [ ->gateway => 'Úvod', 'podcasts' => 'podcasty', 'episodes' => 'časti', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'odbery', 'contributors' => 'prispievatelia', 'pages' => 'stránky', 'settings' => 'nastavenia', 'theme' => 'vzhľad', - 'about' => 'about', + 'about' => 'informácie', 'add' => 'pridať', 'new' => 'pridať', 'edit' => 'upraviť', 'persons' => 'osobnosti', 'publish' => 'zverejniť', 'publish-edit' => 'upraviť zverejnené', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'upraviť dátum publikovania', 'unpublish' => 'zrušiť zverejnenie', 'delete' => 'vymazať', - 'remove' => 'remove', + 'remove' => 'odstrániť', 'fediverse' => 'fediverse', 'block-lists' => 'zoznamy blokovaných', 'users' => 'používatelia', @@ -50,5 +50,5 @@ return [ 'video-clips' => 'video klipy', 'embed' => 'vnorený', 'notifications' => 'oboznámenia', - 'suspend' => 'suspend', + 'suspend' => 'pozastaviť', ]; diff --git a/modules/Admin/Language/sk/Countries.php b/modules/Admin/Language/sk/Countries.php index 1077917e..870a5a5b 100644 --- a/modules/Admin/Language/sk/Countries.php +++ b/modules/Admin/Language/sk/Countries.php @@ -13,7 +13,7 @@ declare(strict_types=1); return [ 'AD' => 'Andorra', 'AE' => 'Spojené Arabské Emiráty', - 'AF' => 'Afghanistan', + 'AF' => 'Afganistan', 'AG' => 'Antigua a Barbuda', 'AI' => 'Anguilla', 'AL' => 'Albánsko', @@ -25,7 +25,7 @@ return [ 'AT' => 'Rakúsko', 'AU' => 'Austrália', 'AW' => 'Aruba', - 'AX' => 'Åland Islands', + 'AX' => 'Ålandy', 'AZ' => 'Azerbajdžan', 'BA' => 'Bosna a Hercegovina', 'BB' => 'Barbados', @@ -33,36 +33,41 @@ return [ 'BE' => 'Belgicko', 'BF' => 'Burkina Faso', 'BG' => 'Bulharsko', - 'BH' => 'Bahrain', + 'BH' => 'Bahrajn', 'BI' => 'Burundi', 'BJ' => 'Benin', - 'BL' => 'Saint Barthélemy', - 'BM' => 'Bermuda', - 'BN' => 'Brunei Darussalam', - 'BO' => 'Bolivia, Plurinational State of', - 'BQ' => 'Bonaire, Sint Eustatius and Saba', - 'BR' => 'Brazil', - 'BS' => 'Bahamas', - 'BT' => 'Bhutan', - 'BV' => 'Bouvet Island', + 'BL' => 'Svätý Bartolomej', + 'BM' => 'Bermudy', + 'BN' => 'Brunejsko-Darussalamsky Štát', + 'BO' => 'Bolívia, plurinský štát', + 'BQ' => 'Bonaire, Sint Eustatius a Sabaj', + 'BR' => 'Brazília', + 'BS' => 'Bahamy', + 'BT' => 'Bhután', + 'BV' => 'Bouvetov ostrov', 'BW' => 'Botswana', - 'BY' => 'Belarus', + 'BY' => 'Bielorusko', 'BZ' => 'Belize', - 'CA' => 'Canada', - 'CC' => 'Cocos (Keeling) Islands', - 'CD' => 'Congo, the Democratic Republic of the', - 'CF' => 'Central African Republic', - 'CG' => 'Congo', - 'CH' => 'Switzerland', - 'CI' => "Côte d'Ivoire", - 'CK' => 'Cook Islands', - 'CL' => 'Chile', - 'CM' => 'Cameroon', + 'CA' => 'Kanada', + 'CC' => 'Kokosové ostrovy', + 'CD' => ' +Bhután +Bouvetov ostrov +Bielorusko +Kokosové ostrovy +Konžská demokratická republika', + 'CF' => 'Stredoafrická republika', + 'CG' => 'Kongo', + 'CH' => 'Švajčiarsko', + 'CI' => "Pobrežie slonoviny", + 'CK' => 'Cookove ostrovy', + 'CL' => 'Čile', + 'CM' => 'Kamerun', 'CN' => 'Čína', 'CO' => 'Kolumbia', 'CR' => 'Kostarika', 'CU' => 'Kuba', - 'CV' => 'Cape Verde', + 'CV' => 'Kapverdy', 'CW' => 'Curaçao', 'CX' => 'Vianočný Ostrov', 'CY' => 'Cyprus', @@ -70,7 +75,7 @@ return [ 'DE' => 'Nemecko', 'DJ' => 'Džibutsko', 'DK' => 'Dánsko', - 'DM' => 'Dominica', + 'DM' => 'Dominika', 'DO' => 'Dominikánska republika', 'DZ' => 'Alžírsko', 'EC' => 'Ekvádor', @@ -83,22 +88,22 @@ return [ 'FI' => 'Fínsko', 'FJ' => 'Fidži', 'FK' => 'Falklandské ostrovy (Malvíny)', - 'FM' => 'Micronesia, Federated States of', + 'FM' => 'Mikronézia, federatívne štáty', 'FO' => 'Faerské Ostrovy', 'FR' => 'Francúzsko', 'GA' => 'Gabon', 'GB' => 'Spojené Kráľovstvo', 'GD' => 'Grenada', 'GE' => 'Gruzínsko', - 'GF' => 'French Guiana', + 'GF' => 'Francúzska Guayana', 'GG' => 'Guernsey', 'GH' => 'Ghana', - 'GI' => 'Gibraltar', + 'GI' => 'Gibraltár', 'GL' => 'Grónsko', 'GM' => 'Gambia', 'GN' => 'Guinea', 'GP' => 'Guadeloupe', - 'GQ' => 'Equatorial Guinea', + 'GQ' => 'Rovníková Guinea', 'GR' => 'Grécko', 'GS' => 'Južná Georgia a Južné Sandwichove ostrovy', 'GT' => 'Guatemala', @@ -113,7 +118,7 @@ return [ 'HU' => 'Maďarsko', 'ID' => 'Indonézia', 'IE' => 'Írsko', - 'IL' => 'Israel', + 'IL' => 'Izrael', 'IM' => 'Ostrov Man', 'IN' => 'India', 'IO' => 'Britské indickooceánske územie', @@ -129,18 +134,31 @@ return [ 'KG' => 'Kirgizsko', 'KH' => 'Kambodža', 'KI' => 'Kiribati', - 'KM' => 'Comoros', - 'KN' => 'Saint Kitts and Nevis', - 'KP' => "Korea, Democratic People's Republic of", - 'KR' => 'Korea, Republic of', - 'KW' => 'Kuwait', - 'KY' => 'Cayman Islands', - 'KZ' => 'Kazakhstan', - 'LA' => "Lao People's Democratic Republic", + 'KM' => 'Komory', + 'KN' => 'Svätý Krištof a Nevis', + 'KP' => "Kórea, Demokratická ľudová republika", + 'KR' => 'Kórejská Republika', + 'KW' => 'Kuvajt', + 'KY' => 'Kajmanské ostrovy', + 'KZ' => 'Kazachstan', + 'LA' => "_03 slovutny poprad. mp3 +Kapverdy +Dominika +Mikronézia, federatívne štáty +Francúzska Guayana +Rovníková Guinea +Komory +Svätý Krištof a Nevis +Kórea, Demokratická ľudová republika +Kórejská Republika +Kuvajt +Kajmanské ostrovy +Kazachstan +Laoská ľudovodemokratická Republika", 'LB' => 'Libanon', 'LC' => 'Svätá Lucia', 'LI' => 'Lichtenštajnsko', - 'LK' => 'Sri Lanka', + 'LK' => 'Srí Lanka', 'LR' => 'Libéria', 'LS' => 'Lesotho', 'LT' => 'Litva', @@ -151,21 +169,21 @@ return [ 'MC' => 'Monako', 'MD' => 'Moldavská Republika', 'ME' => 'Čierna Hora', - 'MF' => 'Saint Martin (French part)', + 'MF' => 'Svätý Martin (Francúzska časť)', 'MG' => 'Madagaskar', - 'MH' => 'Marshall Islands', + 'MH' => 'Marshallove ostrovy', 'MK' => 'Macedónsko-Bývalá Juhoslovanská Republika', 'ML' => 'Mali', 'MM' => 'Mjanmarsko', 'MN' => 'Mongolsko', 'MO' => 'Macao', - 'MP' => 'Northern Mariana Islands', - 'MQ' => 'Martinique', - 'MR' => 'Mauritania', + 'MP' => 'Severné Mariány', + 'MQ' => 'Martinik', + 'MR' => 'Mauritánia', 'MS' => 'Montserrat', 'MT' => 'Malta', - 'MU' => 'Mauritius', - 'MV' => 'Maldives', + 'MU' => 'Maurícius', + 'MV' => 'Maledivy', 'MW' => 'Malawi', 'MX' => 'Mexiko', 'MY' => 'Malajzia', @@ -254,7 +272,7 @@ return [ 'VI' => 'Americké Panenské ostrovy', 'VN' => 'Vietnam', 'VU' => 'Vanuatu', - 'WF' => 'Wallis and Futuna', + 'WF' => 'Wallis a Futuna', 'WS' => 'Samoa', 'YE' => 'Jemen', 'YT' => 'Mayotte', diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php index a731c0e2..69edd601 100644 --- a/modules/Admin/Language/sk/Episode.php +++ b/modules/Admin/Language/sk/Episode.php @@ -26,14 +26,14 @@ return [ 'edit' => 'Upraviť', 'publish' => 'Zverejniť', 'publish_edit' => 'Upraviť zverejnenie', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Upraviť dátum zverejnenia', 'unpublish' => 'Zrušiť zverejnenie', 'publish_error' => 'Epizóda je už zverejnená.', 'publish_edit_error' => 'Epizóda je už zverejnená.', 'publish_cancel_error' => 'Epizóda je už zverejnená.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'Epizóda zatiaľ nie je zverejnená, nie je možné upraviť dátum zverejnenia.', + 'publish_date_edit_future_error' => 'Dátum zverejnenia musí byť v minulosti! Ak si zverejnenie želáte naplánovať v budúcnosti, musíte ho najskôr zrušiť.', + 'publish_date_edit_success' => 'Dátum zverejnenia epizódy bol úspešne aktualizovaný!', 'unpublish_error' => 'Epizóda nie je zverejnená.', 'delete' => 'Vymazať', 'go_to_page' => 'Prejsť na stránku', @@ -94,45 +94,45 @@ return [ ], 'form' => [ 'file_size_error' => - 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'Súbor je príliš veľký! Maximálna povolená veľkosť je {0}. V konfigurácii Php zvýšte hodnoty nastavení `memory_limit`, `upload_max_filesize` a `post_max_size` a následne reštartujte web server, aby ste súbor mohli nahrať znovu.', 'audio_file' => 'Zvukový súbor', 'audio_file_hint' => 'Vyberte zvukový súbor .mp3, alebo .m4a.', 'info_section_title' => 'Informácie o časti', 'cover' => 'Obal k časti', 'cover_hint' => - 'If you do not set a cover, the podcast cover will be used instead.', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'Ak obrázok nepridáte, použije sa obrázok podcastu.', + 'cover_size_hint' => 'Obrázok musí byť štvorcový minimálny rozmer 1400px.', 'title' => 'Názov', 'title_hint' => - 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'Má obsahovať jasný a výstižný názov. Nepridávajte čísla sérií a epizód.', 'permalink' => 'Trvalý odkaz', - 'season_number' => 'Season', + 'season_number' => 'Séria', 'episode_number' => 'Epizóda', 'type' => [ - 'label' => 'Type', - 'full' => 'Full', - 'full_hint' => 'Complete content (the episode)', - 'trailer' => 'Trailer', - 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'label' => 'Typ', + 'full' => 'Celá epizóda', + 'full_hint' => '´Uplný obsah', + 'trailer' => 'Upútavka', + 'trailer_hint' => 'Krátky promočný úryvok obsahu, ktorý slúži ako ukážka podcastu', 'bonus' => 'Bonus', - 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + 'bonus_hint' => 'Doplnkový obsah podcastu (Informácie zo zákulisia alebo rozhovor s účinkujúcimi) alebo upútavka iného podcastu', ], - 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium_title' => 'Prémiový obsah', + 'premium' => 'Epizóda je prístupná len pre predplatiteľov prémiového obsahu', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does the episode contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', + 'label' => 'Rodičovská kontrola', + 'hint' => 'Obsahuje epizóda explicitný obsah?', + 'undefined' => 'neuvedené', + 'clean' => 'Čisté', 'explicit' => 'Chúlostivé', ], - 'show_notes_section_title' => 'Show notes', + 'show_notes_section_title' => 'Poznámky epizódy', 'show_notes_section_subtitle' => - 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'Maximálne 4000 znakov, buďte jasní a výstižní.', 'description' => 'Popis', - 'description_footer' => 'Description footer', + 'description_footer' => 'Päta popisu', 'description_footer_hint' => - 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'Tento text je pridaný na koniec popisu každej epizódy, je vhodný napríklad na zverejnenie odkazov na sociálne siete.', 'additional_files_section_title' => 'Dodatočné súbory', 'additional_files_section_subtitle' => 'Tieto súbory sú určené na použitie s inými platformami s cieľom poslucháčom poskytovať bohačšiu skúsenosť. Pre viac informácií si pozrite {podcastNamespaceLink}.', @@ -187,13 +187,13 @@ return [ 'message_warning_submit' => 'Napriek tomu zverejniť', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Nový dátum zverejnenia', + 'new_publication_date_hint' => 'Musí byť dátum v minulosti.', + 'submit' => 'Upraviť dátum zverejnenia', ], 'unpublish_form' => [ 'disclaimer' => - "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + "Zrušenie zverejnenia odstráni všetky pridružené príspevky a komentáre a odstráni epizódu z kanála RSS.", 'understand' => 'Rozumiem, chcem zrušiť zverejnenie epizódy', 'submit' => 'Zrušiť zverejnenie', ], @@ -210,8 +210,8 @@ return [ 'clipboard_iframe' => 'Skopírovať kód prehrávača do schránky', 'clipboard_url' => 'Skopírovať adresu do schránky', 'dark' => 'Tmavý', - 'dark-transparent' => 'Dark transparent', - 'light' => 'Light', - 'light-transparent' => 'Light transparent', + 'dark-transparent' => 'Tmavý priehľadný', + 'light' => 'Svetlý', + 'light-transparent' => 'Svetlý priehľadný', ], ]; diff --git a/modules/Admin/Language/sk/EpisodeNavigation.php b/modules/Admin/Language/sk/EpisodeNavigation.php index d60ef396..6283072b 100644 --- a/modules/Admin/Language/sk/EpisodeNavigation.php +++ b/modules/Admin/Language/sk/EpisodeNavigation.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'go_to_page' => 'Zobraziť stránku časti', - 'dashboard' => 'Episode dashboard', + 'dashboard' => 'Nástenka epizódy', 'episode-view' => 'Domov', 'episode-edit' => 'Upraviť časť', 'episode-persons-manage' => 'Manage persons', diff --git a/modules/Admin/Language/sv/AboutCastopod.php b/modules/Admin/Language/sv/AboutCastopod.php index 3fb62aff..f9707cbe 100644 --- a/modules/Admin/Language/sv/AboutCastopod.php +++ b/modules/Admin/Language/sv/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', + 'title' => 'Om Castopod', + 'host_name' => 'Värdnamn', 'version' => 'Castopod version', 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'os' => 'Operativsystem', + 'languages' => 'Språk', + 'update_database' => 'Uppdatera databas', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'Databasen är uppdaterad!', ], ]; diff --git a/modules/Admin/Language/sv/Breadcrumb.php b/modules/Admin/Language/sv/Breadcrumb.php index b1742abf..84778eaa 100644 --- a/modules/Admin/Language/sv/Breadcrumb.php +++ b/modules/Admin/Language/sv/Breadcrumb.php @@ -11,44 +11,44 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', config('Admin') - ->gateway => 'Home', + ->gateway => 'Hem', 'podcasts' => 'podcasts', - 'episodes' => 'episodes', - 'subscriptions' => 'subscriptions', - 'contributors' => 'contributors', - 'pages' => 'pages', - 'settings' => 'settings', - 'theme' => 'theme', - 'about' => 'about', - 'add' => 'add', - 'new' => 'new', - 'edit' => 'edit', - 'persons' => 'persons', - 'publish' => 'publish', - 'publish-edit' => 'edit publication', - 'publish-date-edit' => 'edit publication date', - 'unpublish' => 'unpublish', - 'delete' => 'delete', - 'remove' => 'remove', + 'episodes' => 'avsnitt', + 'subscriptions' => 'prenumerationer', + 'contributors' => 'bidragsgivare', + 'pages' => 'sidor', + 'settings' => 'inställningar', + 'theme' => 'tema', + 'about' => 'om', + 'add' => 'lägg till', + 'new' => 'ny', + 'edit' => 'redigera', + 'persons' => 'personer', + 'publish' => 'publicera', + 'publish-edit' => 'redigera publikation', + 'publish-date-edit' => 'redigera publiceringsdatum', + 'unpublish' => 'avpublicera', + 'delete' => 'radera', + 'remove' => 'ta bort', 'fediverse' => 'fediverse', - 'block-lists' => 'block lists', - 'users' => 'users', - 'my-account' => 'my account', - 'change-password' => 'change password', - 'import' => 'feed import', - 'platforms' => 'platforms', - 'social' => 'social networks', - 'funding' => 'funding', - 'analytics' => 'analytics', - 'locations' => 'locations', - 'webpages' => 'web pages', - 'unique-listeners' => 'unique listeners', - 'players' => 'players', - 'listening-time' => 'listening time', - 'time-periods' => 'time periods', - 'soundbites' => 'soundbites', - 'video-clips' => 'video clips', - 'embed' => 'embeddable player', - 'notifications' => 'notifications', - 'suspend' => 'suspend', + 'block-lists' => 'block listor', + 'users' => 'användare', + 'my-account' => 'mitt konto', + 'change-password' => 'ändra lösenord', + 'import' => 'import av flöde', + 'platforms' => 'plattformar', + 'social' => 'sociala nätverk', + 'funding' => 'finansiering', + 'analytics' => 'analys', + 'locations' => 'platser', + 'webpages' => 'webbplatser', + 'unique-listeners' => 'unika lyssnare', + 'players' => 'spelare', + 'listening-time' => 'lyssningstid', + 'time-periods' => 'tidsperiod', + 'soundbites' => 'ljudklipp', + 'video-clips' => 'videoklipp', + 'embed' => 'inbäddad spelare', + 'notifications' => 'aviseringar', + 'suspend' => 'suspendera', ]; diff --git a/modules/Admin/Language/sv/Charts.php b/modules/Admin/Language/sv/Charts.php index 4b33530e..708e96f8 100644 --- a/modules/Admin/Language/sv/Charts.php +++ b/modules/Admin/Language/sv/Charts.php @@ -9,32 +9,32 @@ declare(strict_types=1); */ return [ - 'by_service_weekly' => 'Episode downloads by service (for the past week)', - 'by_player_weekly' => 'Episode downloads by player (for the past week)', - 'by_player_yearly' => 'Episode downloads by player (for the past year)', - 'by_device_weekly' => 'Episode downloads by device (for the past week)', - 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', - 'podcast_by_region' => 'Episode downloads by region (for the past week)', - 'unique_daily_listeners' => 'Daily unique listeners', - 'unique_monthly_listeners' => 'Monthly unique listeners', - 'by_browser' => 'Web pages usage by browser (for the past week)', - 'podcast_by_day' => 'Episode daily downloads', - 'podcast_by_month' => 'Episode monthly downloads', - 'episode_by_day' => 'Episode daily downloads (first 60 days)', - 'episode_by_month' => 'Episode monthly downloads', + 'by_service_weekly' => 'Avsnitt nedladdningar via tjänst (under den senaste veckan)', + 'by_player_weekly' => 'Nedladdningar av avsnitt via spelare (under den senaste veckan)', + 'by_player_yearly' => 'Nedladdningar av avsnitt via spelare (under det gångna året)', + 'by_device_weekly' => 'Avsnitt nedladdningar per enhet (föregående veckan)', + 'by_os_weekly' => 'Avsnitt nedladdningar av O.S. (för den föregående veckan)', + 'podcast_by_region' => 'Nedladdningar av avsnitt efter region (under den föregående veckan)', + 'unique_daily_listeners' => 'Dagliga unika lyssnare', + 'unique_monthly_listeners' => 'Unika lyssnare varje månad', + 'by_browser' => 'Webbsidor användning av webbläsare (under den föregående veckan)', + 'podcast_by_day' => 'Avsnitt dagliga nedladdningar', + 'podcast_by_month' => 'Månatliga nedladdningar av avsnitt', + 'episode_by_day' => 'Avsnitt dagliga nedladdningar (första 60 dagar)', + 'episode_by_month' => 'Månatliga nedladdningar av avsnitt', 'episodes_by_day' => - '5 latest episodes downloads (during their first 60 days)', - 'by_country_weekly' => 'Episode downloads by country (for the past week)', - 'by_country_yearly' => 'Episode downloads by country (for the past year)', - 'by_domain_weekly' => 'Web pages visits by source (for the past week)', - 'by_domain_yearly' => 'Web pages visits by source (for the past year)', - 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + '5 senaste avsnitt nedladdningar (under sina första 60 dagar)', + 'by_country_weekly' => 'Nedladdningar av avsnitt per land (under den föregående veckan)', + 'by_country_yearly' => 'Nedladdningar av avsnitt per land (för föregående året)', + 'by_domain_weekly' => 'Webbsidor besök per källa (under föregående veckan)', + 'by_domain_yearly' => 'Webbsidor besök per källa (för det gångna året)', + 'by_entry_page' => 'Webbsidor besök via startsida (under den föregående veckan)', 'podcast_bots' => 'Bots (crawlers)', - 'daily_listening_time' => 'Daily cumulative listening time', - 'monthly_listening_time' => 'Monthly cumulative listening time', - 'by_weekday' => 'By week day (for the past 60 days)', - 'by_hour' => 'By time of day (for the past 60 days)', - 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', - 'total_storage_by_month' => 'Monthly storage (in MB)', - 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'daily_listening_time' => 'Daglig kumulativ lyssningstid', + 'monthly_listening_time' => 'Månatlig kumulativ lyssningstid', + 'by_weekday' => 'Efter veckodag (för de senaste 60 dagarna)', + 'by_hour' => 'Via tiden på dagen (de senaste 60 dagarna)', + 'podcast_by_bandwidth' => 'Dagligen använd bandbredd (i MB)', + 'total_storage_by_month' => 'Månadslagring (i MB)', + 'total_bandwidth_by_month' => 'Månatlig använd bandbredd (i MB)', ]; diff --git a/modules/Admin/Language/sv/Common.php b/modules/Admin/Language/sv/Common.php index 596c8bcd..ce69e0eb 100644 --- a/modules/Admin/Language/sv/Common.php +++ b/modules/Admin/Language/sv/Common.php @@ -9,43 +9,43 @@ declare(strict_types=1); */ return [ - 'yes' => 'Yes', - 'no' => 'No', - 'cancel' => 'Cancel', - 'optional' => 'Optional', - 'more' => 'More', - 'no_data' => 'No data found!', - 'close' => 'Close', - 'edit' => 'Edit', - 'copy' => 'Copy', - 'copied' => 'Copied!', - 'home' => 'Home', - 'explicit' => 'Explicit', - 'powered_by' => 'Powered by {castopod}', - 'actions' => 'Actions', - 'pageInfo' => 'Page {currentPage} out of {pageCount}', - 'go_back' => 'Go back', + 'yes' => 'Ja', + 'no' => 'Nej', + 'cancel' => 'Avbryt', + 'optional' => 'Valfritt', + 'more' => 'Mer', + 'no_data' => 'Ingen data hittades!', + 'close' => 'Stäng', + 'edit' => 'Redigera', + 'copy' => 'Kopiera', + 'copied' => 'Kopierad!', + 'home' => 'Hem', + 'explicit' => 'Uteslutande', + 'powered_by' => 'Drivs av {castopod}', + 'actions' => 'Åtgärder', + 'pageInfo' => 'Sida {currentPage} av {pageCount}', + 'go_back' => 'Gå tillbaka', 'forms' => [ 'editor' => [ - 'write' => 'Write', - 'preview' => 'Preview', - 'help' => 'Powered by markdown', + 'write' => 'Skriv', + 'preview' => 'Förhandsgranska', + 'help' => 'Drivs av markdown', ], 'multiSelect' => [ - 'selectText' => 'Press to select', - 'loadingText' => 'Loading…', - 'noResultsText' => 'No results found', - 'noChoicesText' => 'No choices to choose from', - 'maxItemText' => 'Cannot add more items', + 'selectText' => 'Tryck för att välja', + 'loadingText' => 'Laddar…', + 'noResultsText' => 'Hittade inga resultat', + 'noChoicesText' => 'Inga val att välja mellan', + 'maxItemText' => 'Kan inte lägga till fler objekt', ], - 'upload_file' => 'Upload a file', - 'remote_url' => 'Remote URL', + 'upload_file' => 'Ladda upp en fil', + 'remote_url' => 'Fjärr URL', ], 'play_episode_button' => [ - 'play' => 'Play', - 'playing' => 'Playing', + 'play' => 'Spela', + 'playing' => 'Spelar', ], - 'size_limit' => 'Size limit: {0}.', - 'choose_interact' => 'Choose how to interact', - 'view' => 'View', + 'size_limit' => 'Storleksgräns: {0}.', + 'choose_interact' => 'Välj hur du vill interagera', + 'view' => 'Visa', ]; diff --git a/modules/Admin/Language/sv/Countries.php b/modules/Admin/Language/sv/Countries.php index 4cd5d9c8..1aed3bb0 100644 --- a/modules/Admin/Language/sv/Countries.php +++ b/modules/Admin/Language/sv/Countries.php @@ -12,253 +12,253 @@ declare(strict_types=1); return [ 'AD' => 'Andorra', - 'AE' => 'United Arab Emirates', + 'AE' => 'Förenade Arabemiraten', 'AF' => 'Afghanistan', - 'AG' => 'Antigua and Barbuda', + 'AG' => 'Antigua och Barbuda', 'AI' => 'Anguilla', - 'AL' => 'Albania', - 'AM' => 'Armenia', + 'AL' => 'Albanien', + 'AM' => 'Armenien', 'AO' => 'Angola', - 'AQ' => 'Antarctica', + 'AQ' => 'Antarktis', 'AR' => 'Argentina', - 'AS' => 'American Samoa', - 'AT' => 'Austria', - 'AU' => 'Australia', + 'AS' => 'Amerikanska Samoaöarna', + 'AT' => 'Österrike', + 'AU' => 'Australien', 'AW' => 'Aruba', - 'AX' => 'Åland Islands', - 'AZ' => 'Azerbaijan', - 'BA' => 'Bosnia and Herzegovina', + 'AX' => 'Åland', + 'AZ' => 'Azerbajdzjan', + 'BA' => 'Bosnien och Hercegovina', 'BB' => 'Barbados', 'BD' => 'Bangladesh', - 'BE' => 'Belgium', + 'BE' => 'Belgien', 'BF' => 'Burkina Faso', - 'BG' => 'Bulgaria', + 'BG' => 'Bulgarien', 'BH' => 'Bahrain', 'BI' => 'Burundi', 'BJ' => 'Benin', 'BL' => 'Saint Barthélemy', 'BM' => 'Bermuda', 'BN' => 'Brunei Darussalam', - 'BO' => 'Bolivia, Plurinational State of', - 'BQ' => 'Bonaire, Sint Eustatius and Saba', - 'BR' => 'Brazil', + 'BO' => 'Bolivia', + 'BQ' => 'Bonaire', + 'BR' => 'Brasilien', 'BS' => 'Bahamas', 'BT' => 'Bhutan', - 'BV' => 'Bouvet Island', + 'BV' => 'Bouvetön', 'BW' => 'Botswana', - 'BY' => 'Belarus', + 'BY' => 'Vitryssland', 'BZ' => 'Belize', - 'CA' => 'Canada', - 'CC' => 'Cocos (Keeling) Islands', - 'CD' => 'Congo, the Democratic Republic of the', - 'CF' => 'Central African Republic', - 'CG' => 'Congo', - 'CH' => 'Switzerland', - 'CI' => "Côte d'Ivoire", - 'CK' => 'Cook Islands', + 'CA' => 'Kanada', + 'CC' => 'Kokosöarna', + 'CD' => 'Kongo, Demokratiska republiken Kongo', + 'CF' => 'Centralafrikanska republiken', + 'CG' => 'Kongo', + 'CH' => 'Schweiz', + 'CI' => "Elfenbenskusten", + 'CK' => 'Cooköarna', 'CL' => 'Chile', - 'CM' => 'Cameroon', - 'CN' => 'China', + 'CM' => 'Kamerun', + 'CN' => 'Kina', 'CO' => 'Colombia', 'CR' => 'Costa Rica', - 'CU' => 'Cuba', - 'CV' => 'Cape Verde', - 'CW' => 'Curaçao', - 'CX' => 'Christmas Island', - 'CY' => 'Cyprus', - 'CZ' => 'Czech Republic', - 'DE' => 'Germany', + 'CU' => 'Kuba', + 'CV' => 'Kap Verde', + 'CW' => 'Curacao', + 'CX' => 'Julön', + 'CY' => 'Cypern', + 'CZ' => 'Tjeckien', + 'DE' => 'Tyskland', 'DJ' => 'Djibouti', - 'DK' => 'Denmark', + 'DK' => 'Danmark', 'DM' => 'Dominica', - 'DO' => 'Dominican Republic', - 'DZ' => 'Algeria', + 'DO' => 'Dominikanska republiken', + 'DZ' => 'Algeriet', 'EC' => 'Ecuador', - 'EE' => 'Estonia', - 'EG' => 'Egypt', - 'EH' => 'Western Sahara', + 'EE' => 'Estland', + 'EG' => 'Egypten', + 'EH' => 'Västsahara', 'ER' => 'Eritrea', - 'ES' => 'Spain', - 'ET' => 'Ethiopia', + 'ES' => 'Spanien', + 'ET' => 'Etiopien', 'FI' => 'Finland', 'FJ' => 'Fiji', - 'FK' => 'Falkland Islands (Malvinas)', - 'FM' => 'Micronesia, Federated States of', - 'FO' => 'Faroe Islands', - 'FR' => 'France', + 'FK' => 'Falklandsöarna (Malvinas)', + 'FM' => 'Mikronesien, Federerade Stater', + 'FO' => 'Färöarna', + 'FR' => 'Frankrike', 'GA' => 'Gabon', - 'GB' => 'United Kingdom', + 'GB' => 'Storbritannien', 'GD' => 'Grenada', - 'GE' => 'Georgia', - 'GF' => 'French Guiana', + 'GE' => 'Georgien', + 'GF' => 'Franska Guyana', 'GG' => 'Guernsey', 'GH' => 'Ghana', 'GI' => 'Gibraltar', - 'GL' => 'Greenland', + 'GL' => 'Grönland', 'GM' => 'Gambia', 'GN' => 'Guinea', 'GP' => 'Guadeloupe', 'GQ' => 'Equatorial Guinea', - 'GR' => 'Greece', - 'GS' => 'South Georgia and the South Sandwich Islands', + 'GR' => 'Grekland', + 'GS' => 'Sydgeorgien och Sydsandwichöarna', 'GT' => 'Guatemala', 'GU' => 'Guam', 'GW' => 'Guinea-Bissau', 'GY' => 'Guyana', - 'HK' => 'Hong Kong', - 'HM' => 'Heard Island and McDonald Islands', + 'HK' => 'Hongkong', + 'HM' => 'Heard Island och McDonaldsöarna', 'HN' => 'Honduras', - 'HR' => 'Croatia', + 'HR' => 'Kroatien', 'HT' => 'Haiti', - 'HU' => 'Hungary', - 'ID' => 'Indonesia', - 'IE' => 'Ireland', + 'HU' => 'Ungern', + 'ID' => 'Indonesien', + 'IE' => 'Irland', 'IL' => 'Israel', 'IM' => 'Isle of Man', - 'IN' => 'India', - 'IO' => 'British Indian Ocean Territory', - 'IQ' => 'Iraq', - 'IR' => 'Iran, Islamic Republic of', - 'IS' => 'Iceland', - 'IT' => 'Italy', + 'IN' => 'Indien', + 'IO' => 'Brittiska territoriet i Indiska oceanen', + 'IQ' => 'Irak', + 'IR' => 'Iran, Islamiska republiken av', + 'IS' => 'Island', + 'IT' => 'Italien', 'JE' => 'Jersey', 'JM' => 'Jamaica', - 'JO' => 'Jordan', + 'JO' => 'Jordanien', 'JP' => 'Japan', 'KE' => 'Kenya', 'KG' => 'Kyrgyzstan', - 'KH' => 'Cambodia', + 'KH' => 'Kambodja', 'KI' => 'Kiribati', - 'KM' => 'Comoros', - 'KN' => 'Saint Kitts and Nevis', - 'KP' => "Korea, Democratic People's Republic of", - 'KR' => 'Korea, Republic of', + 'KM' => 'Komorerna', + 'KN' => 'Saint Kitts och Nevis', + 'KP' => "Nordkorea", + 'KR' => 'Sydkorea', 'KW' => 'Kuwait', - 'KY' => 'Cayman Islands', - 'KZ' => 'Kazakhstan', - 'LA' => "Lao People's Democratic Republic", - 'LB' => 'Lebanon', - 'LC' => 'Saint Lucia', + 'KY' => 'Caymanöarna', + 'KZ' => 'Kazakstan', + 'LA' => "Laos", + 'LB' => 'Libanon', + 'LC' => 'Sankt Lucia', 'LI' => 'Liechtenstein', 'LK' => 'Sri Lanka', - 'LR' => 'Liberia', + 'LR' => 'Liberien', 'LS' => 'Lesotho', - 'LT' => 'Lithuania', + 'LT' => 'Litauen', 'LU' => 'Luxembourg', - 'LV' => 'Latvia', - 'LY' => 'Libya', - 'MA' => 'Morocco', + 'LV' => 'Lettland', + 'LY' => 'Libyen', + 'MA' => 'Marocko', 'MC' => 'Monaco', - 'MD' => 'Moldova, Republic of', + 'MD' => 'Moldavien', 'ME' => 'Montenegro', - 'MF' => 'Saint Martin (French part)', - 'MG' => 'Madagascar', - 'MH' => 'Marshall Islands', - 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'MF' => 'Saint Martin', + 'MG' => 'Madagaskar', + 'MH' => 'Marshallöarna', + 'MK' => 'Makedonien', 'ML' => 'Mali', 'MM' => 'Myanmar', - 'MN' => 'Mongolia', + 'MN' => 'Mongoliet', 'MO' => 'Macao', - 'MP' => 'Northern Mariana Islands', + 'MP' => 'Nordmarianerna', 'MQ' => 'Martinique', 'MR' => 'Mauritania', 'MS' => 'Montserrat', 'MT' => 'Malta', 'MU' => 'Mauritius', - 'MV' => 'Maldives', + 'MV' => 'Maldiverna', 'MW' => 'Malawi', - 'MX' => 'Mexico', + 'MX' => 'Mexiko', 'MY' => 'Malaysia', - 'MZ' => 'Mozambique', - 'N/A' => 'Not Applicable (local IP…)', + 'MZ' => 'Moçambique', + 'N/A' => 'Ej tillämplig (lokal IP…)', 'NA' => 'Namibia', - 'NC' => 'New Caledonia', + 'NC' => 'Nya Kaledonien', 'NE' => 'Niger', - 'NF' => 'Norfolk Island', + 'NF' => 'Norfolkön', 'NG' => 'Nigeria', 'NI' => 'Nicaragua', - 'NL' => 'Netherlands', - 'NO' => 'Norway', + 'NL' => 'Nederländerna', + 'NO' => 'Norge', 'NP' => 'Nepal', 'NR' => 'Nauru', 'NU' => 'Niue', - 'NZ' => 'New Zealand', + 'NZ' => 'Nya Zeeland', 'OM' => 'Oman', 'PA' => 'Panama', 'PE' => 'Peru', - 'PF' => 'French Polynesia', - 'PG' => 'Papua New Guinea', - 'PH' => 'Philippines', + 'PF' => 'Franska Polynesien', + 'PG' => 'Papua Nya Guinea', + 'PH' => 'Filippinerna', 'PK' => 'Pakistan', - 'PL' => 'Poland', - 'PM' => 'Saint Pierre and Miquelon', + 'PL' => 'Polen', + 'PM' => 'Saint Pierre och Miquelon', 'PN' => 'Pitcairn', 'PR' => 'Puerto Rico', - 'PS' => 'Palestine, State of', + 'PS' => 'Palestina', 'PT' => 'Portugal', 'PW' => 'Palau', 'PY' => 'Paraguay', 'QA' => 'Qatar', 'RE' => 'Réunion', - 'RO' => 'Romania', - 'RS' => 'Serbia', - 'RU' => 'Russian Federation', + 'RO' => 'Rumänien', + 'RS' => 'Serbien', + 'RU' => 'Ryssland', 'RW' => 'Rwanda', - 'SA' => 'Saudi Arabia', - 'SB' => 'Solomon Islands', - 'SC' => 'Seychelles', + 'SA' => 'Saudiarabien', + 'SB' => 'Salomonöarna', + 'SC' => 'Seychellerna', 'SD' => 'Sudan', - 'SE' => 'Sweden', + 'SE' => 'Sverige', 'SG' => 'Singapore', - 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', - 'SI' => 'Slovenia', - 'SJ' => 'Svalbard and Jan Mayen', - 'SK' => 'Slovakia', + 'SH' => 'Sankta Helena, Ascension och Tristan da Cunha', + 'SI' => 'Slovenien', + 'SJ' => 'Svalbard', + 'SK' => 'Slovakien', 'SL' => 'Sierra Leone', 'SM' => 'San Marino', 'SN' => 'Senegal', 'SO' => 'Somalia', - 'SR' => 'Suriname', - 'SS' => 'South Sudan', - 'ST' => 'Sao Tome and Principe', + 'SR' => 'Surinam', + 'SS' => 'Sydsudan', + 'ST' => 'Sao Tome och Principe', 'SV' => 'El Salvador', - 'SX' => 'Sint Maarten (Dutch part)', - 'SY' => 'Syrian Arab Republic', + 'SX' => 'Sint Maarten (nederländska delen)', + 'SY' => 'Syrien', 'SZ' => 'Swaziland', - 'TC' => 'Turks and Caicos Islands', - 'TD' => 'Chad', - 'TF' => 'French Southern Territories', + 'TC' => 'Turks- och Caicosöarna', + 'TD' => 'Tchad', + 'TF' => 'Franska sydterritorierna', 'TG' => 'Togo', 'TH' => 'Thailand', 'TJ' => 'Tajikistan', - 'TK' => 'Tokelau', - 'TL' => 'Timor-Leste', + 'TK' => 'Tokelauöarna', + 'TL' => 'Östtimor', 'TM' => 'Turkmenistan', - 'TN' => 'Tunisia', + 'TN' => 'Tunisien', 'TO' => 'Tonga', - 'TR' => 'Turkey', - 'TT' => 'Trinidad and Tobago', + 'TR' => 'Turkiet', + 'TT' => 'Trinidad och Tobago', 'TV' => 'Tuvalu', - 'TW' => 'Taiwan, Province of China', - 'TZ' => 'Tanzania, United Republic of', - 'UA' => 'Ukraine', + 'TW' => 'Taiwan', + 'TZ' => 'Tanzania', + 'UA' => 'Ukraina', 'UG' => 'Uganda', - 'UM' => 'United States Minor Outlying Islands', - 'US' => 'United States', + 'UM' => 'Förenta staternas mindre öar i Oceanien och Västindien', + 'US' => 'USA', 'UY' => 'Uruguay', 'UZ' => 'Uzbekistan', - 'VA' => 'Holy See (Vatican City State)', - 'VC' => 'Saint Vincent and the Grenadines', - 'VE' => 'Venezuela, Bolivarian Republic of', - 'VG' => 'Virgin Islands, British', - 'VI' => 'Virgin Islands, U.S.', - 'VN' => 'Viet Nam', + 'VA' => 'Vatikanstaten', + 'VC' => 'Saint Vincent och Grenadinerna', + 'VE' => 'Venezuela', + 'VG' => 'Brittiska Jungfruöarna', + 'VI' => 'Amerikanska Jungfruöarna.', + 'VN' => 'Vietnam', 'VU' => 'Vanuatu', - 'WF' => 'Wallis and Futuna', + 'WF' => 'Wallis- och Futunaöarna', 'WS' => 'Samoa', - 'YE' => 'Yemen', + 'YE' => 'Jemen', 'YT' => 'Mayotte', - 'ZA' => 'South Africa', + 'ZA' => 'Sydafrika', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe', ]; diff --git a/modules/Admin/Language/sv/Dashboard.php b/modules/Admin/Language/sv/Dashboard.php index 881073fd..cf127945 100644 --- a/modules/Admin/Language/sv/Dashboard.php +++ b/modules/Admin/Language/sv/Dashboard.php @@ -9,20 +9,20 @@ declare(strict_types=1); */ return [ - 'home' => 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', + 'home' => 'Admin kontrollpanel', + 'welcome_message' => 'Välkommen till adminområdet!', 'podcasts' => [ 'title' => 'Podcasts', - 'not_found' => 'No published podcast', - 'last_published' => 'Last published on {lastPublicationDate}', + 'not_found' => 'Ingen publicerad podcast', + 'last_published' => 'Senast publicerad den {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episodes', - 'not_found' => 'No published episode', - 'last_published' => 'Last published on {lastPublicationDate}', + 'title' => 'Avsnitt', + 'not_found' => 'Inga publicerade avsnitt', + 'last_published' => 'Senast publicerad den {lastPublicationDate}', ], 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', + 'title' => 'Lagring', + 'subtitle' => '{totalUploaded} av {totalStorage}', ], ]; diff --git a/modules/Admin/Language/sv/Episode.php b/modules/Admin/Language/sv/Episode.php index 91313a7c..4daf1a0b 100644 --- a/modules/Admin/Language/sv/Episode.php +++ b/modules/Admin/Language/sv/Episode.php @@ -9,205 +9,205 @@ declare(strict_types=1); */ return [ - 'season' => 'Season {seasonNumber}', + 'season' => 'Säsong {seasonNumber}', 'season_abbr' => 'S{seasonNumber}', - 'number' => 'Episode {episodeNumber}', - 'number_abbr' => 'Ep. {episodeNumber}', - 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', - 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number' => 'Avsnitt {episodeNumber}', + 'number_abbr' => 'Av. {episodeNumber}', + 'season_episode' => 'Säsong {seasonNumber} avsnitt {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}A{episodeNumber}', 'number_of_comments' => '{numberOfComments, plural, - one {# comment} - other {# comments} + one {# kommentar} + other {# kommentarer} }', - 'all_podcast_episodes' => 'All podcast episodes', - 'back_to_podcast' => 'Go back to podcast', - 'edit' => 'Edit', - 'publish' => 'Publish', - 'publish_edit' => 'Edit publication', - 'publish_date_edit' => 'Edit publication date', - 'unpublish' => 'Unpublish', - 'publish_error' => 'Episode is already published.', - 'publish_edit_error' => 'Episode is already published.', - 'publish_cancel_error' => 'Episode is already published.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', - 'unpublish_error' => 'Episode is not published.', - 'delete' => 'Delete', - 'go_to_page' => 'Go to page', - 'create' => 'Add an episode', + 'all_podcast_episodes' => 'Alla podcast avsnitt', + 'back_to_podcast' => 'Gå tillbaka till podcasten', + 'edit' => 'Redigera', + 'publish' => 'Publicera', + 'publish_edit' => 'Redigera publikation', + 'publish_date_edit' => 'Redigera publiceringsdatum', + 'unpublish' => 'Avpublicera', + 'publish_error' => 'Avsnittet är redan publicerat.', + 'publish_edit_error' => 'Avsnittet är redan publicerat.', + 'publish_cancel_error' => 'Avsnittet är redan publicerat.', + 'publish_date_edit_error' => 'Avsnittet har inte publicerats ännu, du kan inte redigera dess publiceringsdatum.', + 'publish_date_edit_future_error' => 'Avsnittets publiceringsdatum kan bara ställas in till ett tidigare datum! Om du vill boka om det, avpublicera det först.', + 'publish_date_edit_success' => 'Avsnittets publiceringsdatum har uppdaterats!', + 'unpublish_error' => 'Avsnittet är inte publicerat.', + 'delete' => 'Radera', + 'go_to_page' => 'Gå till sida', + 'create' => 'Lägg till ett avsnitt', 'publication_status' => [ - 'published' => 'Published', - 'with_podcast' => 'Published', - 'scheduled' => 'Scheduled', - 'not_published' => 'Not published', + 'published' => 'Publicerad', + 'with_podcast' => 'Publicerad', + 'scheduled' => 'Schemalagd', + 'not_published' => 'Ej publicerat', ], - 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'with_podcast_hint' => 'Publiceras samtidigt som podcasten', 'list' => [ 'search' => [ - 'placeholder' => 'Search for an episode', - 'clear' => 'Clear search', - 'submit' => 'Search', + 'placeholder' => 'Sök efter ett avsnitt', + 'clear' => 'Rensa sökning', + 'submit' => 'Sök', ], 'number_of_episodes' => '{numberOfEpisodes, plural, - one {# episode} - other {# episodes} + one {# avsnitt} + other {# avsnitt} }', - 'episode' => 'Episode', - 'visibility' => 'Visibility', - 'comments' => 'Comments', - 'actions' => 'Actions', + 'episode' => 'Avsnitt', + 'visibility' => 'Synlighet', + 'comments' => 'Kommentarer', + 'actions' => 'Åtgärder', ], 'messages' => [ - 'createSuccess' => 'Episode has been successfully created!', - 'editSuccess' => 'Episode has been successfully updated!', + 'createSuccess' => 'Avsnittet har skapats!', + 'editSuccess' => 'Avsnittet har uppdaterats!', 'publishSuccess' => '{publication_status, select, - published {Episode successfully published!} - scheduled {Episode publication successfully scheduled!} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not published.} + published {Avsnittet har publicerats!} + scheduled {Avsnittspubliceringen har planerats!} + with_podcast {Detta avsnitt kommer att publiceras samtidigt som podcasten.} + other {Detta avsnitt är inte publicerad.} }', - 'publishCancelSuccess' => 'Episode publication successfully cancelled!', - 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', - 'scheduleDateError' => 'Schedule date must be set!', - 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', - 'deleteSuccess' => 'Episode successfully deleted!', - 'deleteError' => 'Failed to delete episode {type, select, + 'publishCancelSuccess' => 'Avsnitt publicering har avbrutits!', + 'unpublishBeforeDeleteTip' => 'Du måste avpublicera avsnittet innan du tar bort det.', + 'scheduleDateError' => 'Schemaläggningsdatum måste anges!', + 'deletePublishedEpisodeError' => 'Avpublicera avsnittet innan du tar bort det.', + 'deleteSuccess' => 'Avsnittet har tagits bort!', + 'deleteError' => 'Misslyckades att ta bort avsnitt {type, select, transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} + chapters {kapitel} + image {omslag} + audio {ljud} other {media} }.', - 'deleteFileError' => 'Failed to delete {type, select, + 'deleteFileError' => 'Det gick inte att ta bort {type, select, transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} + chapters {kapitel} + image {omslag} + audio {ljud} other {media} - } file {file_path}. You may manually remove it from your disk.', - 'sameSlugError' => 'An episode with the chosen slug already exists.', + } fil {file_path}. Du kan manuellt ta bort den från disken.', + 'sameSlugError' => 'Ett avsnitt med den valda slug finns redan.', ], 'form' => [ 'file_size_error' => - 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', - 'audio_file' => 'Audio file', - 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', - 'info_section_title' => 'Episode info', - 'cover' => 'Episode cover', + 'Din filstorlek är för stor! Max storlek är {0}. Öka värdena `memory_limit`, `upload_max_filesize` och `post_max_size` i din php-konfigurationsfil och starta sedan om din webbserver för att ladda upp filen.', + 'audio_file' => 'Ljudfil', + 'audio_file_hint' => 'Välj en. mp3 eller . m4a ljudfil.', + 'info_section_title' => 'Avsnitt information', + 'cover' => 'Avsnitt omslag', 'cover_hint' => - 'If you do not set a cover, the podcast cover will be used instead.', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', - 'title' => 'Title', + 'Om du inte sätter ett omslag kommer podcast-omslaget att användas istället.', + 'cover_size_hint' => 'Omslaget måste vara fyrkantigt och minst 1400px brett och högt.', + 'title' => 'Rubrik', 'title_hint' => - 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', - 'permalink' => 'Permalink', - 'season_number' => 'Season', - 'episode_number' => 'Episode', + 'Bör innehålla ett tydligt och koncist avsnittsnamn. Ange inte avsnitt eller säsongsnummer här.', + 'permalink' => 'Permalänk', + 'season_number' => 'Säsong', + 'episode_number' => 'Avsnitt', 'type' => [ - 'label' => 'Type', + 'label' => 'Typ', 'full' => 'Full', - 'full_hint' => 'Complete content (the episode)', + 'full_hint' => 'Komplett innehåll (avsnittet)', 'trailer' => 'Trailer', - 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'trailer_hint' => 'Kort, PR-del av innehåll som representerar en förhandsvisning av den aktuella serien', 'bonus' => 'Bonus', - 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + 'bonus_hint' => 'Extra innehåll för showen (till exempel bakom scenens info eller intervjuer med cast) eller korspremiellt innehåll för en annan show', ], 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium' => 'Avsnitt måste endast vara tillgängligt för premiumprenumeranter', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does the episode contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'label' => 'Föräldrarådgivande', + 'hint' => 'Innehåller avsnittet olämpligt innehåll?', + 'undefined' => 'odefinierad', + 'clean' => 'Ren', + 'explicit' => 'Uteslutande', ], - 'show_notes_section_title' => 'Show notes', + 'show_notes_section_title' => 'Visa anteckningar', 'show_notes_section_subtitle' => - 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', - 'description' => 'Description', - 'description_footer' => 'Description footer', + 'Upp till 4000 tecken, var tydlig och koncis. Visa anteckningar hjälper potentiella lyssnare att hitta avsnittet.', + 'description' => 'Beskrivning', + 'description_footer' => 'Beskrivning sidfot', 'description_footer_hint' => - 'This text is added at the end of each episode description, it is a good place to input your social links for example.', - 'additional_files_section_title' => 'Additional files', + 'Denna text läggs till i slutet av varje avsnitt beskrivning, det är ett bra ställe att skriva in dina sociala länkar till exempel.', + 'additional_files_section_title' => 'Ytterligare filer', 'additional_files_section_subtitle' => - 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this episode about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real or fictional location', - 'transcript' => 'Transcript (subtitles / closed captions)', - 'transcript_hint' => 'Only .srt are allowed.', - 'transcript_download' => 'Download transcript', - 'transcript_file' => 'Transcript file (.srt)', - 'transcript_remote_url' => 'Remote url for transcript', - 'transcript_file_delete' => 'Delete transcript file', - 'chapters' => 'Chapters', - 'chapters_hint' => 'File must be in JSON Chapters format.', - 'chapters_download' => 'Download chapters', - 'chapters_file' => 'Chapters file', - 'chapters_remote_url' => 'Remote url for chapters file', - 'chapters_file_delete' => 'Delete chapters file', - 'advanced_section_title' => 'Advanced Parameters', + 'Dessa filer kan användas av andra plattformar för att ge bättre upplevelse till din publik. Se {podcastNamespaceLink} för mer information.', + 'location_section_title' => 'Plats', + 'location_section_subtitle' => 'Vilken plats handlar detta avsnitt om?', + 'location_name' => 'Platsnamn eller adress', + 'location_name_hint' => 'Detta kan vara en verklig eller fiktiv plats', + 'transcript' => 'Avskrift (undertexter / undertexter)', + 'transcript_hint' => 'Endast .srt är tillåtna.', + 'transcript_download' => 'Ladda ner avskrift', + 'transcript_file' => 'Avskrift av fil (.srt)', + 'transcript_remote_url' => 'Fjärr-URL för avskrift', + 'transcript_file_delete' => 'Ta bort avskrift', + 'chapters' => 'Kapitel', + 'chapters_hint' => 'Filen måste vara i JSON Kapitelformat.', + 'chapters_download' => 'Ladda ner kapitel', + 'chapters_file' => 'Kapitel fil', + 'chapters_remote_url' => 'Fjärr-URL för kapitelfil', + 'chapters_file_delete' => 'Ta bort kapitelfil', + 'advanced_section_title' => 'Avancerade parametrar', 'advanced_section_subtitle' => - 'If you need RSS tags that Castopod does not handle, set them here.', - 'custom_rss' => 'Custom RSS tags for the episode', - 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', - 'block' => 'Episode should be hidden from public catalogues', + 'Om du behöver RSS-taggar som Castopod inte hanterar, ställ in dem här.', + 'custom_rss' => 'Anpassade RSS-taggar för avsnittet', + 'custom_rss_hint' => 'Detta kommer att injiceras inom item taggen.', + 'block' => 'Avsnitt bör döljas från offentliga kataloger', 'block_hint' => - 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', - 'submit_create' => 'Create episode', - 'submit_edit' => 'Save episode', + 'Avsnitten visa eller dölja status: växla detta hindrar avsnitten från att visas i Apple Podcasts, Google Podcasts, och alla tredjepartsappar som drar program från dessa kataloger. (Inte garanterat)', + 'submit_create' => 'Skapa avsnitt', + 'submit_edit' => 'Spara avsnitt', ], 'publish_form' => [ - 'back_to_episode_dashboard' => 'Back to episode dashboard', - 'post' => 'Your announcement post', + 'back_to_episode_dashboard' => 'Tillbaka till avsnittets instrumentpanel', + 'post' => 'Ditt meddelande inlägg', 'post_hint' => - "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'publication_date' => 'Publication date', + "Skriv ett meddelande för att meddela publiceringen av ditt avsnitt. Meddelandet kommer att sändas till alla dina följare i fediverse och presenteras på din podcasts hemsida.", + 'message_placeholder' => 'Skriv ditt meddelande…', + 'publication_date' => 'Publiceringsdatum', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', - 'with_podcast' => 'Publish alongside podcast', + 'now' => 'Nu', + 'schedule' => 'Schemalägg', + 'with_podcast' => 'Publicera tillsammans med podcast', ], - 'scheduled_publication_date' => 'Scheduled publication date', - 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date' => 'Planerat publiceringsdatum', + 'scheduled_publication_date_clear' => 'Rensa publiceringsdatum', 'scheduled_publication_date_hint' => - 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit' => 'Publish', - 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', - 'message_warning' => 'You did not write a message for your announcement post!', - 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', - 'message_warning_submit' => 'Publish anyways', + 'Du kan schemalägga avsnittet genom att ställa in ett framtida publiceringsdatum. Detta fält måste formateras som ÅÅÅ-MM-DD HH:mm', + 'submit' => 'Publicera', + 'submit_edit' => 'Redigera publikation', + 'cancel_publication' => 'Avbryt publicering', + 'message_warning' => 'Du skrev inte ett meddelande för ditt tillkännagivande!', + 'message_warning_hint' => 'Att ha ett meddelande ökar socialt engagemang, vilket resulterar i en bättre synlighet för ditt avsnitt.', + 'message_warning_submit' => 'Publicera ändå', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Nytt publiceringsdatum', + 'new_publication_date_hint' => 'Måste vara inställd till ett tidigare datum.', + 'submit' => 'Redigera publiceringsdatum', ], 'unpublish_form' => [ 'disclaimer' => - "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", - 'understand' => 'I understand, I want to unpublish the episode', - 'submit' => 'Unpublish', + "Avpublicera avsnittet kommer att ta bort alla kommentarer och inlägg som är associerade med det och ta bort det från podcastens RSS-flöde.", + 'understand' => 'Jag förstår, jag vill avpublicera avsnittet', + 'submit' => 'Avpublicera', ], 'delete_form' => [ 'disclaimer' => - "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", - 'understand' => 'I understand, I want to delete the episode', - 'submit' => 'Delete', + "Borttagning av avsnittet kommer att ta bort alla mediefiler, kommentarer, videoklipp och ljudfiler som är associerade med det.", + 'understand' => 'Jag förstår, Jag vill ta bort avsnittet', + 'submit' => 'Radera', ], 'embed' => [ - 'title' => 'Embeddable player', + 'title' => 'Inbäddad spelare', 'label' => - 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', - 'clipboard_iframe' => 'Copy embeddable player to clipboard', - 'clipboard_url' => 'Copy address to clipboard', - 'dark' => 'Dark', - 'dark-transparent' => 'Dark transparent', - 'light' => 'Light', - 'light-transparent' => 'Light transparent', + 'Välj ett tema färg, kopiera den inbäddade spelaren till urklipp, sedan klistra in den på din webbplats.', + 'clipboard_iframe' => 'Kopiera inbäddbar spelare till urklipp', + 'clipboard_url' => 'Kopiera adress till urklipp', + 'dark' => 'Mörk', + 'dark-transparent' => 'Mörk transparent', + 'light' => 'Ljust', + 'light-transparent' => 'Ljus transparent', ], ]; diff --git a/modules/Admin/Language/sv/EpisodeNavigation.php b/modules/Admin/Language/sv/EpisodeNavigation.php index 1406e301..59f92a52 100644 --- a/modules/Admin/Language/sv/EpisodeNavigation.php +++ b/modules/Admin/Language/sv/EpisodeNavigation.php @@ -9,15 +9,15 @@ declare(strict_types=1); */ return [ - 'go_to_page' => 'View episode page', - 'dashboard' => 'Episode dashboard', - 'episode-view' => 'Home', - 'episode-edit' => 'Edit episode', - 'episode-persons-manage' => 'Manage persons', - 'embed-add' => 'Embeddable player', - 'clips' => 'Clips', - 'video-clips-list' => 'Video clips', - 'video-clips-create' => 'New video clip', - 'soundbites-list' => 'Soundbites', - 'soundbites-create' => 'New soundbite', + 'go_to_page' => 'Visa avsnittssida', + 'dashboard' => 'Avsnittets instrumentpanel', + 'episode-view' => 'Hem', + 'episode-edit' => 'Redigera avsnitt', + 'episode-persons-manage' => 'Hantera personer', + 'embed-add' => 'Inbäddad spelare', + 'clips' => 'Klipp', + 'video-clips-list' => 'Videoklipp', + 'video-clips-create' => 'Nytt videoklipp', + 'soundbites-list' => 'Ljudklipp', + 'soundbites-create' => 'Ny ljudbit', ]; diff --git a/modules/Admin/Language/sv/Fediverse.php b/modules/Admin/Language/sv/Fediverse.php index 0e4ca66d..18a1b209 100644 --- a/modules/Admin/Language/sv/Fediverse.php +++ b/modules/Admin/Language/sv/Fediverse.php @@ -10,23 +10,23 @@ declare(strict_types=1); return [ 'messages' => [ - 'actorNotFound' => 'The account could not be found!', - 'blockActorSuccess' => '{actor} has been blocked!', - 'unblockActorSuccess' => 'Actor has been unblocked!', - 'blockDomainSuccess' => '{domain} has been blocked!', - 'unblockDomainSuccess' => '{domain} has been unblocked!', + 'actorNotFound' => 'Det gick inte att hitta kontot!', + 'blockActorSuccess' => '{actor} har blockerats!', + 'unblockActorSuccess' => 'Aktören har blivit avblockerad!', + 'blockDomainSuccess' => '{domain} har blockerats!', + 'unblockDomainSuccess' => '{domain} har blivit avblockerad!', ], - 'blocked_actors' => 'Blocked accounts', - 'blocked_domains' => 'Blocked domains', + 'blocked_actors' => 'Blockerade konton', + 'blocked_domains' => 'Blockerade domäner', 'block_lists_form' => [ - 'handle' => 'Account handle', - 'handle_hint' => 'Input @username@domain account.', - 'domain' => 'Domain name', - 'submit' => 'Block!', + 'handle' => 'Hantera konto', + 'handle_hint' => 'Skriv in @användarnamn@domänkonto.', + 'domain' => 'Domännamn', + 'submit' => 'Blockera!', ], 'list' => [ - 'actor' => 'Account', - 'domain' => 'Domain name', - 'unblock' => 'Unblock', + 'actor' => 'Konto', + 'domain' => 'Domännamn', + 'unblock' => 'Avblockera', ], ]; diff --git a/modules/Admin/Language/sv/Home.php b/modules/Admin/Language/sv/Home.php index 3ff4c04d..493b5d18 100644 --- a/modules/Admin/Language/sv/Home.php +++ b/modules/Admin/Language/sv/Home.php @@ -9,6 +9,6 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found', + 'all_podcasts' => 'Alla podcasts', + 'no_podcast' => 'Ingen podcast hittades', ]; diff --git a/modules/Admin/Language/sv/Install.php b/modules/Admin/Language/sv/Install.php index 36e373a2..9e7de812 100644 --- a/modules/Admin/Language/sv/Install.php +++ b/modules/Admin/Language/sv/Install.php @@ -9,53 +9,53 @@ declare(strict_types=1); */ return [ - 'manual_config' => 'Manual configuration', + 'manual_config' => 'Manuell konfiguration', 'manual_config_subtitle' => - 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'Skapa en \'.env\' fil med dina inställningar och uppdatera sidan för att fortsätta installationen.', 'form' => [ - 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', - 'media_base_url' => 'Media base URL', + 'instance_config' => 'Konfiguration av instans', + 'hostname' => 'Servernamn', + 'media_base_url' => 'Bas-URL för media', 'media_base_url_hint' => - 'If you use a CDN and/or an external analytics service, you may set them here.', + 'Om du använder en CDN och/eller en extern analystjänst kan du ställa in dem här.', 'admin_gateway' => 'Admin gateway', 'admin_gateway_hint' => - 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'Rutten för att komma åt adminområdet (t.ex. https://example.com/cp-admin). Det är som standard inställt som cp-admin, vi rekommenderar att du ändrar det av säkerhetsskäl.', 'auth_gateway' => 'Auth gateway', 'auth_gateway_hint' => - 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', + 'Rutten för att komma åt autentiseringssidorna (t.ex. https://example.com/cp-auth). Den är som standard inställd som cp-auth, vi rekommenderar att du ändrar den av säkerhetsskäl.', + 'database_config' => 'Databas konfiguration', 'database_config_hint' => - 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', + 'Castopod måste ansluta till din MySQL (eller MariaDB) databas. Om du inte har dessa nödvändiga uppgifter, kontakta din serveradministratör.', + 'db_hostname' => 'Databasens värdnamn', + 'db_name' => 'Databasnamn', + 'db_username' => 'Användarnamn till databasen', + 'db_password' => 'Databasens lösenord', + 'db_prefix' => 'Databas prefix', 'db_prefix_hint' => - "The prefix of the Castopod table names, leave as is if you don't know what it means.", - 'cache_config' => 'Cache configuration', + "Prefixet för Castopod tabellnamn, lämna som om du inte vet vad det betyder.", + 'cache_config' => 'Cache-konfiguration', 'cache_config_hint' => - 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'Välj önskad cachehanterare. Lämna det som standardvärde om du inte har någon aning om vad det innebär.', 'cache_handler' => 'Cache handler', 'cacheHandlerOptions' => [ - 'file' => 'File', + 'file' => 'Fil', 'redis' => 'Redis', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', - 'create_superadmin' => 'Create your superadmin account', - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', + 'next' => 'Nästa', + 'submit' => 'Slutför installationen', + 'create_superadmin' => 'Skapa ditt superadministratörskonto', + 'email' => 'Epost', + 'username' => 'Användarnamn', + 'password' => 'Lösenord', ], 'messages' => [ 'createSuperAdminSuccess' => - 'Your superadmin account has been created successfully. Login to start podcasting!', + 'Ditt superadministratörskonto har skapats. Logga in för att starta podcasting!', 'databaseConnectError' => - 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'Castopod kunde inte ansluta till din databas. Redigera din databaskonfiguration och försök igen.', 'writeError' => - "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + "Kunde inte skapa/skriva `.env`-filen. Du måste skapa den manuellt genom att följa filmallen `.env.exempel` i Castopod-paketet.", ], ]; diff --git a/modules/Admin/Language/sv/Navigation.php b/modules/Admin/Language/sv/Navigation.php index 610f1434..ea1f6de5 100644 --- a/modules/Admin/Language/sv/Navigation.php +++ b/modules/Admin/Language/sv/Navigation.php @@ -9,34 +9,34 @@ declare(strict_types=1); */ return [ - 'toggle_sidebar' => 'Toggle sidebar', - 'go_to_website' => 'Go to website', - 'go_to_admin' => 'Go to admin', - 'dashboard' => 'Dashboard', - 'admin' => 'Home', + 'toggle_sidebar' => 'Växla sidofält', + 'go_to_website' => 'Gå till webbsidan', + 'go_to_admin' => 'Gå till admin', + 'dashboard' => 'Översiktspanel', + 'admin' => 'Hem', 'podcasts' => 'Podcasts', - 'podcast-list' => 'All podcasts', - 'podcast-create' => 'New podcast', - 'podcast-import' => 'Import a podcast', - 'persons' => 'Persons', - 'person-list' => 'All persons', - 'person-create' => 'New person', + 'podcast-list' => 'Alla podcasts', + 'podcast-create' => 'Ny podcast', + 'podcast-import' => 'Importera en podcast', + 'persons' => 'Personer', + 'person-list' => 'Alla personer', + 'person-create' => 'Ny person', 'fediverse' => 'Fediverse', - 'fediverse-blocked-actors' => 'Blocked accounts', - 'fediverse-blocked-domains' => 'Blocked domains', - 'users' => 'Users', - 'user-list' => 'All users', - 'user-create' => 'New user', - 'pages' => 'Pages', - 'page-list' => 'All pages', - 'page-create' => 'New Page', - 'settings' => 'Settings', - 'settings-general' => 'General', - 'settings-theme' => 'Theme', - 'about' => 'About', + 'fediverse-blocked-actors' => 'Blockerade konton', + 'fediverse-blocked-domains' => 'Blockerade domäner', + 'users' => 'Användare', + 'user-list' => 'Alla användare', + 'user-create' => 'Ny användare', + 'pages' => 'Sidor', + 'page-list' => 'Alla sidor', + 'page-create' => 'Ny sida', + 'settings' => 'Inställningar', + 'settings-general' => 'Allmänt', + 'settings-theme' => 'Tema', + 'about' => 'Om', 'account' => [ - 'my-account' => 'My account', - 'change-password' => 'Change password', - 'logout' => 'Logout', + 'my-account' => 'Mitt konto', + 'change-password' => 'Ändra lösenord', + 'logout' => 'Logga ut', ], ]; diff --git a/modules/Admin/Language/sv/Notifications.php b/modules/Admin/Language/sv/Notifications.php index 2b139d51..cacbb79a 100644 --- a/modules/Admin/Language/sv/Notifications.php +++ b/modules/Admin/Language/sv/Notifications.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'Notifications', - 'reply' => '{actor_username} replied to your post', - 'favourite' => '{actor_username} favourited your post', - 'reblog' => '{actor_username} shared your post', - 'follow' => '{actor_username} started following you', - 'no_notifications' => 'No notifications', - 'mark_all_as_read' => 'Mark all as read', + 'title' => 'Aviseringar', + 'reply' => '{actor_username} svarade på ditt inlägg', + 'favourite' => '{actor_username} favoriterade ditt inlägg', + 'reblog' => '{actor_username} delade ditt inlägg', + 'follow' => '{actor_username} började följa dig', + 'no_notifications' => 'Inga aviseringar', + 'mark_all_as_read' => 'Markera alla som lästa', ]; diff --git a/modules/Admin/Language/sv/Page.php b/modules/Admin/Language/sv/Page.php index b6f49de5..89f48754 100644 --- a/modules/Admin/Language/sv/Page.php +++ b/modules/Admin/Language/sv/Page.php @@ -9,22 +9,22 @@ declare(strict_types=1); */ return [ - 'back_to_home' => 'Back to home', - 'page' => 'Page', - 'all_pages' => 'All pages', - 'create' => 'New page', - 'go_to_page' => 'Go to page', - 'edit' => 'Edit page', - 'delete' => 'Delete page', + 'back_to_home' => 'Tillbaka till startsidan', + 'page' => 'Sida', + 'all_pages' => 'Alla sidor', + 'create' => 'Ny sida', + 'go_to_page' => 'Gå till sida', + 'edit' => 'Redigera sida', + 'delete' => 'Ta bort sida', 'form' => [ - 'title' => 'Title', - 'permalink' => 'Permalink', - 'content' => 'Content', - 'submit_create' => 'Create page', - 'submit_edit' => 'Save', + 'title' => 'Rubrik', + 'permalink' => 'Permalänk', + 'content' => 'Innehåll', + 'submit_create' => 'Skapa sida', + 'submit_edit' => 'Spara', ], 'messages' => [ - 'createSuccess' => 'The page “{pageTitle}” was created successfully!', - 'editSuccess' => 'The page was successfully updated!', + 'createSuccess' => 'Sidan ”{pageTitle}” skapades framgångsrikt!', + 'editSuccess' => 'Sidan har uppdaterats!', ], ]; diff --git a/modules/Admin/Language/sv/Pager.php b/modules/Admin/Language/sv/Pager.php index e25ee638..32a18e90 100644 --- a/modules/Admin/Language/sv/Pager.php +++ b/modules/Admin/Language/sv/Pager.php @@ -9,13 +9,13 @@ declare(strict_types=1); */ return [ - 'pageNavigation' => 'Page navigation', - 'first' => 'First', - 'previous' => 'Previous', - 'next' => 'Next', - 'last' => 'Last', - 'older' => 'Older', - 'newer' => 'Newer', - 'invalidTemplate' => '{0} is not a valid Pager template.', - 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', + 'pageNavigation' => 'Sidnavigering', + 'first' => 'Första', + 'previous' => 'Föregående', + 'next' => 'Nästa', + 'last' => 'Sista', + 'older' => 'Äldre', + 'newer' => 'Nyare', + 'invalidTemplate' => '{0} är inte en giltig sidmall.', + 'invalidPaginationGroup' => '{0} är inte en giltig sidnumreringsgrupp.', ]; diff --git a/modules/Admin/Language/sv/Person.php b/modules/Admin/Language/sv/Person.php index a652be9f..f5007527 100644 --- a/modules/Admin/Language/sv/Person.php +++ b/modules/Admin/Language/sv/Person.php @@ -9,57 +9,57 @@ declare(strict_types=1); */ return [ - 'persons' => 'Persons', - 'all_persons' => 'All persons', - 'no_person' => 'Nobody found!', - 'create' => 'Create a person', - 'view' => 'View person', - 'edit' => 'Edit person', - 'delete' => 'Delete person', + 'persons' => 'Personer', + 'all_persons' => 'Alla personer', + 'no_person' => 'Ingen hittades!', + 'create' => 'Skapa en person', + 'view' => 'Visa person', + 'edit' => 'Redigera person', + 'delete' => 'Ta bort person', 'messages' => [ - 'createSuccess' => 'Person has been successfully created!', - 'editSuccess' => 'Person has been successfully updated!', - 'deleteSuccess' => 'Person has been removed!', + 'createSuccess' => 'Person har skapats framgångsrikt!', + 'editSuccess' => 'Person har uppdaterats!', + 'deleteSuccess' => 'Person har tagits bort!', ], 'form' => [ 'avatar' => 'Avatar', 'avatar_size_hint' => - 'Avatar must be squared and at least 400px wide and tall.', - 'full_name' => 'Full name', - 'full_name_hint' => 'This is the full name or alias of the person.', - 'unique_name' => 'Unique name', - 'unique_name_hint' => 'Used for URLs', + 'Avatar måste vara kvadratisk och minst 400px bred och hög.', + 'full_name' => 'Fullständigt namn', + 'full_name_hint' => 'Detta är personens fullständiga namn eller alias.', + 'unique_name' => 'Unikt namn', + 'unique_name_hint' => 'Används för URL: er', 'information_url' => 'Information URL', 'information_url_hint' => - 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', - 'submit_create' => 'Create person', - 'submit_edit' => 'Save person', + 'Url till en relevant resurs av information om personen, såsom en hemsida eller en tredje parts profilplattform.', + 'submit_create' => 'Skapa person', + 'submit_edit' => 'Spara person', ], 'podcast_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this podcast', - 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'title' => 'Hantera personer', + 'add_section_title' => 'Lägg till personer till denna podcast', + 'add_section_subtitle' => 'Du kan välja flera personer och roller.', + 'persons' => 'Personer', 'persons_hint' => - 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'Du kan välja en eller flera personer med samma roller. Du måste skapa personerna först.', + 'roles' => 'Roller', 'roles_hint' => - 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'Du kan välja ingen, en eller flera roller för en person.', + 'submit_add' => 'Lägg till person(er)', + 'remove' => 'Ta bort', ], 'episode_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this episode', - 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'title' => 'Hantera personer', + 'add_section_title' => 'Lägg till personer till detta avsnitt', + 'add_section_subtitle' => 'Du kan välja flera personer och roller.', + 'persons' => 'Personer', 'persons_hint' => - 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'Du kan välja en eller flera personer med samma roller. Du måste skapa personerna först.', + 'roles' => 'Roller', 'roles_hint' => - 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'Du kan välja ingen, en eller flera roller för en person.', + 'submit_add' => 'Lägg till person(er)', + 'remove' => 'Ta bort', ], - 'credits' => 'Credits', + 'credits' => 'Tack till', ]; diff --git a/modules/Admin/Language/sv/Platforms.php b/modules/Admin/Language/sv/Platforms.php index ab17d599..1ab090f9 100644 --- a/modules/Admin/Language/sv/Platforms.php +++ b/modules/Admin/Language/sv/Platforms.php @@ -9,22 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', - 'home_url' => 'Go to {platformName} website', - 'submit_url' => 'Submit your podcast on {platformName}', - 'visible' => 'Display in podcast homepage?', - 'on_embed' => 'Display on embeddable player?', - 'remove' => 'Remove {platformName}', - 'submit' => 'Save', + 'title' => 'Plattformar', + 'home_url' => 'Gå till {platformName} webbplats', + 'submit_url' => 'Skicka din podcast den {platformName}', + 'visible' => 'Visa på podcastens hemsida?', + 'on_embed' => 'Visa på inbäddbar spelare?', + 'remove' => 'Ta bort {platformName}', + 'submit' => 'Spara', 'messages' => [ - 'updateSuccess' => 'Platform links have been successfully updated!', - 'removeLinkSuccess' => 'The platform link has been removed.', + 'updateSuccess' => 'Plattformslänkarna har uppdaterats!', + 'removeLinkSuccess' => 'Plattformslänken har tagits bort.', 'removeLinkError' => - 'The platform link could not be removed. Try again.', + 'Plattformslänken kunde inte tas bort. Försök igen.', ], 'description' => [ - 'podcasting' => 'The podcast ID on this platform', - 'social' => 'The podcast account ID on this platform', - 'funding' => 'Call to action message', + 'podcasting' => 'Podcast ID på denna plattform', + 'social' => 'Den podcast konto ID på denna plattform', + 'funding' => 'Ring till åtgärdsmeddelande', ], ]; diff --git a/modules/Admin/Language/sv/Podcast.php b/modules/Admin/Language/sv/Podcast.php index 426b763b..6e817ffe 100644 --- a/modules/Admin/Language/sv/Podcast.php +++ b/modules/Admin/Language/sv/Podcast.php @@ -9,302 +9,302 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found!', - 'create' => 'Create podcast', - 'import' => 'Import podcast', - 'new_episode' => 'New Episode', - 'view' => 'View podcast', - 'edit' => 'Edit podcast', - 'publish' => 'Publish podcast', - 'publish_edit' => 'Edit publication', - 'delete' => 'Delete podcast', - 'see_episodes' => 'See episodes', - 'see_contributors' => 'See contributors', - 'go_to_page' => 'Go to page', - 'latest_episodes' => 'Latest episodes', - 'see_all_episodes' => 'See all episodes', - 'draft' => 'Draft', + 'all_podcasts' => 'Alla podcasts', + 'no_podcast' => 'Ingen podcast hittades!', + 'create' => 'Skapa podcast', + 'import' => 'Importera podcast', + 'new_episode' => 'Nytt avsnitt', + 'view' => 'Visa podcast', + 'edit' => 'Redigera podcast', + 'publish' => 'Publicera podcasten', + 'publish_edit' => 'Redigera publikation', + 'delete' => 'Ta bort podcast', + 'see_episodes' => 'Se avsnitt', + 'see_contributors' => 'Se bidragsgivare', + 'go_to_page' => 'Gå till sida', + 'latest_episodes' => 'Senaste avsnitt', + 'see_all_episodes' => 'Se alla avsnitt', + 'draft' => 'Utkast', 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', - 'editSuccess' => 'Podcast has been successfully updated!', - 'importSuccess' => 'Podcast has been successfully imported!', - 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', - 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, - cover {cover} + 'createSuccess' => 'Podcast har skapats!', + 'editSuccess' => 'Podcasten har uppdaterats!', + 'importSuccess' => 'Podcasten har importerats!', + 'deleteSuccess' => 'Podcast @{podcast_handle} har raderats!', + 'deletePodcastMediaError' => 'Kunde inte ta bort podcast {type, select, + cover {omslag} banner {banner} other {media} }.', - 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + 'deleteEpisodeMediaError' => 'Misslyckades att ta bort avsnitt {episode_slug} {type, select, transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} + chapters {kapitel} + image {omslag} + audio {ljud} other {media} }.', - 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', - 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, - one {# episode was} - other {# episodes were} - } added to the podcast!', - 'podcastFeedUpToDate' => 'Podcast is already up to date.', - 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', - 'publishError' => 'This podcast is either already published or scheduled for publication.', - 'publishEditError' => 'This podcast is not scheduled for publication.', - 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', - 'scheduleDateError' => 'Schedule date must be set!', + 'deletePodcastMediaFolderError' => 'Det gick inte att ta bort podcast-mediamappen {folder_path}. Du kan manuellt ta bort den från disken.', + 'podcastFeedUpdateSuccess' => 'Lyckad uppdatering: {number_of_new_episodes, plural, + one {# episoden var} + other {# episoder var} + } lades till i podcasten!', + 'podcastFeedUpToDate' => 'Podcasten är redan uppdaterad.', + 'podcastNotImported' => 'Podcast kunde inte uppdateras eftersom den inte importerades.', + 'publishError' => 'Denna podcast är antingen redan publicerad eller schemalagd för publicering.', + 'publishEditError' => 'Denna podcast är inte schemalagd för publicering.', + 'publishCancelSuccess' => 'Podcast publicering avbröts!', + 'scheduleDateError' => 'Schemaläggningsdatum måste anges!', ], 'form' => [ - 'identity_section_title' => 'Podcast identity', - 'identity_section_subtitle' => 'These fields allow you to get noticed.', - 'cover' => 'Podcast cover', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'identity_section_title' => 'Podcast identitet', + 'identity_section_subtitle' => 'Dessa fält gör att du kan bli uppmärksammad.', + 'cover' => 'Podcast omslag', + 'cover_size_hint' => 'Omslaget måste vara fyrkantigt och minst 1400px brett och högt.', 'banner' => 'Podcast banner', - 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', - 'banner_delete' => 'Delete podcast banner', - 'title' => 'Title', - 'handle' => 'Handle', + 'banner_size_hint' => 'Banner måste ha ett 3:1-förhållande och vara minst 1500px bred.', + 'banner_delete' => 'Ta bort podcast banner', + 'title' => 'Rubrik', + 'handle' => 'Hantera', 'handle_hint' => - 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'Används för att identifiera podcasten. Versaler, gemener, siffror och understrykningar accepteras.', 'type' => [ - 'label' => 'Type', + 'label' => 'Typ', 'episodic' => 'Episodic', - 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', - 'serial' => 'Serial', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + 'episodic_hint' => 'Om avsnitt är avsedda att konsumeras utan någon specifik ordning. Nyaste avsnitt kommer att presenteras först.', + 'serial' => 'Serie', + 'serial_hint' => 'Om avsnitt är avsedda att konsumeras i sekventiell ordning. De äldsta avsnitten kommer att presenteras först.', ], - 'description' => 'Description', - 'classification_section_title' => 'Classification', + 'description' => 'Beskrivning', + 'classification_section_title' => 'Klassificering', 'classification_section_subtitle' => - 'These fields will impact your audience and competition.', - 'language' => 'Language', - 'category' => 'Category', - 'category_placeholder' => 'Select a category…', - 'other_categories' => 'Other categories', + 'Dessa fält kommer att påverka din publik och konkurrens.', + 'language' => 'Språk', + 'category' => 'Kategori', + 'category_placeholder' => 'Välj en kategori…', + 'other_categories' => 'Andra kategorier', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does it contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'label' => 'Föräldrarådgivande', + 'hint' => 'Innehåller det olämpligt innehåll?', + 'undefined' => 'odefinierad', + 'clean' => 'Ren', + 'explicit' => 'Uteslutande', ], - 'author_section_title' => 'Author', - 'author_section_subtitle' => 'Who is managing the podcast?', - 'owner_name' => 'Owner name', + 'author_section_title' => 'Författare', + 'author_section_subtitle' => 'Vem hanterar podcasten?', + 'owner_name' => 'Ägarens namn', 'owner_name_hint' => - 'For administrative use only. Visible in the public RSS feed.', - 'owner_email' => 'Owner email', + 'Endast för administrativt bruk. Synlig i det offentliga RSS-flödet.', + 'owner_email' => 'Ägarens e-post', 'owner_email_hint' => - 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', - 'publisher' => 'Publisher', + 'Kommer att användas av de flesta plattformar för att verifiera podcast-ägandet. Synlig i det offentliga RSS-flödet.', + 'publisher' => 'Utgivare', 'publisher_hint' => - 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'Gruppen som ansvarar för att skapa showen. Ofta hänvisar man till moderbolaget eller nätverket av en podcast. Detta fält är ibland märkt som "Författare".', 'copyright' => 'Copyright', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this podcast about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real place or fictional', - 'monetization_section_title' => 'Monetization', + 'location_section_title' => 'Plats', + 'location_section_subtitle' => 'Vilken plats handlar denna podcast om?', + 'location_name' => 'Platsnamn eller adress', + 'location_name_hint' => 'Detta kan vara en riktig plats eller fiktiv', + 'monetization_section_title' => 'Inkomster', 'monetization_section_subtitle' => - 'Earn money thanks to your audience.', + 'Tjäna pengar tack vare din publik.', 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', - 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'premium_by_default' => 'Avsnitt måste anges som premium som standard', + 'premium_by_default_hint' => 'Podcast avsnitt kommer att markeras som premium som standard. Du kan fortfarande välja att ställa in några avsnitt, trailers eller bonusar som offentliga.', + 'payment_pointer' => 'Betalning pekare för Web Monetization', 'payment_pointer_hint' => - 'This is your where you will receive money thanks to Web Monetization', - 'advanced_section_title' => 'Advanced Parameters', + 'Detta är din där du kommer att få pengar tack vare Web Monetization', + 'advanced_section_title' => 'Avancerade parametrar', 'advanced_section_subtitle' => - 'If you need RSS tags that Castopod does not handle, set them here.', - 'custom_rss' => 'Custom RSS tags for the podcast', - 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', - 'new_feed_url' => 'New feed URL', - 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', - 'old_feed_url' => 'Old feed URL', - 'update_feed' => 'Update feed', - 'update_feed_tip' => 'Import this podcast\'s latest episodes', - 'partnership' => 'Partnership', + 'Om du behöver RSS-taggar som Castopod inte hanterar, ställ in dem här.', + 'custom_rss' => 'Anpassade RSS-taggar för podcasten', + 'custom_rss_hint' => 'Detta kommer att injiceras i kanal taggen.', + 'new_feed_url' => 'Ny flödes-URL', + 'new_feed_url_hint' => 'Använd detta fält när du flyttar till en annan domän eller podcast webbhotell. Som standard är värdet inställt på nuvarande RSS-URL om podcasten importeras.', + 'old_feed_url' => 'Gammal flödes-URL', + 'update_feed' => 'Uppdatera flöde', + 'update_feed_tip' => 'Importera den här podcastens senaste avsnitt', + 'partnership' => 'Samarbete', 'partner_id' => 'ID', - 'partner_link_url' => 'Link URL', - 'partner_image_url' => 'Image URL', - 'partner_id_hint' => 'Your own partner ID', - 'partner_link_url_hint' => 'The generic partner link address', - 'partner_image_url_hint' => 'The generic partner image address', + 'partner_link_url' => 'Länk url', + 'partner_image_url' => 'Bild-URL', + 'partner_id_hint' => 'Din egen partner ID', + 'partner_link_url_hint' => 'Den generiska partnerns länkadress', + 'partner_image_url_hint' => 'Den generiska partnerns bildadress', 'status_section_title' => 'Status', - 'block' => 'Podcast should be hidden from public catalogues', + 'block' => 'Podcast bör döljas från offentliga kataloger', 'block_hint' => - 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', - 'complete' => 'Podcast will not be having new episodes', - 'lock' => 'Prevent podcast from being copied', + 'Podcasten visar eller dölj status: att växla på detta hindrar hela podcasten från att visas i Apple Podcasts, Google Podcasts, och alla tredjepartsappar som drar program från dessa kataloger. (Inte garanterat)', + 'complete' => 'Podcast kommer inte att ha nya avsnitt', + 'lock' => 'Förhindra podcast från att kopieras', 'lock_hint' => - 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', - 'submit_create' => 'Create podcast', - 'submit_edit' => 'Save podcast', + 'Syftet är att berätta för andra podcast-plattformar om de får importera detta flöde. Ett värde av ja innebär att varje försök att importera detta flöde till en ny plattform bör avvisas.', + 'submit_create' => 'Skapa podcast', + 'submit_edit' => 'Spara podcast', ], 'category_options' => [ - 'uncategorized' => 'uncategorized', - 'arts' => 'Arts', - 'business' => 'Business', - 'comedy' => 'Comedy', - 'education' => 'Education', - 'fiction' => 'Fiction', - 'government' => 'Government', - 'health_and_fitness' => 'Health & Fitness', - 'history' => 'History', - 'kids_and_family' => 'Kids & Family', - 'leisure' => 'Leisure', - 'music' => 'Music', - 'news' => 'News', - 'religion_and_spirituality' => 'Religion & Spirituality', - 'science' => 'Science', - 'society_and_culture' => 'Society & Culture', - 'sports' => 'Sports', - 'technology' => 'Technology', - 'true_crime' => 'True Crime', - 'tv_and_film' => 'TV & Film', - 'books' => 'Books', + 'uncategorized' => 'okategoriserad', + 'arts' => 'Konst', + 'business' => 'Företagande', + 'comedy' => 'Komedi', + 'education' => 'Utbildning', + 'fiction' => 'Fiktion', + 'government' => 'Myndighet', + 'health_and_fitness' => 'Hälsa & Träning', + 'history' => 'Historia', + 'kids_and_family' => 'Barn & Familj', + 'leisure' => 'Fritid', + 'music' => 'Musik', + 'news' => 'Nyheter', + 'religion_and_spirituality' => 'Religion & Andlighet', + 'science' => 'Vetenskap', + 'society_and_culture' => 'Samhälle & Kultur', + 'sports' => 'Sport', + 'technology' => 'Teknologi', + 'true_crime' => 'Sann brottslighet', + 'tv_and_film' => 'TV & Film', + 'books' => 'Böcker', 'design' => 'Design', - 'fashion_and_beauty' => 'Fashion & Beauty', - 'food' => 'Food', - 'performing_arts' => 'Performing Arts', - 'visual_arts' => 'Visual Arts', - 'careers' => 'Careers', - 'entrepreneurship' => 'Entrepreneurship', - 'investing' => 'Investing', + 'fashion_and_beauty' => 'Mode & Skönhet', + 'food' => 'Mat', + 'performing_arts' => 'Scenkonst', + 'visual_arts' => 'Visuell konst', + 'careers' => 'Karriärer', + 'entrepreneurship' => 'Entreprenörskap', + 'investing' => 'Investering', 'management' => 'Management', - 'marketing' => 'Marketing', - 'non_profit' => 'Non-Profit', - 'comedy_interviews' => 'Comedy Interviews', - 'improv' => 'Improv', + 'marketing' => 'Marknadsföring', + 'non_profit' => 'Ideell organisation', + 'comedy_interviews' => 'Komedi Intervjuer', + 'improv' => 'Förbättra', 'stand_up' => 'Stand-Up', - 'courses' => 'Courses', - 'how_to' => 'How To', - 'language_learning' => 'Language Learning', - 'self_improvement' => 'Self-Improvement', - 'comedy_fiction' => 'Comedy Fiction', + 'courses' => 'Kurser', + 'how_to' => 'Så funkar det', + 'language_learning' => 'Språkinlärning', + 'self_improvement' => 'Självförbättring', + 'comedy_fiction' => 'Komedi fiktion', 'drama' => 'Drama', 'science_fiction' => 'Science Fiction', - 'alternative_health' => 'Alternative Health', - 'fitness' => 'Fitness', - 'medicine' => 'Medicine', - 'mental_health' => 'Mental Health', - 'nutrition' => 'Nutrition', - 'sexuality' => 'Sexuality', - 'education_for_kids' => 'Education for Kids', - 'parenting' => 'Parenting', - 'pets_and_animals' => 'Pets & Animals', - 'stories_for_kids' => 'Stories for Kids', - 'animation_and_manga' => 'Animation & Manga', - 'automotive' => 'Automotive', - 'aviation' => 'Aviation', - 'crafts' => 'Crafts', - 'games' => 'Games', - 'hobbies' => 'Hobbies', - 'home_and_garden' => 'Home & Garden', - 'video_games' => 'Video Games', - 'music_commentary' => 'Music Commentary', - 'music_history' => 'Music History', - 'music_interviews' => 'Music Interviews', - 'business_news' => 'Business News', - 'daily_news' => 'Daily News', - 'entertainment_news' => 'Entertainment News', - 'news_commentary' => 'News Commentary', - 'politics' => 'Politics', - 'sports_news' => 'Sports News', - 'tech_news' => 'Tech News', - 'buddhism' => 'Buddhism', - 'christianity' => 'Christianity', + 'alternative_health' => 'Alternativ Hälsa', + 'fitness' => 'Träning', + 'medicine' => 'Medicin', + 'mental_health' => 'Mental hälsa', + 'nutrition' => 'Näring', + 'sexuality' => 'Sexualitet', + 'education_for_kids' => 'Utbildning för barn', + 'parenting' => 'Föräldraskap', + 'pets_and_animals' => 'Husdjur & djur', + 'stories_for_kids' => 'Berättelser för barn', + 'animation_and_manga' => 'Animering & Manga', + 'automotive' => 'Fordon', + 'aviation' => 'Luftfart', + 'crafts' => 'Hantverk', + 'games' => 'Spel', + 'hobbies' => 'Fritidsintressen', + 'home_and_garden' => 'Hem och trädgård', + 'video_games' => 'Videospel', + 'music_commentary' => 'Kommentar från musik', + 'music_history' => 'Musikhistorik', + 'music_interviews' => 'Musikintervjuer', + 'business_news' => 'Företagsnyheter', + 'daily_news' => 'Dagliga nyheter', + 'entertainment_news' => 'Underhållningsnyheter', + 'news_commentary' => 'Nyheter Kommentar', + 'politics' => 'Politik', + 'sports_news' => 'Sportnyheter', + 'tech_news' => 'Tekniknyheter', + 'buddhism' => 'Budism', + 'christianity' => 'Kristendom', 'hinduism' => 'Hinduism', 'islam' => 'Islam', - 'judaism' => 'Judaism', + 'judaism' => 'Judendom', 'religion' => 'Religion', - 'spirituality' => 'Spirituality', - 'astronomy' => 'Astronomy', - 'chemistry' => 'Chemistry', - 'earth_sciences' => 'Earth Sciences', - 'life_sciences' => 'Life Sciences', - 'mathematics' => 'Mathematics', - 'natural_sciences' => 'Natural Sciences', - 'nature' => 'Nature', - 'physics' => 'Physics', - 'social_sciences' => 'Social Sciences', - 'documentary' => 'Documentary', - 'personal_journals' => 'Personal Journals', - 'philosophy' => 'Philosophy', - 'places_and_travel' => 'Places & Travel', - 'relationships' => 'Relationships', + 'spirituality' => 'Andlighet', + 'astronomy' => 'Astronomi', + 'chemistry' => 'Kemi', + 'earth_sciences' => 'Jordvetenskap', + 'life_sciences' => 'Livsvetenskaper', + 'mathematics' => 'Matematik', + 'natural_sciences' => 'Naturvetenskap', + 'nature' => 'Natur', + 'physics' => 'Fysik', + 'social_sciences' => 'Samhällsvetenskap', + 'documentary' => 'Dokumentär', + 'personal_journals' => 'Personliga tidsskrifter', + 'philosophy' => 'Filosofi', + 'places_and_travel' => 'Resor & Resmål', + 'relationships' => 'Relationer', 'baseball' => 'Baseball', - 'basketball' => 'Basketball', - 'cricket' => 'Cricket', - 'fantasy_sports' => 'Fantasy Sports', - 'football' => 'Football', + 'basketball' => 'Basket', + 'cricket' => 'Kricket', + 'fantasy_sports' => 'Fantasy Sport', + 'football' => 'Fotboll', 'golf' => 'Golf', 'hockey' => 'Hockey', 'rugby' => 'Rugby', - 'running' => 'Running', - 'soccer' => 'Soccer', - 'swimming' => 'Swimming', + 'running' => 'Löpning', + 'soccer' => 'Fotboll', + 'swimming' => 'Simning', 'tennis' => 'Tennis', - 'volleyball' => 'Volleyball', - 'wilderness' => 'Wilderness', - 'wrestling' => 'Wrestling', - 'after_shows' => 'After Shows', - 'film_history' => 'Film History', - 'film_interviews' => 'Film Interviews', - 'film_reviews' => 'Film Reviews', - 'tv_reviews' => 'TV Reviews', + 'volleyball' => 'Volleyboll', + 'wilderness' => 'Vildmark', + 'wrestling' => 'Brottning', + 'after_shows' => 'Efter serier', + 'film_history' => 'Film Historik', + 'film_interviews' => 'Filmintervjuer', + 'film_reviews' => 'Filmrecensioner', + 'tv_reviews' => 'TV recensioner', ], 'publish_form' => [ - 'back_to_podcast_dashboard' => 'Back to podcast dashboard', - 'post' => 'Your announcement post', + 'back_to_podcast_dashboard' => 'Tillbaka till podcast instrumentpanel', + 'post' => 'Ditt meddelande inlägg', 'post_hint' => - "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'submit' => 'Publish', - 'publication_date' => 'Publication date', + "Skriv ett meddelande för att meddela publiceringen av din podcast. Meddelandet kommer att visas på din podcasts hemsida.", + 'message_placeholder' => 'Skriv ditt meddelande…', + 'submit' => 'Publicera', + 'publication_date' => 'Publiceringsdatum', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', + 'now' => 'Nu', + 'schedule' => 'Schemalägg', ], - 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date' => 'Planerat publiceringsdatum', 'scheduled_publication_date_hint' => - 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', - 'message_warning' => 'You did not write a message for your announcement post!', - 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', - 'message_warning_submit' => 'Publish anyway', + 'Du kan schemalägga podcast-utgåvan genom att ställa in ett framtida publiceringsdatum. Detta fält måste formateras som YYYY-MM-DD HH:mm', + 'submit_edit' => 'Redigera publikation', + 'cancel_publication' => 'Avbryt publicering', + 'message_warning' => 'Du skrev inte ett meddelande för ditt tillkännagivande!', + 'message_warning_hint' => 'Att ha ett meddelande ökar socialt engagemang, vilket resulterar i en bättre synlighet för din podcast.', + 'message_warning_submit' => 'Publicera ändå', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', - 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + 'draft_mode' => 'utkastläge', + 'not_published' => 'Denna podcast är ännu inte publicerad.', + 'scheduled' => 'Denna podcast är schemalagd för publicering på {publication_date}.', ], 'delete_form' => [ 'disclaimer' => - "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", - 'understand' => 'I understand, I want the podcast to be permanently deleted', - 'submit' => 'Delete', + "Ta bort podcasten kommer att ta bort alla avsnitt, mediefiler, inlägg och analytics i samband med det. Denna åtgärd är oåterkallelig, du kommer inte att kunna hämta dem efteråt.", + 'understand' => 'Jag förstår, jag vill att podcasten ska raderas permanent', + 'submit' => 'Radera', ], - 'by' => 'By {publisher}', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'by' => 'Av {publisher}', + 'season' => 'Säsong {seasonNumber}', + 'list_of_episodes_year' => '{year} avsnitt ({episodeCount})', 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', + 'Säsong {seasonNumber} avsnitt ({episodeCount})', + 'no_episode' => 'Inga avsnitt hittades!', + 'follow' => 'Följ', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# följare} + other {# följare} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# inlägg} + other {# inlägg} }', - 'activity' => 'Activity', - 'episodes' => 'Episodes', + 'activity' => 'Aktivitet', + 'episodes' => 'Avsnitt', 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', + 'funding_links' => 'Finansierar länkar för {podcastTitle}', + 'find_on' => 'Hitta {podcastTitle} på', + 'listen_on' => 'Lyssna på', ]; diff --git a/modules/Admin/Language/sv/PodcastImport.php b/modules/Admin/Language/sv/PodcastImport.php index 7c3ef67d..36f517ad 100644 --- a/modules/Admin/Language/sv/PodcastImport.php +++ b/modules/Admin/Language/sv/PodcastImport.php @@ -10,28 +10,28 @@ declare(strict_types=1); return [ 'warning' => - 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', - 'old_podcast_section_title' => 'The podcast to import', + 'Denna procedur kan ta lång tid. Eftersom den aktuella versionen inte visar några framsteg medan den körs, kommer du inte se något uppdaterat förrän det är gjort. Vid timeoutfel, öka värdet `max_execution_time`.', + 'old_podcast_section_title' => 'Podcast att importera', 'old_podcast_section_subtitle' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', - 'advanced_params_section_title' => 'Advanced parameters', + 'Se till att du äger rättigheterna för den här podcasten innan du importerar den. Kopiering och sändning av en podcast utan rätt rättigheter är piratkopiering och riskerar att åtalas.', + 'imported_feed_url' => 'URL för flöde', + 'imported_feed_url_hint' => 'Flödet måste vara i xml- eller rss-format.', + 'new_podcast_section_title' => 'Den nya podcasten', + 'advanced_params_section_title' => 'Avancerade parametrar', 'advanced_params_section_subtitle' => - 'Keep the default values if you have no idea of what the fields are for.', - 'slug_field' => 'Field to be used to calculate episode slug', + 'Behåll standardvärdena om du inte har någon aning om vad fälten är för.', + 'slug_field' => 'Fält som ska användas för att beräkna avsnitt slug', 'description_field' => - 'Source field used for episode description / show notes', - 'force_renumber' => 'Force episodes renumbering', + 'Källfält som används för avsnittsbeskrivning / visa anteckningar', + 'force_renumber' => 'Tvinga avsnitts åternumrering', 'force_renumber_hint' => - 'Use this if your podcast does not have episode numbers but wish to set them during import.', - 'season_number' => 'Season number', + 'Använd detta om din podcast inte har avsnittsnummer men vill ange dem under import.', + 'season_number' => 'Säsong nummer', 'season_number_hint' => - 'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.', - 'max_episodes' => 'Maximum number of episodes to import', - 'max_episodes_hint' => 'Leave blank to import all episodes', + 'Använd detta om din podcast inte har ett säsongsnummer men vill ange en under import. Lämna tomt annars.', + 'max_episodes' => 'Maximalt antal avsnitt att importera', + 'max_episodes_hint' => 'Lämna tomt för att importera alla avsnitt', 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.', - 'submit' => 'Import podcast', + 'Detta flöde är skyddat. Du kan inte importera det. Om du är ägare, sluta skydda det på ursprungsplattformen.', + 'submit' => 'Importera podcast', ]; diff --git a/modules/Admin/Language/sv/PodcastNavigation.php b/modules/Admin/Language/sv/PodcastNavigation.php index b4d7ddc0..6fe010c8 100644 --- a/modules/Admin/Language/sv/PodcastNavigation.php +++ b/modules/Admin/Language/sv/PodcastNavigation.php @@ -9,30 +9,30 @@ declare(strict_types=1); */ return [ - 'go_to_page' => 'Go to podcast page', - 'dashboard' => 'Podcast dashboard', - 'podcast-view' => 'Home', - 'podcast-edit' => 'Edit podcast', - 'podcast-persons-manage' => 'Manage persons', - 'episodes' => 'Episodes', - 'episode-list' => 'All episodes', - 'episode-create' => 'New episode', - 'analytics' => 'Analytics', - 'podcast-analytics' => 'Audience overview', - 'podcast-analytics-webpages' => 'Web pages visits', - 'podcast-analytics-locations' => 'Locations', - 'podcast-analytics-unique-listeners' => 'Unique listeners', - 'podcast-analytics-players' => 'Players', - 'podcast-analytics-listening-time' => 'Listening time', - 'podcast-analytics-time-periods' => 'Time periods', + 'go_to_page' => 'Gå till podcast sida', + 'dashboard' => 'Podcast instrumentpanel', + 'podcast-view' => 'Hem', + 'podcast-edit' => 'Redigera podcast', + 'podcast-persons-manage' => 'Hantera personer', + 'episodes' => 'Avsnitt', + 'episode-list' => 'Alla avsnitt', + 'episode-create' => 'Nytt avsnitt', + 'analytics' => 'Statistik', + 'podcast-analytics' => 'Lyssnar översikt', + 'podcast-analytics-webpages' => 'Besök på webbsidor', + 'podcast-analytics-locations' => 'Platser', + 'podcast-analytics-unique-listeners' => 'Unika lyssnare', + 'podcast-analytics-players' => 'Spelare', + 'podcast-analytics-listening-time' => 'Lyssningstid', + 'podcast-analytics-time-periods' => 'Tidsperioder', 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', - 'contributors' => 'Contributors', - 'contributor-list' => 'All contributors', - 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', - 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'subscription-list' => 'Alla prenumerationer', + 'subscription-add' => 'Lägg till en prenumeration', + 'contributors' => 'Bidragsgivare', + 'contributor-list' => 'Alla bidragsgivare', + 'contributor-add' => 'Lägg till bidragsgivare', + 'platforms' => 'Externa plattformar', + 'platforms-podcasting' => 'Poddsändning', + 'platforms-social' => 'Sociala nätverk', + 'platforms-funding' => 'Finansiering', ]; diff --git a/modules/Admin/Language/sv/Settings.php b/modules/Admin/Language/sv/Settings.php index 4a70dcba..6a595e0a 100644 --- a/modules/Admin/Language/sv/Settings.php +++ b/modules/Admin/Language/sv/Settings.php @@ -9,50 +9,50 @@ declare(strict_types=1); */ return [ - 'title' => 'General settings', + 'title' => 'Allmänna inställningar', 'instance' => [ - 'title' => 'Instance', - 'site_icon' => 'Site icon', - 'site_icon_delete' => 'Delete site icon', - 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', - 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', - 'site_name' => 'Site name', - 'site_description' => 'Site description', - 'submit' => 'Save', - 'editSuccess' => 'Instance has been updated successfully!', - 'deleteIconSuccess' => 'Site icon has been remove successfully!', + 'title' => 'Instans', + 'site_icon' => 'Ikon för webbplats', + 'site_icon_delete' => 'Ta bort webbplatsikonen', + 'site_icon_hint' => 'Webbplatsikoner är vad du ser på dina webbläsarflikar, bokmärkesfältet och när du lägger till en webbplats som en genväg på mobila enheter.', + 'site_icon_helper' => 'Ikonen måste vara kvadratisk och minst 512px bred och hög.', + 'site_name' => 'Webbplatsens namn', + 'site_description' => 'Webbplatsbeskrivning', + 'submit' => 'Spara', + 'editSuccess' => 'Instansen har uppdaterats!', + 'deleteIconSuccess' => 'Webbplatsikonen har tagits bort!', ], 'images' => [ - 'title' => 'Images', - 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', - 'regenerate' => 'Regenerate images', - 'regenerationSuccess' => 'All images have been regenerated successfully!', + 'title' => 'Bilder', + 'subtitle' => 'Här kan du regenerera alla bilder baserat på originalen som laddats upp. Att användas om du upptäcker att vissa bilder saknas. Denna uppgift kan ta ett tag.', + 'regenerate' => 'Regenerera bilder', + 'regenerationSuccess' => 'Alla bilder har återskapats framgångsrikt!', ], 'housekeeping' => [ - 'title' => 'Housekeeping', - 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', - 'reset_counts' => 'Reset counts', - 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', - 'rewrite_media' => 'Rewrite media metadata', - 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', - 'clear_cache' => 'Clear all cache', - 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', - 'run' => 'Run housekeeping', - 'runSuccess' => 'Housekeeping has been run successfully!', + 'title' => 'Städning', + 'subtitle' => 'Kör olika städuppgifter. Använd denna funktion om du någonsin stöter på problem med mediefiler eller dataintegritet. Dessa uppgifter kan ta ett tag.', + 'reset_counts' => 'Återställ räknare', + 'reset_counts_helper' => 'Detta alternativ kommer att räkna om och återställa alla data räknas (antal följare, inlägg, kommentarer, …).', + 'rewrite_media' => 'Skriv om media metadata', + 'rewrite_media_helper' => 'Detta alternativ kommer att ta bort alla överflödiga mediefiler och återskapa dem (bilder, ljudfiler, avskrifter, kapitel, …)', + 'rename_episodes_files' => 'Döp om avsnittets ljudfiler', + 'rename_episodes_files_hint' => 'Detta alternativ kommer att byta namn på alla avsnitt ljudfiler till en slumpmässig sträng av tecken. Använd detta om en av dina privata episoder länk läckte eftersom detta effektivt kommer att dölja det.', + 'clear_cache' => 'Rensa all cache', + 'clear_cache_helper' => 'Det här alternativet kommer att radera redis cache eller skrivbara/cache-filer.', + 'run' => 'Kör städning', + 'runSuccess' => 'Städning har körts framgångsrikt!', ], 'theme' => [ - 'title' => 'Theme', - 'accent_section_title' => 'Accent color', - 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', - 'pine' => 'Pine', - 'crimson' => 'Crimson', - 'amber' => 'Amber', - 'lake' => 'Lake', + 'title' => 'Tema', + 'accent_section_title' => 'Accentfärg', + 'accent_section_subtitle' => 'Välj färg för att bestämma utseendet och känslan på alla offentliga sidor.', + 'pine' => 'Tall', + 'crimson' => 'Karmosinröd', + 'amber' => 'Bärnsten', + 'lake' => 'Sjö', 'jacaranda' => 'Jacaranda', 'onyx' => 'Onyx', - 'submit' => 'Save', - 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + 'submit' => 'Spara', + 'setInstanceThemeSuccess' => 'Temat har uppdaterats!', ], ]; diff --git a/modules/Admin/Language/sv/Soundbite.php b/modules/Admin/Language/sv/Soundbite.php index a3f828fe..fd80f828 100644 --- a/modules/Admin/Language/sv/Soundbite.php +++ b/modules/Admin/Language/sv/Soundbite.php @@ -10,22 +10,22 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Soundbites', - 'soundbite' => 'Soundbite', + 'title' => 'Ljudklipp', + 'soundbite' => 'Ljudklipp', ], 'messages' => [ - 'createSuccess' => 'Soundbite has been successfully created!', - 'deleteSuccess' => 'Soundbite has been successfully removed!', + 'createSuccess' => 'Ljudklipp har skapats!', + 'deleteSuccess' => 'Ljudklipp har tagits bort!', ], 'form' => [ - 'title' => 'New soundbite', - 'soundbite_title' => 'Soundbite title', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'submit' => 'Create soundbite', + 'title' => 'Nytt ljudklipp', + 'soundbite_title' => 'Ljudklipp titel', + 'start_time' => 'Starta vid', + 'duration' => 'Längd', + 'submit' => 'Skapa ljudklipp', ], - 'play' => 'Play soundbite', - 'stop' => 'Stop soundbite', - 'create' => 'New soundbite', - 'delete' => 'Delete soundbite', + 'play' => 'Spela ljudklipp', + 'stop' => 'Stoppa ljudklipp', + 'create' => 'Nytt ljudklipp', + 'delete' => 'Ta bort ljudklipp', ]; diff --git a/modules/Admin/Language/sv/Validation.php b/modules/Admin/Language/sv/Validation.php index 3bc78cfe..e9112946 100644 --- a/modules/Admin/Language/sv/Validation.php +++ b/modules/Admin/Language/sv/Validation.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'min_dims' => - '{field} is either not an image, or it is not wide or tall enough.', + '{field} är antingen inte en bild, eller så är den inte bred eller tillräckligt hög.', 'is_image_ratio' => - '{field} is either not an image or not of the right ratio.', + '{field} är antingen inte en bild eller inte av rätt förhållande.', ]; diff --git a/modules/Admin/Language/sv/VideoClip.php b/modules/Admin/Language/sv/VideoClip.php index 638de697..a94406b9 100644 --- a/modules/Admin/Language/sv/VideoClip.php +++ b/modules/Admin/Language/sv/VideoClip.php @@ -10,63 +10,63 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Video clips', + 'title' => 'Videoklipp', 'status' => [ 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Clip is waiting to be processed.', - 'pending' => 'pending', - 'pending_hint' => 'Clip will be generated shortly.', - 'running' => 'running', - 'running_hint' => 'Clip is being generated.', - 'failed' => 'failed', - 'failed_hint' => 'Clip could not be generated: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Clip was generated successfully!', + 'queued' => 'köad', + 'queued_hint' => 'Klipp väntar på att bearbetas.', + 'pending' => 'väntande', + 'pending_hint' => 'Klipp kommer att genereras inom kort.', + 'running' => 'körs', + 'running_hint' => 'Klipp genereras.', + 'failed' => 'misslyckades', + 'failed_hint' => 'Klipp kunde inte genereras: skript misslyckades.', + 'passed' => 'godkänd', + 'passed_hint' => 'Klipp har skapats framgångsrikt!', ], - 'clip' => 'Clip', - 'duration' => 'Job duration', + 'clip' => 'Klipp', + 'duration' => 'Varaktighet för jobb', ], - 'title' => 'Video clip: {videoClipLabel}', - 'download_clip' => 'Download clip', - 'create' => 'New video clip', - 'go_to_page' => 'Go to clip page', - 'retry' => 'Retry clip generation', - 'delete' => 'Delete clip', + 'title' => 'Videoklipp: {videoClipLabel}', + 'download_clip' => 'Ladda ner klipp', + 'create' => 'Nytt videoklipp', + 'go_to_page' => 'Gå till klippsida', + 'retry' => 'Generering av nytt klipp', + 'delete' => 'Ta bort klipp', 'logs' => 'Job logs', 'messages' => [ - 'alreadyExistingError' => 'The video clip you are trying to create already exists!', - 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', - 'deleteSuccess' => 'Video clip has been successfully removed!', + 'alreadyExistingError' => 'Det videoklipp du försöker skapa finns redan!', + 'addToQueueSuccess' => 'Videoklipp har lagts till i kön, väntar på att skapas!', + 'deleteSuccess' => 'Videoklipp har tagits bort!', ], 'format' => [ - 'landscape' => 'Landscape', - 'portrait' => 'Portrait', - 'squared' => 'Squared', + 'landscape' => 'Liggande', + 'portrait' => 'Stående', + 'squared' => 'Kvadrat', ], 'form' => [ - 'title' => 'New video clip', - 'params_section_title' => 'Video clip parameters', - 'clip_title' => 'Clip title', + 'title' => 'Nytt videoklipp', + 'params_section_title' => 'Parametrar för videoklipp', + 'clip_title' => 'Klipp titel', 'format' => [ - 'label' => 'Choose a format', - 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', - 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', - 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + 'label' => 'Välj ett format', + 'landscape_hint' => 'Med ett 16:9 förhållande, landskapsvideor är bra för PeerTube, Youtube och Vimeo.', + 'portrait_hint' => 'Med 9:16 förhållande, porträttfilmer är bra för TikTok, Youtube shorts och Instagram berättelser.', + 'squared_hint' => 'Med en 1:1 förhållande, fyrkantiga videor är bra för Mastodon, Facebook, Twitter och LinkedIn.', ], - 'theme' => 'Select a theme', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'trim_start' => 'Trim start', - 'trim_end' => 'Trim end', - 'submit' => 'Create video clip', + 'theme' => 'Välj ett tema', + 'start_time' => 'Starta vid', + 'duration' => 'Längd', + 'trim_start' => 'Trimma start', + 'trim_end' => 'Trimma slut', + 'submit' => 'Skapa videoklipp', ], 'requirements' => [ - 'title' => 'Missing requirements', - 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'title' => 'Krav ej uppfyllda', + 'missing' => 'Du har saknade krav. Se till att lägga till alla nödvändiga objekt som tillåts att skapa en video för detta avsnitt!', 'ffmpeg' => 'FFmpeg', - 'gd' => 'Graphics Draw (GD)', - 'freetype' => 'Freetype library for GD', - 'transcript' => 'Transcript file (.srt)', + 'gd' => 'Grafik Rita (GD)', + 'freetype' => 'Freetyp bibliotek för GD', + 'transcript' => 'Avskrift fil (.srt)', ], ]; diff --git a/modules/Admin/Language/zh-Hans/AboutCastopod.php b/modules/Admin/Language/zh-Hans/AboutCastopod.php index 3fb62aff..9817b219 100644 --- a/modules/Admin/Language/zh-Hans/AboutCastopod.php +++ b/modules/Admin/Language/zh-Hans/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => '关于 Castopod', + 'host_name' => '主机名', + 'version' => 'Castopod 版本', + 'php_version' => 'PHP 版本', + 'os' => '操作系统', + 'languages' => '语言', + 'update_database' => '更新数据库', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => '数据库是最新的!', ], ]; diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-Hans/Breadcrumb.php index 9d90fe90..3bf06845 100644 --- a/modules/Admin/Language/zh-Hans/Breadcrumb.php +++ b/modules/Admin/Language/zh-Hans/Breadcrumb.php @@ -19,17 +19,17 @@ return [ 'pages' => '页', 'settings' => '设置', 'theme' => '主题', - 'about' => 'about', + 'about' => '关于', 'add' => '添加', 'new' => '新建', 'edit' => '编辑', 'persons' => '人', 'publish' => '发布', 'publish-edit' => '编辑发布', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => '编辑发布日期', 'unpublish' => '取消发布', 'delete' => '删除', - 'remove' => 'remove', + 'remove' => '移除', 'fediverse' => '联邦宇宙', 'block-lists' => '封禁列表', 'users' => '用户', diff --git a/modules/Admin/Language/zh-Hans/Episode.php b/modules/Admin/Language/zh-Hans/Episode.php index 7a8f335a..736faa96 100644 --- a/modules/Admin/Language/zh-Hans/Episode.php +++ b/modules/Admin/Language/zh-Hans/Episode.php @@ -24,14 +24,14 @@ return [ 'edit' => '编辑', 'publish' => '发布', 'publish_edit' => '编辑发布', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => '编辑发布日期', 'unpublish' => '取消发布', 'publish_error' => '剧集已被发布。', 'publish_edit_error' => '剧集已被发布。', 'publish_cancel_error' => '剧集已被发布。', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => '剧集尚未发布,你不能编辑其发布日期。', + 'publish_date_edit_future_error' => '剧集的发布日期只能设置为过去的日期! 如果你想重新安排日期,请先取消发布。', + 'publish_date_edit_success' => '剧集的发布日期已成功更新!', 'unpublish_error' => '剧集尚未发布。', 'delete' => '删除', 'go_to_page' => '转到页面', @@ -183,9 +183,9 @@ return [ 'message_warning_submit' => '仍然发布', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => '新发布日期', + 'new_publication_date_hint' => '必须设置为过去的日期。', + 'submit' => '编辑发布日期', ], 'unpublish_form' => [ 'disclaimer' => diff --git a/modules/Admin/Language/zh-Hans/Navigation.php b/modules/Admin/Language/zh-Hans/Navigation.php index 4be56290..52d57ac3 100644 --- a/modules/Admin/Language/zh-Hans/Navigation.php +++ b/modules/Admin/Language/zh-Hans/Navigation.php @@ -33,7 +33,7 @@ return [ 'settings' => '设置', 'settings-general' => '通用', 'settings-theme' => '主题', - 'about' => 'About', + 'about' => '关于', 'account' => [ 'my-account' => '我的帐户', 'change-password' => '修改密码', diff --git a/modules/Auth/Language/ar/Auth.php b/modules/Auth/Language/ar/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/ar/Auth.php +++ b/modules/Auth/Language/ar/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/ar/Contributor.php b/modules/Auth/Language/ar/Contributor.php index 92ddf0b8..4731c799 100644 --- a/modules/Auth/Language/ar/Contributor.php +++ b/modules/Auth/Language/ar/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'إضافة مساهم', 'submit_edit' => 'حدّث الدور', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "لا يمكنك إزالة صاحب البودكاست!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Auth/Language/ar/User.php b/modules/Auth/Language/ar/User.php index 7607ad97..39f78c2e 100644 --- a/modules/Auth/Language/ar/User.php +++ b/modules/Auth/Language/ar/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'احذف', @@ -18,7 +18,7 @@ return [ 'all_users' => 'كافة المستخدمين', 'list' => [ 'user' => 'مستخدم', - 'roles' => 'الأدوار', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'اسم المستخدم', 'password' => 'كلمة المرور', 'new_password' => 'كلمة المرور الجديدة', + 'role' => 'Role', 'roles' => 'الأدوار', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'حفظ', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/br/Auth.php b/modules/Auth/Language/br/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/br/Auth.php +++ b/modules/Auth/Language/br/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/br/Contributor.php b/modules/Auth/Language/br/Contributor.php index 637fe9f1..60995c44 100644 --- a/modules/Auth/Language/br/Contributor.php +++ b/modules/Auth/Language/br/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez', 'submit_edit' => 'Hizivaat ar roll', ], - 'roles' => [ - 'podcast_admin' => 'Merour podkastoù', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Ne c'hellit ket lemel perc'henn ar podkast!", 'removeSuccess' => 'Lamet ho peus {username} diouzh {podcastTitle} gant berzh', diff --git a/modules/Auth/Language/br/User.php b/modules/Auth/Language/br/User.php index 1fa37c2a..d2c07933 100644 --- a/modules/Auth/Language/br/User.php +++ b/modules/Auth/Language/br/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Kemm rolloù {username}", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Dilemel', @@ -18,7 +18,7 @@ return [ 'all_users' => 'An holl implijerien·ezed', 'list' => [ 'user' => 'Implijer·ez', - 'roles' => 'Rolloù', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Anv implijer·ez', 'password' => 'Ger-tremen', 'new_password' => 'Ger-tremen nevez', + 'role' => 'Role', 'roles' => 'Rolloù', 'permissions' => 'Aotreoù', 'submit_create' => 'Krouiñ an implijer·ez', 'submit_edit' => 'Enrollañ', 'submit_password_change' => 'Kemm!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => 'Dilamet eo bet {username}.', diff --git a/modules/Auth/Language/ca/Auth.php b/modules/Auth/Language/ca/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/ca/Auth.php +++ b/modules/Auth/Language/ca/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/ca/Contributor.php b/modules/Auth/Language/ca/Contributor.php index 61a8b380..e17f7fe0 100644 --- a/modules/Auth/Language/ca/Contributor.php +++ b/modules/Auth/Language/ca/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Afegir un col·laborador', 'submit_edit' => 'Actualitzar el rol', ], - 'roles' => [ - 'podcast_admin' => 'Administrador del podcast', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "No podeu eliminar al propietari del podcast!", 'removeSuccess' => 'S\'ha eliminat a {username} de {podcastTitle}', diff --git a/modules/Auth/Language/ca/User.php b/modules/Auth/Language/ca/User.php index d0065c45..6520db70 100644 --- a/modules/Auth/Language/ca/User.php +++ b/modules/Auth/Language/ca/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Editar els rols de {username}", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Bandejar', 'unban' => 'Re-admetre', 'delete' => 'Eliminar', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Tots els usuaris', 'list' => [ 'user' => 'Usuari', - 'roles' => 'Rols', + 'role' => 'Role', 'banned' => 'Bandejat?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Nom de l\'usuari', 'password' => 'Contrasenya', 'new_password' => 'Nova contrasenya', + 'role' => 'Role', 'roles' => 'Rols', 'permissions' => 'Permisos', 'submit_create' => 'Crea un usuari', 'submit_edit' => 'Desar', 'submit_password_change' => 'Canviat!', ], - 'roles' => [ - 'superadmin' => 'Super administrador/a', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} és un superadministrador, hom simplement no bandeja a un superadministrador...', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} és un superadministrador, hom simplement no elimina a un superadministrador...', 'deleteSuccess' => '{username} ha estat eliminat.', diff --git a/modules/Auth/Language/de/Auth.php b/modules/Auth/Language/de/Auth.php index 09e3cd6b..ef2db93d 100644 --- a/modules/Auth/Language/de/Auth.php +++ b/modules/Auth/Language/de/Auth.php @@ -11,16 +11,16 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Instanzbesitzer', + 'description' => 'Der Castopod-Besitzer.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Super-Administrator', + 'description' => 'Hat die vollständige Kontrolle über Castopod.', ], 'manager' => [ 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'description' => 'Verwaltet Castopods Inhalte.', ], 'podcaster' => [ 'title' => 'Podcaster', @@ -28,35 +28,35 @@ return [ ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', + 'admin.access' => 'Kann auf den Admin-Bereich von Castopod zugreifen.', + 'admin.settings' => 'Kann auf die Einstellungen von Castopod zugreifen.', + 'users.manage' => 'Kann Castopod-Benutzer verwalten.', + 'persons.manage' => 'Kann Mitwirkende verwalten.', + 'pages.manage' => 'Kann Seiten verwalten.', + 'podcasts.view' => 'Kann alle Podcasts einsehen.', + 'podcasts.create' => 'Kann neue Podcasts erstellen.', + 'podcasts.import' => 'Kann Podcasts importieren.', 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Podcast-Besitzer', + 'description' => 'Der Podcast-Besitzer.', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => 'Administrator', + 'description' => 'Hat die vollständige Kontrolle über Podcast #{id}.', ], 'editor' => [ 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'description' => 'Verwaltet Inhalte und Veröffentlichungen von Podcast #{id}.', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => 'Autor', + 'description' => 'Verwaltet Inhalte von Podcast #{id}, kann diese aber nicht veröffentlichen.', ], 'guest' => [ - 'title' => 'Guest', + 'title' => 'Gast', 'description' => 'General contributor of the podcast #{id}.', ], ], @@ -69,12 +69,13 @@ return [ 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-publications' => 'Kann Podcast #{id} veröffentlichen.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.create' => 'Kann Folgen für Podcast #{id} erstellen.', + 'episodes.edit' => 'Kann Folgen von Podcast #{id} bearbeiten.', + 'episodes.delete' => 'Kann Folgen von Podcast #{id} löschen.', 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', @@ -82,12 +83,12 @@ return [ ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'Ihr 6-stelliger Code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', + 'notEnoughPrivilege' => 'Sie haben keine ausreichenden Berechtigungen, um auf diese Seite zuzugreifen.', + 'set_password' => 'Legen Sie Ihr Passwort fest', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'welcomeSubject' => 'Sie wurden zu {siteName} eingeladen', 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', ]; diff --git a/modules/Auth/Language/de/Contributor.php b/modules/Auth/Language/de/Contributor.php index c21e05b8..cba03829 100644 --- a/modules/Auth/Language/de/Contributor.php +++ b/modules/Auth/Language/de/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Administrator zufügen', 'submit_edit' => 'Rolle aktualisieren', ], - 'roles' => [ - 'podcast_admin' => 'Podcast Administrator', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Der Podcast Inhaber kann nicht entfernt werden!", 'removeSuccess' => '{username} wurde von {podcastTitle} entfernt', diff --git a/modules/Auth/Language/de/User.php b/modules/Auth/Language/de/User.php index f6337ed4..e0d54718 100644 --- a/modules/Auth/Language/de/User.php +++ b/modules/Auth/Language/de/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Bearbeite {username}'s Rollen", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Bannen', 'unban' => 'Entbannen', 'delete' => 'Löschen', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Alle Benutzer', 'list' => [ 'user' => 'Benutzer', - 'roles' => 'Rollen', + 'role' => 'Role', 'banned' => 'Gebannt?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Benutzername', 'password' => 'Passwort', 'new_password' => 'Neues Passwort', + 'role' => 'Role', 'roles' => 'Rollen', 'permissions' => 'Berechtigungen', 'submit_create' => 'Benutzer erstellen', 'submit_edit' => 'Speichern', 'submit_password_change' => 'Verändern!', ], - 'roles' => [ - 'superadmin' => 'Super-Admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} ist ein Superadmin, man bannt nicht einfach einen Superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} ist ein Superadmin, man löscht nicht einfach einen Superadmin…', 'deleteSuccess' => '{username} wurde gelöscht.', diff --git a/modules/Auth/Language/el/Auth.php b/modules/Auth/Language/el/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/el/Auth.php +++ b/modules/Auth/Language/el/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/el/Contributor.php b/modules/Auth/Language/el/Contributor.php index 132d9abb..1acec63a 100644 --- a/modules/Auth/Language/el/Contributor.php +++ b/modules/Auth/Language/el/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Προσθήκη συντελεστή', 'submit_edit' => 'Ενημέρωση ρόλου', ], - 'roles' => [ - 'podcast_admin' => 'Διαχειριστής Podcast', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Δεν μπορείτε να καταργήσετε τον ιδιοκτήτη podcast!", 'removeSuccess' => 'Έχετε αφαιρέσει με επιτυχία τον χρήστη {username} από το {podcastTitle}', diff --git a/modules/Auth/Language/el/User.php b/modules/Auth/Language/el/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/el/User.php +++ b/modules/Auth/Language/el/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/es/Auth.php b/modules/Auth/Language/es/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/es/Auth.php +++ b/modules/Auth/Language/es/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/es/Contributor.php b/modules/Auth/Language/es/Contributor.php index 7cd774b2..b4eee665 100644 --- a/modules/Auth/Language/es/Contributor.php +++ b/modules/Auth/Language/es/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Añadir colaborador', 'submit_edit' => 'Actualizar Cargo', ], - 'roles' => [ - 'podcast_admin' => 'Administrador del Podcast', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "¡No puedes eliminar al dueño del podcast!", 'removeSuccess' => 'Has eliminado con éxito a {username} de {podcastTitle}', diff --git a/modules/Auth/Language/es/User.php b/modules/Auth/Language/es/User.php index cf00d948..22562c9f 100644 --- a/modules/Auth/Language/es/User.php +++ b/modules/Auth/Language/es/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Editar rol de {username}", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Banear', 'unban' => 'Desbanear', 'delete' => 'Borrar', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Todos los usuarios', 'list' => [ 'user' => 'Usuario', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => '¿Baneado?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Nombre de usuario', 'password' => 'Contraseña', 'new_password' => 'Nueva Contraseña', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permisos', 'submit_create' => 'Crear usuario', 'submit_edit' => 'Guardar', 'submit_password_change' => '¡Cambiar!', ], - 'roles' => [ - 'superadmin' => 'Super administrador', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} es un superadmin, no puedes banear a un superadministrador…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} es un superadmin, no puedes borrar a un superadministrador…', 'deleteSuccess' => '{username} ha sido eliminado.', diff --git a/modules/Auth/Language/fa/Auth.php b/modules/Auth/Language/fa/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/fa/Auth.php +++ b/modules/Auth/Language/fa/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/fa/Contributor.php b/modules/Auth/Language/fa/Contributor.php index d0f3b93d..c70badc0 100644 --- a/modules/Auth/Language/fa/Contributor.php +++ b/modules/Auth/Language/fa/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Add contributor', 'submit_edit' => 'Update role', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "You can't remove the podcast owner!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Auth/Language/fa/User.php b/modules/Auth/Language/fa/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/fa/User.php +++ b/modules/Auth/Language/fa/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/fr/Auth.php b/modules/Auth/Language/fr/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/fr/Auth.php +++ b/modules/Auth/Language/fr/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/fr/Contributor.php b/modules/Auth/Language/fr/Contributor.php index 700f760b..2a1f9dd2 100644 --- a/modules/Auth/Language/fr/Contributor.php +++ b/modules/Auth/Language/fr/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Ajouter le contributeur', 'submit_edit' => 'Mettre à jour le rôle', ], - 'roles' => [ - 'podcast_admin' => 'Administrateur de Podcasts', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Vous ne pouvez pas retirer le propriétaire du podcast !", 'removeSuccess' => 'Vous avez retiré {username} de {podcastTitle}', diff --git a/modules/Auth/Language/fr/User.php b/modules/Auth/Language/fr/User.php index 27283ed9..69d864d1 100644 --- a/modules/Auth/Language/fr/User.php +++ b/modules/Auth/Language/fr/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Modifier les rôles de {username}", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Bloquer', 'unban' => 'Débloquer', 'delete' => 'Supprimer', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Tous les utilisateurs', 'list' => [ 'user' => 'Utilisateurs', - 'roles' => 'Rôles', + 'role' => 'Role', 'banned' => 'Bloqué ?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Identifiant', 'password' => 'Mot de passe', 'new_password' => 'Nouveau mot de passe', + 'role' => 'Role', 'roles' => 'Rôles', 'permissions' => 'Permissions', 'submit_create' => 'Créer un utilisateur', 'submit_edit' => 'Enregistrer', 'submit_password_change' => 'Valider !', ], - 'roles' => [ - 'superadmin' => 'Super-utilisateur', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} est un super-utilisateur, on ne bloque pas un super-utilisateur comme ça…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} est un super-utilisateur, on ne supprime pas un super-utilisateur comme ça…', 'deleteSuccess' => '{username} a été supprimé.', diff --git a/modules/Auth/Language/gd/Auth.php b/modules/Auth/Language/gd/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/gd/Auth.php +++ b/modules/Auth/Language/gd/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/gd/Contributor.php b/modules/Auth/Language/gd/Contributor.php index d0f3b93d..c70badc0 100644 --- a/modules/Auth/Language/gd/Contributor.php +++ b/modules/Auth/Language/gd/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Add contributor', 'submit_edit' => 'Update role', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "You can't remove the podcast owner!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Auth/Language/gd/User.php b/modules/Auth/Language/gd/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/gd/User.php +++ b/modules/Auth/Language/gd/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/gl/Auth.php b/modules/Auth/Language/gl/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/gl/Auth.php +++ b/modules/Auth/Language/gl/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/gl/Contributor.php b/modules/Auth/Language/gl/Contributor.php index a09021cd..664fb1be 100644 --- a/modules/Auth/Language/gl/Contributor.php +++ b/modules/Auth/Language/gl/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Engadir colaboración', 'submit_edit' => 'Actualizar rol', ], - 'roles' => [ - 'podcast_admin' => 'Admin podcast', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Non podes eliminar a propietaria do podcast!", 'removeSuccess' => 'Quitaches correctamente a {username} de {podcastTitle}', diff --git a/modules/Auth/Language/gl/User.php b/modules/Auth/Language/gl/User.php index dd84c53d..74aa688f 100644 --- a/modules/Auth/Language/gl/User.php +++ b/modules/Auth/Language/gl/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Editar os roles de {username}", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Vetar', 'unban' => 'Retirar veto', 'delete' => 'Eliminar', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Tódalas usuarias', 'list' => [ 'user' => 'Usuaria', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Vetada?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Identificador', 'password' => 'Contrasinal', 'new_password' => 'Novo contrasinal', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permisos', 'submit_create' => 'Crear usuaria', 'submit_edit' => 'Gardar', 'submit_password_change' => 'Cambiar!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ 'A instancia pertence a {username}, ti non podes editar os roles.', 'banSuperAdminError' => '{username} é superadmin, non se pode vetar a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} é superadmin, non se pode eliminar a superadmin…', 'deleteSuccess' => 'Eliminouse a {username}.', diff --git a/modules/Auth/Language/id/Auth.php b/modules/Auth/Language/id/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/id/Auth.php +++ b/modules/Auth/Language/id/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/id/Contributor.php b/modules/Auth/Language/id/Contributor.php index d0f3b93d..c70badc0 100644 --- a/modules/Auth/Language/id/Contributor.php +++ b/modules/Auth/Language/id/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Add contributor', 'submit_edit' => 'Update role', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "You can't remove the podcast owner!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Auth/Language/id/User.php b/modules/Auth/Language/id/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/id/User.php +++ b/modules/Auth/Language/id/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/it/Auth.php b/modules/Auth/Language/it/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/it/Auth.php +++ b/modules/Auth/Language/it/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/it/Contributor.php b/modules/Auth/Language/it/Contributor.php index ab685c04..b82b51bb 100644 --- a/modules/Auth/Language/it/Contributor.php +++ b/modules/Auth/Language/it/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Aggiungi collaboratore', 'submit_edit' => 'Aggiorna Ruolo', ], - 'roles' => [ - 'podcast_admin' => 'Amministratore del podcast', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Non puoi rimuovere il proprietario del podcast!", 'removeSuccess' => 'Hai rimosso con successo {username} da {podcastTitle}', diff --git a/modules/Auth/Language/it/User.php b/modules/Auth/Language/it/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/it/User.php +++ b/modules/Auth/Language/it/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/ko/Auth.php b/modules/Auth/Language/ko/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/ko/Auth.php +++ b/modules/Auth/Language/ko/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/ko/Contributor.php b/modules/Auth/Language/ko/Contributor.php new file mode 100644 index 00000000..c70badc0 --- /dev/null +++ b/modules/Auth/Language/ko/Contributor.php @@ -0,0 +1,47 @@ + 'Podcast contributors', + 'view' => "{username}'s contribution to {podcastTitle}", + 'add' => 'Add contributor', + 'add_contributor' => 'Add a contributor for {0}', + 'edit_role' => 'Update role for {0}', + 'edit' => 'Edit', + 'remove' => 'Remove', + 'list' => [ + 'username' => 'Username', + 'role' => 'Role', + ], + 'form' => [ + 'user' => 'User', + 'user_placeholder' => 'Select a user…', + 'role' => 'Role', + 'role_placeholder' => 'Select its role…', + 'submit_add' => 'Add contributor', + 'submit_edit' => 'Update role', + ], + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', + ], + 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", + 'removeOwnerError' => "You can't remove the podcast owner!", + 'removeSuccess' => + 'You have successfully removed {username} from {podcastTitle}', + 'alreadyAddedError' => + "The contributor you're trying to add has already been added!", + ], +]; diff --git a/modules/Auth/Language/ko/MyAccount.php b/modules/Auth/Language/ko/MyAccount.php new file mode 100644 index 00000000..6ebbb30e --- /dev/null +++ b/modules/Auth/Language/ko/MyAccount.php @@ -0,0 +1,18 @@ + 'My account info', + 'changePassword' => 'Change my password', + 'messages' => [ + 'wrongPasswordError' => "You've entered the wrong password, try again.", + 'passwordChangeSuccess' => 'Password has been successfully changed!', + ], +]; diff --git a/modules/Auth/Language/ko/User.php b/modules/Auth/Language/ko/User.php new file mode 100644 index 00000000..32ec560c --- /dev/null +++ b/modules/Auth/Language/ko/User.php @@ -0,0 +1,60 @@ + "Edit {username}'s role", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'role' => 'Role', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'role' => 'Role', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Auth/Language/nl/Auth.php b/modules/Auth/Language/nl/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/nl/Auth.php +++ b/modules/Auth/Language/nl/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/nl/Contributor.php b/modules/Auth/Language/nl/Contributor.php index a9d938d6..3754bb92 100644 --- a/modules/Auth/Language/nl/Contributor.php +++ b/modules/Auth/Language/nl/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Voeg bijdrager toe', 'submit_edit' => 'Rol bijwerken', ], - 'roles' => [ - 'podcast_admin' => 'Podcast beheerder', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Je kunt de eigenaar van podcast niet verwijderen!", 'removeSuccess' => 'Je hebt {username} met succes verwijderd van {podcastTitle}', diff --git a/modules/Auth/Language/nl/User.php b/modules/Auth/Language/nl/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/nl/User.php +++ b/modules/Auth/Language/nl/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/nn-NO/Auth.php b/modules/Auth/Language/nn-NO/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/nn-NO/Auth.php +++ b/modules/Auth/Language/nn-NO/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/nn-NO/Contributor.php b/modules/Auth/Language/nn-NO/Contributor.php index 0fe4cc66..1fc338ba 100644 --- a/modules/Auth/Language/nn-NO/Contributor.php +++ b/modules/Auth/Language/nn-NO/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Legg til bidragsytar', 'submit_edit' => 'Oppdater rolla', ], - 'roles' => [ - 'podcast_admin' => 'Podkaststyrar', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Du kan ikkje fjerna podkast-eigaren!", 'removeSuccess' => 'Du har fjerna {username} frå {podcastTitle}', diff --git a/modules/Auth/Language/nn-NO/User.php b/modules/Auth/Language/nn-NO/User.php index a3ec4bfe..2ac777e1 100644 --- a/modules/Auth/Language/nn-NO/User.php +++ b/modules/Auth/Language/nn-NO/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Endre rollene til {username}", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Steng ute', 'unban' => 'Slepp inn att', 'delete' => 'Slett', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Alle brukarane', 'list' => [ 'user' => 'Brukar', - 'roles' => 'Roller', + 'role' => 'Role', 'banned' => 'Utestengd?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Brukarnamn', 'password' => 'Passord', 'new_password' => 'Nytt passord', + 'role' => 'Role', 'roles' => 'Roller', 'permissions' => 'Løyve', 'submit_create' => 'Lag brukar', 'submit_edit' => 'Lagre', 'submit_password_change' => 'Endre!', ], - 'roles' => [ - 'superadmin' => 'Superstyrar', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} er superstyrar, og du stengjer ikkje ute ein superstyrar…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} er superstyrar, og du slettar ikkje ein superstyrar…', 'deleteSuccess' => '{username} er sletta.', diff --git a/modules/Auth/Language/oc/Auth.php b/modules/Auth/Language/oc/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/oc/Auth.php +++ b/modules/Auth/Language/oc/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/oc/Contributor.php b/modules/Auth/Language/oc/Contributor.php index d0f3b93d..c70badc0 100644 --- a/modules/Auth/Language/oc/Contributor.php +++ b/modules/Auth/Language/oc/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Add contributor', 'submit_edit' => 'Update role', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "You can't remove the podcast owner!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Auth/Language/oc/User.php b/modules/Auth/Language/oc/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/oc/User.php +++ b/modules/Auth/Language/oc/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/pl/Auth.php b/modules/Auth/Language/pl/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/pl/Auth.php +++ b/modules/Auth/Language/pl/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/pl/Contributor.php b/modules/Auth/Language/pl/Contributor.php index a00fc8b4..162a6dd8 100644 --- a/modules/Auth/Language/pl/Contributor.php +++ b/modules/Auth/Language/pl/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Dodaj kontrybutora', 'submit_edit' => 'Zaktualizuj rolę', ], - 'roles' => [ - 'podcast_admin' => 'Administrator podcastu', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Nie możesz usunąć właściciela podcastu!", 'removeSuccess' => 'Pomyślnie usunąłeś/aś {username} z {podcastTitle}', diff --git a/modules/Auth/Language/pl/User.php b/modules/Auth/Language/pl/User.php index 7c2d0789..b0c8d87f 100644 --- a/modules/Auth/Language/pl/User.php +++ b/modules/Auth/Language/pl/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edytuj role użytkownika {username}", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Zablokuj', 'unban' => 'Odblokuj', 'delete' => 'Usuń', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Wszyscy użytkownicy', 'list' => [ 'user' => 'Użytkownik', - 'roles' => 'Role', + 'role' => 'Role', 'banned' => 'Zablokowany?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Nazwa użytkownika', 'password' => 'Hasło', 'new_password' => 'Nowe hasło', + 'role' => 'Role', 'roles' => 'Role', 'permissions' => 'Uprawnienia', 'submit_create' => 'Stwórz użytkownika', 'submit_edit' => 'Zapisz', 'submit_password_change' => 'Zmień!', ], - 'roles' => [ - 'superadmin' => 'Superadministrator', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} jest superadministratorem, nie można po prostu zablokować superadministratora…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} jest superadministratorem, nie można po prostu usunąć superadministratora…', 'deleteSuccess' => '{username} został usunięty.', diff --git a/modules/Auth/Language/pt-BR/Auth.php b/modules/Auth/Language/pt-BR/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/pt-BR/Auth.php +++ b/modules/Auth/Language/pt-BR/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/pt-BR/Contributor.php b/modules/Auth/Language/pt-BR/Contributor.php index 60329ef2..a2188fe8 100644 --- a/modules/Auth/Language/pt-BR/Contributor.php +++ b/modules/Auth/Language/pt-BR/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Adicionar contribuidor', 'submit_edit' => 'Atualizar cargo', ], - 'roles' => [ - 'podcast_admin' => 'Administrador do podcast', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Você não pode remover o dono do podcast!", 'removeSuccess' => 'Você removeu {username} com sucesso de {podcastTitle}', diff --git a/modules/Auth/Language/pt-BR/User.php b/modules/Auth/Language/pt-BR/User.php index aff24883..945f8609 100644 --- a/modules/Auth/Language/pt-BR/User.php +++ b/modules/Auth/Language/pt-BR/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Editar cargos de {username}", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Banir', 'unban' => 'Desbanir', 'delete' => 'Excluir', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Todos os usuários', 'list' => [ 'user' => 'Usuário', - 'roles' => 'Cargos', + 'role' => 'Role', 'banned' => 'Banido?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Nome de usuário', 'password' => 'Senha', 'new_password' => 'Nova Senha', + 'role' => 'Role', 'roles' => 'Cargos', 'permissions' => 'Permissões', 'submit_create' => 'Criar usuário', 'submit_edit' => 'Salvar', 'submit_password_change' => 'Alterar!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} é um super admin, não bloqueamos um super admin assim…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} é um super admin, você não exclui um super admin assim…', 'deleteSuccess' => '{username} foi excluído.', diff --git a/modules/Auth/Language/pt/Auth.php b/modules/Auth/Language/pt/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/pt/Auth.php +++ b/modules/Auth/Language/pt/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/pt/Contributor.php b/modules/Auth/Language/pt/Contributor.php index d0f3b93d..c70badc0 100644 --- a/modules/Auth/Language/pt/Contributor.php +++ b/modules/Auth/Language/pt/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Add contributor', 'submit_edit' => 'Update role', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "You can't remove the podcast owner!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Auth/Language/pt/User.php b/modules/Auth/Language/pt/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/pt/User.php +++ b/modules/Auth/Language/pt/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/ru/Auth.php b/modules/Auth/Language/ru/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/ru/Auth.php +++ b/modules/Auth/Language/ru/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/ru/Contributor.php b/modules/Auth/Language/ru/Contributor.php index d0f3b93d..c70badc0 100644 --- a/modules/Auth/Language/ru/Contributor.php +++ b/modules/Auth/Language/ru/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Add contributor', 'submit_edit' => 'Update role', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "You can't remove the podcast owner!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Auth/Language/ru/User.php b/modules/Auth/Language/ru/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/ru/User.php +++ b/modules/Auth/Language/ru/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/sk/Auth.php b/modules/Auth/Language/sk/Auth.php index 09e3cd6b..a47932e3 100644 --- a/modules/Auth/Language/sk/Auth.php +++ b/modules/Auth/Language/sk/Auth.php @@ -70,6 +70,7 @@ return [ 'manage-contributors' => 'Can manage contributors of podcast #{id}.', 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', 'episodes.create' => 'Can create episodes for podcast #{id}.', diff --git a/modules/Auth/Language/sk/Contributor.php b/modules/Auth/Language/sk/Contributor.php index 3f0991fa..2f251c38 100644 --- a/modules/Auth/Language/sk/Contributor.php +++ b/modules/Auth/Language/sk/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Pridať prispievateľa', 'submit_edit' => 'Aktualizovať rolu', ], - 'roles' => [ - 'podcast_admin' => 'Správca podcastu', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "Nemôžete odstrániť vlastníka podcastu!", 'removeSuccess' => 'Úspešne ste odstránili používateľa {username} z podcastu {podcastTitle}', diff --git a/modules/Auth/Language/sk/User.php b/modules/Auth/Language/sk/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/sk/User.php +++ b/modules/Auth/Language/sk/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/sv/Auth.php b/modules/Auth/Language/sv/Auth.php index 09e3cd6b..92c04320 100644 --- a/modules/Auth/Language/sv/Auth.php +++ b/modules/Auth/Language/sv/Auth.php @@ -11,83 +11,84 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Instans Ägare', + 'description' => 'Castopod ägaren.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Super administratör', + 'description' => 'Har fullständig kontroll över Castopod.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Hanterare', + 'description' => 'Hanterar Castopods innehåll.', ], 'podcaster' => [ 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'description' => 'Generella användare av Castopod.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => 'Kan komma åt Castopod admin-området.', + 'admin.settings' => 'Kan komma åt Castopod-inställningarna.', + 'users.manage' => 'Kan hantera Castopod-användare.', + 'persons.manage' => 'Kan hantera personer.', + 'pages.manage' => 'Kan hantera sidor.', + 'podcasts.view' => 'Kan se alla podcasts.', + 'podcasts.create' => 'Kan skapa nya podcasts.', + 'podcasts.import' => 'Kan importera podcasts.', + 'fediverse.manage-blocks' => 'Kan blockera fediverse skådespelare/domäner från att interagera med Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Podcast ägare', + 'description' => 'Podcast ägaren.', ], 'admin' => [ 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'description' => 'Har fullständig kontroll över podcast #{id}.', ], 'editor' => [ - 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'title' => 'Redigerare', + 'description' => 'Hanterar innehåll och publikationer i podcast #{id}.', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => 'Författare', + 'description' => 'Hanterar innehåll i podcast #{id} men kan inte publicera dem.', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => 'Gäst', + 'description' => 'Generell bidragsgivare till podcasten #{id}.', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => 'Kan visa instrumentpanelen och analysen av podcast #{id}.', + 'edit' => 'Kan redigera podcast #{id}.', + 'delete' => 'Kan ta bort podcast #{id}.', + 'manage-import' => 'Kan synkronisera importerad podcast #{id}.', + 'manage-persons' => 'Kan hantera prenumerationer på podcast #{id}.', + 'manage-subscriptions' => 'Kan hantera prenumerationer på podcast #{id}.', + 'manage-contributors' => 'Kan hantera bidragsgivare för podcast #{id}.', + 'manage-platforms' => 'Kan sätta/ta bort plattformslänkar för podcast #{id}.', + 'manage-publications' => 'Kan publicera podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', + 'interact-as' => 'Kan interagera som podcasten #{id} för att favorita, dela eller svara på inlägg.', + 'episodes.view' => 'Kan visa instrumentpaneler och analyser av podcast #{id}s avsnitt.', + 'episodes.create' => 'Kan skapa avsnitt för podcast #{id}.', + 'episodes.edit' => 'Kan redigera avsnitt av podcast #{id}.', + 'episodes.delete' => 'Kan ta bort avsnitt av podcast #{id}.', + 'episodes.manage-persons' => 'Kan hantera avsnittpersoner i podcast #{id}.', + 'episodes.manage-clips' => 'Kan hantera videoklipp eller ljudklipp från podcasten #{id}.', + 'episodes.manage-publications' => 'Kan publicera/avpublicera avsnitt och inlägg i podcast #{id}.', + 'episodes.manage-comments' => 'Kan skapa/ta bort avsnitt kommentarer från podcasten #{id}.', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'Din 6-siffriga kod', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', + 'notEnoughPrivilege' => 'Du har inte tillräcklig behörighet att komma åt sidan.', + 'set_password' => 'Välj ett lösenord', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'welcomeSubject' => 'Du har blivit inbjuden till {siteName}', + 'emailWelcomeMailBody' => 'Ett konto skapades för dig på {domain}, klicka på inloggningslänken nedan för att ange ditt lösenord. Länken är giltig i {numberOfHours} timmar efter att detta e-postmeddelande skickats.', ]; diff --git a/modules/Auth/Language/sv/Contributor.php b/modules/Auth/Language/sv/Contributor.php index d0f3b93d..c70badc0 100644 --- a/modules/Auth/Language/sv/Contributor.php +++ b/modules/Auth/Language/sv/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => 'Add contributor', 'submit_edit' => 'Update role', ], - 'roles' => [ - 'podcast_admin' => 'Podcast admin', + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', ], 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", 'removeOwnerError' => "You can't remove the podcast owner!", 'removeSuccess' => 'You have successfully removed {username} from {podcastTitle}', diff --git a/modules/Auth/Language/sv/User.php b/modules/Auth/Language/sv/User.php index fe3a9e1a..e7908f5b 100644 --- a/modules/Auth/Language/sv/User.php +++ b/modules/Auth/Language/sv/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "Edit {username}'s roles", + 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', 'delete' => 'Delete', @@ -18,7 +18,7 @@ return [ 'all_users' => 'All users', 'list' => [ 'user' => 'User', - 'roles' => 'Roles', + 'role' => 'Role', 'banned' => 'Banned?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => 'Username', 'password' => 'Password', 'new_password' => 'New Password', + 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', 'submit_create' => 'Create user', 'submit_edit' => 'Save', 'submit_password_change' => 'Change!', ], - 'roles' => [ - 'superadmin' => 'Super admin', + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} is the instance owner, you cannot edit its roles.', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', 'deleteSuperAdminError' => '{username} is a superadmin, one does not simply delete a superadmin…', 'deleteSuccess' => '{username} has been deleted.', diff --git a/modules/Auth/Language/zh-Hans/Auth.php b/modules/Auth/Language/zh-Hans/Auth.php index 09e3cd6b..9d5502a2 100644 --- a/modules/Auth/Language/zh-Hans/Auth.php +++ b/modules/Auth/Language/zh-Hans/Auth.php @@ -11,83 +11,84 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => '实例所有者', + 'description' => 'Castopod 所有者', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => '超级管理员', + 'description' => '拥有对 Castopod 的完全控制。', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => '管理', + 'description' => '管理 Castopod 的内容。', ], 'podcaster' => [ - 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'title' => '播客', + 'description' => 'Castopod 的普通用户。', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => '可以访问 Castopod 管理区域。', + 'admin.settings' => '可以访问 Castopod 设置。', + 'users.manage' => '可以管理 Castopod 用户。', + 'persons.manage' => '可以管理人员。', + 'pages.manage' => '可以管理页面。', + 'podcasts.view' => '可以查看所有播客。', + 'podcasts.create' => '可以创建新播客。', + 'podcasts.import' => '可以导入播客。', + 'fediverse.manage-blocks' => '可以阻止联邦宇宙参与者/域与 Castopod 交互。', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => '播客封面', + 'description' => '播客所有者。', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => '管理员', + 'description' => '完全控制播客 #{id}。', ], 'editor' => [ - 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'title' => '编辑', + 'description' => '管理播客 #{id} 的内容和出版物。', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => '作者', + 'description' => '管理播客 #{id} 的内容,但不能发布。', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => '访客', + 'description' => '播客 #{id} 的普通贡献者。', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => '可以查看播客 #{id} 的仪表板和分析。', + 'edit' => '可以编辑播客 #{id}。', + 'delete' => '可以删除播客 #{id}。', + 'manage-import' => '可以同步导入的播客 #{id}。', + 'manage-persons' => '可以管理播客 #{id} 的订阅。', + 'manage-subscriptions' => '可以管理播客 #{id} 的订阅。', + 'manage-contributors' => '可以管理播客 #{id} 的贡献者。', + 'manage-platforms' => '可以设置/删除播客 #{id} 的平台链接。', + 'manage-publications' => '可以发布播客 #{id}。', + 'manage-notifications' => '可以查看播客 #{id} 的通知并将其标记为已读。', + 'interact-as' => '可以在播客 #{id} 进行互动,以收藏、分享或回复帖子。', + 'episodes.view' => '可以查看播客 #{id} 的仪表板和分析。', + 'episodes.create' => '可以为播客 #{id} 创建剧集。', + 'episodes.edit' => '可以编辑播客 #{id} 的剧集。', + 'episodes.delete' => '可以删除播客 #{id} 的剧集。', + 'episodes.manage-persons' => '可以管理播客 #{id} 的剧集人。', + 'episodes.manage-clips' => '可以管理播客 #{id} 的视频剪辑或声音片段。', + 'episodes.manage-publications' => '可以发布/取消发布播客 #{id} 的剧集和帖子。', + 'episodes.manage-comments' => '可以创建/删除播客 #{id} 的剧集评论。', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => '你的6位验证码', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', + 'notEnoughPrivilege' => '你没有足够的权限访问该页面。', + 'set_password' => '设置你的密码', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'welcomeSubject' => '你已受邀加入 {siteName}', + 'emailWelcomeMailBody' => '在 {domain} 上为你创建了一个帐户,单击下面的登录链接设置您的密码。 该链接在发送此电子邮件后的 {numberOfHours} 小时内有效。', ]; diff --git a/modules/Auth/Language/zh-Hans/Contributor.php b/modules/Auth/Language/zh-Hans/Contributor.php index d90ef87d..0d28c5ad 100644 --- a/modules/Auth/Language/zh-Hans/Contributor.php +++ b/modules/Auth/Language/zh-Hans/Contributor.php @@ -28,10 +28,16 @@ return [ 'submit_add' => '添加贡献者', 'submit_edit' => '更新角色', ], - 'roles' => [ - 'podcast_admin' => '播客管理员', + 'delete_form' => [ + 'title' => '移除 {contributor}', + 'disclaimer' => + '你将要从贡献者中删除 {contributor},他们将无法再访问“{podcastTitle}”。', + 'understand' => '我明白,我想从“{podcastTitle}”中删除 {contributor}', + 'submit' => '移除', ], 'messages' => [ + 'editSuccess' => '已成功更改角色!', + 'editOwnerError' => "你无法编辑播客所有者!", 'removeOwnerError' => "你无法删除播客所有者!", 'removeSuccess' => '你从 {username} 移除 {podcastTitle}', diff --git a/modules/Auth/Language/zh-Hans/User.php b/modules/Auth/Language/zh-Hans/User.php index f76f603d..5440c60a 100644 --- a/modules/Auth/Language/zh-Hans/User.php +++ b/modules/Auth/Language/zh-Hans/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_roles' => "编辑 {username} 的角色", + 'edit_role' => "编辑 {username} 的角色", 'ban' => '封禁', 'unban' => '取消封禁', 'delete' => '删除', @@ -18,7 +18,7 @@ return [ 'all_users' => '所有用户', 'list' => [ 'user' => '用户', - 'roles' => '角色', + 'role' => '角色', 'banned' => '已封禁?', ], 'form' => [ @@ -26,14 +26,19 @@ return [ 'username' => '用户名', 'password' => '密码', 'new_password' => '新密码', + 'role' => '角色', 'roles' => '角色', 'permissions' => '权限', 'submit_create' => '创建用户', 'submit_edit' => '保存', 'submit_password_change' => '修改!', ], - 'roles' => [ - 'superadmin' => '超级管理员', + 'delete_form' => [ + 'title' => '删除 {user} ?', + 'disclaimer' => + "你将永久删除 {user},他们将无法再访问管理区域。", + 'understand' => '我明白,我想永久删除 {user}', + 'submit' => '删除', ], 'messages' => [ 'createSuccess' => @@ -46,6 +51,8 @@ return [ '{username} 是实例的所有者,你不能编辑他的角色。', 'banSuperAdminError' => '{username} 是超级管理员,不能禁止超级管理员…', + 'deleteOwnerError' => + '{username} 是实例的所有者,不能简单地删除所有者…', 'deleteSuperAdminError' => '{username} 是超级管理员,不能封禁超级管理员…', 'deleteSuccess' => '{username} 已被删除。', diff --git a/modules/Install/Language/sv/Install.php b/modules/Install/Language/sv/Install.php index 1f66ef11..f2bc70b5 100644 --- a/modules/Install/Language/sv/Install.php +++ b/modules/Install/Language/sv/Install.php @@ -9,54 +9,54 @@ declare(strict_types=1); */ return [ - 'title' => 'Castopod installer', - 'manual_config' => 'Manual configuration', + 'title' => 'Installationsprogrammet för Castopod', + 'manual_config' => 'Manuell konfiguration', 'manual_config_subtitle' => - 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'Skapa en \'.env\' fil med dina inställningar och uppdatera sidan för att fortsätta installationen.', 'form' => [ - 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', - 'media_base_url' => 'Media base URL', + 'instance_config' => 'Konfiguration av instans', + 'hostname' => 'Servernamn', + 'media_base_url' => 'Bas-URL för media', 'media_base_url_hint' => - 'If you use a CDN and/or an external analytics service, you may set them here.', + 'Om du använder en CDN och/eller en extern analystjänst kan du ställa in dem här.', 'admin_gateway' => 'Admin gateway', 'admin_gateway_hint' => - 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'Rutten för att komma åt adminområdet (t.ex. https://example.com/cp-admin). Det är som standard inställt som cp-admin, vi rekommenderar att du ändrar det av säkerhetsskäl.', 'auth_gateway' => 'Auth gateway', 'auth_gateway_hint' => - 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', + 'Rutten för att komma åt autentiseringssidorna (t.ex. https://example.com/cp-auth). Den är som standard inställd som cp-auth, vi rekommenderar att du ändrar den av säkerhetsskäl.', + 'database_config' => 'Databas konfiguration', 'database_config_hint' => - 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', + 'Castopod måste ansluta till din MySQL (eller MariaDB) databas. Om du inte har dessa nödvändiga uppgifter, kontakta din serveradministratör.', + 'db_hostname' => 'Databasens värdnamn', + 'db_name' => 'Databasnamn', + 'db_username' => 'Användarnamn till databasen', + 'db_password' => 'Databasens lösenord', + 'db_prefix' => 'Databas prefix', 'db_prefix_hint' => - "The prefix of the Castopod table names, leave as is if you don't know what it means.", - 'cache_config' => 'Cache configuration', + "Prefixet för Castopod tabellnamn, lämna som om du inte vet vad det betyder.", + 'cache_config' => 'Cache-konfiguration', 'cache_config_hint' => - 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'Välj önskad cachehanterare. Lämna det som standardvärde om du inte har någon aning om vad det innebär.', 'cache_handler' => 'Cache handler', 'cacheHandlerOptions' => [ - 'file' => 'File', + 'file' => 'Fil', 'redis' => 'Redis', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', + 'next' => 'Nästa', + 'submit' => 'Slutför installationen', 'create_superadmin' => 'Create your superadmin account', - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', + 'email' => 'Epost', + 'username' => 'Användarnamn', + 'password' => 'Lösenord', ], 'messages' => [ 'createSuperAdminSuccess' => - 'Your superadmin account has been created successfully. Login to start podcasting!', + 'Ditt superadministratörskonto har skapats. Logga in för att starta podcasting!', 'databaseConnectError' => - 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'Castopod kunde inte ansluta till din databas. Redigera din databaskonfiguration och försök igen.', 'writeError' => - "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + "Kunde inte skapa/skriva `.env`-filen. Du måste skapa den manuellt genom att följa filmallen `.env.exempel` i Castopod-paketet.", ], ]; diff --git a/modules/PremiumPodcasts/Language/de/Subscription.php b/modules/PremiumPodcasts/Language/de/Subscription.php index f8af256f..cd0feacf 100644 --- a/modules/PremiumPodcasts/Language/de/Subscription.php +++ b/modules/PremiumPodcasts/Language/de/Subscription.php @@ -9,49 +9,49 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Podcast-Abonnements', + 'add' => 'Neues Abonnement', + 'view' => 'Abonnement anzeigen', + 'edit' => 'Abonnement bearbeiten', + 'regenerate_token' => 'Token neu generieren', + 'suspend' => 'Abonnement unterbrechen', + 'resume' => 'Abonnement fortsetzen', + 'delete' => 'Abonnement löschen', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Aktiv', + 'suspended' => 'Unterbrochen', + 'expired' => 'Abgelaufen', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', + 'number' => 'Nummer', + 'email' => 'E-Mail', 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', + 'unlimited' => 'Unbegrenzt', 'downloads' => 'Downloads', 'status' => 'Status', ], 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', - 'submit_edit' => 'Edit subscription', + 'email' => 'E-Mail', + 'expiration_date' => 'Ablaufdatum', + 'expiration_date_hint' => 'Das Datum und die Uhrzeit, zu der das Abonnement abläuft. Leer lassen für ein unbegrenztes Abonnement.', + 'submit_add' => 'Abonnement hinzufügen', + 'submit_edit' => 'Abonnement bearbeiten', ], 'form_link_add' => [ 'link' => 'Subscription page link', 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'submit' => 'Link speichern', ], 'suspend_form' => [ 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', + 'reason' => 'Grund', + 'reason_placeholder' => 'Warum unterbrechen Sie Ihr Abonnement?', + "submit" => 'Abonnement unterbrechen', ], 'delete_form' => [ 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', + 'submit' => 'Abonnement entfernen', ], 'messages' => [ 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', @@ -71,9 +71,9 @@ return [ ], 'emails' => [ 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', + 'token' => 'Ihr Token: {0}', + 'unique_feed_link' => 'Ihr eindeutiger Feed-Link: {0}', + 'how_to_use' => 'Wie nutzt man es?', 'two_ways' => 'You have two ways of unlocking the premium episodes:', 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', diff --git a/modules/PremiumPodcasts/Language/sv/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/sv/PremiumPodcasts.php index 18c0dd4e..21dcd34b 100644 --- a/modules/PremiumPodcasts/Language/sv/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/sv/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'podcast_is_premium' => 'Podcast innehåller premium avsnitt', + 'episode_is_premium' => 'Avsnitt är premium, endast tillgängligt för premium-prenumeranter', + 'unlock_episode' => 'Denna episod är endast för premiumprenumeranter. Klicka för att låsa upp den!', + 'banner_unlock' => 'Denna podcast innehåller premiumavsnitt som endast är tillgängliga för premiumprenumeranter.', + 'banner_lock' => 'Podcast är olåst, njut av premiumavsnitt!', + 'subscribe' => 'Prenumerera', + 'lock' => 'Lås', + 'unlock' => 'Lås upp', 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'title' => 'Premium-innehåll', + 'subtitle' => 'Denna podcast innehåller låsta premium-avsnitt! Har du nyckeln för att låsa upp dem?', + 'token' => 'Ange din nyckel', + 'token_hint' => 'Om du prenumererar på {podcastTitle} kan du kopiera nyckeln som skickades till dig via e-post och klistra in den här.', + 'submit' => 'Lås upp alla avsnitt!', + 'call_to_action' => 'Lås upp alla avsnitt av {podcastTitle}:', + 'subscribe_cta' => 'Prenumerera nu!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Podcast har låsts upp! Njut av premiumavsnitt!', + 'unlockBadAttempt' => 'Din nyckel verkar inte fungera…', + 'lockSuccess' => 'Podcast har låsts!', ], ]; diff --git a/modules/PremiumPodcasts/Language/sv/Subscription.php b/modules/PremiumPodcasts/Language/sv/Subscription.php index f8af256f..c2dee29e 100644 --- a/modules/PremiumPodcasts/Language/sv/Subscription.php +++ b/modules/PremiumPodcasts/Language/sv/Subscription.php @@ -9,92 +9,92 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Podcast prenumerationer', + 'add' => 'Ny prenumeration', + 'view' => 'Visa prenumeration', + 'edit' => 'Ändra prenumeration', + 'regenerate_token' => 'Generera om token', + 'suspend' => 'Avaktivera prenumeration', + 'resume' => 'Återuppta prenumeration', + 'delete' => 'Radera prenumeration', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Aktiv', + 'suspended' => 'Suspenderad', + 'expired' => 'Utgått', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', + 'number' => 'Nummer', + 'email' => 'Epost', + 'expiration_date' => 'Utgångsdatum', + 'unlimited' => 'Obegränsat', + 'downloads' => 'Nerladdningar', 'status' => 'Status', ], 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', - 'submit_edit' => 'Edit subscription', + 'email' => 'Epost', + 'expiration_date' => 'Utgångsdatum', + 'expiration_date_hint' => 'Datum och tid då prenumerationen går ut. Lämna tomt för ett obegränsat abonnemang.', + 'submit_add' => 'Lägg till en prenumeration', + 'submit_edit' => 'Ändra prenumeration', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'link' => 'Länk för prenumerationssida', + 'link_hint' => 'Detta kommer att lägga till en uppmaning till åtgärder på webbplatsen som bjuder in lyssnare att prenumerera på podcasten.', + 'submit' => 'Spara länk', ], 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', + 'disclaimer' => 'Avstängning av abonnemanget kommer att begränsa abonnenten från att ha tillgång till premiuminnehållet. Du kommer fortfarande att kunna lyfta suspensionen efteråt.', + 'reason' => 'Orsak', + 'reason_placeholder' => 'Varför stänger du av prenumerationen?', + "submit" => 'Avaktivera prenumeration', ], 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', - 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', + 'disclaimer' => 'Borttagning av {subscriber}s prenumeration kommer att ta bort all analysdata som är kopplad till den.', + 'understand' => 'Jag förstår, ta bort prenumerationen permanent', + 'submit' => 'Ta bort prenumeration', ], 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', - 'editError' => 'Subscription could not be edited.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', - 'regenerateTokenError' => 'Token could not be regenerated.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + 'addSuccess' => 'Ny prenumeration tillagd! Ett välkomstmeddelande skickades till {subscriber}.', + 'addError' => 'Prenumerationen kunde inte läggas till.', + 'editSuccess' => 'Prenumeration utgångsdatum uppdaterades! Ett e-postmeddelande skickades till {subscriber}.', + 'editError' => 'Prenumerationen kunde inte redigeras.', + 'regenerateTokenSuccess' => 'Token regenererad! Ett e-postmeddelande skickades till {subscriber} med den nya token.', + 'regenerateTokenError' => 'Token kunde inte regenereras.', + 'deleteSuccess' => 'Prenumerationen har tagits bort! Ett e-postmeddelande har skickats till {subscriber}.', + 'deleteError' => 'Prenumerationen kunde inte tas bort.', + 'suspendSuccess' => 'Prenumerationen suspenderades! Ett e-postmeddelande skickades till {subscriber}.', + 'suspendError' => 'Prenumerationen kunde inte stängas av.', + 'resumeSuccess' => 'Prenumerationen återupptades! Ett e-postmeddelande skickades till {subscriber}.', + 'resumeError' => 'Prenumerationen kunde inte återupptas.', + 'linkSaveSuccess' => 'Prenumerationslänken har sparats! Den kommer att visas på webbplatsen som en Call To Action!', + 'linkRemoveSuccess' => 'Prenumerationslänken har tagits bort!', ], 'emails' => [ - 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', - 'welcome_subject' => 'Welcome to {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', - 'edited_subject' => 'Your subscription has been updated!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', - 'suspended_subject' => 'Your subscription has been suspended!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', - 'suspended_reason' => 'That is for the following reason: {0}', - 'resumed_subject' => 'Your subscription has been resumed!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', - 'deleted_subject' => 'Your subscription has been removed!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', - 'footer' => '{castopod} hosted on {host}', + 'greeting' => 'Hej,', + 'token' => 'Din token: {0}', + 'unique_feed_link' => 'Din unika flödeslänk: {0}', + 'how_to_use' => 'Hur gör man?', + 'two_ways' => 'Du har två sätt att låsa upp premiumavsnitt:', + 'import_into_app' => 'Kopiera din unika feed url inuti din favorit podcast-app (importera den som ett privat flöde för att förhindra att du exponerar dina referenser).', + 'go_to_website' => 'Gå till {podcastWebsite}s webbplats och lås upp podcasten med din token.', + 'welcome_subject' => 'Välkommen till {podcastTitle}', + 'welcome' => 'Du har prenumererat på {podcastTitle}, tack och välkommen ombord!', + 'welcome_token_title' => 'Här är dina referenser för att låsa upp podcastens premiumavsnitt:', + 'welcome_expires' => 'Ditt abonnemang var inställt på att löpa ut {0}.', + 'welcome_never_expires' => 'Din prenumeration var inställd på att aldrig upphöra.', + 'reset_subject' => 'Din token återställdes!', + 'reset_token' => 'Din åtkomst till {podcastTitle} har återställts!', + 'reset_token_title' => 'Nya autentiseringsuppgifter har skapats för att du ska kunna låsa upp podcastens premiumavsnitt:', + 'edited_subject' => 'Din prenumeration har uppdaterats!', + 'edited_expires' => 'Ditt abonnemang för {podcastTitle} sattes att löpa ut den {expiresAt}.', + 'edited_never_expires' => 'Din prenumeration på {podcastTitle} har ställts in på att aldrig upphör!', + 'suspended_subject' => 'Din prenumeration har stängts av!', + 'suspended' => 'Din prenumeration på {podcastTitle} har stängts av! Du kan inte längre komma åt podcastens premiumavsnitt.', + 'suspended_reason' => 'Det är av följande skäl: {0}', + 'resumed_subject' => 'Din prenumeration har återupptagits!', + 'resumed' => 'Din prenumeration på {podcastTitle} har återupptagits! Du kan komma åt podcastens premiumavsnitt igen.', + 'deleted_subject' => 'Din prenumeration har tagits bort!', + 'deleted' => 'Din prenumeration på {podcastTitle} har tagits bort! Du har inte längre tillgång till podcastens premiumavsnitt.', + 'footer' => '{castopod} hostas på {host}', ], ]; From 7ba5f158398207a1cc1ccd392eb2709daa5501e4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 4 Nov 2022 11:24:09 +0000 Subject: [PATCH 031/477] chore(release): 1.0.2 [skip ci] ## [1.0.2](https://code.castopod.org/adaures/castopod/compare/v1.0.1...v1.0.2) (2022-11-04) ### Bug Fixes * **auth:** disallow registration by default ([379b9be](https://code.castopod.org/adaures/castopod/commit/379b9be2b99574fe4af4009b01128dba2c75f037)) * **contributors:** add prefix to podcast group to delete contributor ([9f785db](https://code.castopod.org/adaures/castopod/commit/9f785db7ba674638a6f456aa3626f3f8100911f1)) * extract podcast ids from user groups using a regex ([e26215a](https://code.castopod.org/adaures/castopod/commit/e26215a11fc23aa0ad5ccff8ee97d6c6e8a09c1a)) * **notifications:** add manage-notifications permission to podcast ([ed7c247](https://code.castopod.org/adaures/castopod/commit/ed7c247bcbbb450e5ff96418930d3b37ce912cc4)) * **platforms:** convert special characters to htmlentities to validate url ([82310a2](https://code.castopod.org/adaures/castopod/commit/82310a2e0b426e84501090bdd9c0cf592d1c0d53)) --- CHANGELOG.md | 15 +++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 612078fa..59fc304a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## [1.0.2](https://code.castopod.org/adaures/castopod/compare/v1.0.1...v1.0.2) (2022-11-04) + +### Bug Fixes + +- **auth:** disallow registration by default + ([379b9be](https://code.castopod.org/adaures/castopod/commit/379b9be2b99574fe4af4009b01128dba2c75f037)) +- **contributors:** add prefix to podcast group to delete contributor + ([9f785db](https://code.castopod.org/adaures/castopod/commit/9f785db7ba674638a6f456aa3626f3f8100911f1)) +- extract podcast ids from user groups using a regex + ([e26215a](https://code.castopod.org/adaures/castopod/commit/e26215a11fc23aa0ad5ccff8ee97d6c6e8a09c1a)) +- **notifications:** add manage-notifications permission to podcast + ([ed7c247](https://code.castopod.org/adaures/castopod/commit/ed7c247bcbbb450e5ff96418930d3b37ce912cc4)) +- **platforms:** convert special characters to htmlentities to validate url + ([82310a2](https://code.castopod.org/adaures/castopod/commit/82310a2e0b426e84501090bdd9c0cf592d1c0d53)) + ## [1.0.1](https://code.castopod.org/adaures/castopod/compare/v1.0.0...v1.0.1) (2022-11-01) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 65637ce3..a8df469c 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.0.1'); +defined('CP_VERSION') || define('CP_VERSION', '1.0.2'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index be977cae..684dc228 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "podlibre/castopod-host", - "version": "1.0.1", + "version": "1.0.2", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package-lock.json b/package-lock.json index e390c981..e813af7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "castopod-host", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "castopod-host", - "version": "1.0.1", + "version": "1.0.2", "license": "AGPL-3.0-or-later", "dependencies": { "@amcharts/amcharts4": "^4.10.29", diff --git a/package.json b/package.json index dfbb3f78..c6c5609a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod-host", - "version": "1.0.1", + "version": "1.0.2", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 0bb1c9635a517f9b245fa35abd83995ea5fedb6a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 7 Nov 2022 13:38:27 +0000 Subject: [PATCH 032/477] ci: fix docker build job rules by including main branch --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 266e8598..c275cec6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -166,7 +166,7 @@ docker: variables: PARENT_PIPELINE_ID: $CI_PIPELINE_ID rules: - - if: ($CI_COMMIT_BRANCH == "alpha" || $CI_COMMIT_BRANCH == "alpha" || $CI_COMMIT_BRANCH == "beta") && $CI_PROJECT_NAMESPACE == "adaures" + - if: ($CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "alpha" || $CI_COMMIT_BRANCH == "beta") && $CI_PROJECT_NAMESPACE == "adaures" exists: - CP_VERSION.env - if: ($CI_COMMIT_BRANCH == "develop" && $CI_PROJECT_NAMESPACE == "adaures") From 5227b5fc29df126b9b5411560a76cb7984583ba3 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 7 Nov 2022 16:00:40 +0000 Subject: [PATCH 033/477] refactor(webmonetization): update value tag to follow new WM proposal --- app/Helpers/rss_helper.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 16845ae9..5c55c280 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -90,11 +90,10 @@ if (! function_exists('get_rss_feed')) { if ($podcast->payment_pointer !== null) { $valueElement = $channel->addChild('value', null, $podcastNamespace); $valueElement->addAttribute('type', 'webmonetization'); - $valueElement->addAttribute('method', ''); - $valueElement->addAttribute('suggested', ''); + $valueElement->addAttribute('method', 'ILP'); $recipientElement = $valueElement->addChild('valueRecipient', null, $podcastNamespace); $recipientElement->addAttribute('name', $podcast->owner_name); - $recipientElement->addAttribute('type', 'ILP'); + $recipientElement->addAttribute('type', 'paymentpointer'); $recipientElement->addAttribute('address', $podcast->payment_pointer); $recipientElement->addAttribute('split', '100'); } From 00836cc368c75ae2e23fa5dc4a53a5bb6eb2ce24 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 7 Nov 2022 16:55:25 +0000 Subject: [PATCH 034/477] fix(dashboard-ui): fill the blank gaps between cards on smaller screen sizes --- app/Views/Components/DashboardCard.php | 8 ++++---- themes/cp_admin/dashboard.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Views/Components/DashboardCard.php b/app/Views/Components/DashboardCard.php index 47402237..573d4955 100644 --- a/app/Views/Components/DashboardCard.php +++ b/app/Views/Components/DashboardCard.php @@ -29,17 +29,17 @@ class DashboardCard extends Component $chevronRight = icon('chevron-right'); $viewLang = lang('Common.view'); return << +
{$glyph}
{$this->title}
{$viewLang}{$chevronRight}

{$this->subtitle}

-
{$this->slot}
+
{$this->slot}
HTML; } return << +
{$glyph}
{$this->title}

{$this->subtitle}

-
{$this->slot}
+
{$this->slot}
HTML; } diff --git a/themes/cp_admin/dashboard.php b/themes/cp_admin/dashboard.php index e3f6222c..c47fa597 100644 --- a/themes/cp_admin/dashboard.php +++ b/themes/cp_admin/dashboard.php @@ -11,7 +11,7 @@ section('content') ?> -
+
From 0eb223baa069b5131e1048a8d6c1ee4b512d5824 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 10 Nov 2022 16:47:55 +0000 Subject: [PATCH 035/477] chore: update CodeIgniter to v4.2.10 --- app/Libraries/MediaClipper/VideoClipper.php | 2 +- app/Libraries/Router.php | 4 +- composer.json | 2 +- composer.lock | 168 ++++++++++---------- modules/Fediverse/HttpSignature.php | 2 +- modules/Fediverse/WebFinger.php | 2 +- 6 files changed, 91 insertions(+), 89 deletions(-) diff --git a/app/Libraries/MediaClipper/VideoClipper.php b/app/Libraries/MediaClipper/VideoClipper.php index 7bf7e280..c057415d 100644 --- a/app/Libraries/MediaClipper/VideoClipper.php +++ b/app/Libraries/MediaClipper/VideoClipper.php @@ -297,7 +297,7 @@ class VideoClipper { $background = $this->generateBackground($this->dimensions['width'], $this->dimensions['height']); - if (! $background instanceof \GdImage) { + if (! $background instanceof GdImage) { return false; } diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php index 9eb9fa51..f42f7491 100644 --- a/app/Libraries/Router.php +++ b/app/Libraries/Router.php @@ -164,10 +164,10 @@ class Router extends CodeIgniterRouter str_contains($routeKey, '/') ) { $replacekey = str_replace('/(.*)', '', $routeKey); - $val = preg_replace('#^' . $routeKey . '$#u', $val, $uri); + $val = preg_replace('#^' . $routeKey . '$#u', (string) $val, $uri); $val = str_replace($replacekey, str_replace('/', '\\', $replacekey), $val); } elseif (str_contains((string) $val, '$') && str_contains($routeKey, '(')) { - $val = preg_replace('#^' . $routeKey . '$#u', $val, $uri); + $val = preg_replace('#^' . $routeKey . '$#u', (string) $val, $uri); } elseif (str_contains((string) $val, '/')) { [$controller, $method] = explode('::', (string) $val); diff --git a/composer.json b/composer.json index 684dc228..1581f856 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,7 @@ "license": "AGPL-3.0-or-later", "require": { "php": "^8.1", - "codeigniter4/framework": "v4.2.7", + "codeigniter4/framework": "v4.2.10", "james-heinrich/getid3": "^2.0.x-dev", "whichbrowser/parser": "^v2.1.7", "geoip2/geoip2": "v2.13.0", diff --git a/composer.lock b/composer.lock index 90d0c673..07dfac71 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cce1336454d39f470af759fd078e55a9", + "content-hash": "ec434296cd3ae06cb0f6d5fcee2a1ce4", "packages": [ { "name": "adaures/ipcat-php", @@ -169,16 +169,16 @@ }, { "name": "codeigniter4/framework", - "version": "v4.2.7", + "version": "v4.2.10", "source": { "type": "git", "url": "https://github.com/codeigniter4/framework.git", - "reference": "011ce3bbda6f85930075a9b8fecbee01c4b23ab9" + "reference": "6ffad151a303c5817ad6b2d9b996d07960aff2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/011ce3bbda6f85930075a9b8fecbee01c4b23ab9", - "reference": "011ce3bbda6f85930075a9b8fecbee01c4b23ab9", + "url": "https://api.github.com/repos/codeigniter4/framework/zipball/6ffad151a303c5817ad6b2d9b996d07960aff2cc", + "reference": "6ffad151a303c5817ad6b2d9b996d07960aff2cc", "shasum": "" }, "require": { @@ -194,15 +194,19 @@ "require-dev": { "codeigniter/coding-standard": "^1.5", "fakerphp/faker": "^1.9", - "friendsofphp/php-cs-fixer": "~3.11.0", + "friendsofphp/php-cs-fixer": "~3.13.0", "mikey179/vfsstream": "^1.6", "nexusphp/cs-config": "^3.6", "phpunit/phpunit": "^9.1", "predis/predis": "^1.1 || ^2.0" }, "suggest": { + "ext-dom": "If you use TestResponse", + "ext-exif": "If you run Image class tests", "ext-fileinfo": "Improves mime type detection for files", + "ext-gd": "If you use Image class GDHandler", "ext-imagick": "If you use Image class ImageMagickHandler", + "ext-libxml": "If you use TestResponse", "ext-memcache": "If you use Cache class MemcachedHandler with Memcache", "ext-memcached": "If you use Cache class MemcachedHandler with Memcached", "ext-mysqli": "If you use MySQL", @@ -212,7 +216,8 @@ "ext-redis": "If you use Cache class RedisHandler", "ext-simplexml": "If you format XML", "ext-sqlite3": "If you use SQLite3", - "ext-sqlsrv": "If you use SQL Server" + "ext-sqlsrv": "If you use SQL Server", + "ext-xdebug": "If you use CIUnitTestCase::assertHeaderEmitted()" }, "type": "project", "autoload": { @@ -230,7 +235,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/codeigniter4/CodeIgniter4" }, - "time": "2022-10-06T13:46:23+00:00" + "time": "2022-11-05T22:23:07+00:00" }, { "name": "codeigniter4/settings", @@ -955,16 +960,16 @@ }, { "name": "league/commonmark", - "version": "2.3.6", + "version": "2.3.7", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "857afc47ce113454bd629037213378ba3219dd40" + "reference": "a36bd2be4f5387c0f3a8792a0d76b7d68865abbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/857afc47ce113454bd629037213378ba3219dd40", - "reference": "857afc47ce113454bd629037213378ba3219dd40", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/a36bd2be4f5387c0f3a8792a0d76b7d68865abbf", + "reference": "a36bd2be4f5387c0f3a8792a0d76b7d68865abbf", "shasum": "" }, "require": { @@ -1055,7 +1060,7 @@ "type": "tidelift" } ], - "time": "2022-10-30T16:45:38+00:00" + "time": "2022-11-03T17:29:46+00:00" }, { "name": "league/config", @@ -1975,21 +1980,20 @@ }, { "name": "ramsey/uuid", - "version": "4.5.1", + "version": "4.6.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d" + "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/a161a26d917604dc6d3aa25100fddf2556e9f35d", - "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/ad63bc700e7d021039e30ce464eba384c4a1d40f", + "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f", "shasum": "" }, "require": { "brick/math": "^0.8.8 || ^0.9 || ^0.10", - "ext-ctype": "*", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.0" @@ -2021,7 +2025,6 @@ }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-ctype": "Enables faster processing of character classification using ctype functions.", "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", @@ -2045,7 +2048,7 @@ "keywords": ["guid", "identifier", "uuid"], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.5.1" + "source": "https://github.com/ramsey/uuid/tree/4.6.0" }, "funding": [ { @@ -2057,7 +2060,7 @@ "type": "tidelift" } ], - "time": "2022-09-16T03:22:46+00:00" + "time": "2022-11-05T23:03:38+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2124,16 +2127,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -2148,7 +2151,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2177,7 +2180,7 @@ "homepage": "https://symfony.com", "keywords": ["compatibility", "ctype", "polyfill", "portable"], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -2193,20 +2196,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -2221,7 +2224,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2250,7 +2253,7 @@ "homepage": "https://symfony.com", "keywords": ["compatibility", "mbstring", "polyfill", "portable", "shim"], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -2266,20 +2269,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -2288,7 +2291,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2322,7 +2325,7 @@ "homepage": "https://symfony.com", "keywords": ["compatibility", "polyfill", "portable", "shim"], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -2338,20 +2341,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { @@ -2360,7 +2363,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2390,7 +2393,7 @@ "homepage": "https://symfony.com", "keywords": ["compatibility", "polyfill", "portable", "shim"], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -2406,7 +2409,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "vlucas/phpdotenv", @@ -2623,16 +2626,16 @@ }, { "name": "composer/pcre", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" + "reference": "4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", - "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", + "url": "https://api.github.com/repos/composer/pcre/zipball/4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb", + "reference": "4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb", "shasum": "" }, "require": { @@ -2667,7 +2670,7 @@ "keywords": ["PCRE", "preg", "regex", "regular expression"], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.0" + "source": "https://github.com/composer/pcre/tree/3.0.2" }, "funding": [ { @@ -2683,7 +2686,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T20:21:48+00:00" + "time": "2022-11-03T20:24:16+00:00" }, { "name": "composer/semver", @@ -3357,16 +3360,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.0", + "version": "1.9.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e08de53a5eec983de78a787a88e72518cf8fe43a" + "reference": "d6fdf01c53978b6429f1393ba4afeca39cc68afa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e08de53a5eec983de78a787a88e72518cf8fe43a", - "reference": "e08de53a5eec983de78a787a88e72518cf8fe43a", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d6fdf01c53978b6429f1393ba4afeca39cc68afa", + "reference": "d6fdf01c53978b6429f1393ba4afeca39cc68afa", "shasum": "" }, "require": { @@ -3386,7 +3389,7 @@ "keywords": ["dev", "static analysis"], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.0" + "source": "https://github.com/phpstan/phpstan/tree/1.9.2" }, "funding": [ { @@ -3402,7 +3405,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T07:26:48+00:00" + "time": "2022-11-10T09:56:11+00:00" }, { "name": "phpunit/php-code-coverage", @@ -3832,26 +3835,25 @@ }, { "name": "rector/rector", - "version": "0.14.6", + "version": "0.14.7", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "e61574288661334155de6e5f0f45497285abad5d" + "reference": "3553aaba0e820083fc6d7f0dc78d8d789226a398" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/e61574288661334155de6e5f0f45497285abad5d", - "reference": "e61574288661334155de6e5f0f45497285abad5d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/3553aaba0e820083fc6d7f0dc78d8d789226a398", + "reference": "3553aaba0e820083fc6d7f0dc78d8d789226a398", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.8.7" + "phpstan/phpstan": "^1.9.0" }, "conflict": { "rector/rector-doctrine": "*", "rector/rector-downgrade-php": "*", - "rector/rector-laravel": "*", "rector/rector-php-parser": "*", "rector/rector-phpoffice": "*", "rector/rector-phpunit": "*", @@ -3872,7 +3874,7 @@ "description": "Instant Upgrade and Automated Refactoring of any PHP code", "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.14.6" + "source": "https://github.com/rectorphp/rector/tree/0.14.7" }, "funding": [ { @@ -3880,7 +3882,7 @@ "type": "github" } ], - "time": "2022-10-15T22:58:22+00:00" + "time": "2022-11-04T08:48:40+00:00" }, { "name": "sebastian/cli-parser", @@ -5505,16 +5507,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -5526,7 +5528,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5562,7 +5564,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -5578,20 +5580,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -5603,7 +5605,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5640,7 +5642,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -5656,7 +5658,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", diff --git a/modules/Fediverse/HttpSignature.php b/modules/Fediverse/HttpSignature.php index f5d08e43..7ca50fdf 100644 --- a/modules/Fediverse/HttpSignature.php +++ b/modules/Fediverse/HttpSignature.php @@ -116,7 +116,7 @@ class HttpSignature * * @return array|false */ - private function splitSignature(string $signature): array | false + private function splitSignature(string $signature): bool|array { if (! preg_match(self::SIGNATURE_PATTERN, $signature, $matches, PREG_UNMATCHED_AS_NULL)) { // Signature pattern failed diff --git a/modules/Fediverse/WebFinger.php b/modules/Fediverse/WebFinger.php index 82e0472f..857d663d 100644 --- a/modules/Fediverse/WebFinger.php +++ b/modules/Fediverse/WebFinger.php @@ -102,7 +102,7 @@ class WebFinger * * @return array|false */ - private function splitResource(string $resource): array | false + private function splitResource(string $resource): bool|array { if (! preg_match(self::RESOURCE_PATTERN, $resource, $matches)) { // Resource pattern failed From e96044085467bf0595a36a914370b4249008048a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 17 Nov 2022 13:49:44 +0000 Subject: [PATCH 036/477] docs(all-contributors): add missing translators in contributors list --- .all-contributorsrc | 76 ++++++++++++++++++++++++++- README.md | 122 +++++++++++++++++++++++--------------------- docs/src/index.md | 122 +++++++++++++++++++++++--------------------- 3 files changed, 204 insertions(+), 116 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 66f56d8e..5592daf8 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -370,7 +370,7 @@ { "login": "BoFFire", "name": "ButterflyOfFire", - "avatar_url": "https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png", + "avatar_url": "https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/5908e93ad5447f15.png", "profile": "https://mstdn.fr/@ButterflyOfFire", "contributions": [ { @@ -499,7 +499,7 @@ { "login": "irithys", "name": "irithys", - "avatar_url": "https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/e46d7f8e9f7c05997827563c3a3cf942.jpeg", + "avatar_url": "https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/3086461c47cce0a0c031925e5f943412.png", "profile": "https://im.irithys.com/@thy", "contributions": [ { @@ -531,6 +531,78 @@ "url": "https://translate.castopod.org" } ] + }, + { + "login": "basen1982", + "name": "Andreas Olsson", + "avatar_url": "https://castopod.org/assets/images/castopod-avatar.jpg", + "profile": "https://crowdin.com/profile/basen1982", + "contributions": [ + { + "type": "translation", + "url": "https://translate.castopod.org" + } + ] + }, + { + "login": "leonfrom", + "name": "leonfrom", + "avatar_url": "https://castopod.org/assets/images/castopod-avatar.jpg", + "profile": "https://crowdin.com/profile/leonfrom", + "contributions": [ + { + "type": "translation", + "url": "https://translate.castopod.org" + } + ] + }, + { + "login": "agentcobra57", + "name": "agentcobra", + "avatar_url": "https://castopod.org/assets/images/castopod-avatar.jpg", + "profile": "https://crowdin.com/profile/agentcobra57", + "contributions": [ + { + "type": "translation", + "url": "https://translate.castopod.org" + } + ] + }, + { + "login": "alephoto85", + "name": "Alessandro", + "avatar_url": "https://crowdin-static.downloads.crowdin.com/avatar/15094649/large/530391f54157af52ae33058ec15b0f99.jpg", + "profile": "https://crowdin.com/profile/alephoto85", + "contributions": [ + { + "type": "translation", + "url": "https://translate.castopod.org" + } + ] + }, + { + "login": "liimee", + "name": "liimee", + "avatar_url": "https://castopod.org/assets/images/castopod-avatar.jpg", + "profile": "https://crowdin.com/profile/liimee", + "contributions": [ + { + "type": "translation", + "url": "https://translate.castopod.org" + } + ] + }, + { + "login": "ahmed.sabouni11", + "name": "Ahmed Sabouni", + "avatar_url": "https://avatars.githubusercontent.com/u/74497842?v=4", + "profile": "https://github.com/ahmedsabouni", + "contributions": [ + { + "type": "translation", + "url": "https://translate.castopod.org" + } + ] } ], "commitConvention": "none" diff --git a/README.md b/README.md index 89b6c508..9206ff09 100644 --- a/README.md +++ b/README.md @@ -55,63 +55,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/index.md b/docs/src/index.md index b8a6f427..0154fd28 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
From b99f70cc6092a3d58ebf2ecc6595551c94b4a4a0 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 17 Nov 2022 14:30:22 +0000 Subject: [PATCH 037/477] ci(docker): revert docker job condition --- .gitlab-ci.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c275cec6..32748899 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -165,8 +165,11 @@ docker: strategy: depend variables: PARENT_PIPELINE_ID: $CI_PIPELINE_ID - rules: - - if: ($CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "alpha" || $CI_COMMIT_BRANCH == "beta") && $CI_PROJECT_NAMESPACE == "adaures" - exists: - - CP_VERSION.env - - if: ($CI_COMMIT_BRANCH == "develop" && $CI_PROJECT_NAMESPACE == "adaures") + only: + refs: + - develop + - main + - beta + - alpha + variables: + - $CI_PROJECT_NAMESPACE == "adaures" From b1e52ffac325bcf1711b4efca7093f9d40c1e8d2 Mon Sep 17 00:00:00 2001 From: crowdin Date: Thu, 17 Nov 2022 14:42:46 +0000 Subject: [PATCH 038/477] chore: new Crowdin updates --- app/Language/fr/Common.php | 2 +- docs/src/br/index.md | 122 +++++++++++--------- docs/src/el/getting-started/auth.md | 2 +- docs/src/es/index.md | 122 +++++++++++--------- docs/src/fa/index.md | 122 +++++++++++--------- docs/src/fr/index.md | 122 +++++++++++--------- docs/src/gd/index.md | 122 +++++++++++--------- docs/src/gl/index.md | 122 +++++++++++--------- docs/src/id/index.md | 122 +++++++++++--------- docs/src/nn-NO/index.md | 122 +++++++++++--------- docs/src/pt-BR/index.md | 122 +++++++++++--------- docs/src/pt/index.md | 122 +++++++++++--------- docs/src/ru/index.md | 122 +++++++++++--------- docs/src/sk/index.md | 122 +++++++++++--------- docs/src/sv/index.md | 122 +++++++++++--------- docs/src/zh-Hans/index.md | 122 +++++++++++--------- modules/Admin/Language/ar/AboutCastopod.php | 10 +- modules/Admin/Language/ar/Charts.php | 6 +- modules/Admin/Language/ar/Notifications.php | 4 +- modules/Admin/Language/ar/Page.php | 2 +- modules/Admin/Language/fr/Breadcrumb.php | 10 +- modules/Admin/Language/fr/Common.php | 4 +- modules/Admin/Language/fr/Episode.php | 76 ++++++------ modules/Admin/Language/fr/Navigation.php | 2 +- modules/Admin/Language/fr/Person.php | 2 +- modules/Admin/Language/fr/Podcast.php | 68 +++++------ 26 files changed, 1004 insertions(+), 892 deletions(-) diff --git a/app/Language/fr/Common.php b/app/Language/fr/Common.php index 7037cef8..c87b7fb4 100644 --- a/app/Language/fr/Common.php +++ b/app/Language/fr/Common.php @@ -26,5 +26,5 @@ return [ 'read_less' => 'Lire moins', 'see_more' => 'Voir plus', 'see_less' => 'Voir moins', - 'legal_notice' => 'Legal notice', + 'legal_notice' => 'Mentions légales', ]; diff --git a/docs/src/br/index.md b/docs/src/br/index.md index d89daccb..6e04835b 100644 --- a/docs/src/br/index.md +++ b/docs/src/br/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/el/getting-started/auth.md b/docs/src/el/getting-started/auth.md index 6c0ccd75..7e2d5947 100644 --- a/docs/src/el/getting-started/auth.md +++ b/docs/src/el/getting-started/auth.md @@ -3,7 +3,7 @@ title: Authentication & Authorization sidebarDepth: 3 --- -# Authentication & Authorization +# Ταυτοποίηση & εξουσιοδότηση Castopod handles authentication and authorization using `codeigniter/shield` coupled with custom rules. Roles and permissions are defined at two levels: diff --git a/docs/src/es/index.md b/docs/src/es/index.md index b0566d29..3dc90e06 100644 --- a/docs/src/es/index.md +++ b/docs/src/es/index.md @@ -193,63 +193,71 @@ Los agradecimientos van a estas estupendas personas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/fa/index.md b/docs/src/fa/index.md index d89daccb..6e04835b 100644 --- a/docs/src/fa/index.md +++ b/docs/src/fa/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md index 73e2a1ae..206098cf 100644 --- a/docs/src/fr/index.md +++ b/docs/src/fr/index.md @@ -187,63 +187,71 @@ Merci à toutes ces personnes merveilleuses - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md index 335197e0..91f3cd49 100644 --- a/docs/src/gd/index.md +++ b/docs/src/gd/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/gl/index.md b/docs/src/gl/index.md index d89daccb..6e04835b 100644 --- a/docs/src/gl/index.md +++ b/docs/src/gl/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/id/index.md b/docs/src/id/index.md index 234e051f..1258fa9e 100644 --- a/docs/src/id/index.md +++ b/docs/src/id/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md index 0c7598cc..870ef946 100644 --- a/docs/src/nn-NO/index.md +++ b/docs/src/nn-NO/index.md @@ -180,63 +180,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/pt-BR/index.md b/docs/src/pt-BR/index.md index 6152ea69..5cdcc77e 100644 --- a/docs/src/pt-BR/index.md +++ b/docs/src/pt-BR/index.md @@ -182,63 +182,71 @@ Agradecimento vai para essas pessoas maravilhosas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/pt/index.md b/docs/src/pt/index.md index d89daccb..6e04835b 100644 --- a/docs/src/pt/index.md +++ b/docs/src/pt/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/ru/index.md b/docs/src/ru/index.md index d89daccb..6e04835b 100644 --- a/docs/src/ru/index.md +++ b/docs/src/ru/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/sk/index.md b/docs/src/sk/index.md index d89daccb..6e04835b 100644 --- a/docs/src/sk/index.md +++ b/docs/src/sk/index.md @@ -179,63 +179,71 @@ Thanks goes to these wonderful people - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/sv/index.md b/docs/src/sv/index.md index 46d6ec05..65fb95a5 100644 --- a/docs/src/sv/index.md +++ b/docs/src/sv/index.md @@ -184,63 +184,71 @@ Tack går till dessa underbara människor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 :artist_palett: 🌍 💬 🧑 🏫 🚇 🤔 📆 memo:

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 :artist_palett: 🌍 💬 🧑 🏫 🚇 🤔 📆 memo:

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

Bastien Luneteau

💻 🐛

Bastien Luneteau

💻 🐛

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

João Leandro

🌍 🤔

Patryk Miś

🌍

Patryk Miś

🌍

Bastien Luneteau

💻 🐛

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

Patryk Miś

🌍

patryk Miś

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md index 0cd5b07e..8df5d7df 100644 --- a/docs/src/zh-Hans/index.md +++ b/docs/src/zh-Hans/index.md @@ -156,63 +156,71 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝

Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢

Ola Hneini

💻 👀 📖 🚧 💬 🤔

Romain de Laage

💻 🚇 📖 🌍 🤔

Lyonel Bernard

🐛 💬 🔊 🤔

Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔

Ernesto Acosta

🐛 🔊 🌍 💬 🤔

Bastien Luneteau

💻 🐛

Cécile Ricordeau

🎨

Patryk Miś

🌍

Marcin Lewandowski

🐛 🤔

Sebastian Janik

💻

Patryk Karczmarczyk

💻

denis d

🐛 🤔

Douglas Kastle

🐛 🤔

cExplorer

🐛 🌍

ImaCrea

🐛 🤔

Jonas S

💻

LEFEBVRE Yann

🐛

Sebastian Späth

🐛 🤔

rocky III

🐛

Hermann Josef Eckl

🐛

Delhaye Cyrille

🐛 🤔

João Leandro

🌍 🤔

Angelos Chouvardas

🌍

Eivind

🌍

Ewen

🌍 🤔

forght

🌍

glottis0q

🌍

ButterflyOfFire

🌍

Lucian I. Last

🌍

LuuzViir

🌍

CTHTC

🌍

Russian Retro

🌍

Marek L'ach

🌍

GunChleoc

🌍

GabiSnow

🌍

bendaha

🌍

Samuel Roland

🌍

Dimitri Regnier

🤔

irithys

🌍

Sergi

🌍

ghose (XoseM)

🌍
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
diff --git a/modules/Admin/Language/ar/AboutCastopod.php b/modules/Admin/Language/ar/AboutCastopod.php index 3fb62aff..f5bc662b 100644 --- a/modules/Admin/Language/ar/AboutCastopod.php +++ b/modules/Admin/Language/ar/AboutCastopod.php @@ -9,13 +9,13 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', + 'title' => 'حول كاستوبود', + 'host_name' => 'إسم المضيف', 'version' => 'Castopod version', 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'os' => 'نظام التشغيل', + 'languages' => 'اللغات', + 'update_database' => 'تحديث قاعدة البيانات', 'messages' => [ 'databaseUpdateSuccess' => 'Database is up to date!', ], diff --git a/modules/Admin/Language/ar/Charts.php b/modules/Admin/Language/ar/Charts.php index 4f0e8556..58bf1189 100644 --- a/modules/Admin/Language/ar/Charts.php +++ b/modules/Admin/Language/ar/Charts.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'by_service_weekly' => 'Episode downloads by service (for the past week)', + 'by_service_weekly' => 'تنزيلات الحلقة حسب الخدمة (للأسبوع الماضي)', 'by_player_weekly' => 'Episode downloads by player (for the past week)', 'by_player_yearly' => 'Episode downloads by player (for the past year)', 'by_device_weekly' => 'Episode downloads by device (for the past week)', @@ -24,7 +24,7 @@ return [ 'episode_by_month' => 'Episode monthly downloads', 'episodes_by_day' => '5 latest episodes downloads (during their first 60 days)', - 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_weekly' => 'تنزيلات الحلقة حسب البلد (في الأسبوع الماضي)', 'by_country_yearly' => 'Episode downloads by country (for the past year)', 'by_domain_weekly' => 'Web pages visits by source (for the past week)', 'by_domain_yearly' => 'Web pages visits by source (for the past year)', @@ -35,6 +35,6 @@ return [ 'by_weekday' => 'By week day (for the past 60 days)', 'by_hour' => 'By time of day (for the past 60 days)', 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', - 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_storage_by_month' => 'التخزين الشهري (بالميغابايت)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', ]; diff --git a/modules/Admin/Language/ar/Notifications.php b/modules/Admin/Language/ar/Notifications.php index 2b139d51..8e86a2b3 100644 --- a/modules/Admin/Language/ar/Notifications.php +++ b/modules/Admin/Language/ar/Notifications.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'Notifications', + 'title' => 'الإشعارات', 'reply' => '{actor_username} replied to your post', 'favourite' => '{actor_username} favourited your post', 'reblog' => '{actor_username} shared your post', 'follow' => '{actor_username} started following you', - 'no_notifications' => 'No notifications', + 'no_notifications' => 'لا توجد إشعارات', 'mark_all_as_read' => 'Mark all as read', ]; diff --git a/modules/Admin/Language/ar/Page.php b/modules/Admin/Language/ar/Page.php index d4145ddc..31dde5a1 100644 --- a/modules/Admin/Language/ar/Page.php +++ b/modules/Admin/Language/ar/Page.php @@ -24,7 +24,7 @@ return [ 'submit_edit' => 'حفظ', ], 'messages' => [ - 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'createSuccess' => 'تم إنشاء الصفحة "{pageTitle}" بنجاح!', 'editSuccess' => 'تم تحديث الصفحة بنجاح!', ], ]; diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php index 6f78f95d..54a5ab23 100644 --- a/modules/Admin/Language/fr/Breadcrumb.php +++ b/modules/Admin/Language/fr/Breadcrumb.php @@ -14,22 +14,22 @@ return [ ->gateway => 'Accueil', 'podcasts' => 'podcasts', 'episodes' => 'épisodes', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'abonnements', 'contributors' => 'contributeurs', 'pages' => 'pages', 'settings' => 'paramètres', 'theme' => 'thème', - 'about' => 'about', + 'about' => 'à propos', 'add' => 'ajouter', 'new' => 'créer', 'edit' => 'modifier', 'persons' => 'intervenants', 'publish' => 'publier', 'publish-edit' => 'modifier la publication', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'définir la date de publication', 'unpublish' => 'dépublier', 'delete' => 'supprimer', - 'remove' => 'remove', + 'remove' => 'retirer', 'fediverse' => 'fédiverse', 'block-lists' => 'listes de blocage', 'users' => 'utilisateurs', @@ -50,5 +50,5 @@ return [ 'video-clips' => 'extraits vidéo', 'embed' => 'lecteur intégré', 'notifications' => 'notifications', - 'suspend' => 'suspend', + 'suspend' => 'suspendre', ]; diff --git a/modules/Admin/Language/fr/Common.php b/modules/Admin/Language/fr/Common.php index f66f2a29..0a12d861 100644 --- a/modules/Admin/Language/fr/Common.php +++ b/modules/Admin/Language/fr/Common.php @@ -46,6 +46,6 @@ return [ 'playing' => 'En cours', ], 'size_limit' => 'Taille maximale : {0}.', - 'choose_interact' => 'Choose how to interact', - 'view' => 'View', + 'choose_interact' => 'Choisissez comment interagir', + 'view' => 'Voir', ]; diff --git a/modules/Admin/Language/fr/Episode.php b/modules/Admin/Language/fr/Episode.php index dbdf875c..51b8d4d7 100644 --- a/modules/Admin/Language/fr/Episode.php +++ b/modules/Admin/Language/fr/Episode.php @@ -24,14 +24,14 @@ return [ 'edit' => 'Modifier', 'publish' => 'Publier', 'publish_edit' => 'Modifier la publication', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Définir la date de publication', 'unpublish' => 'Dépublier', 'publish_error' => 'L’épisode est déjà publié.', 'publish_edit_error' => 'L’épisode est déjà publié.', 'publish_cancel_error' => 'L’épisode est déjà publié.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'L\'épisode n\'a pas encore été publié, vous ne pouvez pas modifier sa date de publication.', + 'publish_date_edit_future_error' => 'La date de publication de l\'épisode ne peut être définie qu\'à une date antérieure! Si vous souhaitez la replanifier, dépubliez-la d\'abord.', + 'publish_date_edit_success' => 'La date de publication de l\'épisode a été mise à jour avec succès !', 'unpublish_error' => 'L’épisode n’est pas publié.', 'delete' => 'Supprimer', 'go_to_page' => 'Voir', @@ -42,7 +42,7 @@ return [ 'scheduled' => 'Planifié', 'not_published' => 'Non publié', ], - 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'with_podcast_hint' => 'Publier en même temps que le podcast', 'list' => [ 'search' => [ 'placeholder' => 'Rechercher un épisode', @@ -50,8 +50,8 @@ return [ 'submit' => 'Recherche', ], 'number_of_episodes' => '{numberOfEpisodes, plural, - one {# episode} - other {# episodes} + one {# épisode} + other {# épisodes} }', 'episode' => 'Épisode', 'visibility' => 'Visibilité', @@ -62,31 +62,31 @@ return [ 'createSuccess' => 'L’épisode a été créé avec succès !', 'editSuccess' => 'L’épisode a bien été mis à jour !', 'publishSuccess' => '{publication_status, select, - published {Episode successfully published!} - scheduled {Episode publication successfully scheduled!} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not published.} + published {Épisode publié avec succès !} + scheduled {La publication de l\'épisode est planifiée avec succès !} + with_podcast {Cet épisode sera publié en même temps que le podcast.} + other {Cet épisode n\'est pas publié.} }', 'publishCancelSuccess' => 'La publication de l’épisode a bien été annulée !', - 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', - 'scheduleDateError' => 'Schedule date must be set!', - 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'unpublishBeforeDeleteTip' => 'Vous devez dépublier l\'épisode avant de le supprimer.', + 'scheduleDateError' => 'La date de planification doit être définie !', + 'deletePublishedEpisodeError' => 'Vous devez dépublier l\'épisode avant de le supprimer.', 'deleteSuccess' => 'L\'épisode a bien été supprimé !', - 'deleteError' => 'Failed to delete episode {type, select, - transcript {transcript} - chapters {chapters} - image {cover} + 'deleteError' => 'Impossible de supprimer l\'épisode {type, select, + transcript {transcription} + chapters {chapitres} + image {couverture} audio {audio} - other {media} + other {média} }.', - 'deleteFileError' => 'Failed to delete {type, select, - transcript {transcript} - chapters {chapters} - image {cover} + 'deleteFileError' => 'Impossible de supprimer {type, select, + transcript {transcription} + chapters {chapitres} + image {couverture} audio {audio} - other {media} - } file {file_path}. You may manually remove it from your disk.', - 'sameSlugError' => 'An episode with the chosen slug already exists.', + other {média} + } fichier {file_path}. Vous pouvez le supprimer manuellement de votre disque.', + 'sameSlugError' => 'Il existe déjà un épisode avec le slug choisi.', ], 'form' => [ 'file_size_error' => @@ -97,7 +97,7 @@ return [ 'cover' => 'Image de couverture', 'cover_hint' => 'Si vous ne définissez pas d’image, celle du podcast sera utilisée à la place.', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'cover_size_hint' => 'L’image doit être carrée et avoir au moins 1400px de largeur et de hauteur.', 'title' => 'Titre', 'title_hint' => 'Doit contenir un titre d’épisode clair et concis. Ne précisez ici aucun numéro de saison ou d’épisode.', @@ -113,8 +113,8 @@ return [ 'bonus' => 'Bonus', 'bonus_hint' => 'Contenu supplémentaire pour le podcast (par exemple des informations sur les coulisses ou des interviews avec les acteurs) ou du contenu promotionnel croisé pour un autre podcast', ], - 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium_title' => 'Prémium', + 'premium' => 'L\'épisode doit être accessible aux abonnés premium uniquement', 'parental_advisory' => [ 'label' => 'Avertissement parental', 'hint' => 'L’épisode contient-il un contenu explicite ?', @@ -131,7 +131,7 @@ return [ 'Ce texte est ajouté à la fin de chaque description d’épisode, c’est un bon endroit pour placer vos liens sociaux par exemple.', 'additional_files_section_title' => 'Fichiers additionels', 'additional_files_section_subtitle' => - 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'Ces fichiers pourront être utilisées par d’autres plate-formes pour procurer une meilleure expérience à vos auditeurs. Consulter le {podcastNamespaceLink} pour plus d’informations.', 'location_section_title' => 'Localisation', 'location_section_subtitle' => 'De quel lieu cet épisode parle-t-il ?', 'location_name' => 'Nom ou adresse du lieu', @@ -153,9 +153,9 @@ return [ 'Si vous avez besoin d’une balise que Castopod ne couvre pas, définissez-la ici.', 'custom_rss' => 'Balises RSS personnalisées pour l’épisode', 'custom_rss_hint' => 'Ceci sera injecté dans la balise ❬item❭.', - 'block' => 'Episode should be hidden from public catalogues', + 'block' => 'L\'épisode doit être masqué dans les catalogues publics', 'block_hint' => - 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'L\'épisode montre ou masque le statut: activer ceci empêche l\'épisode d\'apparaître dans les Podcasts Apple, Google Podcasts, et toutes les applications tierces qui tirent vers ces répertoires. (non garanti)', 'submit_create' => 'Créer l’épisode', 'submit_edit' => 'Enregistrer l’épisode', ], @@ -169,7 +169,7 @@ return [ 'publication_method' => [ 'now' => 'Maintenant', 'schedule' => 'Planifier', - 'with_podcast' => 'Publish alongside podcast', + 'with_podcast' => 'Publier à côté du podcast', ], 'scheduled_publication_date' => 'Date de publication programmée', 'scheduled_publication_date_clear' => 'Effacer la date de publication', @@ -183,19 +183,19 @@ return [ 'message_warning_submit' => 'Publier quand même', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Date de la prochaine publication', + 'new_publication_date_hint' => 'Doit être défini à une date antérieure.', + 'submit' => 'Définir la date de publication', ], 'unpublish_form' => [ 'disclaimer' => - "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + "Dépublier l'épisode supprimera tous les commentaires et messages qui lui sont associés et le supprimera du flux RSS du podcast.", 'understand' => 'Je comprends, je veux dépublier l’épisode', 'submit' => 'Dépublier', ], 'delete_form' => [ 'disclaimer' => - "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + "La suppression de l'épisode supprimera tous les fichiers multimédia, les commentaires, les clips vidéo et les parties sonores qui y sont associées.", 'understand' => 'Je comprends, je veux supprimer l’épisode', 'submit' => 'Supprimer', ], diff --git a/modules/Admin/Language/fr/Navigation.php b/modules/Admin/Language/fr/Navigation.php index a0cd50c0..e5ccf297 100644 --- a/modules/Admin/Language/fr/Navigation.php +++ b/modules/Admin/Language/fr/Navigation.php @@ -33,7 +33,7 @@ return [ 'settings' => 'Paramètres', 'settings-general' => 'Général', 'settings-theme' => 'Thème', - 'about' => 'About', + 'about' => 'À propos', 'account' => [ 'my-account' => 'Mon compte', 'change-password' => 'Modifier le mot de passe', diff --git a/modules/Admin/Language/fr/Person.php b/modules/Admin/Language/fr/Person.php index e5f3128a..afd6d28f 100644 --- a/modules/Admin/Language/fr/Person.php +++ b/modules/Admin/Language/fr/Person.php @@ -24,7 +24,7 @@ return [ 'form' => [ 'avatar' => 'Avatar', 'avatar_size_hint' => - 'Avatar must be squared and at least 400px wide and tall.', + 'L\'avatar doit être carré et au moins 400px de largeur et de hauteur.', 'full_name' => 'Nom complet', 'full_name_hint' => 'Le nom complet ou le pseudonyme de l’intervenant', 'unique_name' => 'Nom unique', diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php index 41255ff2..195d917c 100644 --- a/modules/Admin/Language/fr/Podcast.php +++ b/modules/Admin/Language/fr/Podcast.php @@ -16,51 +16,51 @@ return [ 'new_episode' => 'Créer un épisode', 'view' => 'Voir le podcast', 'edit' => 'Modifier le podcast', - 'publish' => 'Publish podcast', - 'publish_edit' => 'Edit publication', + 'publish' => 'Publier le podcast', + 'publish_edit' => 'Modifier la publication', 'delete' => 'Supprimer le podcast', 'see_episodes' => 'Voir les épisodes', 'see_contributors' => 'Voir les contributeurs', 'go_to_page' => 'Aller à la page', 'latest_episodes' => 'Derniers épisodes', 'see_all_episodes' => 'Voir tous les épisodes', - 'draft' => 'Draft', + 'draft' => 'Brouillon', 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', + 'createSuccess' => 'Le podcast a été créé avec succès !', 'editSuccess' => 'Le podcast a bien été mis à jour !', 'importSuccess' => 'Le podcast a été importé avec succès !', - 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', - 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, - cover {cover} - banner {banner} - other {media} + 'deleteSuccess' => 'Podcast @{podcast_handle} a été supprimé avec succès !', + 'deletePodcastMediaError' => 'Impossible de supprimer le podcast {type, select, + cover {couverture} + banner {bannière} + other {média} }.', - 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, - transcript {transcript} - chapters {chapters} - image {cover} + 'deleteEpisodeMediaError' => 'Impossible de supprimer l\'épisode de podcast {episode_slug} {type, select, + transcript {transcription} + chapters {chapitres} + image {couverture} audio {audio} - other {media} + other {média} }.', - 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', - 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, - one {# episode was} - other {# episodes were} - } added to the podcast!', - 'podcastFeedUpToDate' => 'Podcast is already up to date.', - 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', - 'publishError' => 'This podcast is either already published or scheduled for publication.', - 'publishEditError' => 'This podcast is not scheduled for publication.', - 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', - 'scheduleDateError' => 'Schedule date must be set!', + 'deletePodcastMediaFolderError' => 'Impossible de supprimer le dossier de podcast {folder_path}. Vous pouvez le supprimer manuellement de votre disque.', + 'podcastFeedUpdateSuccess' => 'Mise à jour réussie : {number_of_new_episodes, plural, + one {# épisode a été} + other {# épisodes ont été} + } ajoutés au podcast!', + 'podcastFeedUpToDate' => 'Le podcast est déjà à jour.', + 'podcastNotImported' => 'Le podcast n\'a pas pu être mis à jour car il n\'a pas été importé.', + 'publishError' => 'Ce podcast est soit déjà publié, soit programmé pour publication.', + 'publishEditError' => 'Ce podcast n\'est pas programmé pour publication.', + 'publishCancelSuccess' => 'Publication de Podcast annulée avec succès !', + 'scheduleDateError' => 'La date de planification doit être définie !', ], 'form' => [ 'identity_section_title' => 'Informations sur le Podcast', 'identity_section_subtitle' => 'Ces champs vous permettent de vous faire remarquer.', 'cover' => 'Couverture du podcast', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'cover_size_hint' => 'La couverture du podcast doit être carrée, avec au minimum 1400px de largeur et de hauteur.', 'banner' => 'Bannière du podcast', - 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_size_hint' => 'La bannière doit être au format 3/1, avec au minimum 1500px de largeur.', 'banner_delete' => 'Supprimer la bannière du podcast', 'title' => 'Titre', 'handle' => 'Identifiant', @@ -107,9 +107,9 @@ return [ 'monetization_section_title' => 'Monétisation', 'monetization_section_subtitle' => 'Gagnez de l’argent grâce à votre audience.', - 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'premium' => 'Prémium', + 'premium_by_default' => 'Les épisodes doivent être définis comme premium par défaut', + 'premium_by_default_hint' => 'Les épisodes de Podcast seront marqués comme premium par défaut. Vous pouvez toujours choisir de définir certains épisodes, bandes-annonces ou bonus comme publics.', 'payment_pointer' => 'Adresse de paiement (Payment Pointer) pour Web Monetization', 'payment_pointer_hint' => 'L’adresse où vous recevrez de l’argent grâce à Web Monetization', @@ -120,9 +120,9 @@ return [ 'custom_rss_hint' => 'Ceci sera injecté dans la balise ❬channel❭.', 'new_feed_url' => 'URL du nouveau flux', 'new_feed_url_hint' => 'Utilisez ce champ lorsque vous déplacez ce podcast vers un autre domaine ou que vous changez d’hébergeur. Par défaut, ce champ est rempli avec l’URL du flux actuel si le podcast est importé.', - 'old_feed_url' => 'Old feed URL', - 'update_feed' => 'Update feed', - 'update_feed_tip' => 'Import this podcast\'s latest episodes', + 'old_feed_url' => 'URL de l\'ancien flux', + 'update_feed' => 'Actualiser ce flux', + 'update_feed_tip' => 'Importer les derniers épisodes de ce podcast', 'partnership' => 'Partenariat', 'partner_id' => 'ID', 'partner_link_url' => 'URL lien', @@ -131,7 +131,7 @@ return [ 'partner_link_url_hint' => 'L’adresse générique des liens partenaire', 'partner_image_url_hint' => 'L’adresse générique des images partenaire', 'status_section_title' => 'Statut', - 'block' => 'Podcast should be hidden from public catalogues', + 'block' => 'L\'épisode doit être masqué dans les catalogues publics', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', 'complete' => 'Le podcast n’aura plus de nouveaux épisodes.', From f867ab6a618154763e6ee462408869d941945321 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 17 Nov 2022 15:30:13 +0000 Subject: [PATCH 039/477] chore(release): 1.0.3 [skip ci] ## [1.0.3](https://code.castopod.org/adaures/castopod/compare/v1.0.2...v1.0.3) (2022-11-17) ### Bug Fixes * **dashboard-ui:** fill the blank gaps between cards on smaller screen sizes ([00836cc](https://code.castopod.org/adaures/castopod/commit/00836cc368c75ae2e23fa5dc4a53a5bb6eb2ce24)) --- CHANGELOG.md | 7 +++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59fc304a..695345e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.0.3](https://code.castopod.org/adaures/castopod/compare/v1.0.2...v1.0.3) (2022-11-17) + +### Bug Fixes + +- **dashboard-ui:** fill the blank gaps between cards on smaller screen sizes + ([00836cc](https://code.castopod.org/adaures/castopod/commit/00836cc368c75ae2e23fa5dc4a53a5bb6eb2ce24)) + ## [1.0.2](https://code.castopod.org/adaures/castopod/compare/v1.0.1...v1.0.2) (2022-11-04) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index a8df469c..9cf4229d 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.0.2'); +defined('CP_VERSION') || define('CP_VERSION', '1.0.3'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 1581f856..0f449343 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "podlibre/castopod-host", - "version": "1.0.2", + "version": "1.0.3", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package-lock.json b/package-lock.json index e813af7e..ce60b406 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "castopod-host", - "version": "1.0.2", + "version": "1.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "castopod-host", - "version": "1.0.2", + "version": "1.0.3", "license": "AGPL-3.0-or-later", "dependencies": { "@amcharts/amcharts4": "^4.10.29", diff --git a/package.json b/package.json index c6c5609a..f27def54 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod-host", - "version": "1.0.2", + "version": "1.0.3", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 2d82411788fc0cf3653d7e1b0fb15b83ab8bbe03 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 17 Nov 2022 16:21:02 +0000 Subject: [PATCH 040/477] docs(docker): rename ffmpeg service to video-clipper in docker-compose example --- docs/src/getting-started/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/getting-started/docker.md b/docs/src/getting-started/docker.md index b2ef420f..4f6f5751 100644 --- a/docs/src/getting-started/docker.md +++ b/docs/src/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: From 1d6b177a55111ede01fba1c08499036d474533bc Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 18 Nov 2022 17:38:40 +0000 Subject: [PATCH 041/477] fix: update actorUsername regex to get url_to actor Since CI4 v4.2.8, the actor route is not retrieved anymore, this prevents users from creating a podcast. --- modules/Fediverse/Config/Routes.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/Fediverse/Config/Routes.php b/modules/Fediverse/Config/Routes.php index 06fa16de..d9dc51b1 100644 --- a/modules/Fediverse/Config/Routes.php +++ b/modules/Fediverse/Config/Routes.php @@ -10,7 +10,10 @@ declare(strict_types=1); $routes = service('routes'); -$routes->addPlaceholder('actorUsername', '[a-zA-Z0-9\_]{1,32}'); +// FIXME: HOTFIX to be edited, add character to actorUsername regex to have it show up on routes list +// This bug is from CI4, since v4.2.8 with the following change +// https://github.com/codeigniter4/CodeIgniter4/pull/6644/files#diff-b28efb4cd802e8a3ead515befe9f46254b6cc9d17ab1beeb8a42a16cff69d283R1257 +$routes->addPlaceholder('actorUsername', '[a-zA-Z0-9\_]{1,33}'); $routes->addPlaceholder( 'uuid', '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}', From 07d5ab5af72134147ae233e76f227d636b703a71 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 21 Nov 2022 14:25:08 +0000 Subject: [PATCH 042/477] chore(release): 1.0.4 [skip ci] ## [1.0.4](https://code.castopod.org/adaures/castopod/compare/v1.0.3...v1.0.4) (2022-11-21) ### Bug Fixes * update actorUsername regex to get url_to actor ([1d6b177](https://code.castopod.org/adaures/castopod/commit/1d6b177a55111ede01fba1c08499036d474533bc)) --- CHANGELOG.md | 7 +++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 695345e1..bc76852e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.0.4](https://code.castopod.org/adaures/castopod/compare/v1.0.3...v1.0.4) (2022-11-21) + +### Bug Fixes + +- update actorUsername regex to get url_to actor + ([1d6b177](https://code.castopod.org/adaures/castopod/commit/1d6b177a55111ede01fba1c08499036d474533bc)) + ## [1.0.3](https://code.castopod.org/adaures/castopod/compare/v1.0.2...v1.0.3) (2022-11-17) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 9cf4229d..416b60bb 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.0.3'); +defined('CP_VERSION') || define('CP_VERSION', '1.0.4'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 0f449343..e2e26781 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "podlibre/castopod-host", - "version": "1.0.3", + "version": "1.0.4", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package-lock.json b/package-lock.json index ce60b406..771f3fed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "castopod-host", - "version": "1.0.3", + "version": "1.0.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "castopod-host", - "version": "1.0.3", + "version": "1.0.4", "license": "AGPL-3.0-or-later", "dependencies": { "@amcharts/amcharts4": "^4.10.29", diff --git a/package.json b/package.json index f27def54..6635eb4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod-host", - "version": "1.0.3", + "version": "1.0.4", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 4f7c17f4205726ad1825b17b0c4ba1b79d266141 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 22 Nov 2022 16:48:59 +0000 Subject: [PATCH 043/477] chore: add missing translation keys for blocked actors and domains breadcrumb --- modules/Admin/Language/en/Breadcrumb.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/Admin/Language/en/Breadcrumb.php b/modules/Admin/Language/en/Breadcrumb.php index b1742abf..558b90f7 100644 --- a/modules/Admin/Language/en/Breadcrumb.php +++ b/modules/Admin/Language/en/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'delete', 'remove' => 'remove', 'fediverse' => 'fediverse', - 'block-lists' => 'block lists', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'users', 'my-account' => 'my account', 'change-password' => 'change password', From 2e95273d97b1897fd92648531de8cb0ed5045d08 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 23 Nov 2022 16:57:26 +0100 Subject: [PATCH 044/477] build(docker-dev): fix app container command --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 52a712c7..8b735730 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: context: . dockerfile: docker/development/Dockerfile container_name: app - command: /bin/sh -c "crontab ./crontab && cron && service cron reload && php spark serve - 0.0.0.0" + command: /bin/sh -c "crontab ./crontab && cron && service cron reload && php spark serve --host 0.0.0.0" ports: - 8080:8080 volumes: From c13cfa0ea0679751521ca4157b953043ecc7974a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 24 Nov 2022 15:20:43 +0000 Subject: [PATCH 045/477] fix(router): revert to CI4 v4.2.7 to include all routes --- composer.json | 16 ++--- composer.lock | 97 ++++++++++++++--------------- modules/Fediverse/Config/Routes.php | 5 +- 3 files changed, 55 insertions(+), 63 deletions(-) diff --git a/composer.json b/composer.json index e2e26781..168f542c 100644 --- a/composer.json +++ b/composer.json @@ -7,17 +7,17 @@ "license": "AGPL-3.0-or-later", "require": { "php": "^8.1", - "codeigniter4/framework": "v4.2.10", + "codeigniter4/framework": "v4.2.7", "james-heinrich/getid3": "^2.0.x-dev", "whichbrowser/parser": "^v2.1.7", "geoip2/geoip2": "v2.13.0", - "league/commonmark": "^2.3.5", - "vlucas/phpdotenv": "^v5.4.1", + "league/commonmark": "^2.3.7", + "vlucas/phpdotenv": "v5.5.0", "league/html-to-markdown": "^v5.1.0", "opawg/user-agents-php": "^v1.0", "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.0", - "phpseclib/phpseclib": "~2.0.38", + "phpseclib/phpseclib": "~2.0.39", "michalsn/codeigniter4-uuid": "dev-develop", "essence/essence": "^3.5.4", "codeigniter4/settings": "^v2.1.0", @@ -27,11 +27,11 @@ }, "require-dev": { "mikey179/vfsstream": "^v1.6.11", - "phpunit/phpunit": "^9.5.25", - "captainhook/captainhook": "^5.10.11", + "phpunit/phpunit": "^9.5.26", + "captainhook/captainhook": "^5.11.1", "symplify/easy-coding-standard": "^10.3.3", - "phpstan/phpstan": "^1.8.9", - "rector/rector": "^0.14.5", + "phpstan/phpstan": "^1.9.2", + "rector/rector": "^0.14.8", "symplify/coding-standard": "^10.3.3" }, "autoload": { diff --git a/composer.lock b/composer.lock index 07dfac71..ed25fe80 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ec434296cd3ae06cb0f6d5fcee2a1ce4", + "content-hash": "e5d3ae32b8a1422fc2c33ecef375dfe8", "packages": [ { "name": "adaures/ipcat-php", @@ -169,16 +169,16 @@ }, { "name": "codeigniter4/framework", - "version": "v4.2.10", + "version": "v4.2.7", "source": { "type": "git", "url": "https://github.com/codeigniter4/framework.git", - "reference": "6ffad151a303c5817ad6b2d9b996d07960aff2cc" + "reference": "011ce3bbda6f85930075a9b8fecbee01c4b23ab9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/6ffad151a303c5817ad6b2d9b996d07960aff2cc", - "reference": "6ffad151a303c5817ad6b2d9b996d07960aff2cc", + "url": "https://api.github.com/repos/codeigniter4/framework/zipball/011ce3bbda6f85930075a9b8fecbee01c4b23ab9", + "reference": "011ce3bbda6f85930075a9b8fecbee01c4b23ab9", "shasum": "" }, "require": { @@ -194,19 +194,15 @@ "require-dev": { "codeigniter/coding-standard": "^1.5", "fakerphp/faker": "^1.9", - "friendsofphp/php-cs-fixer": "~3.13.0", + "friendsofphp/php-cs-fixer": "~3.11.0", "mikey179/vfsstream": "^1.6", "nexusphp/cs-config": "^3.6", "phpunit/phpunit": "^9.1", "predis/predis": "^1.1 || ^2.0" }, "suggest": { - "ext-dom": "If you use TestResponse", - "ext-exif": "If you run Image class tests", "ext-fileinfo": "Improves mime type detection for files", - "ext-gd": "If you use Image class GDHandler", "ext-imagick": "If you use Image class ImageMagickHandler", - "ext-libxml": "If you use TestResponse", "ext-memcache": "If you use Cache class MemcachedHandler with Memcache", "ext-memcached": "If you use Cache class MemcachedHandler with Memcached", "ext-mysqli": "If you use MySQL", @@ -216,8 +212,7 @@ "ext-redis": "If you use Cache class RedisHandler", "ext-simplexml": "If you format XML", "ext-sqlite3": "If you use SQLite3", - "ext-sqlsrv": "If you use SQL Server", - "ext-xdebug": "If you use CIUnitTestCase::assertHeaderEmitted()" + "ext-sqlsrv": "If you use SQL Server" }, "type": "project", "autoload": { @@ -235,7 +230,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/codeigniter4/CodeIgniter4" }, - "time": "2022-11-05T22:23:07+00:00" + "time": "2022-10-06T13:46:23+00:00" }, { "name": "codeigniter4/settings", @@ -1437,25 +1432,25 @@ }, { "name": "nette/schema", - "version": "v1.2.2", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", "shasum": "" }, "require": { "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.2" + "php": ">=7.1 <8.3" }, "require-dev": { "nette/tester": "^2.3 || ^2.4", - "phpstan/phpstan-nette": "^0.12", + "phpstan/phpstan-nette": "^1.0", "tracy/tracy": "^2.7" }, "type": "library", @@ -1484,9 +1479,9 @@ "keywords": ["config", "nette"], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.2" + "source": "https://github.com/nette/schema/tree/v1.2.3" }, - "time": "2021-10-15T11:40:02+00:00" + "time": "2022-10-13T01:24:26+00:00" }, { "name": "nette/utils", @@ -2547,16 +2542,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.11.0", + "version": "5.11.1", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "0a7b757e065f6e5033f286bbb9b64d180c816a05" + "reference": "44ba2b815a64ea71a3dc4afc9007d953ab992238" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/0a7b757e065f6e5033f286bbb9b64d180c816a05", - "reference": "0a7b757e065f6e5033f286bbb9b64d180c816a05", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/44ba2b815a64ea71a3dc4afc9007d953ab992238", + "reference": "44ba2b815a64ea71a3dc4afc9007d953ab992238", "shasum": "" }, "require": { @@ -2614,7 +2609,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.11.0" + "source": "https://github.com/captainhookphp/captainhook/tree/5.11.1" }, "funding": [ { @@ -2622,20 +2617,20 @@ "type": "github" } ], - "time": "2022-10-27T19:11:19+00:00" + "time": "2022-11-11T16:45:34+00:00" }, { "name": "composer/pcre", - "version": "3.0.2", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb" + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb", - "reference": "4482b6409ca6bfc2af043a5711cd21ac3e7a8dfb", + "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", "shasum": "" }, "require": { @@ -2670,7 +2665,7 @@ "keywords": ["PCRE", "preg", "regex", "regular expression"], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.0.2" + "source": "https://github.com/composer/pcre/tree/3.1.0" }, "funding": [ { @@ -2686,7 +2681,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T20:24:16+00:00" + "time": "2022-11-17T09:50:14+00:00" }, { "name": "composer/semver", @@ -3208,16 +3203,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.1", + "version": "v4.15.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", "shasum": "" }, "require": { @@ -3251,9 +3246,9 @@ "keywords": ["parser", "php"], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" }, - "time": "2022-09-04T07:30:47+00:00" + "time": "2022-11-12T15:38:23+00:00" }, { "name": "phar-io/manifest", @@ -3409,16 +3404,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.18", + "version": "9.2.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a" + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a", - "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", + "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", "shasum": "" }, "require": { @@ -3466,7 +3461,7 @@ "keywords": ["coverage", "testing", "xunit"], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" }, "funding": [ { @@ -3474,7 +3469,7 @@ "type": "github" } ], - "time": "2022-10-27T13:35:33+00:00" + "time": "2022-11-18T07:47:47+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3835,16 +3830,16 @@ }, { "name": "rector/rector", - "version": "0.14.7", + "version": "0.14.8", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "3553aaba0e820083fc6d7f0dc78d8d789226a398" + "reference": "46ee9a173a2b2645ca92a75ffc17460139fa226e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/3553aaba0e820083fc6d7f0dc78d8d789226a398", - "reference": "3553aaba0e820083fc6d7f0dc78d8d789226a398", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/46ee9a173a2b2645ca92a75ffc17460139fa226e", + "reference": "46ee9a173a2b2645ca92a75ffc17460139fa226e", "shasum": "" }, "require": { @@ -3874,7 +3869,7 @@ "description": "Instant Upgrade and Automated Refactoring of any PHP code", "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.14.7" + "source": "https://github.com/rectorphp/rector/tree/0.14.8" }, "funding": [ { @@ -3882,7 +3877,7 @@ "type": "github" } ], - "time": "2022-11-04T08:48:40+00:00" + "time": "2022-11-14T14:09:49+00:00" }, { "name": "sebastian/cli-parser", diff --git a/modules/Fediverse/Config/Routes.php b/modules/Fediverse/Config/Routes.php index d9dc51b1..06fa16de 100644 --- a/modules/Fediverse/Config/Routes.php +++ b/modules/Fediverse/Config/Routes.php @@ -10,10 +10,7 @@ declare(strict_types=1); $routes = service('routes'); -// FIXME: HOTFIX to be edited, add character to actorUsername regex to have it show up on routes list -// This bug is from CI4, since v4.2.8 with the following change -// https://github.com/codeigniter4/CodeIgniter4/pull/6644/files#diff-b28efb4cd802e8a3ead515befe9f46254b6cc9d17ab1beeb8a42a16cff69d283R1257 -$routes->addPlaceholder('actorUsername', '[a-zA-Z0-9\_]{1,33}'); +$routes->addPlaceholder('actorUsername', '[a-zA-Z0-9\_]{1,32}'); $routes->addPlaceholder( 'uuid', '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}', From 80666bc7286800a933e650214cbde02dcffb669d Mon Sep 17 00:00:00 2001 From: crowdin Date: Fri, 25 Nov 2022 17:44:19 +0000 Subject: [PATCH 046/477] chore(i18n): new Crowdin updates --- app/Language/el/Common.php | 2 +- app/Language/gd/Common.php | 2 +- app/Language/gd/Fediverse.php | 8 +- app/Language/gd/Podcast.php | 4 +- app/Language/ro/Comment.php | 35 ++ app/Language/ro/Common.php | 30 ++ app/Language/ro/Episode.php | 35 ++ app/Language/ro/Fediverse.php | 37 +++ app/Language/ro/Home.php | 20 ++ app/Language/ro/Page.php | 17 + app/Language/ro/Podcast.php | 58 ++++ app/Language/ro/Post.php | 40 +++ docs/src/ar/getting-started/docker.md | 2 +- docs/src/br/getting-started/docker.md | 2 +- docs/src/ca/getting-started/docker.md | 2 +- docs/src/de/getting-started/docker.md | 2 +- docs/src/el/getting-started/auth.md | 23 +- docs/src/el/getting-started/docker.md | 2 +- docs/src/es/getting-started/auth.md | 111 +++---- docs/src/es/getting-started/docker.md | 34 +- docs/src/fa/getting-started/docker.md | 2 +- docs/src/fr/getting-started/docker.md | 2 +- docs/src/gd/getting-started/docker.md | 2 +- docs/src/gl/getting-started/docker.md | 2 +- docs/src/id/getting-started/docker.md | 2 +- docs/src/it/getting-started/docker.md | 2 +- docs/src/ko/getting-started/docker.md | 2 +- docs/src/nl/getting-started/docker.md | 2 +- docs/src/nn-NO/getting-started/docker.md | 2 +- docs/src/oc/getting-started/docker.md | 2 +- docs/src/pl/getting-started/docker.md | 2 +- docs/src/pt-BR/getting-started/docker.md | 2 +- docs/src/pt/getting-started/docker.md | 2 +- docs/src/ro/getting-started/auth.md | 88 +++++ docs/src/ro/getting-started/docker.md | 177 ++++++++++ docs/src/ro/getting-started/install.md | 185 +++++++++++ docs/src/ro/getting-started/security.md | 26 ++ docs/src/ro/getting-started/update.md | 109 ++++++ docs/src/ro/index.md | 303 +++++++++++++++++ docs/src/ru/getting-started/docker.md | 2 +- docs/src/sk/getting-started/docker.md | 2 +- docs/src/sv/getting-started/docker.md | 2 +- docs/src/zh-Hans/getting-started/docker.md | 2 +- modules/Admin/Language/ar/Breadcrumb.php | 3 +- modules/Admin/Language/br/Breadcrumb.php | 3 +- modules/Admin/Language/ca/Breadcrumb.php | 3 +- modules/Admin/Language/de/Breadcrumb.php | 3 +- modules/Admin/Language/el/AboutCastopod.php | 16 +- modules/Admin/Language/el/Breadcrumb.php | 15 +- modules/Admin/Language/el/Charts.php | 4 +- modules/Admin/Language/el/Common.php | 4 +- modules/Admin/Language/el/Dashboard.php | 18 +- modules/Admin/Language/el/Episode.php | 84 ++--- modules/Admin/Language/el/Notifications.php | 14 +- modules/Admin/Language/el/Podcast.php | 268 +++++++-------- modules/Admin/Language/el/PodcastImport.php | 32 +- .../Admin/Language/el/PodcastNavigation.php | 48 +-- modules/Admin/Language/el/Settings.php | 66 ++-- modules/Admin/Language/el/Soundbite.php | 26 +- modules/Admin/Language/el/Validation.php | 4 +- modules/Admin/Language/el/VideoClip.php | 84 ++--- modules/Admin/Language/es/AboutCastopod.php | 16 +- modules/Admin/Language/es/Breadcrumb.php | 13 +- modules/Admin/Language/es/Episode.php | 16 +- modules/Admin/Language/es/Navigation.php | 2 +- modules/Admin/Language/es/Notifications.php | 2 +- modules/Admin/Language/es/Podcast.php | 4 +- .../Admin/Language/es/PodcastNavigation.php | 4 +- modules/Admin/Language/es/Settings.php | 4 +- modules/Admin/Language/fa/Breadcrumb.php | 3 +- modules/Admin/Language/fr/Breadcrumb.php | 3 +- modules/Admin/Language/gd/Breadcrumb.php | 3 +- modules/Admin/Language/gl/Breadcrumb.php | 3 +- modules/Admin/Language/id/Breadcrumb.php | 3 +- modules/Admin/Language/it/Breadcrumb.php | 3 +- modules/Admin/Language/ko/Breadcrumb.php | 3 +- modules/Admin/Language/nl/Breadcrumb.php | 7 +- modules/Admin/Language/nl/Countries.php | 6 +- modules/Admin/Language/nn-NO/Breadcrumb.php | 3 +- modules/Admin/Language/oc/Breadcrumb.php | 3 +- modules/Admin/Language/pl/Breadcrumb.php | 3 +- modules/Admin/Language/pt-BR/Breadcrumb.php | 3 +- modules/Admin/Language/pt/Breadcrumb.php | 3 +- modules/Admin/Language/ro/AboutCastopod.php | 22 ++ modules/Admin/Language/ro/Breadcrumb.php | 55 ++++ modules/Admin/Language/ro/Charts.php | 40 +++ modules/Admin/Language/ro/Common.php | 51 +++ modules/Admin/Language/ro/Countries.php | 264 +++++++++++++++ modules/Admin/Language/ro/Dashboard.php | 28 ++ modules/Admin/Language/ro/Episode.php | 213 ++++++++++++ .../Admin/Language/ro/EpisodeNavigation.php | 23 ++ modules/Admin/Language/ro/Fediverse.php | 32 ++ modules/Admin/Language/ro/Home.php | 14 + modules/Admin/Language/ro/Install.php | 61 ++++ modules/Admin/Language/ro/Navigation.php | 42 +++ modules/Admin/Language/ro/Notifications.php | 19 ++ modules/Admin/Language/ro/Page.php | 30 ++ modules/Admin/Language/ro/Pager.php | 21 ++ modules/Admin/Language/ro/Person.php | 65 ++++ modules/Admin/Language/ro/Platforms.php | 30 ++ modules/Admin/Language/ro/Podcast.php | 310 ++++++++++++++++++ modules/Admin/Language/ro/PodcastImport.php | 37 +++ .../Admin/Language/ro/PodcastNavigation.php | 38 +++ modules/Admin/Language/ro/Settings.php | 58 ++++ modules/Admin/Language/ro/Soundbite.php | 31 ++ modules/Admin/Language/ro/Validation.php | 16 + modules/Admin/Language/ro/VideoClip.php | 72 ++++ modules/Admin/Language/ru/Breadcrumb.php | 3 +- modules/Admin/Language/sk/Breadcrumb.php | 3 +- modules/Admin/Language/sv/Breadcrumb.php | 3 +- modules/Admin/Language/zh-Hans/Breadcrumb.php | 3 +- modules/Auth/Language/el/Auth.php | 50 +-- modules/Auth/Language/el/User.php | 52 +-- modules/Auth/Language/es/Auth.php | 96 +++--- modules/Auth/Language/ro/Auth.php | 94 ++++++ modules/Auth/Language/ro/Contributor.php | 47 +++ modules/Auth/Language/ro/MyAccount.php | 18 + modules/Auth/Language/ro/User.php | 60 ++++ modules/Install/Language/ro/Install.php | 62 ++++ .../Language/de/PremiumPodcasts.php | 2 +- .../Language/el/PremiumPodcasts.php | 32 +- .../Language/el/Subscription.php | 36 +- .../Language/es/PremiumPodcasts.php | 36 +- .../Language/es/Subscription.php | 144 ++++---- .../Language/ro/PremiumPodcasts.php | 34 ++ .../Language/ro/Subscription.php | 100 ++++++ 126 files changed, 3906 insertions(+), 734 deletions(-) create mode 100644 app/Language/ro/Comment.php create mode 100644 app/Language/ro/Common.php create mode 100644 app/Language/ro/Episode.php create mode 100644 app/Language/ro/Fediverse.php create mode 100644 app/Language/ro/Home.php create mode 100644 app/Language/ro/Page.php create mode 100644 app/Language/ro/Podcast.php create mode 100644 app/Language/ro/Post.php create mode 100644 docs/src/ro/getting-started/auth.md create mode 100644 docs/src/ro/getting-started/docker.md create mode 100644 docs/src/ro/getting-started/install.md create mode 100644 docs/src/ro/getting-started/security.md create mode 100644 docs/src/ro/getting-started/update.md create mode 100644 docs/src/ro/index.md create mode 100644 modules/Admin/Language/ro/AboutCastopod.php create mode 100644 modules/Admin/Language/ro/Breadcrumb.php create mode 100644 modules/Admin/Language/ro/Charts.php create mode 100644 modules/Admin/Language/ro/Common.php create mode 100644 modules/Admin/Language/ro/Countries.php create mode 100644 modules/Admin/Language/ro/Dashboard.php create mode 100644 modules/Admin/Language/ro/Episode.php create mode 100644 modules/Admin/Language/ro/EpisodeNavigation.php create mode 100644 modules/Admin/Language/ro/Fediverse.php create mode 100644 modules/Admin/Language/ro/Home.php create mode 100644 modules/Admin/Language/ro/Install.php create mode 100644 modules/Admin/Language/ro/Navigation.php create mode 100644 modules/Admin/Language/ro/Notifications.php create mode 100644 modules/Admin/Language/ro/Page.php create mode 100644 modules/Admin/Language/ro/Pager.php create mode 100644 modules/Admin/Language/ro/Person.php create mode 100644 modules/Admin/Language/ro/Platforms.php create mode 100644 modules/Admin/Language/ro/Podcast.php create mode 100644 modules/Admin/Language/ro/PodcastImport.php create mode 100644 modules/Admin/Language/ro/PodcastNavigation.php create mode 100644 modules/Admin/Language/ro/Settings.php create mode 100644 modules/Admin/Language/ro/Soundbite.php create mode 100644 modules/Admin/Language/ro/Validation.php create mode 100644 modules/Admin/Language/ro/VideoClip.php create mode 100644 modules/Auth/Language/ro/Auth.php create mode 100644 modules/Auth/Language/ro/Contributor.php create mode 100644 modules/Auth/Language/ro/MyAccount.php create mode 100644 modules/Auth/Language/ro/User.php create mode 100644 modules/Install/Language/ro/Install.php create mode 100644 modules/PremiumPodcasts/Language/ro/PremiumPodcasts.php create mode 100644 modules/PremiumPodcasts/Language/ro/Subscription.php diff --git a/app/Language/el/Common.php b/app/Language/el/Common.php index a74dced0..e66241cb 100644 --- a/app/Language/el/Common.php +++ b/app/Language/el/Common.php @@ -26,5 +26,5 @@ return [ 'read_less' => 'Διαβάστε λιγότερα', 'see_more' => 'Εμφάνιση περισσότερων', 'see_less' => 'Δείτε λιγότερα', - 'legal_notice' => 'Legal notice', + 'legal_notice' => 'Νομικές επισημάνσεις', ]; diff --git a/app/Language/gd/Common.php b/app/Language/gd/Common.php index 7bb494e9..e16dc6e6 100644 --- a/app/Language/gd/Common.php +++ b/app/Language/gd/Common.php @@ -26,5 +26,5 @@ return [ 'read_less' => 'Leugh nas lugha dheth', 'see_more' => 'Seall barrachd dheth', 'see_less' => 'Seall nas lugha dheth', - 'legal_notice' => 'Legal notice', + 'legal_notice' => 'Sanas laghail', ]; diff --git a/app/Language/gd/Fediverse.php b/app/Language/gd/Fediverse.php index d1dbaaef..1811f926 100644 --- a/app/Language/gd/Fediverse.php +++ b/app/Language/gd/Fediverse.php @@ -12,12 +12,12 @@ return [ 'your_handle' => 'An t-aithnichear agad', 'your_handle_hint' => 'Cuir a-steach an @ainm_cleachdaiche@àrainn leis a ghabhas tu gnìomh.', 'follow' => [ - 'label' => 'Lean air', - 'title' => 'Lean air {actorDisplayName}', - 'subtitle' => 'Tha thu gu bhith leantainn air:', + 'label' => 'Lean', + 'title' => 'Lean {actorDisplayName}', + 'subtitle' => 'Tha thu gu bhith leantainn:', 'accountNotFound' => 'Cha deach an cunntas a lorg.', 'remoteFollowNotAllowed' => 'Tha coltas nach gabh am frithealaiche ri leantainn chèin…', - 'submit' => 'Lean air adhart gus leantainn air', + 'submit' => 'Lean air adhart gus a leantainn', ], 'favourite' => [ 'title' => "Cuir am post aig {actorDisplayName} ris na h-annsachdan", diff --git a/app/Language/gd/Podcast.php b/app/Language/gd/Podcast.php index 5fb7d3e8..c9e6c962 100644 --- a/app/Language/gd/Podcast.php +++ b/app/Language/gd/Podcast.php @@ -15,8 +15,8 @@ return [ 'list_of_episodes_season' => 'Eapasodan seusan {seasonNumber} ({episodeCount})', 'no_episode' => 'Cha deach eapasod a lorg!', - 'follow' => 'Lean air', - 'followTitle' => 'Lean air {actorDisplayName} sa cho-shaoghal!', + 'follow' => 'Lean', + 'followTitle' => 'Lean {actorDisplayName} sa cho-shaoghal!', 'followers' => '{numberOfFollowers, plural, one {# neach-leantainn} two {# luchd-leantainn} diff --git a/app/Language/ro/Comment.php b/app/Language/ro/Comment.php new file mode 100644 index 00000000..ab16710c --- /dev/null +++ b/app/Language/ro/Comment.php @@ -0,0 +1,35 @@ + "Comentariul lui {actorDisplayName} pentru {episodeTitle}", + 'back_to_comments' => 'Înapoi la comentarii', + 'form' => [ + 'episode_message_placeholder' => 'Scrieți un comentariu…', + 'reply_to_placeholder' => 'Răspundeți lui @{actorUsername}', + 'submit' => 'Trimiteți', + 'submit_reply' => 'Răspundeți', + ], + 'likes' => '{numberOfLikes, plural, + one {# apreciere} + other {# aprecieri} + }', + 'replies' => '{numberOfReplies, plural, + one {# răspuns} + few {# răspunsuri} + other {# răspunsuri} + }', + 'like' => 'Apreciază', + 'reply' => 'Răspundeți', + 'view_replies' => 'Vizualizați răspunsurile ({numberOfReplies})', + 'block_actor' => 'Blocați utilizatorul @{actorUsername}', + 'block_domain' => 'Blocați domeniul @{actorDomain}', + 'delete' => 'Ștergeți comentariul', +]; diff --git a/app/Language/ro/Common.php b/app/Language/ro/Common.php new file mode 100644 index 00000000..96742cbd --- /dev/null +++ b/app/Language/ro/Common.php @@ -0,0 +1,30 @@ + 'Da', + 'no' => 'Nu', + 'cancel' => 'Anulare', + 'optional' => 'Opțional', + 'close' => 'Închideți', + 'home' => 'Acasă', + 'explicit' => 'Conținut explicit', + 'powered_by' => 'Dezvoltat de {castopod}', + 'go_back' => 'Înapoi', + 'play_episode_button' => [ + 'play' => 'Redare', + 'playing' => 'În desfășurare', + ], + 'read_more' => 'Informații suplimentare', + 'read_less' => 'Citește mai puţin', + 'see_more' => 'Vizualizați mai mult', + 'see_less' => 'Vizualizați mai puțin', + 'legal_notice' => 'Mențiuni legale', +]; diff --git a/app/Language/ro/Episode.php b/app/Language/ro/Episode.php new file mode 100644 index 00000000..b59401f3 --- /dev/null +++ b/app/Language/ro/Episode.php @@ -0,0 +1,35 @@ + 'Sezonul {seasonNumber}', + 'season_abbr' => 'Sezonul {seasonNumber}', + 'number' => 'Episod {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Sezonul {seasonNumber} episod {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', + 'persons' => '{personsCount, plural, + one {# răspuns} + few {# răspunsuri} + other {# răspunsuri} + }', + 'persons_list' => 'Persoane', + 'back_to_episodes' => 'Înapoi la episoadele {podcast}', + 'comments' => 'Comentarii', + 'activity' => 'Activitate', + 'description' => 'Descrierea episodului', + 'number_of_comments' => '{numberOfComments, plural, + one {# răspuns} + few {# răspunsuri} + other {# răspunsuri} + }', + 'all_podcast_episodes' => 'Toate episoadele podcastului', + 'back_to_podcast' => 'Înapoi la podcast', +]; diff --git a/app/Language/ro/Fediverse.php b/app/Language/ro/Fediverse.php new file mode 100644 index 00000000..e2337656 --- /dev/null +++ b/app/Language/ro/Fediverse.php @@ -0,0 +1,37 @@ + 'ID-ul tău', + 'your_handle_hint' => 'Introduceți numele@domeniu din care doriți să acționați', + 'follow' => [ + 'label' => 'Urmăriţi', + 'title' => 'Urmărește pe {actorDisplayName}', + 'subtitle' => 'Îl veți urmări pe:', + 'accountNotFound' => 'Contul nu a putut fi găsit.', + 'remoteFollowNotAllowed' => 'Se pare că serverul nu permite urmărirea...', + 'submit' => 'Continuați să urmăriți', + ], + 'favourite' => [ + 'title' => "Postarea favorită a lui {actorDisplayName}", + 'subtitle' => 'Veți adăuga la favoriți:', + 'submit' => 'Continuați să adăugați la favoriți', + ], + 'reblog' => [ + 'title' => "Distribuie postarea lui {actorDisplayName}", + 'subtitle' => 'Veți distribui:', + 'submit' => 'Continuați să distribuiți', + ], + 'reply' => [ + 'title' => "Răspundeți lui {actorDisplayName}", + 'subtitle' => 'Îi veți răspunde lui:', + 'submit' => 'Continuați să răspundeți', + ], +]; diff --git a/app/Language/ro/Home.php b/app/Language/ro/Home.php new file mode 100644 index 00000000..a0c01594 --- /dev/null +++ b/app/Language/ro/Home.php @@ -0,0 +1,20 @@ + 'Toate podcasturile', + 'sort_by' => 'Sortați după', + 'sort_options' => [ + 'activity' => 'Activitate recentă', + 'created_desc' => 'Întâi cele mai noi', + 'created_asc' => 'Întâi cele mai vechi', + ], + 'no_podcast' => 'Nu s-a găsit nici un podcast', +]; diff --git a/app/Language/ro/Page.php b/app/Language/ro/Page.php new file mode 100644 index 00000000..47352fd6 --- /dev/null +++ b/app/Language/ro/Page.php @@ -0,0 +1,17 @@ + 'Înapoi la pagina de start', + 'map' => [ + 'title' => 'Hartă', + 'description' => 'Descoperă episoadele podcastului pe {siteName} ce sunt plasate pe hartă! Navighează pe hartă și ascultă episoade ce vorbesc despre locații specifice.', + ], +]; diff --git a/app/Language/ro/Podcast.php b/app/Language/ro/Podcast.php new file mode 100644 index 00000000..f5134251 --- /dev/null +++ b/app/Language/ro/Podcast.php @@ -0,0 +1,58 @@ + 'Flux RSS Podcast', + 'season' => 'Sezonul {seasonNumber}', + 'list_of_episodes_year' => '{year} episoade ({episodeCount})', + 'list_of_episodes_season' => + 'Sezonul {seasonNumber} episoadele ({episodeCount})', + 'no_episode' => 'Nici un episod găsit!', + 'follow' => 'Urmăriţi', + 'followTitle' => 'Urmărește pe {actorDisplayName} în fediverse!', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + few {# followeri} + other {# followeri} + }', + 'posts' => '{numberOfPosts, plural, + one {# postare} + few {# postări} + other {# postări} + }', + 'activity' => 'Activitate', + 'episodes' => 'Episoade', + 'episodes_title' => 'Episoadele podcastului {podcastTitle}', + 'about' => 'Despre noi', + 'stats' => [ + 'title' => 'Statistici', + 'number_of_seasons' => '{0, plural, + one {# sezon} + few {# sezoane} + other {# sezoane} + }', + 'number_of_episodes' => '{0, plural, + one {# episod} + few {# episoade} + other {# episoade} + }', + 'first_published_at' => 'Primul episod publicat pe {0, date, medium}', + ], + 'sponsor' => 'Sponsor', + 'funding_links' => 'Link-uri de finanțare pentru {podcastTitle}', + 'find_on' => 'Găsește {podcastTitle} pe', + 'listen_on' => 'Ascultă pe', + 'persons' => '{personsCount, plural, + one {# persoană} + few {# persoane} + other {# persoane} + }', + 'persons_list' => 'Persoane', +]; diff --git a/app/Language/ro/Post.php b/app/Language/ro/Post.php new file mode 100644 index 00000000..87e497fe --- /dev/null +++ b/app/Language/ro/Post.php @@ -0,0 +1,40 @@ + "Postarea lui {actorDisplayName}", + 'back_to_actor_posts' => 'Înapoi la postările lui {actor}', + 'actor_shared' => '{actor} a distribuit', + 'reply_to' => 'Răspundeți lui @{actorUsername}', + 'form' => [ + 'message_placeholder' => 'Scrie un mesaj...', + 'episode_message_placeholder' => 'Scrie un mesaj pentru episodul…', + 'episode_url_placeholder' => 'URL episod', + 'reply_to_placeholder' => 'Răspundeți lui @{actorUsername}', + 'submit' => 'Trimiteți', + 'submit_reply' => 'Răspundeți', + ], + 'favourites' => '{numberOfFavourites, plural, + one {# favorit} + other {# favoriți} + }', + 'reblogs' => '{numberOfReblogs, plural, + one {# distribuire} + other {# distribuiri} + }', + 'replies' => '{numberOfReplies, plural, + one {# răspuns} + other {# răspunsuri} + }', + 'expand' => 'Expandați postarea', + 'block_actor' => 'Blocați utilizatorul @{actorUsername}', + 'block_domain' => 'Blocați domeniul @{actorDomain}', + 'delete' => 'Șterge postarea', +]; diff --git a/docs/src/ar/getting-started/docker.md b/docs/src/ar/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/ar/getting-started/docker.md +++ b/docs/src/ar/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/br/getting-started/docker.md b/docs/src/br/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/br/getting-started/docker.md +++ b/docs/src/br/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/ca/getting-started/docker.md b/docs/src/ca/getting-started/docker.md index d1aea27f..1134fd98 100644 --- a/docs/src/ca/getting-started/docker.md +++ b/docs/src/ca/getting-started/docker.md @@ -89,7 +89,7 @@ una base de dades Redis com a gestor de memòria cau. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/de/getting-started/docker.md b/docs/src/de/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/de/getting-started/docker.md +++ b/docs/src/de/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/el/getting-started/auth.md b/docs/src/el/getting-started/auth.md index 7e2d5947..b517b107 100644 --- a/docs/src/el/getting-started/auth.md +++ b/docs/src/el/getting-started/auth.md @@ -5,23 +5,24 @@ sidebarDepth: 3 # Ταυτοποίηση & εξουσιοδότηση -Castopod handles authentication and authorization using `codeigniter/shield` -coupled with custom rules. Roles and permissions are defined at two levels: +Ο Castopod χειρίζεται τον έλεγχο ταυτότητας και την έγκριση χρησιμοποιώντας +`codeigniter/shield` σε συνδυασμό με προσαρμοσμένους κανόνες. Οι ρόλοι και τα +δικαιώματα καθορίζονται σε δύο επίπεδα: -1. [instance wide](#1-instance-wide-roles-and-permissions) -2. [per podcast](#2-per-podcast-roles-and-permissions) +1. [ευρεία παρουσία](#1-instance-wide-roles-and-permissions) +2. [ανά podcast](#2-per-podcast-roles-and-permissions) -## 1. Instance wide roles and permissions +## 1. Διαχείριση ρόλων και δικαιωμάτων -### Instance roles +### Ρόλοι εμφάνισης -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| ρόλος | περιγραφή | δικαιώματα | +| ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | +| Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Γενικοί χρήστες του Castopod. | admin.access | diff --git a/docs/src/el/getting-started/docker.md b/docs/src/el/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/el/getting-started/docker.md +++ b/docs/src/el/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/es/getting-started/auth.md b/docs/src/es/getting-started/auth.md index 6c0ccd75..b8276b2e 100644 --- a/docs/src/es/getting-started/auth.md +++ b/docs/src/es/getting-started/auth.md @@ -1,87 +1,88 @@ --- -title: Authentication & Authorization +title: Autenticación & Autenticación sidebarDepth: 3 --- -# Authentication & Authorization +# Autenticación & Autenticación -Castopod handles authentication and authorization using `codeigniter/shield` -coupled with custom rules. Roles and permissions are defined at two levels: +Castopod gestiona la autenticación y autorización usando `codeignitor/escudo` +emparejado con reglas personalizadas. Los roles y permisos se definen en dos +niveles: -1. [instance wide](#1-instance-wide-roles-and-permissions) -2. [per podcast](#2-per-podcast-roles-and-permissions) +1. [por instancia](#1-instance-wide-roles-and-permissions) +2. [por podcast](#2-per-podcast-roles-and-permissions) -## 1. Instance wide roles and permissions +## 1. Roles por instancia y permisos -### Instance roles +### Roles de instancia -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| roles | descripción | permisos | +| ------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administrador | Tiene control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Administrador | Gestiona el contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Usuarios generales de Castopod. | admin.access | -### Instance permissions +### Permisos de instancia -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permisos | descripción | +| ----------------------- | ------------------------------------------------------------------------------ | +| admin.access | Puedes acceder al área de administración de Castopod. | +| admin.settings | Puede acceder a la configuración de Castopod. | +| users.manage | Puede administrar usuarios de Castopod. | +| persons.manage | Puede administrar personas. | +| pages.manage | Puede administrar páginas. | +| podcasts.view | Puede ver todos los podcasts. | +| podcasts.create | Puede crear nuevos podcasts. | +| podcasts.import | Puede importar podcasts. | +| fediverse.manage-blocks | Puedes bloquear la interacción de actores/dominios del fediverso con Castopod. | -## 2. Per podcast roles and permissions +## 2. Permisos y roles por podcast -### Per podcast roles +### Roles por podcast -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| roles | descripción | permisos | +| ------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrador | Tiene el control completo del podcast #{id}. | \* | +| Editor | Gestiona el contenido y las publicaciones del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Autor | Gestiona el contenido del podcast #{id} pero no puede publicarlo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Invitado | Colaborador general del podcast #{id}. | view, episodes.view | -### Per podcast permissions +### Permisos por podcast -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permisos | descripción | +| ---------------------------- | -------------------------------------------------------------------------------------------------- | +| view | Puede ver el panel de control y análisis del podcast #{id}. | +| edit | Puede editar podcast #{id}. | +| delete | Puede borrar el podcast #{id}. | +| manage-import | Puede sincronizar el podcast importado #{id}. | +| manage-persons | Puede administrar las suscripciones del podcast #{id}. | +| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. | +| manage-contributors | Puede administrar colaboradores del podcast #{id}. | +| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. | +| manage-publications | Puede publicar el podcast #{id}. | +| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. | +| interact-as | Puede interactuar como el podcast #{id} para favoritar, compartir o responder a las publicaciones. | +| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. | +| episodes.create | Puede crear episodios para el podcast #{id}. | +| episodes.edit | Puede editar episodios #{id}. | +| episodes.delete | Puede borrar el podcast #{id}. | +| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. | +| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. | +| episodes.manage-publications | Puede publicar el podcast #{id}. | +| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. | diff --git a/docs/src/es/getting-started/docker.md b/docs/src/es/getting-started/docker.md index 849b2478..6c2a5083 100644 --- a/docs/src/es/getting-started/docker.md +++ b/docs/src/es/getting-started/docker.md @@ -5,15 +5,15 @@ sidebarDepth: 3 # Imágenes oficiales de Docker -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: +Castopod lanza 3 imágenes Docker al DockerHub durante su proceso de construcción +automatizada: - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el paquete completo de Castopod con todas las dependencias. - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una configuración Nginx para Castopod -- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): - an optional image building videoclips thanks to ffmpeg +- [**`castopod/videoclipper`**](https://hub.docker.com/r/castopod/video-clipper): + una imagen opcional de creación de videoclips gracias a ffmpeg Adicionalmente, Castopod requiere una base de datos compatible con MySQL. También se puede añadir una base de datos Redis como gestor de caché. @@ -21,10 +21,10 @@ También se puede añadir una base de datos Redis como gestor de caché. ## Etiquetas admitidas - `develop` [unstable], última rama de desarrollo construida -- `beta` [stable], latest beta version build -- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) +- `beta` [stable], última versión beta +- `1.0.0-beta.x` [stable], versión beta específica (desde `1.0.0-beta.22`) +- `latest` [stable], última versión +- `1.x.x` [stable], versión específica de compilación (desde `1.0.0`) ## Ejemplo de uso @@ -87,9 +87,9 @@ También se puede añadir una base de datos Redis como gestor de caché. networks: - castopod-app - # this container is optional - # add this if you want to use the videoclips feature - ffmpeg: + # este contenedor es opcional + # agregue esto si desea usar la funcionalidad de videoclips + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: @@ -138,7 +138,7 @@ También se puede añadir una base de datos Redis como gestor de caché. - **castopod/video-clipper** - | Nombre de la Variable | Tipo (`predeterminado`) | Default | + | Nombre de la Variable | Tipo (`predeterminado`) | Por defecto | | -------------------------- | ----------------------- | ---------------- | | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | @@ -148,9 +148,9 @@ También se puede añadir una base de datos Redis como gestor de caché. - **castopod/app** - | Nombre de la variable | Type (`default`) | Default | + | Nombre de la variable | Tipo (`por defecto`) | Por defecto | | ---------------------------- | ----------------------- | ---------------- | - | **`CP_URLBASE`** | string | `undefined` | + | **`CP_BASEURL`** | string | `undefined` | | **`CP_MEDIA_URLBASE`** | ?string | `CP_BASEURL` | | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | @@ -174,6 +174,6 @@ También se puede añadir una base de datos Redis como gestor de caché. - **castopod/web-server** - | Variable name | Type | Default | - | --------------------- | ------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | Nombre de la variable | Tipo | Por defecto | + | --------------------- | ------- | ----------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/fa/getting-started/docker.md b/docs/src/fa/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/fa/getting-started/docker.md +++ b/docs/src/fa/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/fr/getting-started/docker.md b/docs/src/fr/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/fr/getting-started/docker.md +++ b/docs/src/fr/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/gd/getting-started/docker.md b/docs/src/gd/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/gd/getting-started/docker.md +++ b/docs/src/gd/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/gl/getting-started/docker.md b/docs/src/gl/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/gl/getting-started/docker.md +++ b/docs/src/gl/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/id/getting-started/docker.md b/docs/src/id/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/id/getting-started/docker.md +++ b/docs/src/id/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/it/getting-started/docker.md b/docs/src/it/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/it/getting-started/docker.md +++ b/docs/src/it/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/ko/getting-started/docker.md b/docs/src/ko/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/ko/getting-started/docker.md +++ b/docs/src/ko/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/nl/getting-started/docker.md b/docs/src/nl/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/nl/getting-started/docker.md +++ b/docs/src/nl/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/nn-NO/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/nn-NO/getting-started/docker.md +++ b/docs/src/nn-NO/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/oc/getting-started/docker.md b/docs/src/oc/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/oc/getting-started/docker.md +++ b/docs/src/oc/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/pl/getting-started/docker.md b/docs/src/pl/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/pl/getting-started/docker.md +++ b/docs/src/pl/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/pt-BR/getting-started/docker.md b/docs/src/pt-BR/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/pt-BR/getting-started/docker.md +++ b/docs/src/pt-BR/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/pt/getting-started/docker.md b/docs/src/pt/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/pt/getting-started/docker.md +++ b/docs/src/pt/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/ro/getting-started/auth.md b/docs/src/ro/getting-started/auth.md new file mode 100644 index 00000000..7688ee1d --- /dev/null +++ b/docs/src/ro/getting-started/auth.md @@ -0,0 +1,88 @@ +--- +title: Autentificare & Autorizare +sidebarDepth: 3 +--- + +# Autentificare & Autorizare + +Castopod folosește pentru autentificare și autorizare `codeigniter/shield` +cuplat la reguli personalizate. Rolurile și permisiunile sunt definite la două +niveluri: + +1. [întreaga instanță](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Gestionați roluri şi permisiuni pe întreaga instanță + +### Rolurile instanței + + + +| rol | descriere | permisiuni | +| ----------- | ----------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Deține controlul complet asupra Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Gestionează conținutul Castopodului. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Utilizatorii generali ai Castopod. | admin.access | + + + +### Permisiuni instanță + + + +| permisiune | descriere | +| ----------------------- | -------------------------------------------------------------------------- | +| admin.access | Poate accesa zona de administrare Castopod. | +| admin.settings | Poate accesa setările Castopod. | +| users.manage | Poate gestiona utilizatorii Castopod. | +| persons.manage | Poate gestiona persoane. | +| pages.manage | Poate gestiona pagini. | +| podcasts.view | Poate vedea toate podcast-urile. | +| podcasts.create | Poate crea noi podcast-uri. | +| podcasts.import | Poate importa podcast-uri. | +| fediverse.manage-blocks | Poate bloca actorilor/domenii din fediverse să interacționeze cu Castopod. | + + + +## 2. Roluri și permisiuni per podcast + +### Roluri per podcast + + + +| rol | descriere | permisiuni | +| ------ | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Deține controlul complet asupra podcastului #{id}. | \* | +| Editor | Gestionează conținutul și publicațiile podcastului #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | +| Author | Gestionează conținutul podcastului #{id} dar nu poate publica. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | Contribuitor al podcastului #{id}. | view, episodes.view | + + + +### Permisiuni per podcast + + + +| permisiune | descriere | +| ---------------------------- | ------------------------------------------------------------------------------------------------------- | +| view | Poate vedea panoul de control și analiticele podcastului #{id}. | +| edit | Poate edita podcastul #{id}. | +| delete | Poate șterge podcastul #{id}. | +| manage-import | Poate sincroniza podcastul importat #{id}. | +| manage-persons | Poate administra abonamentele podcastului #{id}. | +| manage-subscriptions | Poate administra abonamentele podcastului #{id}. | +| manage-contributors | Poate administra colaboratorii podcastului #{id}. | +| manage-platforms | Poate seta/elimina link-urile podcastului #{id}. | +| manage-publications | Poate publica podcastul #{id}. | +| manage-notifications | Poate vizualiza și marca notificările ca fiind citite pentru podcastul #{id}. | +| interact-as | Poate interacționa ca podcastul #{id} pentru adăuga la favorite, a distribui sau a răspunde la postări. | +| episodes.view | Poate vizualiza panoul de control și analiticile podcastului #{id}. | +| episodes.create | Poate crea episoade pentru podcastul #{id}. | +| episodes.edit | Poate edita podcastul #{id}. | +| episodes.delete | Poate șterge podcastul #{id}. | +| episodes.manage-persons | Poate administra abonamentele podcastului #{id}. | +| episodes.manage-clips | Poate administra clipuri video sau biții de sunet ai podcastului #{id}. | +| episodes.manage-publications | Poate publica podcastul #{id}. | +| episodes.manage-comments | Poate crea/elimina comentariile episodului podcastului #{id}. | + + diff --git a/docs/src/ro/getting-started/docker.md b/docs/src/ro/getting-started/docker.md new file mode 100644 index 00000000..68557942 --- /dev/null +++ b/docs/src/ro/getting-started/docker.md @@ -0,0 +1,177 @@ +--- +title: Imagini oficiale Docker +sidebarDepth: 3 +--- + +# Imagini oficiale Docker + +Castopod dă push la 3 imagini Docker pe Docker Hub pe parcursul procesului de +compilare automată + +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): pachetul + aplicației cu toate dependințele Castopod +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): o + configurație Nginx pentru Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + o imagine opțională ce compilează videoclipuri cu ajutorul ffmpeg + +În plus, Castopod necesită o bază de date compatibilă cu MySQL. O bază de date +Redis poate fi adăugată pentru cache. + +## Tag-uri acceptate + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +1. Install [docker](https://docs.docker.com/get-docker/) and + [docker-compose](https://docs.docker.com/compose/install/) +2. Create a `docker-compose.yml` file with the following: + + ```yml + version: "3.7" + + services: + app: + image: castopod/app:latest + container_name: "castopod-app" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "http://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + networks: + - castopod-app + - castopod-db + restart: unless-stopped + + web-server: + image: castopod/web-server:latest + container_name: "castopod-web-server" + volumes: + - castopod-media:/var/www/html/media + networks: + - castopod-app + ports: + - 8080:80 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + volumes: + - castopod-cache:/data + networks: + - castopod-app + + # this container is optional + # add this if you want to use the videoclips feature + video-clipper: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for TLS (SSL/HTTPS) + + TLS is mandatory for ActivityPub to work. This job can easily be handled by + a reverse proxy, for example with [Caddy](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8080 + } + ``` + +4. Run `docker-compose up -d`, wait for it to initialize and head on to + `https://castopod.example.com/cp-install` to finish setting up Castopod! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + +- **castopod/app** + + | Variable name | Type (`default`) | Default | + | ---------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | --------------------- | ------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/ro/getting-started/install.md b/docs/src/ro/getting-started/install.md new file mode 100644 index 00000000..c68be846 --- /dev/null +++ b/docs/src/ro/getting-started/install.md @@ -0,0 +1,185 @@ +--- +title: Installation +sidebarDepth: 3 +--- + +# How to install Castopod? + +Castopod was thought-out to be easy to install. Whether using dedicated or +shared hosting, you can install it on most PHP-MySQL compatible web servers. + +::: tip Note + +We've released official Docker images for Castopod! + +If you prefer using Docker, you may skip this and go straight to the +[docker documentation](./docker.md) for Castopod. + +::: + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support + +### PHP v8.1 or higher + +PHP version 8.1 or higher is required, with the following extensions installed: + +- [intl](https://php.net/manual/en/intl.requirements.php) +- [libcurl](https://php.net/manual/en/curl.requirements.php) +- [mbstring](https://php.net/manual/en/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, + **PNG** and **WEBP** libraries. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +::: warning Warning + +Castopod only works with supported MySQL 5.7 or higher compatible databases. It +will break with the previous MySQL v5.6 for example as its end of life was on +February 5, 2021. + +::: + +You will need the server hostname, database name, username and password to +complete the installation process. If you do not have these, please contact your +server administrator. + +#### Privileges + +User must have at least these privileges on the database for Castopod to work: +`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, +`REFERENCES`, `CREATE VIEW`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you +want to generate Video Clips. The following extensions must be installed: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +0. Get a Web Server with [requirements](#requirements) installed +1. Create a MySQL database for Castopod with a user having access and + modification privileges (for more info, see + [MySQL compatible database](#mysql-compatible-database)). +2. Activate HTTPS on your domain with an _SSL certificate_. +3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto + the web server if you haven’t already. + - ⚠️ Set the web server document root to the `public/` sub-folder within the + `castopod` folder. +4. Add **cron tasks** on your web server for various background processes + (replace the paths accordingly): + + - For social features to work properly, this task is used to broadcast social + activities to your followers on the fediverse: + + ```bash + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities + ``` + + - For having your episodes be broadcasted on open hubs upon publication using + [WebSub](https://en.wikipedia.org/wiki/WebSub): + + ```bash + * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish + ``` + + - For Video Clips to be created (see + [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)): + + ```bash + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips + ``` + + > These tasks run **every minute**. You may set the frequency depending on + > your needs: every 5, 10 minutes or more. + +### (recommended) Install Wizard + +1. Run the Castopod install script by going to the install wizard page + (`https://your_domain_name.com/cp-install`) in your favorite web browser. +2. Follow the instructions on your screen. +3. Start podcasting! + +::: info Note + +The install script writes a `.env` file in the package root. If you cannot go +through the install wizard, you can create and edit the `.env` file manually +based on the `.env.example` file. + +::: + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +You may add your email configuration in your instance's `.env` like so: + +```ini +# […] + +email.fromEmail="your_email_address" +email.SMTPHost="your_smtp_host" +email.SMTPUser="your_smtp_user" +email.SMTPPass="your_smtp_password" +``` + +#### Email config options + +| Variable name | Type | Default | +| ---------------- | -------------------- | ------------ | +| **`fromEmail`** | string | `undefined` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `undefined` | +| **`SMTPUser`** | string | `undefined` | +| **`SMTPPass`** | string | `undefined` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | + +## Community packages + +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. + +### Install with YunoHost + +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you. + +
+ + + Install Castopod with YunoHost + + +Github +Repo + +
diff --git a/docs/src/ro/getting-started/security.md b/docs/src/ro/getting-started/security.md new file mode 100644 index 00000000..e205698d --- /dev/null +++ b/docs/src/ro/getting-started/security.md @@ -0,0 +1,26 @@ +--- +title: Security +--- + +# Security concerns + +Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP +framework that encourages +[good security practices](https://codeigniter.com/user_guide/concepts/security.html). + +To maximize your instance's safety and prevent any malicious attack, we +recommend you update all your Castopod files permissions after installation or +updates (to avoid any prior permission error): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/ro/getting-started/update.md b/docs/src/ro/getting-started/update.md new file mode 100644 index 00000000..98e019fb --- /dev/null +++ b/docs/src/ro/getting-started/update.md @@ -0,0 +1,109 @@ +--- +title: Update +sidebarDepth: 3 +--- + +# How to update Castopod? + +After installing Castopod, you may want to update your instance to the latest +version in order to enjoy the latest features ✨, bug fixes 🐛 and performance +improvements ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version + + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives + + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). + + ::: + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```bash + php spark castopod:database-update + ``` + +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `public/media`. + +2. Go through each release update instructions sequentially (from oldest to + newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +We advise you do, so you don't lose everything if anything goes wrong! + +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/ro/index.md b/docs/src/ro/index.md new file mode 100644 index 00000000..6e04835b --- /dev/null +++ b/docs/src/ro/index.md @@ -0,0 +1,303 @@ +--- +sidebarDepth: 2 +--- + +# Welcome 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + +::: info Status + +Castopod is currently in **beta** but already quite stable and used by +podcasters around the world! + +::: + +
+ Install +
+ +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivation + +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. + +It is in fact one of the only media to have stayed this way for a long time. + +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. + +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. + +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. + +## Comparison with other solutions + +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. + +### Castopod vs Wordpress + +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. + +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. + +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. + +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. + +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwhale + +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. + +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod can be self-hosted and is the only solution that allows you to keep + full control over what you produce. Also, as it is open-source, you can even + customize it as you wish. + +- Castopod is the only solution that currently integrates both a decentralized + social network with ActivityPub as well as many of the podcasting 2.0 + features, hoping to bridge the gap between the two. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. + +### Contributing guide + +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
+ + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
+ Ad Aures Logo + NLnet Logo +
+ +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/ru/getting-started/docker.md b/docs/src/ru/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/ru/getting-started/docker.md +++ b/docs/src/ru/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/sk/getting-started/docker.md b/docs/src/sk/getting-started/docker.md index e19320f2..c6e6cb7e 100644 --- a/docs/src/sk/getting-started/docker.md +++ b/docs/src/sk/getting-started/docker.md @@ -89,7 +89,7 @@ can be added as a cache handler. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/sv/getting-started/docker.md b/docs/src/sv/getting-started/docker.md index c6fabe52..4b2f94cf 100644 --- a/docs/src/sv/getting-started/docker.md +++ b/docs/src/sv/getting-started/docker.md @@ -89,7 +89,7 @@ läggas till som cachehanterare. # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/docs/src/zh-Hans/getting-started/docker.md b/docs/src/zh-Hans/getting-started/docker.md index e68fc89d..9e5d20ad 100644 --- a/docs/src/zh-Hans/getting-started/docker.md +++ b/docs/src/zh-Hans/getting-started/docker.md @@ -88,7 +88,7 @@ Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub # this container is optional # add this if you want to use the videoclips feature - ffmpeg: + video-clipper: image: castopod/video-clipper:latest container_name: "castopod-video-clipper" volumes: diff --git a/modules/Admin/Language/ar/Breadcrumb.php b/modules/Admin/Language/ar/Breadcrumb.php index f557a2ec..12263f98 100644 --- a/modules/Admin/Language/ar/Breadcrumb.php +++ b/modules/Admin/Language/ar/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'احذف', 'remove' => 'remove', 'fediverse' => 'الفديفرس', - 'block-lists' => 'قوائم حجب', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'مستخدمون', 'my-account' => 'حسابي', 'change-password' => 'تغيير الكلمة السرية', diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php index 46a4350b..8bcec91f 100644 --- a/modules/Admin/Language/br/Breadcrumb.php +++ b/modules/Admin/Language/br/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'dilemel', 'remove' => 'remove', 'fediverse' => 'kevrebed', - 'block-lists' => 'roll ar re stanket', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'implijerien·ezed', 'my-account' => 'ma c\'hont', 'change-password' => 'kemmañ ar ger-tremen', diff --git a/modules/Admin/Language/ca/Breadcrumb.php b/modules/Admin/Language/ca/Breadcrumb.php index 5115dc04..18056225 100644 --- a/modules/Admin/Language/ca/Breadcrumb.php +++ b/modules/Admin/Language/ca/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'eliminar', 'remove' => 'remove', 'fediverse' => 'Fediverse', - 'block-lists' => 'llista de bloquejats', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'usuaris', 'my-account' => 'el meu compte', 'change-password' => 'canviar la contrasenya', diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php index 037c53f5..12474dc2 100644 --- a/modules/Admin/Language/de/Breadcrumb.php +++ b/modules/Admin/Language/de/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'löschen', 'remove' => 'Entfernen', 'fediverse' => 'Fediversum', - 'block-lists' => 'Sperrlisten', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'Benutzer', 'my-account' => 'Mein Konto', 'change-password' => 'Passwort ändern', diff --git a/modules/Admin/Language/el/AboutCastopod.php b/modules/Admin/Language/el/AboutCastopod.php index 3fb62aff..df1c81f4 100644 --- a/modules/Admin/Language/el/AboutCastopod.php +++ b/modules/Admin/Language/el/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'Περί Του Castopod', + 'host_name' => 'Όνομα εξυπηρετητή', + 'version' => 'Έκδοση Castopod', + 'php_version' => 'Έκδοση PHP', + 'os' => 'Λειτουργικό σύστημα', + 'languages' => 'Γλώσσες', + 'update_database' => 'Ενημέρωση Βάσης Δεδομένων', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'Η βάση δεδομένων είναι ενημερωμένη!', ], ]; diff --git a/modules/Admin/Language/el/Breadcrumb.php b/modules/Admin/Language/el/Breadcrumb.php index 25c2cb6d..78a071a7 100644 --- a/modules/Admin/Language/el/Breadcrumb.php +++ b/modules/Admin/Language/el/Breadcrumb.php @@ -14,24 +14,25 @@ return [ ->gateway => 'Αρχική σελίδα', 'podcasts' => 'podcasts', 'episodes' => 'επεισόδια', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'συνδρομές', 'contributors' => 'συντελεστές', 'pages' => 'σελίδες', 'settings' => 'ρυθμίσεις', 'theme' => 'θέμα', - 'about' => 'about', + 'about' => 'σχετικά', 'add' => 'προσθήκη', 'new' => 'νέο', 'edit' => 'επεξεργασία', 'persons' => 'άτομα', 'publish' => 'δημοσίευση', 'publish-edit' => 'επεξεργασία δημοσίευσης', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'επεξεργασία ημερομηνίας δημοσίευσης', 'unpublish' => 'αναίρεση δημοσίευσης', 'delete' => 'διαγραφή', - 'remove' => 'remove', + 'remove' => 'αφαίρεση', 'fediverse' => 'fediverse', - 'block-lists' => 'λίστες αποκλεισμένων', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'χρήστες', 'my-account' => 'ο λογαριασμός μου', 'change-password' => 'αλλαγή κωδικού πρόσβασης', @@ -49,6 +50,6 @@ return [ 'soundbites' => 'ήχοι', 'video-clips' => 'βίντεο κλιπς', 'embed' => 'ενσωματώσιμος αναπαραγωγέας', - 'notifications' => 'notifications', - 'suspend' => 'suspend', + 'notifications' => 'ειδοποιήσεις', + 'suspend' => 'αναστολή', ]; diff --git a/modules/Admin/Language/el/Charts.php b/modules/Admin/Language/el/Charts.php index be7ed2ee..4575d14d 100644 --- a/modules/Admin/Language/el/Charts.php +++ b/modules/Admin/Language/el/Charts.php @@ -35,6 +35,6 @@ return [ 'by_weekday' => 'Την ημέρα της εβδομάδας (για τις τελευταίες 60 ημέρες)', 'by_hour' => 'Κατά την ώρα της ημέρας (για τις τελευταίες 60 ημέρες)', 'podcast_by_bandwidth' => 'Ημερήσιο χρησιμοποιούμενο bandwidth (σε MB)', - 'total_storage_by_month' => 'Monthly storage (in MB)', - 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_storage_by_month' => 'Μηνιαία αποθήκευση (σε MB)', + 'total_bandwidth_by_month' => 'Μηνιαίο χρησιμοποιούμενο εύρος ζώνης (σε MB)', ]; diff --git a/modules/Admin/Language/el/Common.php b/modules/Admin/Language/el/Common.php index 13b75af4..4652e2a3 100644 --- a/modules/Admin/Language/el/Common.php +++ b/modules/Admin/Language/el/Common.php @@ -46,6 +46,6 @@ return [ 'playing' => 'Αναπαράγεται', ], 'size_limit' => 'Όριο μεγέθους: {0}.', - 'choose_interact' => 'Choose how to interact', - 'view' => 'View', + 'choose_interact' => 'Επιλέξτε τον τρόπο αλληλεπίδρασης', + 'view' => 'Προβολή', ]; diff --git a/modules/Admin/Language/el/Dashboard.php b/modules/Admin/Language/el/Dashboard.php index 881073fd..b780ea20 100644 --- a/modules/Admin/Language/el/Dashboard.php +++ b/modules/Admin/Language/el/Dashboard.php @@ -9,20 +9,20 @@ declare(strict_types=1); */ return [ - 'home' => 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', + 'home' => 'Πίνακας ελέγχου διαχειριστή', + 'welcome_message' => 'Καλώς ήρθατε στην περιοχή διαχείρισης!', 'podcasts' => [ 'title' => 'Podcasts', - 'not_found' => 'No published podcast', - 'last_published' => 'Last published on {lastPublicationDate}', + 'not_found' => 'Δεν υπάρχει δημοσιευμένο podcast', + 'last_published' => 'Τελευταία δημοσίευση στις {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episodes', - 'not_found' => 'No published episode', - 'last_published' => 'Last published on {lastPublicationDate}', + 'title' => 'Επεισόδια', + 'not_found' => 'Κανένα δημοσιευμένο επεισόδιο', + 'last_published' => 'Τελευταία δημοσίευση στις {lastPublicationDate}', ], 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', + 'title' => 'Αποθηκευτικός χώρος', + 'subtitle' => '{totalUploaded} από {totalStorage}', ], ]; diff --git a/modules/Admin/Language/el/Episode.php b/modules/Admin/Language/el/Episode.php index 53c6ea41..6bd5c6a1 100644 --- a/modules/Admin/Language/el/Episode.php +++ b/modules/Admin/Language/el/Episode.php @@ -24,34 +24,34 @@ return [ 'edit' => 'Επεξεργασία', 'publish' => 'Δημοσίευση', 'publish_edit' => 'Επεξεργασία δημοσίευσης', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Επεξεργασία ημερομηνίας δημοσίευσης', 'unpublish' => 'Αναίρεση δημοσίευσης', 'publish_error' => 'Το επεισόδιο έχει ήδη δημοσιευθεί.', 'publish_edit_error' => 'Το επεισόδιο έχει ήδη δημοσιευθεί.', 'publish_cancel_error' => 'Το επεισόδιο έχει ήδη δημοσιευθεί.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'Το επεισόδιο δεν έχει δημοσιευθεί ακόμα, δεν μπορείτε να επεξεργαστείτε την ημερομηνία έκδοσής του.', + 'publish_date_edit_future_error' => 'Η ημερομηνία δημοσίευσης του επεισοδίου μπορεί να οριστεί μόνο σε μια προηγούμενη ημερομηνία! Αν θέλετε να την προγραμματίσετε εκ νέου, αποδημοσιεύστε την πρώτα.', + 'publish_date_edit_success' => 'Η ημερομηνία δημοσίευσης του επεισοδίου έχει ενημερωθεί με επιτυχία!', 'unpublish_error' => 'Το επεισόδιο δεν έχει δημοσιευθεί.', 'delete' => 'Διαγραφή', 'go_to_page' => 'Μετάβαση στη σελίδα', 'create' => 'Προσθήκη επεισοδίου', 'publication_status' => [ 'published' => 'Δημοσιευμένο', - 'with_podcast' => 'Published', + 'with_podcast' => 'Δημοσιευμένο', 'scheduled' => 'Προγραμματισμένο', 'not_published' => 'Δεν έχει δημοσιευτεί', ], - 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'with_podcast_hint' => 'Να δημοσιευτεί ταυτόχρονα με το podcast', 'list' => [ 'search' => [ - 'placeholder' => 'Search for an episode', - 'clear' => 'Clear search', - 'submit' => 'Search', + 'placeholder' => 'Αναζήτηση ενός επεισοδίου', + 'clear' => 'Καθαρισμός αναζήτησης', + 'submit' => 'Αναζήτηση', ], 'number_of_episodes' => '{numberOfEpisodes, plural, - one {# episode} - other {# episodes} + one {# επισόδειο} + other {# επισόδεια} }', 'episode' => 'Επεισόδιο', 'visibility' => 'Ορατότητα', @@ -62,31 +62,31 @@ return [ 'createSuccess' => 'Το επεισόδιο δημιουργήθηκε με επιτυχία!', 'editSuccess' => 'Το επεισόδιο ενημερώθηκε με επιτυχία!', 'publishSuccess' => '{publication_status, select, - published {Episode successfully published!} - scheduled {Episode publication successfully scheduled!} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not published.} + published {Το επεισόδιο δημοσιεύτηκε με επιτυχία!} + scheduled {Η έκδοση για το επεισόδιο έχει προγραμματιστεί επιτυχώς!} + with_podcast {Αυτό το επεισόδιο θα δημοσιευθεί ταυτόχρονα με το podcast.} + other {Αυτό το επεισόδιο δεν έχει δημοσιευθεί.} }', 'publishCancelSuccess' => 'Η δημοσίευση του επεισοδίου ακυρώθηκε επιτυχώς!', - 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', - 'scheduleDateError' => 'Schedule date must be set!', - 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', - 'deleteSuccess' => 'Episode successfully deleted!', - 'deleteError' => 'Failed to delete episode {type, select, + 'unpublishBeforeDeleteTip' => 'Πρέπει να καταργήσετε τη δημοσίευση του επεισοδίου πριν τη διαγραφή.', + 'scheduleDateError' => 'Η ημερομηνία πρέπει να οριστεί!', + 'deletePublishedEpisodeError' => 'Πρέπει να καταργήσετε τη δημοσίευση του επεισοδίου πριν τη διαγραφή.', + 'deleteSuccess' => 'Το επεισόδιο διαγράφτηκε με επιτυχία!', + 'deleteError' => 'Αποτυχία διαγραφής επεισοδίου {type, select, transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} + chapters {κεφάλαια} + image {καλύπτουν} + audio {ήχος} + other {πολυμέσα} }.', - 'deleteFileError' => 'Failed to delete {type, select, + 'deleteFileError' => 'Αποτυχία διαγραφής {type, select, transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} - } file {file_path}. You may manually remove it from your disk.', - 'sameSlugError' => 'An episode with the chosen slug already exists.', + chapters {κεφάλαια} + image {καλύψτε} + audio {ήχος} + other {πολυμέσα} + } αρχείο {file_path}. Μπορείτε να το αφαιρέσετε χειροκίνητα από το δίσκο σας.', + 'sameSlugError' => 'Ένα επεισόδιο με το επιλεγμένο slug υπάρχει ήδη.', ], 'form' => [ 'file_size_error' => @@ -97,7 +97,7 @@ return [ 'cover' => 'Εξώφυλλο επισοδίου', 'cover_hint' => 'Εάν δεν ορίσετε ένα εξώφυλλο, το εξώφυλλο του podcast θα χρησιμοποιηθεί αντ \'αυτού.', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'cover_size_hint' => 'Το εξώφυλλο πρέπει να είναι τουλάχιστον 1400px πλάτος και ύψος.', 'title' => 'Τίτλος', 'title_hint' => 'Θα πρέπει να υπάρχει ένα σαφές και συνοπτικό όνομα επεισοδίου. Μην καθορίσετε εδώ το επεισόδιο ή τους αριθμούς της σεζόν.', @@ -114,7 +114,7 @@ return [ 'bonus_hint' => 'Επιπλέον περιεχόμενο για την παράσταση (για παράδειγμα, πίσω από τις σκηνές πληροφορίες ή συνεντεύξεις με τη cast) ή δια-διαφημιστικό περιεχόμενο για μια άλλη παράσταση', ], 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium' => 'Το επεισόδιο πρέπει να είναι προσβάσιμο μόνο σε συνδρομητές premium', 'parental_advisory' => [ 'label' => 'Γονικός σύμβουλος', 'hint' => 'Μήπως το επεισόδιο περιέχει ακατάλληλο περιεχόμενο;', @@ -153,9 +153,9 @@ return [ 'Αν χρειάζεστε ετικέτες RSS που δεν χειρίζεται το Castopod, ορίστε τις εδώ.', 'custom_rss' => 'Προσαρμοσμένες ετικέτες RSS για το επεισόδιο', 'custom_rss_hint' => 'Αυτό θα ενεθεί εντός της ετικέτας "item".', - 'block' => 'Episode should be hidden from public catalogues', + 'block' => 'Το επεισόδιο πρέπει να είναι κρυμμένο από όλες τις πλατφόρμες', 'block_hint' => - 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'H κατάσταση εμφάνιση ή απόκρυψη επισοδείου: Η εναλλαγή αποτρέπει την εμφάνιση του επεισοδίου στο Apple Podcast Google Podcasts, και σε οποιεσδήποτε εφαρμογή τρίτων που τραβούν τις εμφανίσεις από αυτούς τους καταλόγους. (Μη εγγυημένη)', 'submit_create' => 'Δημιουργία επεισοδίου', 'submit_edit' => 'Αποθήκευση επεισοδίου', ], @@ -169,7 +169,7 @@ return [ 'publication_method' => [ 'now' => 'Τώρα', 'schedule' => 'Προγραμματισμός', - 'with_podcast' => 'Publish alongside podcast', + 'with_podcast' => 'Δημοσίευση παράλληλα με podcast', ], 'scheduled_publication_date' => 'Ημερομηνία προγραμματισμένης δημοσίευσης', 'scheduled_publication_date_clear' => 'Εκκαθάριση ημερομηνίας δημοσίευσης', @@ -183,21 +183,21 @@ return [ 'message_warning_submit' => 'Δημοσίευση ούτως ή άλλως', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Ημερομηνία νέας δημοσίευσης', + 'new_publication_date_hint' => 'Πρέπει να οριστεί σε μια προηγούμενη ημερομηνία.', + 'submit' => 'Επεξεργασία ημερομηνίας δημοσίευσης', ], 'unpublish_form' => [ 'disclaimer' => - "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + "Η κατάργηση της δημοσίευσης του επεισοδίου θα διαγράψει όλα τα σχόλια και τις δημοσιεύσεις που σχετίζονται με αυτό και θα τα αφαιρέσει από τη ροή RSS του podcast.", 'understand' => 'Καταλαβαίνω, θέλω να αποδημοσιεύσει το επεισόδιο', 'submit' => 'Αναίρεση δημοσίευσης', ], 'delete_form' => [ 'disclaimer' => - "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + "Διαγράφοντας το επεισόδιο θα διαγράψετε όλα τα αρχεία πολυμέσων, τα σχόλια, τα βίντεο κλιπ και τα ηχητικά δεδομένα που σχετίζονται με αυτό.", 'understand' => 'Καταλαβαίνω, θέλω να διαγράψω το επεισόδιο', - 'submit' => 'Delete', + 'submit' => 'Διαγραφή', ], 'embed' => [ 'title' => 'Ενσωματώσιμος αναπαραγωγέας', diff --git a/modules/Admin/Language/el/Notifications.php b/modules/Admin/Language/el/Notifications.php index 2b139d51..3e87ddba 100644 --- a/modules/Admin/Language/el/Notifications.php +++ b/modules/Admin/Language/el/Notifications.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'Notifications', - 'reply' => '{actor_username} replied to your post', - 'favourite' => '{actor_username} favourited your post', - 'reblog' => '{actor_username} shared your post', - 'follow' => '{actor_username} started following you', - 'no_notifications' => 'No notifications', - 'mark_all_as_read' => 'Mark all as read', + 'title' => 'Ειδοποιήσεις', + 'reply' => '{actor_username} απάντησε στο post σας', + 'favourite' => '{actor_username} έβαλε αγαπημένη τη δημοσίευσή σας', + 'reblog' => '{actor_username} κοινοποίησε τη δημοσίευσή σας', + 'follow' => '{actor_username} ξεκίνησε να σας ακολουθεί', + 'no_notifications' => 'Καμία ειδοποίηση', + 'mark_all_as_read' => 'Σήμανση όλων ως αναγνωσμένα', ]; diff --git a/modules/Admin/Language/el/Podcast.php b/modules/Admin/Language/el/Podcast.php index a0f061b4..070e2443 100644 --- a/modules/Admin/Language/el/Podcast.php +++ b/modules/Admin/Language/el/Podcast.php @@ -16,103 +16,103 @@ return [ 'new_episode' => 'Νέο Επεισόδιο', 'view' => 'Προβολή podcast', 'edit' => 'Επεξεργασία podcast', - 'publish' => 'Publish podcast', - 'publish_edit' => 'Edit publication', + 'publish' => 'Δημοσίευση podcast', + 'publish_edit' => 'Επεξεργασία δημοσίευσης', 'delete' => 'Διαγραφή podcast', 'see_episodes' => 'Δείτε επεισόδια', 'see_contributors' => 'Βλέπε συντελεστές', 'go_to_page' => 'Μετάβαση στη σελίδα', 'latest_episodes' => 'Τελευταία επεισόδια', 'see_all_episodes' => 'Δείτε όλα τα επεισόδια', - 'draft' => 'Draft', + 'draft' => 'Πρόχειρο', 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', + 'createSuccess' => 'Το επεισόδιο δημιουργήθηκε με επιτυχία!', 'editSuccess' => 'Το Podcast ενημερώθηκε με επιτυχία!', 'importSuccess' => 'Το Podcast εισήχθη με επιτυχία!', - 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', - 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, - cover {cover} + 'deleteSuccess' => 'Το Podcast @{podcast_handle} διαγράφηκε επιτυχώς!', + 'deletePodcastMediaError' => 'Αποτυχία διαγραφής podcast {type, select, + cover {εξώφυλλο} banner {banner} - other {media} + other {πολυμέσα} }.', - 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + 'deleteEpisodeMediaError' => 'Αποτυχία διαγραφής του podcast επεισοδίου {episode_slug} {type, select, transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} + chapters {κεφάλαια} + image {κάλυμμα} + audio {ήχος} + other {πολυμέσα} }.', - 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', - 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, - one {# episode was} - other {# episodes were} - } added to the podcast!', - 'podcastFeedUpToDate' => 'Podcast is already up to date.', - 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', - 'publishError' => 'This podcast is either already published or scheduled for publication.', - 'publishEditError' => 'This podcast is not scheduled for publication.', - 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', - 'scheduleDateError' => 'Schedule date must be set!', + 'deletePodcastMediaFolderError' => 'Αποτυχία διαγραφής του φακέλου μέσων podcast {folder_path}. Μπορείτε να τον αφαιρέσετε χειροκίνητα από το δίσκο σας.', + 'podcastFeedUpdateSuccess' => 'Επιτυχημένη ενημέρωση: {number_of_new_episodes, plural, + one {# επεισόδιο ήταν} + other {# επεισόδια ήταν} + } προστέθηκαν στο podcast!', + 'podcastFeedUpToDate' => 'Το Podcast είναι ήδη ενημερωμένο.', + 'podcastNotImported' => 'Το Podcast δεν μπόρεσε να ενημερωθεί καθώς δεν εισήχθη.', + 'publishError' => 'Αυτό το podcast είτε έχει ήδη δημοσιευθεί είτε έχει προγραμματιστεί για δημοσίευση.', + 'publishEditError' => 'Αυτό το podcast δεν έχει προγραμματιστεί για δημοσίευση.', + 'publishCancelSuccess' => 'Η δημοσίευση του επεισοδίου ακυρώθηκε επιτυχώς!', + 'scheduleDateError' => 'Η ημερομηνία πρέπει να οριστεί!', ], 'form' => [ 'identity_section_title' => 'Αναγνωριστικό Podcast', 'identity_section_subtitle' => 'Αυτά τα πεδία σας επιτρέπουν να ξεχωρίσει το podcast σας.', - 'cover' => 'Podcast cover', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', - 'banner' => 'Podcast banner', - 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', - 'banner_delete' => 'Delete podcast banner', - 'title' => 'Title', + 'cover' => 'Εξώφυλο podcast', + 'cover_size_hint' => 'Το εξώφυλλο πρέπει να είναι τουλάχιστον 1400px πλάτος και ύψος.', + 'banner' => 'Banner podcast', + 'banner_size_hint' => 'Το Banner πρέπει να έχει αναλογία 3:1 και να είναι τουλάχιστον 1500px πλάτος.', + 'banner_delete' => 'Διαγραφή του podcast banner', + 'title' => 'Τίτλος', 'handle' => 'Handle', 'handle_hint' => - 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'Χρησιμοποιείται για τον προσδιορισμό του podcast. Τα κεφαλαία, τα πεζά, οι αριθμοί και οι κάτω παύλες γίνονται αποδεκτές.', 'type' => [ - 'label' => 'Type', + 'label' => 'Είδος', 'episodic' => 'Episodic', - 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', - 'serial' => 'Serial', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + 'episodic_hint' => 'Εάν τα επεισόδια προορίζονται να καταναλωθούν χωρίς καμία συγκεκριμένη σειρά.', + 'serial' => 'Σειριακός Αριθμός', + 'serial_hint' => 'Εάν τα επεισόδια προορίζονται να καταναλωθούν με διαδοχική σειρά. Τα παλαιότερα επεισόδια θα παρουσιαστούν πρώτα.', ], - 'description' => 'Description', - 'classification_section_title' => 'Classification', + 'description' => 'Περιγραφή', + 'classification_section_title' => 'Χαρακτηρισμός', 'classification_section_subtitle' => - 'These fields will impact your audience and competition.', - 'language' => 'Language', - 'category' => 'Category', - 'category_placeholder' => 'Select a category…', - 'other_categories' => 'Other categories', + 'Αυτά τα πεδία θα επηρεάσουν το κοινό και τον ανταγωνισμό σας.', + 'language' => 'Γλώσσα', + 'category' => 'Κατηγορία', + 'category_placeholder' => 'Επιλέξτε μια κατηγορία…', + 'other_categories' => 'Άλλες κατηγορίες', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does it contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'label' => 'Γονικός σύμβουλος', + 'hint' => 'Μήπως το επεισόδιο περιέχει ακατάλληλο περιεχόμενο;', + 'undefined' => 'απροσδιόριστο', + 'clean' => 'Καθαρισμός', + 'explicit' => 'Άσεμνο περιεχόμενο', ], - 'author_section_title' => 'Author', - 'author_section_subtitle' => 'Who is managing the podcast?', - 'owner_name' => 'Owner name', + 'author_section_title' => 'Συντάκτης', + 'author_section_subtitle' => 'Ποιος διαχειρίζεται το podcast;', + 'owner_name' => 'Όνομα κατόχου', 'owner_name_hint' => - 'For administrative use only. Visible in the public RSS feed.', - 'owner_email' => 'Owner email', + 'Μόνο για διοικητική χρήση. Ορατό στη δημόσια τροφοδοσία RSS.', + 'owner_email' => 'Email ιδιοκτήτη', 'owner_email_hint' => - 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', - 'publisher' => 'Publisher', + 'Θα χρησιμοποιηθεί από τις περισσότερες πλατφόρμες για να επαληθεύσει την ιδιοκτησία του podcast. Ορατό στη δημόσια τροφοδοσία RSS.', + 'publisher' => 'Εκδότης', 'publisher_hint' => - 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', - 'copyright' => 'Copyright', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this podcast about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real place or fictional', + 'Η ομάδα που είναι υπεύθυνη για τη δημιουργία της παράστασης. Συχνά αναφέρεται στη μητρική εταιρεία ή στο δίκτυο ενός podcast. Αυτό το πεδίο μερικές φορές χαρακτηρίζεται ως \'Συγγραφέας\'.', + 'copyright' => 'Πνευματικά δικαιώματα', + 'location_section_title' => 'Τοποθεσία', + 'location_section_subtitle' => 'Σε ποιο μέρος είναι αυτό το επεισόδιο;', + 'location_name' => 'Όνομα τοποθεσίας ή διεύθυνση', + 'location_name_hint' => 'Αυτό μπορεί να είναι ένα πραγματικό μέρος ή φανταστικό', 'monetization_section_title' => 'Monetization', 'monetization_section_subtitle' => - 'Earn money thanks to your audience.', + 'Κερδίστε χρήματα χάρη στο κοινό σας.', 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', - 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'premium_by_default' => 'Τα επεισόδια πρέπει να ορίζονται ως premium από προεπιλογή', + 'premium_by_default_hint' => 'Τα επεισόδια Podcast θα επισημανθούν ως premium από προεπιλογή. Μπορείτε ακόμα να επιλέξετε να ορίσετε κάποια επεισόδια, trailers ή μπόνους ως δημόσια.', + 'payment_pointer' => 'Δείκτης πληρωμής για Monetization Web', 'payment_pointer_hint' => - 'This is your where you will receive money thanks to Web Monetization', + 'Αυτό είναι το πού θα λάβετε χρήματα χάρη στην Monetization Web', 'advanced_section_title' => 'Advanced Parameters', 'advanced_section_subtitle' => 'If you need RSS tags that Castopod does not handle, set them here.', @@ -168,56 +168,56 @@ return [ 'food' => 'Food', 'performing_arts' => 'Performing Arts', 'visual_arts' => 'Visual Arts', - 'careers' => 'Careers', - 'entrepreneurship' => 'Entrepreneurship', - 'investing' => 'Investing', - 'management' => 'Management', - 'marketing' => 'Marketing', - 'non_profit' => 'Non-Profit', - 'comedy_interviews' => 'Comedy Interviews', - 'improv' => 'Improv', + 'careers' => 'Καριέρες', + 'entrepreneurship' => 'Επιχειρηματικότητα', + 'investing' => 'Επενδύσεις', + 'management' => 'Διαχείριση', + 'marketing' => 'Μάρκετινγκ', + 'non_profit' => 'Μη κερδοσκοπικού χαρακτήρα', + 'comedy_interviews' => 'Συνεντεύξεις Κωμωδίας', + 'improv' => 'Βελτίωση', 'stand_up' => 'Stand-Up', - 'courses' => 'Courses', + 'courses' => 'Σεμινάρια', 'how_to' => 'How To', - 'language_learning' => 'Language Learning', - 'self_improvement' => 'Self-Improvement', - 'comedy_fiction' => 'Comedy Fiction', - 'drama' => 'Drama', - 'science_fiction' => 'Science Fiction', - 'alternative_health' => 'Alternative Health', - 'fitness' => 'Fitness', - 'medicine' => 'Medicine', - 'mental_health' => 'Mental Health', - 'nutrition' => 'Nutrition', - 'sexuality' => 'Sexuality', - 'education_for_kids' => 'Education for Kids', - 'parenting' => 'Parenting', - 'pets_and_animals' => 'Pets & Animals', - 'stories_for_kids' => 'Stories for Kids', + 'language_learning' => 'Εκμάθηση γλωσσών', + 'self_improvement' => 'Αυτοβελτίωση', + 'comedy_fiction' => 'Φαντασία Κωμωδίας', + 'drama' => 'Δράμα', + 'science_fiction' => 'Επιστημονικής φαντασίας', + 'alternative_health' => 'Εναλλακτική Υγεία', + 'fitness' => 'Γυμναστική', + 'medicine' => 'Ιατρική', + 'mental_health' => 'Ψυχική Υγεία', + 'nutrition' => 'Διατροφή', + 'sexuality' => 'Σεξουαλικότητα', + 'education_for_kids' => 'Εκπαίδευση για παιδιά', + 'parenting' => 'Γονείς', + 'pets_and_animals' => 'Κατοικίδια & Ζώα', + 'stories_for_kids' => 'Ιστορίες για παιδιά', 'animation_and_manga' => 'Animation & Manga', - 'automotive' => 'Automotive', - 'aviation' => 'Aviation', - 'crafts' => 'Crafts', - 'games' => 'Games', - 'hobbies' => 'Hobbies', - 'home_and_garden' => 'Home & Garden', - 'video_games' => 'Video Games', - 'music_commentary' => 'Music Commentary', - 'music_history' => 'Music History', - 'music_interviews' => 'Music Interviews', - 'business_news' => 'Business News', - 'daily_news' => 'Daily News', - 'entertainment_news' => 'Entertainment News', + 'automotive' => 'Αυτοκίνητα', + 'aviation' => 'Αεροπορία', + 'crafts' => 'Χειροτεχνίες', + 'games' => 'Παιχνίδια', + 'hobbies' => 'Χόμπι', + 'home_and_garden' => 'Σπίτι & Κήπος', + 'video_games' => 'Βιντεοπαιχνίδια', + 'music_commentary' => 'Σχολιασμός Μουσικής', + 'music_history' => 'Ιστορία Μουσικής', + 'music_interviews' => 'Συνεντεύξεις Μουσικής', + 'business_news' => 'Επιχειρηματικά Νέα', + 'daily_news' => 'Καθημερινές Ειδήσεις', + 'entertainment_news' => 'Ειδήσεις ψυχαγωγίας', 'news_commentary' => 'News Commentary', - 'politics' => 'Politics', - 'sports_news' => 'Sports News', - 'tech_news' => 'Tech News', - 'buddhism' => 'Buddhism', - 'christianity' => 'Christianity', + 'politics' => 'Πολιτική', + 'sports_news' => 'Αθλητικά νέα', + 'tech_news' => 'Ειδήσεις Τεχνολογίας', + 'buddhism' => 'Βουδισμός', + 'christianity' => 'Χριστιανισμός', 'hinduism' => 'Hinduism', - 'islam' => 'Islam', - 'judaism' => 'Judaism', - 'religion' => 'Religion', + 'islam' => 'Ισλαμισμός', + 'judaism' => 'Ιουδαϊσμός', + 'religion' => 'Θρησκεία', 'spirituality' => 'Spirituality', 'astronomy' => 'Astronomy', 'chemistry' => 'Chemistry', @@ -272,39 +272,39 @@ return [ 'submit_edit' => 'Edit publication', 'cancel_publication' => 'Cancel publication', 'message_warning' => 'You did not write a message for your announcement post!', - 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', - 'message_warning_submit' => 'Publish anyway', + 'message_warning_hint' => 'Έχοντας ένα μήνυμα αυξάνει την κοινωνική δέσμευση, με αποτέλεσμα μια καλύτερη ορατότητα για το podcast σας.', + 'message_warning_submit' => 'Δημοσίευση ούτως ή άλλως', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', - 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + 'draft_mode' => 'λειτουργία πρόχειρου', + 'not_published' => 'Αυτό το podcast δεν έχει ακόμη δημοσιευθεί.', + 'scheduled' => 'Αυτό το podcast έχει προγραμματιστεί για δημοσίευση στις {publication_date}.', ], 'delete_form' => [ 'disclaimer' => - "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", - 'understand' => 'I understand, I want the podcast to be permanently deleted', - 'submit' => 'Delete', + "Διαγράφοντας το podcast θα διαγράψει όλα τα επεισόδια, τα αρχεία πολυμέσων, τις δημοσιεύσεις και τα αναλυτικά στοιχεία που σχετίζονται με αυτό. Αυτή η ενέργεια είναι μη αναστρέψιμη, δεν θα είστε σε θέση να τις ανακτήσετε αργότερα.", + 'understand' => 'Καταλαβαίνω, θέλω το podcast να διαγραφεί οριστικά', + 'submit' => 'Διαγραφή', ], - 'by' => 'By {publisher}', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'by' => 'Από {publisher}', + 'season' => 'Σεζόν {seasonNumber}', + 'list_of_episodes_year' => '{year} επεισόδια ({episodeCount})', 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', + 'Σεζόν {seasonNumber} επεισόδεια ({episodeCount})', + 'no_episode' => 'Δεν βρέθηκε επεισόδιο!', + 'follow' => 'Ακολουθήστε', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# ακόλουθος} + other {# ακόλουθοι} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# δημοσίευση} + other {# δημοσιεύσεις} }', - 'activity' => 'Activity', - 'episodes' => 'Episodes', - 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', + 'activity' => 'Δραστηριότητα', + 'episodes' => 'Επεισόδια', + 'sponsor' => 'Χορηγός', + 'funding_links' => 'Σύνδεσμοι χρηματοδότησης για το {podcastTitle}', + 'find_on' => 'Βρείτε το {podcastTitle} στο', + 'listen_on' => 'Ακούστε το', ]; diff --git a/modules/Admin/Language/el/PodcastImport.php b/modules/Admin/Language/el/PodcastImport.php index 7c3ef67d..fbae4b3e 100644 --- a/modules/Admin/Language/el/PodcastImport.php +++ b/modules/Admin/Language/el/PodcastImport.php @@ -10,28 +10,28 @@ declare(strict_types=1); return [ 'warning' => - 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', - 'old_podcast_section_title' => 'The podcast to import', + 'Αυτή η διαδικασία μπορεί να διαρκέσει πολύ. Καθώς η τρέχουσα έκδοση δεν εμφανίζει καμία πρόοδο ενώ εκτελείται, δεν θα δείτε τίποτα να ενημερώνεται μέχρι να ολοκληρωθεί. Σε περίπτωση σφάλματος χρονικού ορίου, αυξήστε την τιμή `max_execution_time`.', + 'old_podcast_section_title' => 'Το podcast για εισαγωγή', 'old_podcast_section_subtitle' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', - 'advanced_params_section_title' => 'Advanced parameters', + 'Βεβαιωθείτε ότι έχετε τα δικαιώματα για αυτό το podcast πριν από την εισαγωγή του. Η αντιγραφή και μετάδοση ενός podcast χωρίς τα κατάλληλα δικαιώματα είναι πειρατεία και μπορεί να διωχθεί.', + 'imported_feed_url' => 'Διεύθυνση URL Ροής', + 'imported_feed_url_hint' => 'To Url πρέπει να είναι σε μορφή xml ή rss.', + 'new_podcast_section_title' => 'Το νέο podcast', + 'advanced_params_section_title' => 'Παράμετροι για προχωρημένους', 'advanced_params_section_subtitle' => - 'Keep the default values if you have no idea of what the fields are for.', - 'slug_field' => 'Field to be used to calculate episode slug', + 'Διατηρήστε τις προεπιλεγμένες τιμές αν δεν έχετε ιδέα για το ποια είναι τα πεδία.', + 'slug_field' => 'Πεδίο που πρέπει να χρησιμοποιείται για τον υπολογισμό του slug του επεισοδίου', 'description_field' => - 'Source field used for episode description / show notes', + 'Πεδίο πηγής που χρησιμοποιείται για την περιγραφή επεισοδίου / εμφάνιση σημειώσεων', 'force_renumber' => 'Force episodes renumbering', 'force_renumber_hint' => 'Use this if your podcast does not have episode numbers but wish to set them during import.', - 'season_number' => 'Season number', + 'season_number' => 'Αριθμός σεζόν', 'season_number_hint' => - 'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.', - 'max_episodes' => 'Maximum number of episodes to import', - 'max_episodes_hint' => 'Leave blank to import all episodes', + 'Χρησιμοποιήστε αυτό αν το podcast σας δεν έχει αριθμό σεζόν αλλά επιθυμεί να ορίσει έναν κατά την εισαγωγή. Αφήστε κενό διαφορετικά.', + 'max_episodes' => 'Μέγιστος αριθμός επεισοδίων εισαγωγής', + 'max_episodes_hint' => 'Αφήστε κενό για την εισαγωγή όλων των επεισοδίων', 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.', - 'submit' => 'Import podcast', + 'Αυτή η ροή προστατεύεται. Δεν μπορείτε να την εισάγετε. Αν είστε ο ιδιοκτήτης, μην την προστατεύετε στην πλατφόρμα προέλευσης.', + 'submit' => 'Εισαγωγή podcast', ]; diff --git a/modules/Admin/Language/el/PodcastNavigation.php b/modules/Admin/Language/el/PodcastNavigation.php index b4d7ddc0..213a52af 100644 --- a/modules/Admin/Language/el/PodcastNavigation.php +++ b/modules/Admin/Language/el/PodcastNavigation.php @@ -9,30 +9,30 @@ declare(strict_types=1); */ return [ - 'go_to_page' => 'Go to podcast page', - 'dashboard' => 'Podcast dashboard', - 'podcast-view' => 'Home', - 'podcast-edit' => 'Edit podcast', - 'podcast-persons-manage' => 'Manage persons', - 'episodes' => 'Episodes', - 'episode-list' => 'All episodes', - 'episode-create' => 'New episode', - 'analytics' => 'Analytics', - 'podcast-analytics' => 'Audience overview', - 'podcast-analytics-webpages' => 'Web pages visits', - 'podcast-analytics-locations' => 'Locations', - 'podcast-analytics-unique-listeners' => 'Unique listeners', - 'podcast-analytics-players' => 'Players', - 'podcast-analytics-listening-time' => 'Listening time', - 'podcast-analytics-time-periods' => 'Time periods', + 'go_to_page' => 'Μετάβαση στη σελίδα podcast', + 'dashboard' => 'Πίνακας ελέγχου Podcast', + 'podcast-view' => 'Αρχική σελίδα', + 'podcast-edit' => 'Επεξεργασία podcast', + 'podcast-persons-manage' => 'Διαχείριση ατόμων', + 'episodes' => 'Επεισόδια', + 'episode-list' => 'Όλα τα επεισόδια', + 'episode-create' => 'Νέο Επεισόδιο', + 'analytics' => 'Στατιστικά', + 'podcast-analytics' => 'Επισκόπηση κοινού', + 'podcast-analytics-webpages' => 'Επίσκεψη ιστοσελίδων', + 'podcast-analytics-locations' => 'Τοποθεσίες', + 'podcast-analytics-unique-listeners' => 'Μοναδικοί ακροατές', + 'podcast-analytics-players' => 'Αναπαραγωγές', + 'podcast-analytics-listening-time' => 'Χρόνος ακρόασης', + 'podcast-analytics-time-periods' => 'Χρονικές περίοδοι', 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', - 'contributors' => 'Contributors', - 'contributor-list' => 'All contributors', - 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', + 'subscription-list' => 'Όλες οι συνδρομές', + 'subscription-add' => 'Προσθέστε συνδρομή', + 'contributors' => 'Συντελεστές', + 'contributor-list' => 'Όλοι οι συντελεστές', + 'contributor-add' => 'Προσθήκη συντελεστή', + 'platforms' => 'Εξωτερικές πλατφόρμες', 'platforms-podcasting' => 'Podcasting', - 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-social' => 'Κοινωνικά δίκτυα', + 'platforms-funding' => 'Χρηματοδότηση', ]; diff --git a/modules/Admin/Language/el/Settings.php b/modules/Admin/Language/el/Settings.php index 4a70dcba..d4ff241b 100644 --- a/modules/Admin/Language/el/Settings.php +++ b/modules/Admin/Language/el/Settings.php @@ -9,50 +9,50 @@ declare(strict_types=1); */ return [ - 'title' => 'General settings', + 'title' => 'Γενικές ρυθμίσεις', 'instance' => [ - 'title' => 'Instance', - 'site_icon' => 'Site icon', - 'site_icon_delete' => 'Delete site icon', - 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', - 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', - 'site_name' => 'Site name', - 'site_description' => 'Site description', - 'submit' => 'Save', - 'editSuccess' => 'Instance has been updated successfully!', - 'deleteIconSuccess' => 'Site icon has been remove successfully!', + 'title' => 'Διακομιστής', + 'site_icon' => 'Εικονίδιο ιστοσελίδας', + 'site_icon_delete' => 'Διαγραφή εικονιδίου ιστότοπου', + 'site_icon_hint' => 'Τα εικονίδια της ιστοσελίδας είναι αυτά που βλέπετε στις καρτέλες του προγράμματος περιήγησης, στη γραμμή σελιδοδεικτών, και όταν προσθέτετε μια ιστοσελίδα ως συντόμευση σε κινητές συσκευές.', + 'site_icon_helper' => 'Το εικονίδιο πρέπει να είναι τετράγωνο και τουλάχιστον 512px πλάτος και ψηλό.', + 'site_name' => 'Όνομα ιστοτόπου', + 'site_description' => 'Περιγραφή ιστοτόπου', + 'submit' => 'Αποθήκευση', + 'editSuccess' => 'Ο Διακομιστής έχει ενημερωθεί με επιτυχία!', + 'deleteIconSuccess' => 'Το εικονίδιο της ιστοσελίδας έχει καταργηθεί με επιτυχία!', ], 'images' => [ - 'title' => 'Images', - 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', - 'regenerate' => 'Regenerate images', - 'regenerationSuccess' => 'All images have been regenerated successfully!', + 'title' => 'Εικόνες', + 'subtitle' => 'Εδώ μπορείτε να επαναδημιουργήσετε όλες τις εικόνες με βάση τα πρωτότυπα που φορτώθηκαν. Για να χρησιμοποιηθεί αν βρείτε κάποιες εικόνες που λείπουν. Αυτή η εργασία μπορεί να διαρκέσει λίγο.', + 'regenerate' => 'Αναδημιουργία εικόνων', + 'regenerationSuccess' => 'Όλες οι εικόνες έχουν δημιουργηθεί επιτυχώς!', ], 'housekeeping' => [ 'title' => 'Housekeeping', 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', - 'reset_counts' => 'Reset counts', - 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', - 'rewrite_media' => 'Rewrite media metadata', - 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', - 'clear_cache' => 'Clear all cache', - 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'reset_counts' => 'Επαναφορά μετρήσεων', + 'reset_counts_helper' => 'Αυτή η επιλογή θα επαναϋπολογίσει και θα επαναφέρει όλους τους αριθμούς δεδομένων (αριθμός των ακολούθων, αναρτήσεις, σχόλια, …).', + 'rewrite_media' => 'Επανεγγραφή μεταδεδομένων πολυμέσων', + 'rewrite_media_helper' => 'Αυτή η επιλογή θα διαγράψει όλα τα περιττά αρχεία πολυμέσων και θα τα αναπαράγει (εικόνες, αρχεία ήχου, μεταγραφές, κεφάλαια, …)', + 'rename_episodes_files' => 'Μετονομασία αρχείων ήχου επεισοδίου', + 'rename_episodes_files_hint' => 'Αυτή η επιλογή θα μετονομάσει όλα τα αρχεία ήχου επεισόδια σε μια τυχαία συμβολοσειρά χαρακτήρων. Χρησιμοποιήστε αυτό αν διαρρεύσει ένας από τους ιδιωτικούς συνδέσμους επεισοδίων σας, καθώς αυτό θα τον αποκρύψει αποτελεσματικά.', + 'clear_cache' => 'Εκκαθάριση συνολικού cache', + 'clear_cache_helper' => 'Αυτή η επιλογή θα εκκαθαρίσει αρχεία cache redis ή εγγράψιμο/cache.', 'run' => 'Run housekeeping', 'runSuccess' => 'Housekeeping has been run successfully!', ], 'theme' => [ - 'title' => 'Theme', - 'accent_section_title' => 'Accent color', - 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', - 'pine' => 'Pine', - 'crimson' => 'Crimson', - 'amber' => 'Amber', - 'lake' => 'Lake', + 'title' => 'Θέμα', + 'accent_section_title' => 'Χρώμα έμφασης', + 'accent_section_subtitle' => 'Επιλέξτε το χρώμα για να καθορίσετε την εμφάνιση και την αίσθηση όλων των δημόσιων σελίδων.', + 'pine' => 'Πεύκο', + 'crimson' => 'Βυσσινί', + 'amber' => 'Κεχριμπάρι', + 'lake' => 'Λίμνη', 'jacaranda' => 'Jacaranda', - 'onyx' => 'Onyx', - 'submit' => 'Save', - 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + 'onyx' => 'Όνυξ', + 'submit' => 'Αποθήκευση', + 'setInstanceThemeSuccess' => 'Το θέμα έχει ενημερωθεί με επιτυχία!', ], ]; diff --git a/modules/Admin/Language/el/Soundbite.php b/modules/Admin/Language/el/Soundbite.php index a3f828fe..122bdb1d 100644 --- a/modules/Admin/Language/el/Soundbite.php +++ b/modules/Admin/Language/el/Soundbite.php @@ -10,22 +10,22 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Soundbites', - 'soundbite' => 'Soundbite', + 'title' => 'Ήχοι', + 'soundbite' => 'Ήχος', ], 'messages' => [ - 'createSuccess' => 'Soundbite has been successfully created!', - 'deleteSuccess' => 'Soundbite has been successfully removed!', + 'createSuccess' => 'Το Soundbite δημιουργήθηκε με επιτυχία!', + 'deleteSuccess' => 'Το Soundbite αφαιρέθηκε με επιτυχία!', ], 'form' => [ - 'title' => 'New soundbite', - 'soundbite_title' => 'Soundbite title', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'submit' => 'Create soundbite', + 'title' => 'Νέο soundbite', + 'soundbite_title' => 'Τίτλος Soundbite', + 'start_time' => 'Έναρξη από', + 'duration' => 'Διάρκεια', + 'submit' => 'Δημιουργία soundbite', ], - 'play' => 'Play soundbite', - 'stop' => 'Stop soundbite', - 'create' => 'New soundbite', - 'delete' => 'Delete soundbite', + 'play' => 'Αναπαραγωγή soundbite', + 'stop' => 'Σταμάτημα soundbite', + 'create' => 'Νέο soundbite', + 'delete' => 'Διαγραφή soundbite', ]; diff --git a/modules/Admin/Language/el/Validation.php b/modules/Admin/Language/el/Validation.php index 3bc78cfe..642f195d 100644 --- a/modules/Admin/Language/el/Validation.php +++ b/modules/Admin/Language/el/Validation.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'min_dims' => - '{field} is either not an image, or it is not wide or tall enough.', + '{field} είτε δεν είναι μια εικόνα, είτε δεν είναι αρκετά ευρεία ή ψηλή.', 'is_image_ratio' => - '{field} is either not an image or not of the right ratio.', + '{field} είτε δεν είναι εικόνα είτε όχι της σωστής αναλογίας.', ]; diff --git a/modules/Admin/Language/el/VideoClip.php b/modules/Admin/Language/el/VideoClip.php index 638de697..64388b13 100644 --- a/modules/Admin/Language/el/VideoClip.php +++ b/modules/Admin/Language/el/VideoClip.php @@ -10,63 +10,63 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Video clips', + 'title' => 'Βίντεο κλιπ', 'status' => [ - 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Clip is waiting to be processed.', - 'pending' => 'pending', - 'pending_hint' => 'Clip will be generated shortly.', - 'running' => 'running', - 'running_hint' => 'Clip is being generated.', - 'failed' => 'failed', - 'failed_hint' => 'Clip could not be generated: script failure.', + 'label' => 'Κατάσταση', + 'queued' => 'στην ουρά', + 'queued_hint' => 'Το κλιπ περιμένει να υποβληθεί σε επεξεργασία.', + 'pending' => 'εκκρεμεί', + 'pending_hint' => 'Το κλιπ θα δημιουργηθεί σύντομα.', + 'running' => 'εκτελείται', + 'running_hint' => 'Το κλιπ δημιουργείται.', + 'failed' => 'απέτυχε', + 'failed_hint' => 'Το κλιπ δεν μπόρεσε να δημιουργηθεί: αποτυχία δέσμης ενεργειών.', 'passed' => 'passed', - 'passed_hint' => 'Clip was generated successfully!', + 'passed_hint' => 'Το κλιπ δημιουργήθηκε με επιτυχία!', ], - 'clip' => 'Clip', - 'duration' => 'Job duration', + 'clip' => 'Αποσπάσματα', + 'duration' => 'Διάρκεια εργασίας', ], - 'title' => 'Video clip: {videoClipLabel}', - 'download_clip' => 'Download clip', - 'create' => 'New video clip', + 'title' => 'Βίντεο κλιπ: {videoClipLabel}', + 'download_clip' => 'Κατεβάστε το κλιπ', + 'create' => 'Νέο βίντεο κλιπ', 'go_to_page' => 'Go to clip page', 'retry' => 'Retry clip generation', - 'delete' => 'Delete clip', - 'logs' => 'Job logs', + 'delete' => 'Διαγραφή κλιπ', + 'logs' => 'Αρχεία καταγραφής εργασίας', 'messages' => [ - 'alreadyExistingError' => 'The video clip you are trying to create already exists!', - 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', - 'deleteSuccess' => 'Video clip has been successfully removed!', + 'alreadyExistingError' => 'Το βίντεο κλιπ που προσπαθείτε να δημιουργήσετε υπάρχει ήδη!', + 'addToQueueSuccess' => 'Το βίντεο κλιπ έχει προστεθεί στην ουρά αναμονής, αναμένοντας να δημιουργηθεί!', + 'deleteSuccess' => 'Το βίντεο κλιπ αφαιρέθηκε με επιτυχία!', ], 'format' => [ - 'landscape' => 'Landscape', - 'portrait' => 'Portrait', - 'squared' => 'Squared', + 'landscape' => 'Οριζόντια', + 'portrait' => 'Κατακόρυφα', + 'squared' => 'Τετράγωνα', ], 'form' => [ - 'title' => 'New video clip', - 'params_section_title' => 'Video clip parameters', - 'clip_title' => 'Clip title', + 'title' => 'Νέο βίντεο κλιπ', + 'params_section_title' => 'Παράμετροι βίντεο κλιπ', + 'clip_title' => 'Τίτλος κλιπ', 'format' => [ - 'label' => 'Choose a format', - 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', - 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', - 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + 'label' => 'Επιλογή μορφής', + 'landscape_hint' => 'Με αναλογία 16:9, τα βίντεο τοπίου είναι υπέροχα για το PeerTube, το Youtube και το Vimeo.', + 'portrait_hint' => 'Με αναλογία 9:16, πορτρέτο βίντεο είναι μεγάλη για TikTok, shorts Youtube και ιστορίες Instagram.', + 'squared_hint' => 'Με αναλογία 1:1, τα τετράγωνα βίντεο είναι υπέροχα για Mastodon, Facebook, Twitter και LinkedIn.', ], - 'theme' => 'Select a theme', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'trim_start' => 'Trim start', - 'trim_end' => 'Trim end', - 'submit' => 'Create video clip', + 'theme' => 'Επιλογή θέματος', + 'start_time' => 'Έναρξη από', + 'duration' => 'Διάρκεια', + 'trim_start' => 'Περικοπή έναρξης', + 'trim_end' => 'Περικοπή τέλους', + 'submit' => 'Δημιουργία βίντεο κλιπ', ], 'requirements' => [ - 'title' => 'Missing requirements', - 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'title' => 'Λείπουν προαπαιτούμενα', + 'missing' => 'Έχετε απαιτήσεις που λείπουν. Σιγουρευτείτε ότι προσθέστε όλα τα απαιτούμενα στοιχεία για να μπορέσετε να δημιουργήσετε ένα βίντεο για αυτό το επεισόδιο!', 'ffmpeg' => 'FFmpeg', - 'gd' => 'Graphics Draw (GD)', - 'freetype' => 'Freetype library for GD', - 'transcript' => 'Transcript file (.srt)', + 'gd' => 'Σχεδίαση Γραφικών (GD)', + 'freetype' => 'Βιβλιοθήκη Freetype για GD', + 'transcript' => 'Αρχείο απομαγνητοφώνησης (.srt)', ], ]; diff --git a/modules/Admin/Language/es/AboutCastopod.php b/modules/Admin/Language/es/AboutCastopod.php index 3fb62aff..93d4142b 100644 --- a/modules/Admin/Language/es/AboutCastopod.php +++ b/modules/Admin/Language/es/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'Acerca de Castopod', + 'host_name' => 'Nombre del host', + 'version' => 'Versión de Castopod', + 'php_version' => 'Versión de PHP', + 'os' => 'Sistema Operativo', + 'languages' => 'Idiomas', + 'update_database' => 'Actualizar base de datos', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'La base de datos esta actualizada!', ], ]; diff --git a/modules/Admin/Language/es/Breadcrumb.php b/modules/Admin/Language/es/Breadcrumb.php index 63fc38d9..74bf0ec7 100644 --- a/modules/Admin/Language/es/Breadcrumb.php +++ b/modules/Admin/Language/es/Breadcrumb.php @@ -14,24 +14,25 @@ return [ ->gateway => 'Inicio', 'podcasts' => 'podcasts', 'episodes' => 'episodios', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'suscripciones', 'contributors' => 'colaboradores', 'pages' => 'páginas', 'settings' => 'configuración', 'theme' => 'tema', - 'about' => 'about', + 'about' => 'acerca de', 'add' => 'añadir', 'new' => 'nuevo', 'edit' => 'editar', 'persons' => 'personas', 'publish' => 'publicar', 'publish-edit' => 'editar publicación', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'editar fecha de publicación', 'unpublish' => 'anular publicación', 'delete' => 'borrar', - 'remove' => 'remove', + 'remove' => 'eliminar', 'fediverse' => 'fediverso', - 'block-lists' => 'listas de bloqueo', + 'blocked-actors' => 'actores bloqueado', + 'blocked-domains' => 'dominios bloqueados', 'users' => 'usuarios', 'my-account' => 'mi cuenta', 'change-password' => 'cambiar contraseña', @@ -50,5 +51,5 @@ return [ 'video-clips' => 'clips de vídeo', 'embed' => 'reproductor embebido', 'notifications' => 'notificaciones', - 'suspend' => 'suspend', + 'suspend' => 'suspender', ]; diff --git a/modules/Admin/Language/es/Episode.php b/modules/Admin/Language/es/Episode.php index 4cb492e8..574759e9 100644 --- a/modules/Admin/Language/es/Episode.php +++ b/modules/Admin/Language/es/Episode.php @@ -24,14 +24,14 @@ return [ 'edit' => 'Editar', 'publish' => 'Publicar', 'publish_edit' => 'Editar publicación', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Editar fecha de publicación', 'unpublish' => 'Anular publicación', 'publish_error' => 'El episodio ya está publicado.', 'publish_edit_error' => 'El episodio ya está publicado.', 'publish_cancel_error' => 'El episodio ya está publicado.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'El episodio no ha sido publicado todavía, no puede editar su fecha de publicación.', + 'publish_date_edit_future_error' => '¡La fecha de publicación del episodio sólo puede establecerse a una fecha pasada! Si desea reprogramarla, despublicarla primero.', + 'publish_date_edit_success' => '¡La fecha de publicación del episodio se ha actualizado con éxito!', 'unpublish_error' => 'El episodio no está publicado.', 'delete' => 'Borrar', 'go_to_page' => 'Ir a la página', @@ -114,7 +114,7 @@ return [ 'bonus_hint' => 'Contenido extra para la serie (por ejemplo, detrás de escenas o entrevistas con el elenco) o contenido promocional para otra serie', ], 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium' => 'El episodio debe ser accesible solamente para los suscriptores premium', 'parental_advisory' => [ 'label' => 'Aviso parental', 'hint' => '¿El episodio contiene contenido explícito?', @@ -183,9 +183,9 @@ return [ 'message_warning_submit' => 'Publicar de todos modos', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Nueva fecha de publicación', + 'new_publication_date_hint' => 'Debe establecerse en una fecha pasada.', + 'submit' => 'Editar fecha de publicación', ], 'unpublish_form' => [ 'disclaimer' => diff --git a/modules/Admin/Language/es/Navigation.php b/modules/Admin/Language/es/Navigation.php index fefb73e5..8e59c56e 100644 --- a/modules/Admin/Language/es/Navigation.php +++ b/modules/Admin/Language/es/Navigation.php @@ -33,7 +33,7 @@ return [ 'settings' => 'Configuración', 'settings-general' => 'General', 'settings-theme' => 'Tema', - 'about' => 'About', + 'about' => 'Acerca de', 'account' => [ 'my-account' => 'Mi cuenta', 'change-password' => 'Cambiar contraseña', diff --git a/modules/Admin/Language/es/Notifications.php b/modules/Admin/Language/es/Notifications.php index d6c93ba9..70e375fb 100644 --- a/modules/Admin/Language/es/Notifications.php +++ b/modules/Admin/Language/es/Notifications.php @@ -13,7 +13,7 @@ return [ 'reply' => '{actor_username} respondió a tu publicación', 'favourite' => '{actor_username} ha marcado como favorita tu publicación', 'reblog' => '{actor_username} ha compartido tu publicación', - 'follow' => '{actor_username} started following you', + 'follow' => '{actor_username} ha empezado a seguirte', 'no_notifications' => 'No hay notificaciones', 'mark_all_as_read' => 'Marcar todas como leídas', ]; diff --git a/modules/Admin/Language/es/Podcast.php b/modules/Admin/Language/es/Podcast.php index c10b2374..4d87a5fd 100644 --- a/modules/Admin/Language/es/Podcast.php +++ b/modules/Admin/Language/es/Podcast.php @@ -108,8 +108,8 @@ return [ 'monetization_section_subtitle' => 'Gana dinero gracias a tu audiencia.', 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'premium_by_default' => 'Los episodios deben establecerse como premium por defecto', + 'premium_by_default_hint' => 'Los episodios Podcast se marcarán como premium de forma predeterminada. Todavía puedes elegir establecer algunos episodios, trailers o bonificaciones como públicos.', 'payment_pointer' => 'Puntero de pago para Monetización web', 'payment_pointer_hint' => 'Aquí es donde usted recibirá dinero gracias a la Monetización Web', diff --git a/modules/Admin/Language/es/PodcastNavigation.php b/modules/Admin/Language/es/PodcastNavigation.php index 8bbe1733..afa57101 100644 --- a/modules/Admin/Language/es/PodcastNavigation.php +++ b/modules/Admin/Language/es/PodcastNavigation.php @@ -26,8 +26,8 @@ return [ 'podcast-analytics-listening-time' => 'Tiempo de escucha', 'podcast-analytics-time-periods' => 'Periodos de tiempo', 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-list' => 'Todas las suscripciones', + 'subscription-add' => 'Añadir suscripción', 'contributors' => 'Colaboradores', 'contributor-list' => 'Todos los colaboradores', 'contributor-add' => 'Añadir colaborador', diff --git a/modules/Admin/Language/es/Settings.php b/modules/Admin/Language/es/Settings.php index 245ee615..6c63c82d 100644 --- a/modules/Admin/Language/es/Settings.php +++ b/modules/Admin/Language/es/Settings.php @@ -35,8 +35,8 @@ return [ 'reset_counts_helper' => 'Esta opción recalculará y restablecerá todos los conteos de datos (número de seguidores, publicaciones, comentarios, …).', 'rewrite_media' => 'Reescribir metadatos de medios', 'rewrite_media_helper' => 'Esta opción eliminará todos los archivos multimedia superfluos y los volverá a crear (imágenes, archivos de audio, transcripciones, capítulos, …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'rename_episodes_files' => 'Renombrar archivos de audio del episodio', + 'rename_episodes_files_hint' => 'Esta opción renombrará todos los archivos de audio de episodios a una cadena aleatoria de caracteres. Usa esto si uno de tus episodios privados fue filtrado ya que esto lo ocultará efectivamente.', 'clear_cache' => 'Borrar toda la caché', 'clear_cache_helper' => 'Esta opción eliminará la caché de redis o archivos de escritura/caché.', 'run' => 'Ejecutar tareas de mantenimiento', diff --git a/modules/Admin/Language/fa/Breadcrumb.php b/modules/Admin/Language/fa/Breadcrumb.php index b1742abf..558b90f7 100644 --- a/modules/Admin/Language/fa/Breadcrumb.php +++ b/modules/Admin/Language/fa/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'delete', 'remove' => 'remove', 'fediverse' => 'fediverse', - 'block-lists' => 'block lists', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'users', 'my-account' => 'my account', 'change-password' => 'change password', diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php index 54a5ab23..a72289fd 100644 --- a/modules/Admin/Language/fr/Breadcrumb.php +++ b/modules/Admin/Language/fr/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'supprimer', 'remove' => 'retirer', 'fediverse' => 'fédiverse', - 'block-lists' => 'listes de blocage', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'utilisateurs', 'my-account' => 'mon compte', 'change-password' => 'changer le mot de passe', diff --git a/modules/Admin/Language/gd/Breadcrumb.php b/modules/Admin/Language/gd/Breadcrumb.php index b1742abf..558b90f7 100644 --- a/modules/Admin/Language/gd/Breadcrumb.php +++ b/modules/Admin/Language/gd/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'delete', 'remove' => 'remove', 'fediverse' => 'fediverse', - 'block-lists' => 'block lists', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'users', 'my-account' => 'my account', 'change-password' => 'change password', diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php index 60a9c487..2e687171 100644 --- a/modules/Admin/Language/gl/Breadcrumb.php +++ b/modules/Admin/Language/gl/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'eliminar', 'remove' => 'eliminar', 'fediverse' => 'fediverso', - 'block-lists' => 'listas de bloqueo', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'usuarias', 'my-account' => 'a miña conta', 'change-password' => 'cambiar contrasinal', diff --git a/modules/Admin/Language/id/Breadcrumb.php b/modules/Admin/Language/id/Breadcrumb.php index 371cdea5..d4623ff9 100644 --- a/modules/Admin/Language/id/Breadcrumb.php +++ b/modules/Admin/Language/id/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'delete', 'remove' => 'remove', 'fediverse' => 'fediverse', - 'block-lists' => 'block lists', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'pengguna', 'my-account' => 'akun saya', 'change-password' => 'ubah kata sandi', diff --git a/modules/Admin/Language/it/Breadcrumb.php b/modules/Admin/Language/it/Breadcrumb.php index d1922c5e..05a72562 100644 --- a/modules/Admin/Language/it/Breadcrumb.php +++ b/modules/Admin/Language/it/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'elimina', 'remove' => 'remove', 'fediverse' => 'fediverso', - 'block-lists' => 'elenco bloccati', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'utenti', 'my-account' => 'il mio profilo', 'change-password' => 'cambia la password', diff --git a/modules/Admin/Language/ko/Breadcrumb.php b/modules/Admin/Language/ko/Breadcrumb.php index b1742abf..558b90f7 100644 --- a/modules/Admin/Language/ko/Breadcrumb.php +++ b/modules/Admin/Language/ko/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'delete', 'remove' => 'remove', 'fediverse' => 'fediverse', - 'block-lists' => 'block lists', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'users', 'my-account' => 'my account', 'change-password' => 'change password', diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php index f7821de4..a91d3bc5 100644 --- a/modules/Admin/Language/nl/Breadcrumb.php +++ b/modules/Admin/Language/nl/Breadcrumb.php @@ -14,7 +14,7 @@ return [ ->gateway => 'Hoofdpagina', 'podcasts' => 'podcasts', 'episodes' => 'afleveringen', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'abonnementen', 'contributors' => 'bijdragers', 'pages' => 'paginas', 'settings' => 'instellingen', @@ -29,9 +29,10 @@ return [ 'publish-date-edit' => 'edit publication date', 'unpublish' => 'publicatie ongedaan maken', 'delete' => 'verwijder', - 'remove' => 'remove', + 'remove' => 'verwijder', 'fediverse' => 'fediverse', - 'block-lists' => 'blokkeerlijst', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'gebruikers', 'my-account' => 'mijn account', 'change-password' => 'wachtwoord wijzigen', diff --git a/modules/Admin/Language/nl/Countries.php b/modules/Admin/Language/nl/Countries.php index 7652b137..12c41f95 100644 --- a/modules/Admin/Language/nl/Countries.php +++ b/modules/Admin/Language/nl/Countries.php @@ -94,12 +94,12 @@ return [ 'GG' => 'Guernsey', 'GH' => 'Ghana', 'GI' => 'Gibraltar', - 'GL' => 'Greenland', + 'GL' => 'Groenland', 'GM' => 'Gambia', 'GN' => 'Guinea', 'GP' => 'Guadeloupe', 'GQ' => 'Equatorial Guinea', - 'GR' => 'Greece', + 'GR' => 'Griekenland', 'GS' => 'South Georgia and the South Sandwich Islands', 'GT' => 'Guatemala', 'GU' => 'Guam', @@ -110,7 +110,7 @@ return [ 'HN' => 'Honduras', 'HR' => 'Croatia', 'HT' => 'Haiti', - 'HU' => 'Hungary', + 'HU' => 'Hongarije', 'ID' => 'Indonesia', 'IE' => 'Ireland', 'IL' => 'Israel', diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php index c191408e..b7f9485f 100644 --- a/modules/Admin/Language/nn-NO/Breadcrumb.php +++ b/modules/Admin/Language/nn-NO/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'slett', 'remove' => 'remove', 'fediverse' => 'fødiverset', - 'block-lists' => 'blokkeringslister', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'brukarar', 'my-account' => 'kontoen min', 'change-password' => 'endre passord', diff --git a/modules/Admin/Language/oc/Breadcrumb.php b/modules/Admin/Language/oc/Breadcrumb.php index b1742abf..558b90f7 100644 --- a/modules/Admin/Language/oc/Breadcrumb.php +++ b/modules/Admin/Language/oc/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'delete', 'remove' => 'remove', 'fediverse' => 'fediverse', - 'block-lists' => 'block lists', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'users', 'my-account' => 'my account', 'change-password' => 'change password', diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php index 3d906747..ba120541 100644 --- a/modules/Admin/Language/pl/Breadcrumb.php +++ b/modules/Admin/Language/pl/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'usuń', 'remove' => 'remove', 'fediverse' => 'fediverse', - 'block-lists' => 'listy blokowanych', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'użytkownicy', 'my-account' => 'moje konto', 'change-password' => 'zmień hasło', diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-BR/Breadcrumb.php index 47646fdd..434876eb 100644 --- a/modules/Admin/Language/pt-BR/Breadcrumb.php +++ b/modules/Admin/Language/pt-BR/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'excluir', 'remove' => 'remove', 'fediverse' => 'fediverso', - 'block-lists' => 'listas de bloqueio', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'usuários', 'my-account' => 'minha conta', 'change-password' => 'alterar senha', diff --git a/modules/Admin/Language/pt/Breadcrumb.php b/modules/Admin/Language/pt/Breadcrumb.php index b1742abf..558b90f7 100644 --- a/modules/Admin/Language/pt/Breadcrumb.php +++ b/modules/Admin/Language/pt/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'delete', 'remove' => 'remove', 'fediverse' => 'fediverse', - 'block-lists' => 'block lists', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'users', 'my-account' => 'my account', 'change-password' => 'change password', diff --git a/modules/Admin/Language/ro/AboutCastopod.php b/modules/Admin/Language/ro/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/ro/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/ro/Breadcrumb.php b/modules/Admin/Language/ro/Breadcrumb.php new file mode 100644 index 00000000..558b90f7 --- /dev/null +++ b/modules/Admin/Language/ro/Breadcrumb.php @@ -0,0 +1,55 @@ + 'breadcrumb', + config('Admin') + ->gateway => 'Home', + 'podcasts' => 'podcasts', + 'episodes' => 'episodes', + 'subscriptions' => 'subscriptions', + 'contributors' => 'contributors', + 'pages' => 'pages', + 'settings' => 'settings', + 'theme' => 'theme', + 'about' => 'about', + 'add' => 'add', + 'new' => 'new', + 'edit' => 'edit', + 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'publish-date-edit' => 'edit publication date', + 'unpublish' => 'unpublish', + 'delete' => 'delete', + 'remove' => 'remove', + 'fediverse' => 'fediverse', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', + 'users' => 'users', + 'my-account' => 'my account', + 'change-password' => 'change password', + 'import' => 'feed import', + 'platforms' => 'platforms', + 'social' => 'social networks', + 'funding' => 'funding', + 'analytics' => 'analytics', + 'locations' => 'locations', + 'webpages' => 'web pages', + 'unique-listeners' => 'unique listeners', + 'players' => 'players', + 'listening-time' => 'listening time', + 'time-periods' => 'time periods', + 'soundbites' => 'soundbites', + 'video-clips' => 'video clips', + 'embed' => 'embeddable player', + 'notifications' => 'notifications', + 'suspend' => 'suspend', +]; diff --git a/modules/Admin/Language/ro/Charts.php b/modules/Admin/Language/ro/Charts.php new file mode 100644 index 00000000..4b33530e --- /dev/null +++ b/modules/Admin/Language/ro/Charts.php @@ -0,0 +1,40 @@ + 'Episode downloads by service (for the past week)', + 'by_player_weekly' => 'Episode downloads by player (for the past week)', + 'by_player_yearly' => 'Episode downloads by player (for the past year)', + 'by_device_weekly' => 'Episode downloads by device (for the past week)', + 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', + 'podcast_by_region' => 'Episode downloads by region (for the past week)', + 'unique_daily_listeners' => 'Daily unique listeners', + 'unique_monthly_listeners' => 'Monthly unique listeners', + 'by_browser' => 'Web pages usage by browser (for the past week)', + 'podcast_by_day' => 'Episode daily downloads', + 'podcast_by_month' => 'Episode monthly downloads', + 'episode_by_day' => 'Episode daily downloads (first 60 days)', + 'episode_by_month' => 'Episode monthly downloads', + 'episodes_by_day' => + '5 latest episodes downloads (during their first 60 days)', + 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_yearly' => 'Episode downloads by country (for the past year)', + 'by_domain_weekly' => 'Web pages visits by source (for the past week)', + 'by_domain_yearly' => 'Web pages visits by source (for the past year)', + 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + 'podcast_bots' => 'Bots (crawlers)', + 'daily_listening_time' => 'Daily cumulative listening time', + 'monthly_listening_time' => 'Monthly cumulative listening time', + 'by_weekday' => 'By week day (for the past 60 days)', + 'by_hour' => 'By time of day (for the past 60 days)', + 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', + 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', +]; diff --git a/modules/Admin/Language/ro/Common.php b/modules/Admin/Language/ro/Common.php new file mode 100644 index 00000000..596c8bcd --- /dev/null +++ b/modules/Admin/Language/ro/Common.php @@ -0,0 +1,51 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'more' => 'More', + 'no_data' => 'No data found!', + 'close' => 'Close', + 'edit' => 'Edit', + 'copy' => 'Copy', + 'copied' => 'Copied!', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', + 'forms' => [ + 'editor' => [ + 'write' => 'Write', + 'preview' => 'Preview', + 'help' => 'Powered by markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Press to select', + 'loadingText' => 'Loading…', + 'noResultsText' => 'No results found', + 'noChoicesText' => 'No choices to choose from', + 'maxItemText' => 'Cannot add more items', + ], + 'upload_file' => 'Upload a file', + 'remote_url' => 'Remote URL', + ], + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'size_limit' => 'Size limit: {0}.', + 'choose_interact' => 'Choose how to interact', + 'view' => 'View', +]; diff --git a/modules/Admin/Language/ro/Countries.php b/modules/Admin/Language/ro/Countries.php new file mode 100644 index 00000000..4cd5d9c8 --- /dev/null +++ b/modules/Admin/Language/ro/Countries.php @@ -0,0 +1,264 @@ + 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia, Plurinational State of', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, the Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => "Côte d'Ivoire", + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cape Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia, Federated States of', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran, Islamic Republic of', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao People's Democratic Republic", + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'N/A' => 'Not Applicable (local IP…)', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Swaziland', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See (Vatican City State)', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/ro/Dashboard.php b/modules/Admin/Language/ro/Dashboard.php new file mode 100644 index 00000000..881073fd --- /dev/null +++ b/modules/Admin/Language/ro/Dashboard.php @@ -0,0 +1,28 @@ + 'Admin dashboard', + 'welcome_message' => 'Welcome to the admin area!', + 'podcasts' => [ + 'title' => 'Podcasts', + 'not_found' => 'No published podcast', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'episodes' => [ + 'title' => 'Episodes', + 'not_found' => 'No published episode', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'storage' => [ + 'title' => 'Storage', + 'subtitle' => '{totalUploaded} out of {totalStorage}', + ], +]; diff --git a/modules/Admin/Language/ro/Episode.php b/modules/Admin/Language/ro/Episode.php new file mode 100644 index 00000000..91313a7c --- /dev/null +++ b/modules/Admin/Language/ro/Episode.php @@ -0,0 +1,213 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'edit' => 'Edit', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'publish_date_edit' => 'Edit publication date', + 'unpublish' => 'Unpublish', + 'publish_error' => 'Episode is already published.', + 'publish_edit_error' => 'Episode is already published.', + 'publish_cancel_error' => 'Episode is already published.', + 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', + 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', + 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'unpublish_error' => 'Episode is not published.', + 'delete' => 'Delete', + 'go_to_page' => 'Go to page', + 'create' => 'Add an episode', + 'publication_status' => [ + 'published' => 'Published', + 'with_podcast' => 'Published', + 'scheduled' => 'Scheduled', + 'not_published' => 'Not published', + ], + 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Search for an episode', + 'clear' => 'Clear search', + 'submit' => 'Search', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# episode} + other {# episodes} + }', + 'episode' => 'Episode', + 'visibility' => 'Visibility', + 'comments' => 'Comments', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'Episode has been successfully created!', + 'editSuccess' => 'Episode has been successfully updated!', + 'publishSuccess' => '{publication_status, select, + published {Episode successfully published!} + scheduled {Episode publication successfully scheduled!} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not published.} + }', + 'publishCancelSuccess' => 'Episode publication successfully cancelled!', + 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', + 'scheduleDateError' => 'Schedule date must be set!', + 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'deleteSuccess' => 'Episode successfully deleted!', + 'deleteError' => 'Failed to delete episode {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_path}. You may manually remove it from your disk.', + 'sameSlugError' => 'An episode with the chosen slug already exists.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapters', + 'chapters_hint' => 'File must be in JSON Chapters format.', + 'chapters_download' => 'Download chapters', + 'chapters_file' => 'Chapters file', + 'chapters_remote_url' => 'Remote url for chapters file', + 'chapters_file_delete' => 'Delete chapters file', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the episode', + 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', + 'block' => 'Episode should be hidden from public catalogues', + 'block_hint' => + 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'submit_create' => 'Create episode', + 'submit_edit' => 'Save episode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Back to episode dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + 'with_podcast' => 'Publish alongside podcast', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', + 'message_warning_submit' => 'Publish anyways', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'New publication date', + 'new_publication_date_hint' => 'Must be set to a past date.', + 'submit' => 'Edit publication date', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + 'understand' => 'I understand, I want to delete the episode', + 'submit' => 'Delete', + ], + 'embed' => [ + 'title' => 'Embeddable player', + 'label' => + 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', + 'clipboard_iframe' => 'Copy embeddable player to clipboard', + 'clipboard_url' => 'Copy address to clipboard', + 'dark' => 'Dark', + 'dark-transparent' => 'Dark transparent', + 'light' => 'Light', + 'light-transparent' => 'Light transparent', + ], +]; diff --git a/modules/Admin/Language/ro/EpisodeNavigation.php b/modules/Admin/Language/ro/EpisodeNavigation.php new file mode 100644 index 00000000..1406e301 --- /dev/null +++ b/modules/Admin/Language/ro/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'View episode page', + 'dashboard' => 'Episode dashboard', + 'episode-view' => 'Home', + 'episode-edit' => 'Edit episode', + 'episode-persons-manage' => 'Manage persons', + 'embed-add' => 'Embeddable player', + 'clips' => 'Clips', + 'video-clips-list' => 'Video clips', + 'video-clips-create' => 'New video clip', + 'soundbites-list' => 'Soundbites', + 'soundbites-create' => 'New soundbite', +]; diff --git a/modules/Admin/Language/ro/Fediverse.php b/modules/Admin/Language/ro/Fediverse.php new file mode 100644 index 00000000..0e4ca66d --- /dev/null +++ b/modules/Admin/Language/ro/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'The account could not be found!', + 'blockActorSuccess' => '{actor} has been blocked!', + 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockDomainSuccess' => '{domain} has been blocked!', + 'unblockDomainSuccess' => '{domain} has been unblocked!', + ], + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/modules/Admin/Language/ro/Home.php b/modules/Admin/Language/ro/Home.php new file mode 100644 index 00000000..3ff4c04d --- /dev/null +++ b/modules/Admin/Language/ro/Home.php @@ -0,0 +1,14 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found', +]; diff --git a/modules/Admin/Language/ro/Install.php b/modules/Admin/Language/ro/Install.php new file mode 100644 index 00000000..36e373a2 --- /dev/null +++ b/modules/Admin/Language/ro/Install.php @@ -0,0 +1,61 @@ + 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Admin/Language/ro/Navigation.php b/modules/Admin/Language/ro/Navigation.php new file mode 100644 index 00000000..610f1434 --- /dev/null +++ b/modules/Admin/Language/ro/Navigation.php @@ -0,0 +1,42 @@ + 'Toggle sidebar', + 'go_to_website' => 'Go to website', + 'go_to_admin' => 'Go to admin', + 'dashboard' => 'Dashboard', + 'admin' => 'Home', + 'podcasts' => 'Podcasts', + 'podcast-list' => 'All podcasts', + 'podcast-create' => 'New podcast', + 'podcast-import' => 'Import a podcast', + 'persons' => 'Persons', + 'person-list' => 'All persons', + 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', + 'users' => 'Users', + 'user-list' => 'All users', + 'user-create' => 'New user', + 'pages' => 'Pages', + 'page-list' => 'All pages', + 'page-create' => 'New Page', + 'settings' => 'Settings', + 'settings-general' => 'General', + 'settings-theme' => 'Theme', + 'about' => 'About', + 'account' => [ + 'my-account' => 'My account', + 'change-password' => 'Change password', + 'logout' => 'Logout', + ], +]; diff --git a/modules/Admin/Language/ro/Notifications.php b/modules/Admin/Language/ro/Notifications.php new file mode 100644 index 00000000..2b139d51 --- /dev/null +++ b/modules/Admin/Language/ro/Notifications.php @@ -0,0 +1,19 @@ + 'Notifications', + 'reply' => '{actor_username} replied to your post', + 'favourite' => '{actor_username} favourited your post', + 'reblog' => '{actor_username} shared your post', + 'follow' => '{actor_username} started following you', + 'no_notifications' => 'No notifications', + 'mark_all_as_read' => 'Mark all as read', +]; diff --git a/modules/Admin/Language/ro/Page.php b/modules/Admin/Language/ro/Page.php new file mode 100644 index 00000000..b6f49de5 --- /dev/null +++ b/modules/Admin/Language/ro/Page.php @@ -0,0 +1,30 @@ + 'Back to home', + 'page' => 'Page', + 'all_pages' => 'All pages', + 'create' => 'New page', + 'go_to_page' => 'Go to page', + 'edit' => 'Edit page', + 'delete' => 'Delete page', + 'form' => [ + 'title' => 'Title', + 'permalink' => 'Permalink', + 'content' => 'Content', + 'submit_create' => 'Create page', + 'submit_edit' => 'Save', + ], + 'messages' => [ + 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'editSuccess' => 'The page was successfully updated!', + ], +]; diff --git a/modules/Admin/Language/ro/Pager.php b/modules/Admin/Language/ro/Pager.php new file mode 100644 index 00000000..e25ee638 --- /dev/null +++ b/modules/Admin/Language/ro/Pager.php @@ -0,0 +1,21 @@ + 'Page navigation', + 'first' => 'First', + 'previous' => 'Previous', + 'next' => 'Next', + 'last' => 'Last', + 'older' => 'Older', + 'newer' => 'Newer', + 'invalidTemplate' => '{0} is not a valid Pager template.', + 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', +]; diff --git a/modules/Admin/Language/ro/Person.php b/modules/Admin/Language/ro/Person.php new file mode 100644 index 00000000..a652be9f --- /dev/null +++ b/modules/Admin/Language/ro/Person.php @@ -0,0 +1,65 @@ + 'Persons', + 'all_persons' => 'All persons', + 'no_person' => 'Nobody found!', + 'create' => 'Create a person', + 'view' => 'View person', + 'edit' => 'Edit person', + 'delete' => 'Delete person', + 'messages' => [ + 'createSuccess' => 'Person has been successfully created!', + 'editSuccess' => 'Person has been successfully updated!', + 'deleteSuccess' => 'Person has been removed!', + ], + 'form' => [ + 'avatar' => 'Avatar', + 'avatar_size_hint' => + 'Avatar must be squared and at least 400px wide and tall.', + 'full_name' => 'Full name', + 'full_name_hint' => 'This is the full name or alias of the person.', + 'unique_name' => 'Unique name', + 'unique_name_hint' => 'Used for URLs', + 'information_url' => 'Information URL', + 'information_url_hint' => + 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', + 'submit_create' => 'Create person', + 'submit_edit' => 'Save person', + ], + 'podcast_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this podcast', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'episode_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this episode', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'credits' => 'Credits', +]; diff --git a/modules/Admin/Language/ro/Platforms.php b/modules/Admin/Language/ro/Platforms.php new file mode 100644 index 00000000..ab17d599 --- /dev/null +++ b/modules/Admin/Language/ro/Platforms.php @@ -0,0 +1,30 @@ + 'Platforms', + 'home_url' => 'Go to {platformName} website', + 'submit_url' => 'Submit your podcast on {platformName}', + 'visible' => 'Display in podcast homepage?', + 'on_embed' => 'Display on embeddable player?', + 'remove' => 'Remove {platformName}', + 'submit' => 'Save', + 'messages' => [ + 'updateSuccess' => 'Platform links have been successfully updated!', + 'removeLinkSuccess' => 'The platform link has been removed.', + 'removeLinkError' => + 'The platform link could not be removed. Try again.', + ], + 'description' => [ + 'podcasting' => 'The podcast ID on this platform', + 'social' => 'The podcast account ID on this platform', + 'funding' => 'Call to action message', + ], +]; diff --git a/modules/Admin/Language/ro/Podcast.php b/modules/Admin/Language/ro/Podcast.php new file mode 100644 index 00000000..426b763b --- /dev/null +++ b/modules/Admin/Language/ro/Podcast.php @@ -0,0 +1,310 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found!', + 'create' => 'Create podcast', + 'import' => 'Import podcast', + 'new_episode' => 'New Episode', + 'view' => 'View podcast', + 'edit' => 'Edit podcast', + 'publish' => 'Publish podcast', + 'publish_edit' => 'Edit publication', + 'delete' => 'Delete podcast', + 'see_episodes' => 'See episodes', + 'see_contributors' => 'See contributors', + 'go_to_page' => 'Go to page', + 'latest_episodes' => 'Latest episodes', + 'see_all_episodes' => 'See all episodes', + 'draft' => 'Draft', + 'messages' => [ + 'createSuccess' => 'Podcast successfully created!', + 'editSuccess' => 'Podcast has been successfully updated!', + 'importSuccess' => 'Podcast has been successfully imported!', + 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, + cover {cover} + banner {banner} + other {media} + }.', + 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, + one {# episode was} + other {# episodes were} + } added to the podcast!', + 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', + 'publishError' => 'This podcast is either already published or scheduled for publication.', + 'publishEditError' => 'This podcast is not scheduled for publication.', + 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', + 'scheduleDateError' => 'Schedule date must be set!', + ], + 'form' => [ + 'identity_section_title' => 'Podcast identity', + 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'cover' => 'Podcast cover', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'banner' => 'Podcast banner', + 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_delete' => 'Delete podcast banner', + 'title' => 'Title', + 'handle' => 'Handle', + 'handle_hint' => + 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'type' => [ + 'label' => 'Type', + 'episodic' => 'Episodic', + 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', + 'serial' => 'Serial', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + ], + 'description' => 'Description', + 'classification_section_title' => 'Classification', + 'classification_section_subtitle' => + 'These fields will impact your audience and competition.', + 'language' => 'Language', + 'category' => 'Category', + 'category_placeholder' => 'Select a category…', + 'other_categories' => 'Other categories', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does it contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'author_section_title' => 'Author', + 'author_section_subtitle' => 'Who is managing the podcast?', + 'owner_name' => 'Owner name', + 'owner_name_hint' => + 'For administrative use only. Visible in the public RSS feed.', + 'owner_email' => 'Owner email', + 'owner_email_hint' => + 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'publisher' => 'Publisher', + 'publisher_hint' => + 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'copyright' => 'Copyright', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this podcast about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real place or fictional', + 'monetization_section_title' => 'Monetization', + 'monetization_section_subtitle' => + 'Earn money thanks to your audience.', + 'premium' => 'Premium', + 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'payment_pointer_hint' => + 'This is your where you will receive money thanks to Web Monetization', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the podcast', + 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'new_feed_url' => 'New feed URL', + 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', + 'old_feed_url' => 'Old feed URL', + 'update_feed' => 'Update feed', + 'update_feed_tip' => 'Import this podcast\'s latest episodes', + 'partnership' => 'Partnership', + 'partner_id' => 'ID', + 'partner_link_url' => 'Link URL', + 'partner_image_url' => 'Image URL', + 'partner_id_hint' => 'Your own partner ID', + 'partner_link_url_hint' => 'The generic partner link address', + 'partner_image_url_hint' => 'The generic partner image address', + 'status_section_title' => 'Status', + 'block' => 'Podcast should be hidden from public catalogues', + 'block_hint' => + 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'complete' => 'Podcast will not be having new episodes', + 'lock' => 'Prevent podcast from being copied', + 'lock_hint' => + 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', + 'submit_create' => 'Create podcast', + 'submit_edit' => 'Save podcast', + ], + 'category_options' => [ + 'uncategorized' => 'uncategorized', + 'arts' => 'Arts', + 'business' => 'Business', + 'comedy' => 'Comedy', + 'education' => 'Education', + 'fiction' => 'Fiction', + 'government' => 'Government', + 'health_and_fitness' => 'Health & Fitness', + 'history' => 'History', + 'kids_and_family' => 'Kids & Family', + 'leisure' => 'Leisure', + 'music' => 'Music', + 'news' => 'News', + 'religion_and_spirituality' => 'Religion & Spirituality', + 'science' => 'Science', + 'society_and_culture' => 'Society & Culture', + 'sports' => 'Sports', + 'technology' => 'Technology', + 'true_crime' => 'True Crime', + 'tv_and_film' => 'TV & Film', + 'books' => 'Books', + 'design' => 'Design', + 'fashion_and_beauty' => 'Fashion & Beauty', + 'food' => 'Food', + 'performing_arts' => 'Performing Arts', + 'visual_arts' => 'Visual Arts', + 'careers' => 'Careers', + 'entrepreneurship' => 'Entrepreneurship', + 'investing' => 'Investing', + 'management' => 'Management', + 'marketing' => 'Marketing', + 'non_profit' => 'Non-Profit', + 'comedy_interviews' => 'Comedy Interviews', + 'improv' => 'Improv', + 'stand_up' => 'Stand-Up', + 'courses' => 'Courses', + 'how_to' => 'How To', + 'language_learning' => 'Language Learning', + 'self_improvement' => 'Self-Improvement', + 'comedy_fiction' => 'Comedy Fiction', + 'drama' => 'Drama', + 'science_fiction' => 'Science Fiction', + 'alternative_health' => 'Alternative Health', + 'fitness' => 'Fitness', + 'medicine' => 'Medicine', + 'mental_health' => 'Mental Health', + 'nutrition' => 'Nutrition', + 'sexuality' => 'Sexuality', + 'education_for_kids' => 'Education for Kids', + 'parenting' => 'Parenting', + 'pets_and_animals' => 'Pets & Animals', + 'stories_for_kids' => 'Stories for Kids', + 'animation_and_manga' => 'Animation & Manga', + 'automotive' => 'Automotive', + 'aviation' => 'Aviation', + 'crafts' => 'Crafts', + 'games' => 'Games', + 'hobbies' => 'Hobbies', + 'home_and_garden' => 'Home & Garden', + 'video_games' => 'Video Games', + 'music_commentary' => 'Music Commentary', + 'music_history' => 'Music History', + 'music_interviews' => 'Music Interviews', + 'business_news' => 'Business News', + 'daily_news' => 'Daily News', + 'entertainment_news' => 'Entertainment News', + 'news_commentary' => 'News Commentary', + 'politics' => 'Politics', + 'sports_news' => 'Sports News', + 'tech_news' => 'Tech News', + 'buddhism' => 'Buddhism', + 'christianity' => 'Christianity', + 'hinduism' => 'Hinduism', + 'islam' => 'Islam', + 'judaism' => 'Judaism', + 'religion' => 'Religion', + 'spirituality' => 'Spirituality', + 'astronomy' => 'Astronomy', + 'chemistry' => 'Chemistry', + 'earth_sciences' => 'Earth Sciences', + 'life_sciences' => 'Life Sciences', + 'mathematics' => 'Mathematics', + 'natural_sciences' => 'Natural Sciences', + 'nature' => 'Nature', + 'physics' => 'Physics', + 'social_sciences' => 'Social Sciences', + 'documentary' => 'Documentary', + 'personal_journals' => 'Personal Journals', + 'philosophy' => 'Philosophy', + 'places_and_travel' => 'Places & Travel', + 'relationships' => 'Relationships', + 'baseball' => 'Baseball', + 'basketball' => 'Basketball', + 'cricket' => 'Cricket', + 'fantasy_sports' => 'Fantasy Sports', + 'football' => 'Football', + 'golf' => 'Golf', + 'hockey' => 'Hockey', + 'rugby' => 'Rugby', + 'running' => 'Running', + 'soccer' => 'Soccer', + 'swimming' => 'Swimming', + 'tennis' => 'Tennis', + 'volleyball' => 'Volleyball', + 'wilderness' => 'Wilderness', + 'wrestling' => 'Wrestling', + 'after_shows' => 'After Shows', + 'film_history' => 'Film History', + 'film_interviews' => 'Film Interviews', + 'film_reviews' => 'Film Reviews', + 'tv_reviews' => 'TV Reviews', + ], + 'publish_form' => [ + 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'submit' => 'Publish', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', + 'message_warning_submit' => 'Publish anyway', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'not_published' => 'This podcast is not yet published.', + 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", + 'understand' => 'I understand, I want the podcast to be permanently deleted', + 'submit' => 'Delete', + ], + 'by' => 'By {publisher}', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', +]; diff --git a/modules/Admin/Language/ro/PodcastImport.php b/modules/Admin/Language/ro/PodcastImport.php new file mode 100644 index 00000000..7c3ef67d --- /dev/null +++ b/modules/Admin/Language/ro/PodcastImport.php @@ -0,0 +1,37 @@ + + 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', + 'old_podcast_section_title' => 'The podcast to import', + 'old_podcast_section_subtitle' => + 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', + 'imported_feed_url' => 'Feed URL', + 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', + 'new_podcast_section_title' => 'The new podcast', + 'advanced_params_section_title' => 'Advanced parameters', + 'advanced_params_section_subtitle' => + 'Keep the default values if you have no idea of what the fields are for.', + 'slug_field' => 'Field to be used to calculate episode slug', + 'description_field' => + 'Source field used for episode description / show notes', + 'force_renumber' => 'Force episodes renumbering', + 'force_renumber_hint' => + 'Use this if your podcast does not have episode numbers but wish to set them during import.', + 'season_number' => 'Season number', + 'season_number_hint' => + 'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.', + 'max_episodes' => 'Maximum number of episodes to import', + 'max_episodes_hint' => 'Leave blank to import all episodes', + 'lock_import' => + 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.', + 'submit' => 'Import podcast', +]; diff --git a/modules/Admin/Language/ro/PodcastNavigation.php b/modules/Admin/Language/ro/PodcastNavigation.php new file mode 100644 index 00000000..b4d7ddc0 --- /dev/null +++ b/modules/Admin/Language/ro/PodcastNavigation.php @@ -0,0 +1,38 @@ + 'Go to podcast page', + 'dashboard' => 'Podcast dashboard', + 'podcast-view' => 'Home', + 'podcast-edit' => 'Edit podcast', + 'podcast-persons-manage' => 'Manage persons', + 'episodes' => 'Episodes', + 'episode-list' => 'All episodes', + 'episode-create' => 'New episode', + 'analytics' => 'Analytics', + 'podcast-analytics' => 'Audience overview', + 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-players' => 'Players', + 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-time-periods' => 'Time periods', + 'premium' => 'Premium', + 'subscription-list' => 'All subscriptions', + 'subscription-add' => 'Add subscription', + 'contributors' => 'Contributors', + 'contributor-list' => 'All contributors', + 'contributor-add' => 'Add contributor', + 'platforms' => 'External platforms', + 'platforms-podcasting' => 'Podcasting', + 'platforms-social' => 'Social networks', + 'platforms-funding' => 'Funding', +]; diff --git a/modules/Admin/Language/ro/Settings.php b/modules/Admin/Language/ro/Settings.php new file mode 100644 index 00000000..4a70dcba --- /dev/null +++ b/modules/Admin/Language/ro/Settings.php @@ -0,0 +1,58 @@ + 'General settings', + 'instance' => [ + 'title' => 'Instance', + 'site_icon' => 'Site icon', + 'site_icon_delete' => 'Delete site icon', + 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_name' => 'Site name', + 'site_description' => 'Site description', + 'submit' => 'Save', + 'editSuccess' => 'Instance has been updated successfully!', + 'deleteIconSuccess' => 'Site icon has been remove successfully!', + ], + 'images' => [ + 'title' => 'Images', + 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'regenerate' => 'Regenerate images', + 'regenerationSuccess' => 'All images have been regenerated successfully!', + ], + 'housekeeping' => [ + 'title' => 'Housekeeping', + 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', + 'reset_counts' => 'Reset counts', + 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', + 'rewrite_media' => 'Rewrite media metadata', + 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', + 'rename_episodes_files' => 'Rename episode audio files', + 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'clear_cache' => 'Clear all cache', + 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'run' => 'Run housekeeping', + 'runSuccess' => 'Housekeeping has been run successfully!', + ], + 'theme' => [ + 'title' => 'Theme', + 'accent_section_title' => 'Accent color', + 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', + 'pine' => 'Pine', + 'crimson' => 'Crimson', + 'amber' => 'Amber', + 'lake' => 'Lake', + 'jacaranda' => 'Jacaranda', + 'onyx' => 'Onyx', + 'submit' => 'Save', + 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + ], +]; diff --git a/modules/Admin/Language/ro/Soundbite.php b/modules/Admin/Language/ro/Soundbite.php new file mode 100644 index 00000000..a3f828fe --- /dev/null +++ b/modules/Admin/Language/ro/Soundbite.php @@ -0,0 +1,31 @@ + [ + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', + ], + 'messages' => [ + 'createSuccess' => 'Soundbite has been successfully created!', + 'deleteSuccess' => 'Soundbite has been successfully removed!', + ], + 'form' => [ + 'title' => 'New soundbite', + 'soundbite_title' => 'Soundbite title', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'submit' => 'Create soundbite', + ], + 'play' => 'Play soundbite', + 'stop' => 'Stop soundbite', + 'create' => 'New soundbite', + 'delete' => 'Delete soundbite', +]; diff --git a/modules/Admin/Language/ro/Validation.php b/modules/Admin/Language/ro/Validation.php new file mode 100644 index 00000000..3bc78cfe --- /dev/null +++ b/modules/Admin/Language/ro/Validation.php @@ -0,0 +1,16 @@ + + '{field} is either not an image, or it is not wide or tall enough.', + 'is_image_ratio' => + '{field} is either not an image or not of the right ratio.', +]; diff --git a/modules/Admin/Language/ro/VideoClip.php b/modules/Admin/Language/ro/VideoClip.php new file mode 100644 index 00000000..638de697 --- /dev/null +++ b/modules/Admin/Language/ro/VideoClip.php @@ -0,0 +1,72 @@ + [ + 'title' => 'Video clips', + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Clip is waiting to be processed.', + 'pending' => 'pending', + 'pending_hint' => 'Clip will be generated shortly.', + 'running' => 'running', + 'running_hint' => 'Clip is being generated.', + 'failed' => 'failed', + 'failed_hint' => 'Clip could not be generated: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Clip was generated successfully!', + ], + 'clip' => 'Clip', + 'duration' => 'Job duration', + ], + 'title' => 'Video clip: {videoClipLabel}', + 'download_clip' => 'Download clip', + 'create' => 'New video clip', + 'go_to_page' => 'Go to clip page', + 'retry' => 'Retry clip generation', + 'delete' => 'Delete clip', + 'logs' => 'Job logs', + 'messages' => [ + 'alreadyExistingError' => 'The video clip you are trying to create already exists!', + 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', + 'deleteSuccess' => 'Video clip has been successfully removed!', + ], + 'format' => [ + 'landscape' => 'Landscape', + 'portrait' => 'Portrait', + 'squared' => 'Squared', + ], + 'form' => [ + 'title' => 'New video clip', + 'params_section_title' => 'Video clip parameters', + 'clip_title' => 'Clip title', + 'format' => [ + 'label' => 'Choose a format', + 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', + 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', + 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + ], + 'theme' => 'Select a theme', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'trim_start' => 'Trim start', + 'trim_end' => 'Trim end', + 'submit' => 'Create video clip', + ], + 'requirements' => [ + 'title' => 'Missing requirements', + 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'ffmpeg' => 'FFmpeg', + 'gd' => 'Graphics Draw (GD)', + 'freetype' => 'Freetype library for GD', + 'transcript' => 'Transcript file (.srt)', + ], +]; diff --git a/modules/Admin/Language/ru/Breadcrumb.php b/modules/Admin/Language/ru/Breadcrumb.php index 72874de6..8383e4c7 100644 --- a/modules/Admin/Language/ru/Breadcrumb.php +++ b/modules/Admin/Language/ru/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'удалить', 'remove' => 'remove', 'fediverse' => 'Федивёрс', - 'block-lists' => 'список блокируемых', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'пользователи', 'my-account' => 'мой аккаунт', 'change-password' => 'сменить пароль', diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php index e9daf15e..64473454 100644 --- a/modules/Admin/Language/sk/Breadcrumb.php +++ b/modules/Admin/Language/sk/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'vymazať', 'remove' => 'odstrániť', 'fediverse' => 'fediverse', - 'block-lists' => 'zoznamy blokovaných', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'používatelia', 'my-account' => 'môj účet', 'change-password' => 'zmeniť heslo', diff --git a/modules/Admin/Language/sv/Breadcrumb.php b/modules/Admin/Language/sv/Breadcrumb.php index 84778eaa..7cc65c0b 100644 --- a/modules/Admin/Language/sv/Breadcrumb.php +++ b/modules/Admin/Language/sv/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => 'radera', 'remove' => 'ta bort', 'fediverse' => 'fediverse', - 'block-lists' => 'block listor', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => 'användare', 'my-account' => 'mitt konto', 'change-password' => 'ändra lösenord', diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-Hans/Breadcrumb.php index 3bf06845..b360c8b8 100644 --- a/modules/Admin/Language/zh-Hans/Breadcrumb.php +++ b/modules/Admin/Language/zh-Hans/Breadcrumb.php @@ -31,7 +31,8 @@ return [ 'delete' => '删除', 'remove' => '移除', 'fediverse' => '联邦宇宙', - 'block-lists' => '封禁列表', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', 'users' => '用户', 'my-account' => '我的帐户', 'change-password' => '修改密码', diff --git a/modules/Auth/Language/el/Auth.php b/modules/Auth/Language/el/Auth.php index a47932e3..9dc498fa 100644 --- a/modules/Auth/Language/el/Auth.php +++ b/modules/Auth/Language/el/Auth.php @@ -11,53 +11,53 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Ιδιοκτήτης Διακομιστή', + 'description' => 'Ο ιδιοκτήτης του Castopod.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Υπερδιαχειριστής', + 'description' => 'Έχει πλήρη έλεγχο του Castopod.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Διαχειριστής', + 'description' => 'Διαχείριση περιεχομένου του Castopod.', ], 'podcaster' => [ 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'description' => 'Γενικοί χρήστες του Castopod.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => 'Μπορεί να έχει πρόσβαση στην περιοχή διαχείρισης Castopod.', + 'admin.settings' => 'Μπορεί να έχει πρόσβαση στις ρυθμίσεις Castopod.', + 'users.manage' => 'Μπορεί να διαχειριστεί τους χρήστες Castopod.', + 'persons.manage' => 'Μπορεί να διαχειριστεί τα άτομα.', + 'pages.manage' => 'Μπορεί να διαχειριστεί τις σελίδες.', + 'podcasts.view' => 'Μπορεί να δει όλα τα podcasts.', + 'podcasts.create' => 'Μπορεί να δημιουργήσει νέα podcasts.', + 'podcasts.import' => 'Μπορεί να εισάγει podcasts.', + 'fediverse.manage-blocks' => 'Μπορεί να εμποδίσει τους ψευτογενείς ηθοποιούς/τομείς να αλληλεπιδρούν με το Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Ιδιοκτήτης Podcast', + 'description' => 'Ο ιδιοκτήτης του podcast.', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => 'Διαχειριστής', + 'description' => 'Έχει πλήρη έλεγχο του podcast #{id}.', ], 'editor' => [ - 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'title' => 'Εκδότης', + 'description' => 'Διαχειρίζεται περιεχόμενο και δημοσιεύσεις του podcast #{id}.', ], 'author' => [ - 'title' => 'Author', + 'title' => 'Συντάκτης', 'description' => 'Manages content of podcast #{id} but cannot publish them.', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => 'Επισκέπτης', + 'description' => 'Γενικός συντελεστής του podcast #{id}.', ], ], 'podcast_permissions' => [ diff --git a/modules/Auth/Language/el/User.php b/modules/Auth/Language/el/User.php index e7908f5b..05bc0e1d 100644 --- a/modules/Auth/Language/el/User.php +++ b/modules/Auth/Language/el/User.php @@ -9,43 +9,43 @@ declare(strict_types=1); */ return [ - 'edit_role' => "Edit {username}'s role", - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', + 'edit_role' => "Επεξεργασία ρόλων {username}", + 'ban' => 'Αποκλεισμός', + 'unban' => 'Κατάργηση αποκλεισμού', + 'delete' => 'Διαγραφή', + 'create' => 'Νέος χρήστης', + 'view' => "πληροφορίες του {username}", + 'all_users' => 'Όλοι οι χρήστες', 'list' => [ - 'user' => 'User', - 'role' => 'Role', - 'banned' => 'Banned?', + 'user' => 'Χρήστης', + 'role' => 'Ρόλος', + 'banned' => 'Αποκλεισμένος;', ], 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'role' => 'Role', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', + 'email' => 'Ηλεκτρονικό ταχυδρομείο', + 'username' => 'Όνομα Χρήστη', + 'password' => 'Κωδικόs πρόσβασης', + 'new_password' => 'Νέος Κωδικός Πρόσβασης', + 'role' => 'Ρόλος', + 'roles' => 'Ρόλοι', + 'permissions' => 'Δικαιώματα', + 'submit_create' => 'Δημιουργία χρήστη', + 'submit_edit' => 'Αποθήκευση', + 'submit_password_change' => 'Αλλαγή!', ], 'delete_form' => [ - 'title' => 'Delete {user}', + 'title' => 'Διαγραφή {user}', 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', + "Πρόκειται να διαγράψετε το {user} οριστικά. Δεν θα μπορούν πλέον να έχουν πρόσβαση στην περιοχή διαχείρισης.", + 'understand' => 'Καταλαβαίνω, θέλω να διαγράψω {user} μόνιμα', + 'submit' => 'Διαγραφή', ], 'messages' => [ 'createSuccess' => 'User created successfully! {username} will be prompted with a password reset upon first authentication.', 'roleEditSuccess' => - "{username}'s roles have been successfully updated.", - 'banSuccess' => '{username} has been banned.', + "οι ρόλοι του {username} έχουν ενημερωθεί με επιτυχία.", + 'banSuccess' => 'Ο/Η {username} έχει αποκλειστεί.', 'unbanSuccess' => '{username} has been unbanned.', 'editOwnerError' => '{username} is the instance owner, you cannot edit its roles.', diff --git a/modules/Auth/Language/es/Auth.php b/modules/Auth/Language/es/Auth.php index a47932e3..d1adf102 100644 --- a/modules/Auth/Language/es/Auth.php +++ b/modules/Auth/Language/es/Auth.php @@ -11,84 +11,84 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Propietario de Instancia', + 'description' => 'Propietario de Castopod.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Super administrador', + 'description' => 'Tiene control completo sobre Castopod.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Administrador', + 'description' => 'Administrar contenido de Castopod.', ], 'podcaster' => [ 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'description' => 'Usuarios generales de Castopod.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => 'Puedes acceder al área de administración de Castopod.', + 'admin.settings' => 'Puede acceder a la configuración de Castopod.', + 'users.manage' => 'Puede administrar usuarios de Castopod.', + 'persons.manage' => 'Puede administrar personas.', + 'pages.manage' => 'Puede administrar páginas.', + 'podcasts.view' => 'Puede ver todos los podcasts.', + 'podcasts.create' => 'Puede crear nuevos podcasts.', + 'podcasts.import' => 'Puede importar podcasts.', + 'fediverse.manage-blocks' => 'Puedes bloquear la interacción de actores/dominios del fediverso con Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Propietario de Podcast', + 'description' => 'El propietario del podcast.', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => 'Administrador', + 'description' => 'Tiene el control completo del podcast #{id}.', ], 'editor' => [ 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'description' => 'Gestiona el contenido y las publicaciones del podcast #{id}.', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => 'Autor', + 'description' => 'Gestiona el contenido del podcast #{id} pero no puede publicarlo.', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => 'Invitado', + 'description' => 'Colaborador general del podcast #{id}.', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => 'Puede ver el panel de control y analíticas del episodio #{id}.', + 'edit' => 'Puede editar el podcast #{id}.', + 'delete' => 'Puede borrar el podcast #{id}.', + 'manage-import' => 'Puede sincronizar el podcast importado #{id}.', + 'manage-persons' => 'Puede administrar las suscripciones del podcast #{id}.', + 'manage-subscriptions' => 'Puede administrar las suscripciones del podcast #{id}.', + 'manage-contributors' => 'Puede administrar colaboradores del podcast #{id}.', + 'manage-platforms' => 'Puede establecer/eliminar enlaces a la plataforma del podcast #{id}.', + 'manage-publications' => 'Puede publicar el podcast #{id}.', + 'manage-notifications' => 'Puede ver y marcar las notificaciones como leídas para podcast #{id}.', + 'interact-as' => 'Puede interactuar como el podcast #{id} para marcar como favarito, compartir o responder a las publicaciones.', + 'episodes.view' => 'Puede ver el panel de control y analíticas del episodio #{id}.', + 'episodes.create' => 'Puede crear episodios para el podcast #{id}.', + 'episodes.edit' => 'Puede editar episodios del podcast #{id}.', + 'episodes.delete' => 'Puede borrar episodios del podcast #{id}.', + 'episodes.manage-persons' => 'Puede administrar las personas de los episodios del podcast #{id}.', + 'episodes.manage-clips' => 'Puedes administrar video clips o sonidos del podcast #{id}.', + 'episodes.manage-publications' => 'Puede publicar/despublicar episodios y publicaciones del podcast #{id}.', + 'episodes.manage-comments' => 'Puede crear/eliminar los comentarios de episodio del podcast #{id}.', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'Introduce un código de 6 dígitos', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', + 'notEnoughPrivilege' => 'No tiene permisos suficientes para acceder a esa página.', + 'set_password' => 'Establece tu contraseña', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'welcomeSubject' => 'Has sido invitado a {siteName}', 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', ]; diff --git a/modules/Auth/Language/ro/Auth.php b/modules/Auth/Language/ro/Auth.php new file mode 100644 index 00000000..a47932e3 --- /dev/null +++ b/modules/Auth/Language/ro/Auth.php @@ -0,0 +1,94 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/ro/Contributor.php b/modules/Auth/Language/ro/Contributor.php new file mode 100644 index 00000000..c70badc0 --- /dev/null +++ b/modules/Auth/Language/ro/Contributor.php @@ -0,0 +1,47 @@ + 'Podcast contributors', + 'view' => "{username}'s contribution to {podcastTitle}", + 'add' => 'Add contributor', + 'add_contributor' => 'Add a contributor for {0}', + 'edit_role' => 'Update role for {0}', + 'edit' => 'Edit', + 'remove' => 'Remove', + 'list' => [ + 'username' => 'Username', + 'role' => 'Role', + ], + 'form' => [ + 'user' => 'User', + 'user_placeholder' => 'Select a user…', + 'role' => 'Role', + 'role_placeholder' => 'Select its role…', + 'submit_add' => 'Add contributor', + 'submit_edit' => 'Update role', + ], + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', + ], + 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", + 'removeOwnerError' => "You can't remove the podcast owner!", + 'removeSuccess' => + 'You have successfully removed {username} from {podcastTitle}', + 'alreadyAddedError' => + "The contributor you're trying to add has already been added!", + ], +]; diff --git a/modules/Auth/Language/ro/MyAccount.php b/modules/Auth/Language/ro/MyAccount.php new file mode 100644 index 00000000..6ebbb30e --- /dev/null +++ b/modules/Auth/Language/ro/MyAccount.php @@ -0,0 +1,18 @@ + 'My account info', + 'changePassword' => 'Change my password', + 'messages' => [ + 'wrongPasswordError' => "You've entered the wrong password, try again.", + 'passwordChangeSuccess' => 'Password has been successfully changed!', + ], +]; diff --git a/modules/Auth/Language/ro/User.php b/modules/Auth/Language/ro/User.php new file mode 100644 index 00000000..32ec560c --- /dev/null +++ b/modules/Auth/Language/ro/User.php @@ -0,0 +1,60 @@ + "Edit {username}'s role", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'role' => 'Role', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'role' => 'Role', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Install/Language/ro/Install.php b/modules/Install/Language/ro/Install.php new file mode 100644 index 00000000..45d26085 --- /dev/null +++ b/modules/Install/Language/ro/Install.php @@ -0,0 +1,62 @@ + 'Castopod installer', + 'manual_config' => 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your Super Admin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php index 18c0dd4e..c62a97fa 100644 --- a/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', + 'podcast_is_premium' => 'Podcast enthält Premium-Episoden', 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', diff --git a/modules/PremiumPodcasts/Language/el/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/el/PremiumPodcasts.php index 18c0dd4e..2cdc8702 100644 --- a/modules/PremiumPodcasts/Language/el/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/el/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', + 'podcast_is_premium' => 'Το Podcast περιέχει premium επεισόδια', + 'episode_is_premium' => 'Το επεισόδιο είναι premium, μόνο διαθέσιμο σε συνδρομητές premium', + 'unlock_episode' => 'Αυτό το επεισόδιο είναι μόνο για premium συνδρομητές. Κάντε κλικ για να το ξεκλειδώσετε!', 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'banner_lock' => 'Το Podcast είναι ξεκλειδωμένο, απολαύστε τα premium επεισόδια!', + 'subscribe' => 'Συνδρομή', + 'lock' => 'Κλείδωμα', + 'unlock' => 'Ξεκλείδωμα', 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', + 'title' => 'Premium περιεχόμενο', + 'subtitle' => 'Αυτό το podcast περιέχει κλειδωμένα premium επεισόδια! Έχεις το κλειδί για να τα ξεκλειδώσεις;', + 'token' => 'Δώστε το κλειδί', 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'submit' => 'Ξεκλείδωμα όλων των επεισοδίων!', + 'call_to_action' => 'Ξεκλειδώστε όλα τα επεισόδια του {podcastTitle}:', + 'subscribe_cta' => 'Εγγραφείτε τώρα!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Το Podcast ξεκλειδώθηκε με επιτυχία! Απολαύστε τα premium επεισόδια!', + 'unlockBadAttempt' => 'Το κλειδί σας δεν φαίνεται να λειτουργεί…', + 'lockSuccess' => 'Το Podcast κλειδώθηκε με επιτυχία!', ], ]; diff --git a/modules/PremiumPodcasts/Language/el/Subscription.php b/modules/PremiumPodcasts/Language/el/Subscription.php index f8af256f..af4ae3db 100644 --- a/modules/PremiumPodcasts/Language/el/Subscription.php +++ b/modules/PremiumPodcasts/Language/el/Subscription.php @@ -9,30 +9,30 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Συνδρομές Podcast', + 'add' => 'Νέα συνδρομή', + 'view' => 'Προβολή συνδρομής', + 'edit' => 'Τροποποίηση συνδρομής', + 'regenerate_token' => 'Αναδημιουργία token', + 'suspend' => 'Αναστολή συνδρομής', + 'resume' => 'Συνέχιση συνδρομής', + 'delete' => 'Διαγραφή συνδρομής', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Ενεργή', + 'suspended' => 'Έχει ανασταλεί', + 'expired' => 'Έληξε', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', - 'status' => 'Status', + 'number' => 'Αριθμός', + 'email' => 'Ηλεκτρονική διεύθυνση', + 'expiration_date' => 'Ημερομηνία λήξης', + 'unlimited' => 'Απεριόριστα', + 'downloads' => 'Λήψεις', + 'status' => 'Κατάσταση', ], 'form' => [ 'email' => 'Email', - 'expiration_date' => 'Expiration date', + 'expiration_date' => 'Ημερομηνία λήξης', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', 'submit_add' => 'Add subscription', 'submit_edit' => 'Edit subscription', diff --git a/modules/PremiumPodcasts/Language/es/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/es/PremiumPodcasts.php index 18c0dd4e..e7beaae7 100644 --- a/modules/PremiumPodcasts/Language/es/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/es/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'podcast_is_premium' => 'Podcast contiene episodios premium', + 'episode_is_premium' => 'El episodio es premium, sólo disponible para los suscriptores premium', + 'unlock_episode' => 'Este episodio es sólo para suscriptores premium. ¡Haz clic para desbloquearlo!', + 'banner_unlock' => 'Este podcast contiene episodios premium, sólo disponible para los suscriptores premium.', + 'banner_lock' => 'Podcast desbloqueado, ¡disfruta de los episodios premium!', + 'subscribe' => 'Suscríbete', + 'lock' => 'Bloquear', + 'unlock' => 'Desbloquear', 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'title' => 'Contenido premium', + 'subtitle' => '¡Este podcast contiene episodios premium bloqueados! ¿Tienes la clave para desbloquearlos?', + 'token' => 'Introduzca su clave', + 'token_hint' => 'Si está suscrito a {podcastTitle}, puede copiar la clave que le fue enviada por correo electrónico y pegarla aquí.', + 'submit' => '¡Desbloquea todos los episodios!', + 'call_to_action' => 'Desbloquea todos los episodios de {podcastTitle}:', + 'subscribe_cta' => '¡Suscríbete ahora!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => '¡Podcast desbloqueado con éxito! ¡Disfruta de los episodios premium!', + 'unlockBadAttempt' => 'Parece que tu clave no está funcionando…', + 'lockSuccess' => 'El Podcast fue bloqueado con éxito!', ], ]; diff --git a/modules/PremiumPodcasts/Language/es/Subscription.php b/modules/PremiumPodcasts/Language/es/Subscription.php index f8af256f..4d81bc70 100644 --- a/modules/PremiumPodcasts/Language/es/Subscription.php +++ b/modules/PremiumPodcasts/Language/es/Subscription.php @@ -9,92 +9,92 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Suscripciones de Podcast', + 'add' => 'Nueva suscripción', + 'view' => 'Ver suscripción', + 'edit' => 'Editar la suscripción', + 'regenerate_token' => 'Regenerar token', + 'suspend' => 'Suspender suscripción', + 'resume' => 'Reanudar suscripción', + 'delete' => 'Eliminar suscripción', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Activo', + 'suspended' => 'Suspendido', + 'expired' => 'Caducado', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', - 'status' => 'Status', + 'number' => 'Número', + 'email' => 'Correo electrónico', + 'expiration_date' => 'Fecha de expiración', + 'unlimited' => 'Ilimitado', + 'downloads' => 'Descargas', + 'status' => 'Estado', ], 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', - 'submit_edit' => 'Edit subscription', + 'email' => 'Correo electrónico', + 'expiration_date' => 'Fecha de expiración', + 'expiration_date_hint' => 'La fecha y hora en que caduca la suscripción. Dejar en blanco para una suscripción ilimitada.', + 'submit_add' => 'Añadir suscripción', + 'submit_edit' => 'Editar la suscripción', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'link' => 'Enlace de página de suscripción', + 'link_hint' => 'Esto añadirá una llamada a la acción en el sitio web invitando a los oyentes a suscribirse al podcast.', + 'submit' => 'Guardar enlace', ], 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', + 'disclaimer' => 'Suspender la suscripción restringirá que el suscriptor tenga acceso al contenido premium. Aún podrá levantar la suspensión después.', + 'reason' => 'Motivo', + 'reason_placeholder' => '¿Por qué quieres detener tu suscripción?', + "submit" => 'Suspender suscripción', ], 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', - 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', + 'disclaimer' => 'Eliminar la suscripción de {subscriber} eliminará todos los datos analíticos asociados a ella.', + 'understand' => 'Entiendo, eliminar la suscripción permanentemente', + 'submit' => 'Eliminar Suscripción', ], 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', - 'editError' => 'Subscription could not be edited.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', - 'regenerateTokenError' => 'Token could not be regenerated.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + 'addSuccess' => '¡Nueva suscripción añadida! Se ha enviado un correo electrónico de bienvenida a {subscriber}.', + 'addError' => 'La suscripción no pudo ser añadida.', + 'editSuccess' => '¡La fecha de caducidad de la suscripción ha sido actualizada! Se ha enviado un correo electrónico a {subscriber}.', + 'editError' => 'No se pudo editar la suscripción.', + 'regenerateTokenSuccess' => '¡Token regenerado! Un correo electrónico fue enviado a {subscriber} con el nuevo token.', + 'regenerateTokenError' => 'El token no se pudo regenerar.', + 'deleteSuccess' => '¡La suscripción ha sido eliminada! Se ha enviado un correo electrónico a {subscriber}.', + 'deleteError' => 'La suscripción no pudo ser eliminada.', + 'suspendSuccess' => '¡La suscripción ha sido suspendida! Se ha enviado un correo electrónico a {subscriber}.', + 'suspendError' => 'La suscripción no pudo ser suspendida.', + 'resumeSuccess' => 'La suscripción se ha reanudado! Se ha enviado un correo electrónico a {subscriber}.', + 'resumeError' => 'No se pudo reanudar la suscripción.', + 'linkSaveSuccess' => '¡El enlace de suscripción se ha guardado correctamente! ¡Aparecerá en el sitio web como una acción de llamada!', + 'linkRemoveSuccess' => '¡El enlace de suscripción se eliminó correctamente!', ], 'emails' => [ - 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', - 'welcome_subject' => 'Welcome to {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', - 'edited_subject' => 'Your subscription has been updated!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', - 'suspended_subject' => 'Your subscription has been suspended!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', - 'suspended_reason' => 'That is for the following reason: {0}', - 'resumed_subject' => 'Your subscription has been resumed!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', - 'deleted_subject' => 'Your subscription has been removed!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', - 'footer' => '{castopod} hosted on {host}', + 'greeting' => 'Hola,', + 'token' => 'Tu token: {0}', + 'unique_feed_link' => 'Tu enlace de feed único: {0}', + 'how_to_use' => '¿Cómo se usa?', + 'two_ways' => 'Tienes dos maneras de desbloquear los episodios premium:', + 'import_into_app' => 'Copie su Url única dentro de su aplicación de podcast favorita (importe como un feed privado para evitar exponer sus credenciales).', + 'go_to_website' => 'Ve a la página web de {podcastWebsite} y desbloquea el podcast con tu token.', + 'welcome_subject' => 'Bienvenido a {podcastTitle}', + 'welcome' => 'Te has suscrito a {podcastTitle}, ¡gracias y bienvenido!', + 'welcome_token_title' => 'Aquí están tus credenciales para desbloquear los episodios premium del podcast:', + 'welcome_expires' => 'Sus suscripción caducará en {0}.', + 'welcome_never_expires' => 'Tu suscripción nunca expirará.', + 'reset_subject' => '¡Tu token ha sido restablecido!', + 'reset_token' => '¡Tu acceso a {podcastTitle} ha sido restablecido!', + 'reset_token_title' => 'Se han generado nuevas credenciales para desbloquear los episodios premium del podcast:', + 'edited_subject' => 'Su suscripción ha sido actualizada!', + 'edited_expires' => 'Su suscripción para {podcastTitle} caducará el {expiresAt}.', + 'edited_never_expires' => '¡Tu suscripción para {podcastTitle} nunca caducará!', + 'suspended_subject' => 'Tu suscripción ha sido suspendida!', + 'suspended' => '¡Tu suscripción para {podcastTitle} ha sido suspendida! Ya no puedes acceder a los episodios premium del podcast.', + 'suspended_reason' => 'Este es el siguiente motivo: {0}', + 'resumed_subject' => 'Hemos reactivado tu suscripción!', + 'resumed' => '¡Tu suscripción para {podcastTitle} ha sido reanudada! Puedes acceder de nuevo a los episodios premium del podcast.', + 'deleted_subject' => 'La suscripción ha sido eliminada!', + 'deleted' => '¡Tu suscripción para {podcastTitle} ha sido eliminada! Ya no tienes acceso a los episodios premium del podcast.', + 'footer' => '{castopod} alojado en {host}', ], ]; diff --git a/modules/PremiumPodcasts/Language/ro/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/ro/PremiumPodcasts.php new file mode 100644 index 00000000..18c0dd4e --- /dev/null +++ b/modules/PremiumPodcasts/Language/ro/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Podcast contains premium episodes', + 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', + 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', + 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', + 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'subscribe' => 'Subscribe', + 'lock' => 'Lock', + 'unlock' => 'Unlock', + 'unlock_form' => [ + 'title' => 'Premium content', + 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'token' => 'Enter your key', + 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'submit' => 'Unlock all episodes!', + 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'subscribe_cta' => 'Subscribe now!', + ], + 'messages' => [ + 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', + 'unlockBadAttempt' => 'Your key does not seem to be working…', + 'lockSuccess' => 'Podcast was successfully locked!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/ro/Subscription.php b/modules/PremiumPodcasts/Language/ro/Subscription.php new file mode 100644 index 00000000..f8af256f --- /dev/null +++ b/modules/PremiumPodcasts/Language/ro/Subscription.php @@ -0,0 +1,100 @@ + 'Podcast subscriptions', + 'add' => 'New subscription', + 'view' => 'View subscription', + 'edit' => 'Edit subscription', + 'regenerate_token' => 'Regenerate token', + 'suspend' => 'Suspend subscription', + 'resume' => 'Resume subscription', + 'delete' => 'Delete subscription', + 'status' => [ + 'active' => 'Active', + 'suspended' => 'Suspended', + 'expired' => 'Expired', + ], + 'list' => [ + 'number' => 'Number', + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'unlimited' => 'Unlimited', + 'downloads' => 'Downloads', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'submit_add' => 'Add subscription', + 'submit_edit' => 'Edit subscription', + ], + 'form_link_add' => [ + 'link' => 'Subscription page link', + 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'submit' => 'Save link', + ], + 'suspend_form' => [ + 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'reason' => 'Reason', + 'reason_placeholder' => 'Why are you suspending the subscription?', + "submit" => 'Suspend subscription', + ], + 'delete_form' => [ + 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'understand' => 'I understand, remove the subscription permanently', + 'submit' => 'Remove subscription', + ], + 'messages' => [ + 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', + 'addError' => 'Subscription could not be added.', + 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'editError' => 'Subscription could not be edited.', + 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenError' => 'Token could not be regenerated.', + 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', + 'deleteError' => 'Subscription could not be removed.', + 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', + 'suspendError' => 'Subscription could not be suspended.', + 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', + 'resumeError' => 'Subscription could not be resumed.', + 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', + 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + ], + 'emails' => [ + 'greeting' => 'Hey,', + 'token' => 'Your token: {0}', + 'unique_feed_link' => 'Your unique feed link: {0}', + 'how_to_use' => 'How to use?', + 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', + 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'welcome_subject' => 'Welcome to {podcastTitle}', + 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', + 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', + 'welcome_expires' => 'Your subscription was set to expire on {0}.', + 'welcome_never_expires' => 'Your subscription was set to never expire.', + 'reset_subject' => 'Your token was reset!', + 'reset_token' => 'Your access to {podcastTitle} has been reset!', + 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'edited_subject' => 'Your subscription has been updated!', + 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', + 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'suspended_subject' => 'Your subscription has been suspended!', + 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended_reason' => 'That is for the following reason: {0}', + 'resumed_subject' => 'Your subscription has been resumed!', + 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'deleted_subject' => 'Your subscription has been removed!', + 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'footer' => '{castopod} hosted on {host}', + ], +]; From 6e4045bb0d075e004fa81285e845e157807f2b2c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 25 Nov 2022 18:16:22 +0000 Subject: [PATCH 047/477] chore(release): 1.0.5 [skip ci] ## [1.0.5](https://code.castopod.org/adaures/castopod/compare/v1.0.4...v1.0.5) (2022-11-25) ### Bug Fixes * **router:** revert to CI4 v4.2.7 to include all routes ([c13cfa0](https://code.castopod.org/adaures/castopod/commit/c13cfa0ea0679751521ca4157b953043ecc7974a)) --- CHANGELOG.md | 7 +++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc76852e..85843640 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.0.5](https://code.castopod.org/adaures/castopod/compare/v1.0.4...v1.0.5) (2022-11-25) + +### Bug Fixes + +- **router:** revert to CI4 v4.2.7 to include all routes + ([c13cfa0](https://code.castopod.org/adaures/castopod/commit/c13cfa0ea0679751521ca4157b953043ecc7974a)) + ## [1.0.4](https://code.castopod.org/adaures/castopod/compare/v1.0.3...v1.0.4) (2022-11-21) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 416b60bb..194722de 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.0.4'); +defined('CP_VERSION') || define('CP_VERSION', '1.0.5'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 168f542c..cac1dbaa 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "podlibre/castopod-host", - "version": "1.0.4", + "version": "1.0.5", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package-lock.json b/package-lock.json index 771f3fed..0bef11b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "castopod-host", - "version": "1.0.4", + "version": "1.0.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "castopod-host", - "version": "1.0.4", + "version": "1.0.5", "license": "AGPL-3.0-or-later", "dependencies": { "@amcharts/amcharts4": "^4.10.29", diff --git a/package.json b/package.json index 6635eb4a..e2717ebd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod-host", - "version": "1.0.4", + "version": "1.0.5", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 689831c26c756d454de432900d23bc09a37f890b Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 2 Dec 2022 15:32:27 +0000 Subject: [PATCH 048/477] fix(podcast:soundbite): rename start time attribute to follow spec --- app/Helpers/rss_helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 5c55c280..faee3708 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -370,7 +370,7 @@ if (! function_exists('get_rss_feed')) { foreach ($episode->soundbites as $soundbite) { // TODO: differentiate video from soundbites? $soundbiteElement = $item->addChild('soundbite', $soundbite->title, $podcastNamespace); - $soundbiteElement->addAttribute('start_time', (string) $soundbite->start_time); + $soundbiteElement->addAttribute('startTime', (string) $soundbite->start_time); $soundbiteElement->addAttribute('duration', (string) round($soundbite->duration, 3)); } From 7fbbd08da6a37d08608900ad318e72815fe4b0c4 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 7 Dec 2022 14:00:38 +0000 Subject: [PATCH 049/477] fix(notifications): retrieve activity from database instead of getting cache --- modules/Fediverse/Models/ActivityModel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/Fediverse/Models/ActivityModel.php b/modules/Fediverse/Models/ActivityModel.php index dcb1f0ad..05564bc0 100644 --- a/modules/Fediverse/Models/ActivityModel.php +++ b/modules/Fediverse/Models/ActivityModel.php @@ -133,7 +133,7 @@ class ActivityModel extends BaseUuidModel */ protected function notify(array $data): array { - $activity = (new self())->getActivityById(is_array($data['id']) ? $data['id'][0] : $data['id']); + $activity = (new self())->find(is_array($data['id']) ? $data['id'][0] : $data['id']); if (! $activity instanceof Activity) { return $data; From 16527ed529265f2925e205856c684e34175a8933 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 9 Dec 2022 15:04:42 +0000 Subject: [PATCH 050/477] feat(analytics): add OP3 analytics service option + update episode audio url --- app/Config/Routes.php | 8 ++ app/Controllers/EpisodeController.php | 80 +++++++++++++++++++ app/Controllers/FeedController.php | 3 +- app/Entities/Episode.php | 29 ++----- app/Helpers/rss_helper.php | 2 +- app/Helpers/seo_helper.php | 2 +- app/Libraries/PodcastEpisode.php | 4 +- .../Admin/Controllers/PodcastController.php | 12 +++ modules/Admin/Language/en/Podcast.php | 4 + modules/Analytics/Config/Analytics.php | 38 +++++++-- modules/Analytics/Config/Routes.php | 21 ++--- .../EpisodeAnalyticsController.php | 64 +++------------ .../Analytics/Helpers/analytics_helper.php | 39 --------- modules/Analytics/OP3.php | 32 ++++++++ themes/cp_admin/episode/soundbites_new.php | 2 +- themes/cp_admin/episode/video_clips_new.php | 2 +- themes/cp_admin/podcast/create.php | 8 ++ themes/cp_admin/podcast/edit.php | 9 +++ themes/cp_app/embed.php | 2 +- 19 files changed, 215 insertions(+), 146 deletions(-) create mode 100644 modules/Analytics/OP3.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 803c0625..3a9f533e 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -194,6 +194,14 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { $routes->get('feed', 'FeedController/$1'); }); +// audio routes +$routes->head('audio/@(:podcastHandle)/(:slug)', 'EpisodeController::audio/$1/$2', [ + 'as' => 'episode-audio', +],); +$routes->get('audio/@(:podcastHandle)/(:slug)', 'EpisodeController::audio/$1/$2', [ + 'as' => 'episode-audio', +],); + // Other pages $routes->get('/credits', 'CreditsController', [ 'as' => 'credits', diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index 5b59cf55..03551e35 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -19,12 +19,14 @@ use App\Models\PodcastModel; use App\Models\PostModel; use CodeIgniter\Database\BaseBuilder; use CodeIgniter\Exceptions\PageNotFoundException; +use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\Response; use CodeIgniter\HTTP\ResponseInterface; use Config\Services; use Modules\Analytics\AnalyticsTrait; use Modules\Fediverse\Objects\OrderedCollectionObject; use Modules\Fediverse\Objects\OrderedCollectionPage; +use Modules\PremiumPodcasts\Models\SubscriptionModel; use SimpleXMLElement; class EpisodeController extends BaseController @@ -329,4 +331,82 @@ class EpisodeController extends BaseController ->setHeader('Access-Control-Allow-Origin', '*') ->setBody($collection->toJSON()); } + + public function audio(): RedirectResponse | ResponseInterface + { + // check if episode is premium? + $subscription = null; + + // check if podcast is already unlocked before any token validation + if ($this->episode->is_premium && ($subscription = service('premium_podcasts')->subscription( + $this->episode->podcast->handle + )) === null) { + // look for token as GET parameter + if (($token = $this->request->getGet('token')) === null) { + return $this->response->setStatusCode(401) + ->setJSON([ + 'errors' => [ + 'status' => 401, + 'title' => 'Unauthorized', + 'detail' => 'Episode is premium, you must provide a token to unlock it.', + ], + ]); + } + + // check if there's a valid subscription for the provided token + if (($subscription = (new SubscriptionModel())->validateSubscription( + $this->episode->podcast->handle, + $token + )) === null) { + return $this->response->setStatusCode(401, 'Invalid token!') + ->setJSON([ + 'errors' => [ + 'status' => 401, + 'title' => 'Unauthorized', + 'detail' => 'Invalid token!', + ], + ]); + } + } + + $session = Services::session(); + $session->start(); + + $serviceName = ''; + if ($this->request->getGet('_from')) { + $serviceName = $this->request->getGet('_from'); + } elseif ($session->get('embed_domain') !== null) { + $serviceName = $session->get('embed_domain'); + } elseif ($session->get('referer') !== null && $session->get('referer') !== '- Direct -') { + $serviceName = parse_url((string) $session->get('referer'), PHP_URL_HOST); + } + + $audioFileSize = $this->episode->audio->file_size; + $audioFileHeaderSize = $this->episode->audio->header_size; + $audioDuration = $this->episode->audio->duration; + + // bytes_threshold: number of bytes that must be downloaded for an episode to be counted in download analytics + // - if audio is less than or equal to 60s, then take the audio file_size + // - if audio is more than 60s, then take the audio file_header_size + 60s + $bytesThreshold = $audioDuration <= 60 + ? $audioFileSize + : $audioFileHeaderSize + + (int) floor((($audioFileSize - $audioFileHeaderSize) / $audioDuration) * 60); + + helper('analytics'); + podcast_hit( + $this->episode->podcast_id, + $this->episode->id, + $bytesThreshold, + $audioFileSize, + $audioDuration, + $this->episode->published_at->getTimestamp(), + $serviceName, + $subscription !== null ? $subscription->id : null + ); + + $analyticsConfig = config('Analytics'); + + return redirect()->to($analyticsConfig->getAudioUrl($this->episode, $this->request->getGet())); + } } diff --git a/app/Controllers/FeedController.php b/app/Controllers/FeedController.php index e323ede8..290de8c4 100644 --- a/app/Controllers/FeedController.php +++ b/app/Controllers/FeedController.php @@ -3,14 +3,13 @@ declare(strict_types=1); /** - * @copyright 2020 Ad Aures + * @copyright 2022 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ */ namespace App\Controllers; -use App\Entities\Podcast; use App\Models\EpisodeModel; use App\Models\PodcastModel; use CodeIgniter\Controller; diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 56d8af8a..ffe0b33e 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -44,7 +44,7 @@ use RuntimeException; * @property string $title * @property int $audio_id * @property Audio $audio - * @property string $audio_analytics_url + * @property string $audio_url * @property string $audio_web_url * @property string $audio_opengraph_url * @property string|null $description Holds text only description, striped of any markdown or html special characters @@ -93,7 +93,7 @@ class Episode extends Entity protected ?Audio $audio = null; - protected string $audio_analytics_url; + protected string $audio_url; protected string $audio_web_url; @@ -335,36 +335,19 @@ class Episode extends Entity return $this->chapters; } - public function getAudioAnalyticsUrl(): string + public function getAudioUrl(): string { - helper('analytics'); - - return generate_episode_analytics_url( - $this->podcast_id, - $this->id, - $this->getPodcast() - ->handle, - $this->attributes['slug'], - $this->getAudio() - ->file_extension, - $this->getAudio() - ->duration, - $this->getAudio() - ->file_size, - $this->getAudio() - ->header_size, - $this->published_at, - ); + return url_to('episode-audio', $this->getPodcast()->handle, $this->slug); } public function getAudioWebUrl(): string { - return $this->getAudioAnalyticsUrl() . '?_from=-+Website+-'; + return $this->getAudioUrl() . '?_from=-+Website+-'; } public function getAudioOpengraphUrl(): string { - return $this->getAudioAnalyticsUrl() . '?_from=-+Open+Graph+-'; + return $this->getAudioUrl() . '?_from=-+Open+Graph+-'; } /** diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index faee3708..28d81e31 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -286,7 +286,7 @@ if (! function_exists('get_rss_feed')) { $enclosure->addAttribute( 'url', - $episode->audio_analytics_url . ($enclosureParams === '' ? '' : '?' . $enclosureParams), + $episode->audio_url . ($enclosureParams === '' ? '' : '?' . $enclosureParams), ); $enclosure->addAttribute('length', (string) $episode->audio->file_size); $enclosure->addAttribute('type', $episode->audio->file_mimetype); diff --git a/app/Helpers/seo_helper.php b/app/Helpers/seo_helper.php index f9d870b0..6d535739 100644 --- a/app/Helpers/seo_helper.php +++ b/app/Helpers/seo_helper.php @@ -87,7 +87,7 @@ if (! function_exists('get_episode_metatags')) { 'timeRequired' => iso8601_duration($episode->audio->duration), 'duration' => iso8601_duration($episode->audio->duration), 'associatedMedia' => new Thing('MediaObject', [ - 'contentUrl' => $episode->audio->file_url, + 'contentUrl' => $episode->audio_url, ]), 'partOfSeries' => new Thing('PodcastSeries', [ 'name' => $episode->podcast->title, diff --git a/app/Libraries/PodcastEpisode.php b/app/Libraries/PodcastEpisode.php index 9b2bf169..7388808d 100644 --- a/app/Libraries/PodcastEpisode.php +++ b/app/Libraries/PodcastEpisode.php @@ -58,13 +58,13 @@ class PodcastEpisode extends ObjectType // add audio file $this->audio = [ - 'id' => $episode->audio->file_url, + 'id' => $episode->audio_url, 'type' => 'Audio', 'name' => esc($episode->title), 'size' => $episode->audio->file_size, 'duration' => $episode->audio->duration, 'url' => [ - 'href' => $episode->audio->file_url, + 'href' => $episode->audio_url, 'type' => 'Link', 'mediaType' => $episode->audio->file_mimetype, ], diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 488fe464..e8bcf742 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -264,6 +264,10 @@ class PodcastController extends BaseController $this->request->getPost('other_categories') ?? [], ); + // OP3 + service('settings') + ->set('Analytics.enableOP3', $this->request->getPost('enable_op3') === 'yes', 'podcast:' . $newPodcastId); + $db->transComplete(); return redirect()->route('podcast-view', [$newPodcastId])->with( @@ -373,6 +377,14 @@ class PodcastController extends BaseController $this->request->getPost('other_categories') ?? [], ); + // enable/disable OP3? + service('settings') + ->set( + 'Analytics.enableOP3', + $this->request->getPost('enable_op3') === 'yes', + 'podcast:' . $this->podcast->id + ); + $db->transComplete(); return redirect()->route('podcast-edit', [$this->podcast->id])->with( diff --git a/modules/Admin/Language/en/Podcast.php b/modules/Admin/Language/en/Podcast.php index 426b763b..2d46aff5 100644 --- a/modules/Admin/Language/en/Podcast.php +++ b/modules/Admin/Language/en/Podcast.php @@ -110,6 +110,10 @@ return [ 'premium' => 'Premium', 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_enable' => 'Enable OP3 analytics service', + 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', 'payment_pointer' => 'Payment Pointer for Web Monetization', 'payment_pointer_hint' => 'This is your where you will receive money thanks to Web Monetization', diff --git a/modules/Analytics/Config/Analytics.php b/modules/Analytics/Config/Analytics.php index 6caea6b0..2d08ad04 100644 --- a/modules/Analytics/Config/Analytics.php +++ b/modules/Analytics/Config/Analytics.php @@ -4,7 +4,10 @@ declare(strict_types=1); namespace Modules\Analytics\Config; +use App\Entities\Episode; use CodeIgniter\Config\BaseConfig; +use CodeIgniter\HTTP\URI; +use Modules\Analytics\OP3; class Analytics extends BaseConfig { @@ -39,14 +42,37 @@ class Analytics extends BaseConfig public string $salt = ''; /** - * get the full audio file url + * -------------------------------------------------------------------------- + * The Open Podcast Prefix Project Config + * -------------------------------------------------------------------------- * - * @param string|string[] $audioPath + * @var array */ - public function getAudioUrl(string | array $audioPath): string - { - helper('media'); + public array $OP3 = [ + 'host' => 'https://op3.dev/', + ]; - return media_base_url($audioPath); + public bool $enableOP3 = false; + + /** + * get the full audio file url + */ + public function getAudioUrl(Episode $episode, array $params): string + { + helper(['media', 'setting']); + + $audioFileURI = new URI(media_base_url($episode->audio->file_path)); + $audioFileURI->setQueryArray($params); + + // Wrap episode url with OP3 if episode is public and OP3 is enabled on this podcast + if (! $episode->is_premium && service('settings')->get( + 'Analytics.enableOP3', + 'podcast:' . $episode->podcast_id + )) { + $op3 = new OP3($this->OP3); + $audioFileURI = new URI($op3->wrap($audioFileURI, $episode)); + } + + return (string) $audioFileURI; } } diff --git a/modules/Analytics/Config/Routes.php b/modules/Analytics/Config/Routes.php index 5285fbfd..0526f1d8 100644 --- a/modules/Analytics/Config/Routes.php +++ b/modules/Analytics/Config/Routes.php @@ -53,21 +53,12 @@ $routes->group('', [ $routes->get(config('Analytics')->gateway . '/(:class)/(:filter)', 'AnalyticsController::getData/$1/$2', [ 'as' => 'analytics-data-instance', ]); - // Route for podcast audio file analytics (/audio/pack(podcast_id,episode_id,bytes_threshold,filesize,duration,date)/podcast_folder/filename.mp3) - $routes->head( - 'audio/(:base64)/(:any)', - 'EpisodeAnalyticsController::hit/$1/$2', - [ - 'as' => 'episode-analytics-hit', - ], - ); - $routes->get( - 'audio/(:base64)/(:any)', - 'EpisodeAnalyticsController::hit/$1/$2', - [ - 'as' => 'episode-analytics-hit', - ], - ); + + /** + * @deprecated Route for podcast audio file analytics (/audio/pack(podcast_id,episode_id,bytes_threshold,filesize,duration,date)/podcast_folder/filename.mp3) + */ + $routes->head('audio/(:base64)/(:any)', 'EpisodeAnalyticsController::hit/$1/$2',); + $routes->get('audio/(:base64)/(:any)', 'EpisodeAnalyticsController::hit/$1/$2',); }); // Show the Unknown UserAgents diff --git a/modules/Analytics/Controllers/EpisodeAnalyticsController.php b/modules/Analytics/Controllers/EpisodeAnalyticsController.php index 8631af4b..b5ee229c 100644 --- a/modules/Analytics/Controllers/EpisodeAnalyticsController.php +++ b/modules/Analytics/Controllers/EpisodeAnalyticsController.php @@ -17,13 +17,13 @@ use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; -use Config\Services; use Modules\Analytics\Config\Analytics; -use Modules\PremiumPodcasts\Models\SubscriptionModel; use Psr\Log\LoggerInterface; class EpisodeAnalyticsController extends Controller { + public mixed $config; + /** * An array of helpers to be loaded automatically upon class instantiation. These helpers will be available to all * other controllers that extend Analytics. @@ -32,7 +32,7 @@ class EpisodeAnalyticsController extends Controller */ protected $helpers = ['analytics']; - protected Analytics $config; + protected Analytics $analyticsConfig; /** * Constructor. @@ -52,70 +52,26 @@ class EpisodeAnalyticsController extends Controller $this->config = config('Analytics'); } - public function hit(string $base64EpisodeData, string ...$audioPath): RedirectResponse|ResponseInterface + /** + * @deprecated Replaced by EpisodeController::audio method + */ + public function hit(string $base64EpisodeData, string ...$audioPath): RedirectResponse { - $session = Services::session(); - $session->start(); - - $serviceName = ''; - if ($this->request->getGet('_from')) { - $serviceName = $this->request->getGet('_from'); - } elseif ($session->get('embed_domain') !== null) { - $serviceName = $session->get('embed_domain'); - } elseif ($session->get('referer') !== null && $session->get('referer') !== '- Direct -') { - $serviceName = parse_url((string) $session->get('referer'), PHP_URL_HOST); - } - $episodeData = unpack( 'IpodcastId/IepisodeId/IbytesThreshold/IfileSize/Iduration/IpublicationDate', base64_url_decode($base64EpisodeData), ); - if (! $episodeData) { + if ($episodeData === false) { throw PageNotFoundException::forPageNotFound(); } - // check if episode is premium? $episode = (new EpisodeModel())->getEpisodeById($episodeData['episodeId']); if (! $episode instanceof Episode) { - return $this->response->setStatusCode(404); + throw PageNotFoundException::forPageNotFound(); } - $subscription = null; - - // check if podcast is already unlocked before any token validation - if ($episode->is_premium && ($subscription = service('premium_podcasts')->subscription( - $episode->podcast->handle - )) === null) { - // look for token as GET parameter - if (($token = $this->request->getGet('token')) === null) { - return $this->response->setStatusCode( - 401, - 'Episode is premium, you must provide a token to unlock it.' - ); - } - - // check if there's a valid subscription for the provided token - if (($subscription = (new SubscriptionModel())->validateSubscription( - $episode->podcast->handle, - $token - )) === null) { - return $this->response->setStatusCode(401, 'Invalid token!'); - } - } - - podcast_hit( - $episodeData['podcastId'], - $episodeData['episodeId'], - $episodeData['bytesThreshold'], - $episodeData['fileSize'], - $episodeData['duration'], - $episodeData['publicationDate'], - $serviceName, - $subscription !== null ? $subscription->id : null - ); - - return redirect()->to($this->config->getAudioUrl($episode->audio->file_path)); + return redirect()->route('episode-audio', [$episode->podcast->handle, $episode->slug]); } } diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php index f5ef255a..cdd5c698 100644 --- a/modules/Analytics/Helpers/analytics_helper.php +++ b/modules/Analytics/Helpers/analytics_helper.php @@ -34,45 +34,6 @@ if (! function_exists('base64_url_decode')) { } } -if (! function_exists('generate_episode_analytics_url')) { - /** - * Builds the episode analytics url that redirects to the audio file url after analytics hit. - */ - function generate_episode_analytics_url( - int $podcastId, - int $episodeId, - string $podcastHandle, - string $episodeSlug, - string $audioExtension, - float $audioDuration, - int $audioFileSize, - int $audioFileHeaderSize, - \CodeIgniter\I18n\Time $publicationDate - ): string { - return url_to( - 'episode-analytics-hit', - base64_url_encode( - pack( - 'I*', - $podcastId, - $episodeId, - // bytes_threshold: number of bytes that must be downloaded for an episode to be counted in download analytics - // - if audio is less than or equal to 60s, then take the audio file_size - // - if audio is more than 60s, then take the audio file_header_size + 60s - $audioDuration <= 60 - ? $audioFileSize - : $audioFileHeaderSize + - floor((($audioFileSize - $audioFileHeaderSize) / $audioDuration) * 60), - $audioFileSize, - $audioDuration, - $publicationDate->getTimestamp(), - ), - ), - $podcastHandle . '/' . $episodeSlug . '.' . $audioExtension, - ); - } -} - if (! function_exists('set_user_session_deny_list_ip')) { /** * Set user country in session variable, for analytic purposes diff --git a/modules/Analytics/OP3.php b/modules/Analytics/OP3.php new file mode 100644 index 00000000..053ab5b7 --- /dev/null +++ b/modules/Analytics/OP3.php @@ -0,0 +1,32 @@ + $config + */ + public function __construct(array $config) + { + $this->host = rtrim($config['host'], '/'); + } + + public function wrap(URI $audioURI, Episode $episode): string + { + return $this->host . '/e,pg=' . $episode->podcast->guid . '/' . $audioURI; + } +} diff --git a/themes/cp_admin/episode/soundbites_new.php b/themes/cp_admin/episode/soundbites_new.php index f5609494..b686de27 100644 --- a/themes/cp_admin/episode/soundbites_new.php +++ b/themes/cp_admin/episode/soundbites_new.php @@ -21,7 +21,7 @@ class="max-w-sm" /> -
HTML; diff --git a/modules/Admin/Controllers/DashboardController.php b/modules/Admin/Controllers/DashboardController.php index 94cb7e8b..ffef90d9 100644 --- a/modules/Admin/Controllers/DashboardController.php +++ b/modules/Admin/Controllers/DashboardController.php @@ -70,10 +70,14 @@ class DashboardController extends BaseController ->id; } + $bandwidthLimit = config('App') + ->bandwidthLimit; + $data = [ 'podcastsData' => $podcastsData, 'episodesData' => $episodesData, 'storageData' => $storageData, + 'bandwidthLimit' => $bandwidthLimit === null ? null : formatBytes($bandwidthLimit * 1000000000), 'onlyPodcastId' => $onlyPodcastId, ]; diff --git a/modules/Admin/Language/en/Charts.php b/modules/Admin/Language/en/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/en/Charts.php +++ b/modules/Admin/Language/en/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/themes/cp_admin/dashboard.php b/themes/cp_admin/dashboard.php index c47fa597..6de5d9ce 100644 --- a/themes/cp_admin/dashboard.php +++ b/themes/cp_admin/dashboard.php @@ -30,7 +30,9 @@ 'Podcast', 'TotalStorageByMonth', ) ?>" /> - Date: Sat, 4 Feb 2023 11:34:15 +0000 Subject: [PATCH 062/477] docs: add ntp requirement to validate federation's incoming requests --- .gitignore | 1 + docs/src/getting-started/install.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 35dd7290..d54743dc 100644 --- a/.gitignore +++ b/.gitignore @@ -126,6 +126,7 @@ nb-configuration.xml # Visual Studio Code .vscode/ +tmp/ /results/ /phpunit*.xml diff --git a/docs/src/getting-started/install.md b/docs/src/getting-started/install.md index c68be846..a94f723e 100644 --- a/docs/src/getting-started/install.md +++ b/docs/src/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher From 34777598dd25b260b83fc6d029a0d92329aeb6f5 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 21 Feb 2023 17:27:45 +0000 Subject: [PATCH 063/477] build: replace npm with pnpm + add Dockerfile for ci update php and js dependencies to latest --- .devcontainer/devcontainer.json | 10 +- .gitignore | 4 +- .gitlab-ci.yml | 38 +- .phpunit.cache/test-results | 1 + app/Libraries/Vite/Config/Vite.php | 2 +- app/Libraries/Vite/Vite.php | 38 +- app/Resources/js/charts.ts | 1 - app/Resources/js/map.ts | 1 - app/Resources/js/modules/Tooltip.ts | 3 +- composer.json | 22 +- composer.lock | 1919 +- docker/ci/Dockerfile | 34 + docker/development/Dockerfile | 14 +- docker/production/app/Dockerfile | 2 +- docs/src/sv/contributing/setup-development.md | 35 +- package-lock.json | 28902 ---------------- package.json | 93 +- phpunit.xml.dist | 97 +- pnpm-lock.yaml | 13125 +++++++ rector.php | 1 - scripts/bundle-prepare.sh | 6 +- scripts/bundle.sh | 9 +- scripts/lint-commit-msg.sh | 2 +- scripts/package.sh | 4 +- vite-manifest-css.ts | 67 - vite.config.ts | 2 - 26 files changed, 13895 insertions(+), 30537 deletions(-) create mode 100644 .phpunit.cache/test-results create mode 100644 docker/ci/Dockerfile delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml delete mode 100644 vite-manifest-css.ts diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index afed9ca1..c98ea926 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,7 +5,7 @@ "dockerComposeFile": ["../docker-compose.yml", "./docker-compose.yml"], "service": "app", "workspaceFolder": "/castopod", - "postCreateCommand": "composer install && npm install && npm run build:static", + "postCreateCommand": "composer install && pnpm install && pnpm run build:static", "postStartCommand": "crontab ./crontab && cron && php spark serve --host 0.0.0.0", "postAttachCommand": "crontab ./crontab && service cron reload", "shutdownAction": "stopCompose", @@ -44,5 +44,11 @@ "stylelint.vscode-stylelint", "wayou.vscode-todo-highlight", "yzhang.markdown-all-in-one" - ] + ], + + "features": { + "ghcr.io/devcontainers/features/git:1": {}, + "ghcr.io/guiyomh/features/vim:0": {}, + "ghcr.io/NicoVIII/devcontainer-features/pnpm:2": {} + } } diff --git a/.gitignore b/.gitignore index d54743dc..370e1c2c 100644 --- a/.gitignore +++ b/.gitignore @@ -85,6 +85,7 @@ tests/coverage* # Don't save phpunit under version control. phpunit +.phpunit.cache #------------------------- # Composer @@ -132,9 +133,10 @@ tmp/ /phpunit*.xml /.phpunit.*.cache -# npm +# js package manager yarn.lock node_modules +.pnpm-store # JS .cache diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 32748899..d677d6a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: code.castopod.org:5050/adaures/castopod:php8.1 +image: code.castopod.org:5050/adaures/castopod:ci stages: - prepare @@ -13,20 +13,32 @@ php-dependencies: script: # Install all php dependencies - composer install --prefer-dist --no-ansi --no-interaction --no-progress --ignore-platform-reqs + cache: + key: + files: + - composer.lock + paths: + - .composer-cache artifacts: + expire_in: 30 mins paths: - vendor/ - expire_in: 30 mins js-dependencies: stage: prepare script: - # Install all npm dependencies - - npm ci + # Install all js dependencies + - pnpm install + cache: + key: + files: + - pnpm-lock.yaml + paths: + - .pnpm-store artifacts: + expire_in: 30 mins paths: - node_modules/ - expire_in: 30 mins lint-commit-msg: stage: quality @@ -49,19 +61,18 @@ lint-php: - vendor/bin/ecs check --ansi # phpstan - increase memory limit to 1GB to prevent script failure - php -d memory_limit=1G vendor/bin/phpstan analyse --ansi - # FIXME: rector keeps failing in CI # run rector to check for php errors - # - vendor/bin/rector process --dry-run --ansi + - vendor/bin/rector process --dry-run --ansi dependencies: - php-dependencies lint-js: stage: quality script: - - npm run prettier - - npm run typecheck - - npm run lint - - npm run lint:css + - pnpm run prettier + - pnpm run typecheck + - pnpm run lint + - pnpm run lint:css dependencies: - js-dependencies @@ -74,10 +85,7 @@ tests: MYSQL_DATABASE: "test" MYSQL_USER: "castopod" MYSQL_PASSWORD: "castopod" - script: - - apt-get update && apt-get install -y mariadb-client libmariadb-dev - - echo "SHOW DATABASES;" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mariadb "$MYSQL_DATABASE" # run phpunit without code coverage @@ -128,7 +136,7 @@ release: - chmod +x ./scripts/package.sh # run semantic-release script (configured in `.releaserc.json` file) - - npm run release + - pnpm run release dependencies: - php-dependencies - js-dependencies diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results new file mode 100644 index 00000000..317399c1 --- /dev/null +++ b/.phpunit.cache/test-results @@ -0,0 +1 @@ +{"version":1,"defects":[],"times":{"Tests\\Database\\ExampleDatabaseTest::testModelFindAll":0.003,"Tests\\Database\\ExampleDatabaseTest::testSoftDeleteLeavesRow":0.004,"modules\\Api\\Rest\\V1\\PodcastTest::testList":0.033,"modules\\Api\\Rest\\V1\\PodcastTest::testView":0.004,"modules\\Api\\Rest\\V1\\PodcastTest::testViewNotFound":0.01,"modules\\Api\\Rest\\V1\\PodcastTest::testListEmpty":4.313,"Tests\\Session\\ExampleSessionTest::testSessionSimple":0,"HealthTest::testIsDefinedAppPath":0,"HealthTest::testBaseUrlHasBeenSet":0.005}} \ No newline at end of file diff --git a/app/Libraries/Vite/Config/Vite.php b/app/Libraries/Vite/Config/Vite.php index 88471e78..5562f8d2 100644 --- a/app/Libraries/Vite/Config/Vite.php +++ b/app/Libraries/Vite/Config/Vite.php @@ -10,7 +10,7 @@ class Vite extends BaseConfig { public string $environment = 'production'; - public string $baseUrl = 'http://localhost:3000/'; + public string $baseUrl = 'http://localhost:5173/'; public string $assetsRoot = 'assets'; diff --git a/app/Libraries/Vite/Vite.php b/app/Libraries/Vite/Vite.php index f602ac14..e85a3b5b 100644 --- a/app/Libraries/Vite/Vite.php +++ b/app/Libraries/Vite/Vite.php @@ -34,36 +34,6 @@ class Vite private function loadProd(string $path, string $type): string { - if ($type === 'css') { - if ($this->manifestCSSData === null) { - $cacheName = 'vite-manifest-css'; - if (! ($cachedManifestCSS = cache($cacheName))) { - $manifestCSSPath = config('Vite') - ->assetsRoot . '/' . config('Vite') - ->manifestCSSFile; - try { - if (($manifestCSSContent = file_get_contents($manifestCSSPath)) !== false) { - $cachedManifestCSS = json_decode($manifestCSSContent, true); - cache() - ->save($cacheName, $cachedManifestCSS, DECADE); - } - } catch (ErrorException) { - // ERROR when getting the manifest-css file - die("Could not load css manifest: {$manifestCSSPath} file not found!"); - } - } - - $this->manifestCSSData = $cachedManifestCSS; - } - - if (array_key_exists($path, $this->manifestCSSData)) { - return $this->getHtmlTag( - '/' . config('Vite')->assetsRoot . '/' . $this->manifestCSSData[$path]['file'], - 'css' - ); - } - } - if ($this->manifestData === null) { $cacheName = 'vite-manifest'; if (! ($cachedManifest = cache($cacheName))) { @@ -100,6 +70,14 @@ class Vite if (array_key_exists('imports', $manifestElement)) { foreach ($manifestElement['imports'] as $importPath) { if (array_key_exists($importPath, $this->manifestData)) { + + // import css dependencies if any + if (array_key_exists('css', $this->manifestData[$importPath])) { + foreach ($this->manifestData[$importPath]['css'] as $cssFile) { + $html .= $this->getHtmlTag('/' . config('Vite')->assetsRoot . '/' . $cssFile, 'css'); + } + } + $html .= $this->getHtmlTag( '/' . config('Vite')->assetsRoot . '/' . $this->manifestData[$importPath]['file'], 'js' diff --git a/app/Resources/js/charts.ts b/app/Resources/js/charts.ts index de52bd13..97b2c4d9 100644 --- a/app/Resources/js/charts.ts +++ b/app/Resources/js/charts.ts @@ -1,4 +1,3 @@ -import "core-js"; import DrawCharts from "./modules/Charts"; DrawCharts(); diff --git a/app/Resources/js/map.ts b/app/Resources/js/map.ts index 66afdef9..195a97d0 100644 --- a/app/Resources/js/map.ts +++ b/app/Resources/js/map.ts @@ -1,4 +1,3 @@ -import "core-js"; import DrawEpisodesMaps from "./modules/EpisodesMap"; DrawEpisodesMaps(); diff --git a/app/Resources/js/modules/Tooltip.ts b/app/Resources/js/modules/Tooltip.ts index 0d0d2733..19d2f7af 100644 --- a/app/Resources/js/modules/Tooltip.ts +++ b/app/Resources/js/modules/Tooltip.ts @@ -1,4 +1,3 @@ -import { Coords } from "@floating-ui/core"; import { arrow, computePosition, @@ -47,7 +46,7 @@ const Tooltip = (): void => { }); // Accessing the data - const { x: arrowX, y: arrowY } = middlewareData.arrow as Coords; + const { x: arrowX, y: arrowY } = middlewareData.arrow as any; const staticSide = { top: "bottom", diff --git a/composer.json b/composer.json index 2bcc5638..d9a61018 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "podlibre/castopod-host", + "name": "adaures/castopod", "version": "1.1.2", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", @@ -8,16 +8,16 @@ "require": { "php": "^8.1", "codeigniter4/framework": "v4.2.7", - "james-heinrich/getid3": "^2.0.x-dev", + "james-heinrich/getid3": "^2.0.0-beta5", "whichbrowser/parser": "^v2.1.7", "geoip2/geoip2": "v2.13.0", - "league/commonmark": "^2.3.7", + "league/commonmark": "^2.3.9", "vlucas/phpdotenv": "v5.5.0", "league/html-to-markdown": "^v5.1.0", "opawg/user-agents-php": "^v1.0", "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.0", - "phpseclib/phpseclib": "~2.0.39", + "phpseclib/phpseclib": "~2.0.41", "michalsn/codeigniter4-uuid": "dev-develop", "essence/essence": "^3.5.4", "codeigniter4/settings": "^v2.1.0", @@ -27,12 +27,12 @@ }, "require-dev": { "mikey179/vfsstream": "^v1.6.11", - "phpunit/phpunit": "^9.5.26", - "captainhook/captainhook": "^5.11.1", - "symplify/easy-coding-standard": "^10.3.3", - "phpstan/phpstan": "^1.9.2", - "rector/rector": "^0.14.8", - "symplify/coding-standard": "^10.3.3" + "phpunit/phpunit": "^10.0.11", + "captainhook/captainhook": "^5.14.4", + "symplify/easy-coding-standard": "^11.2.9", + "phpstan/phpstan": "^1.10.0", + "rector/rector": "^0.15.17", + "symplify/coding-standard": "^11.3.0" }, "autoload": { "exclude-from-classmap": [ @@ -45,7 +45,7 @@ } }, "scripts": { - "test": "vendor/bin/phpunit", + "test": "vendor/bin/phpunit --no-coverage", "analyse": "vendor/bin/phpstan analyse --ansi", "rector": "vendor/bin/rector process --dry-run --ansi --memory-limit=2G", "rector:fix": "vendor/bin/rector process --ansi --memory-limit=2G", diff --git a/composer.lock b/composer.lock index ed25fe80..fdc011b5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e5d3ae32b8a1422fc2c33ecef375dfe8", + "content-hash": "86928335baed20f4228d148b0b4f77e0", "packages": [ { "name": "adaures/ipcat-php", @@ -351,16 +351,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.4", + "version": "1.3.5", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "69098eca243998b53eed7a48d82dedd28b447cd5" + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/69098eca243998b53eed7a48d82dedd28b447cd5", - "reference": "69098eca243998b53eed7a48d82dedd28b447cd5", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", "shasum": "" }, "require": { @@ -399,7 +399,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.4" + "source": "https://github.com/composer/ca-bundle/tree/1.3.5" }, "funding": [ { @@ -415,7 +415,7 @@ "type": "tidelift" } ], - "time": "2022-10-12T12:08:29+00:00" + "time": "2023-01-11T08:27:00+00:00" }, { "name": "dflydev/dot-access-data", @@ -767,7 +767,7 @@ }, { "name": "james-heinrich/getid3", - "version": "2.0.x-dev", + "version": "v2.0.0-beta5", "source": { "type": "git", "url": "https://github.com/JamesHeinrich/getID3.git", @@ -835,7 +835,7 @@ "keywords": ["audio", "codecs", "id3", "metadata", "tags", "video"], "support": { "issues": "https://github.com/JamesHeinrich/getID3/issues", - "source": "https://github.com/JamesHeinrich/getID3/tree/2.0" + "source": "https://github.com/JamesHeinrich/getID3/tree/v2.0.0-beta5" }, "time": "2022-10-28T11:52:26+00:00" }, @@ -955,16 +955,16 @@ }, { "name": "league/commonmark", - "version": "2.3.7", + "version": "2.3.9", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "a36bd2be4f5387c0f3a8792a0d76b7d68865abbf" + "reference": "c1e114f74e518daca2729ea8c4bf1167038fa4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/a36bd2be4f5387c0f3a8792a0d76b7d68865abbf", - "reference": "a36bd2be4f5387c0f3a8792a0d76b7d68865abbf", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c1e114f74e518daca2729ea8c4bf1167038fa4b5", + "reference": "c1e114f74e518daca2729ea8c4bf1167038fa4b5", "shasum": "" }, "require": { @@ -992,7 +992,7 @@ "symfony/finder": "^5.3 | ^6.0", "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", "unleashedtech/php-coding-standard": "^3.1.1", - "vimeo/psalm": "^4.24.0" + "vimeo/psalm": "^4.24.0 || ^5.0.0" }, "suggest": { "symfony/yaml": "v2.3+ required if using the Front Matter extension" @@ -1055,20 +1055,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T17:29:46+00:00" + "time": "2023-02-15T14:07:24+00:00" }, { "name": "league/config", - "version": "v1.1.1", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/config.git", - "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", - "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { @@ -1077,7 +1077,7 @@ "php": "^7.4 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.90", + "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.5", "scrutinizer/ocular": "^1.8.1", "unleashedtech/php-coding-standard": "^3.1", @@ -1135,7 +1135,7 @@ "type": "github" } ], - "time": "2021-08-14T12:15:32+00:00" + "time": "2022-12-11T20:36:23+00:00" }, { "name": "league/html-to-markdown", @@ -1485,16 +1485,16 @@ }, { "name": "nette/utils", - "version": "v3.2.8", + "version": "v3.2.9", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368" + "reference": "c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", - "reference": "02a54c4c872b99e4ec05c4aec54b5a06eb0f6368", + "url": "https://api.github.com/repos/nette/utils/zipball/c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c", + "reference": "c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c", "shasum": "" }, "require": { @@ -1504,6 +1504,7 @@ "nette/di": "<3.0.6" }, "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", "nette/tester": "~2.0", "phpstan/phpstan": "^1.0", "tracy/tracy": "^2.3" @@ -1558,9 +1559,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v3.2.8" + "source": "https://github.com/nette/utils/tree/v3.2.9" }, - "time": "2022-09-12T23:36:20+00:00" + "time": "2023-01-18T03:26:20+00:00" }, { "name": "opawg/user-agents-php", @@ -1668,16 +1669,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.39", + "version": "2.0.41", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "f3a0e2b715c40cf1fd270d444901b63311725d63" + "reference": "7e763c6f97ec1fcb37c46aa8ecfc20a2c71d9c1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f3a0e2b715c40cf1fd270d444901b63311725d63", - "reference": "f3a0e2b715c40cf1fd270d444901b63311725d63", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7e763c6f97ec1fcb37c46aa8ecfc20a2c71d9c1b", + "reference": "7e763c6f97ec1fcb37c46aa8ecfc20a2c71d9c1b", "shasum": "" }, "require": { @@ -1754,7 +1755,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.39" + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.41" }, "funding": [ { @@ -1770,7 +1771,7 @@ "type": "tidelift" } ], - "time": "2022-10-24T10:49:03+00:00" + "time": "2022-12-23T16:44:18+00:00" }, { "name": "psr/cache", @@ -1905,42 +1906,52 @@ }, { "name": "ramsey/collection", - "version": "1.2.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", - "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", "shasum": "" }, "require": { - "php": "^7.3 || ^8", - "symfony/polyfill-php81": "^1.23" + "php": "^8.1" }, "require-dev": { - "captainhook/captainhook": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "ergebnis/composer-normalize": "^2.6", - "fakerphp/faker": "^1.5", - "hamcrest/hamcrest-php": "^2", - "jangregor/phpstan-prophecy": "^0.8", - "mockery/mockery": "^1.3", + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1", - "phpstan/phpstan": "^0.12.32", - "phpstan/phpstan-mockery": "^0.12.5", - "phpstan/phpstan-phpunit": "^0.12.11", - "phpunit/phpunit": "^8.5 || ^9", - "psy/psysh": "^0.10.4", - "slevomat/coding-standard": "^6.3", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" }, "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, "autoload": { "psr-4": { "Ramsey\\Collection\\": "src/" @@ -1959,7 +1970,7 @@ "keywords": ["array", "collection", "hash", "map", "queue", "set"], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/1.2.2" + "source": "https://github.com/ramsey/collection/tree/2.0.0" }, "funding": [ { @@ -1971,27 +1982,27 @@ "type": "tidelift" } ], - "time": "2021-10-10T03:01:02+00:00" + "time": "2022-12-31T21:50:55+00:00" }, { "name": "ramsey/uuid", - "version": "4.6.0", + "version": "4.7.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f" + "reference": "433b2014e3979047db08a17a205f410ba3869cf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/ad63bc700e7d021039e30ce464eba384c4a1d40f", - "reference": "ad63bc700e7d021039e30ce464eba384c4a1d40f", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2", + "reference": "433b2014e3979047db08a17a205f410ba3869cf2", "shasum": "" }, "require": { "brick/math": "^0.8.8 || ^0.9 || ^0.10", "ext-json": "*", "php": "^8.0", - "ramsey/collection": "^1.0" + "ramsey/collection": "^1.2 || ^2.0" }, "replace": { "rhumsaa/uuid": "self.version" @@ -2043,7 +2054,7 @@ "keywords": ["guid", "identifier", "uuid"], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.6.0" + "source": "https://github.com/ramsey/uuid/tree/4.7.3" }, "funding": [ { @@ -2055,20 +2066,20 @@ "type": "tidelift" } ], - "time": "2022-11-05T23:03:38+00:00" + "time": "2023-01-12T18:13:24+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", "shasum": "" }, "require": { @@ -2077,7 +2088,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -2102,7 +2113,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" }, "funding": [ { @@ -2118,7 +2129,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/polyfill-ctype", @@ -2338,74 +2349,6 @@ ], "time": "2022-11-03T14:55:06+00:00" }, - { - "name": "symfony/polyfill-php81", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": ["bootstrap.php"], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": ["Resources/stubs"] - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": ["compatibility", "polyfill", "portable", "shim"], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-11-03T14:55:06+00:00" - }, { "name": "vlucas/phpdotenv", "version": "v5.5.0", @@ -2542,16 +2485,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.11.1", + "version": "5.14.4", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "44ba2b815a64ea71a3dc4afc9007d953ab992238" + "reference": "8309f6e16097754469c485e604900c573bf2c5d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/44ba2b815a64ea71a3dc4afc9007d953ab992238", - "reference": "44ba2b815a64ea71a3dc4afc9007d953ab992238", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/8309f6e16097754469c485e604900c573bf2c5d8", + "reference": "8309f6e16097754469c485e604900c573bf2c5d8", "shasum": "" }, "require": { @@ -2609,7 +2552,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.11.1" + "source": "https://github.com/captainhookphp/captainhook/tree/5.14.4" }, "funding": [ { @@ -2617,7 +2560,7 @@ "type": "github" } ], - "time": "2022-11-11T16:45:34+00:00" + "time": "2023-02-05T15:14:48+00:00" }, { "name": "composer/pcre", @@ -2820,32 +2763,35 @@ }, { "name": "doctrine/annotations", - "version": "1.13.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0" + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0", - "reference": "648b0343343565c4a056bfc8392201385e8d89f0", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", "shasum": "" }, "require": { - "doctrine/lexer": "1.*", + "doctrine/lexer": "^2 || ^3", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0", + "php": "^7.2 || ^8.0", "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "^1.11 || ^2.0", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^1.4.10 || ^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", - "symfony/cache": "^4.4 || ^5.2", + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", "vimeo/psalm": "^4.10" }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, "type": "library", "autoload": { "psr-4": { @@ -2881,102 +2827,38 @@ "keywords": ["annotations", "docblock", "parser"], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.13.3" + "source": "https://github.com/doctrine/annotations/tree/2.0.1" }, - "time": "2022-07-02T10:48:51+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": ["constructor", "instantiate"], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.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%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2023-02-02T22:02:53+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + "reference": "84a527db05647743d50373e0ec53a152f2cde568" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", - "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^9.0", - "phpstan/phpstan": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.11" + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" }, "type": "library", "autoload": { "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + "Doctrine\\Common\\Lexer\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3000,7 +2882,7 @@ "keywords": ["annotations", "docblock", "lexer", "parser", "php"], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.3" + "source": "https://github.com/doctrine/lexer/tree/3.0.0" }, "funding": [ { @@ -3016,55 +2898,56 @@ "type": "tidelift" } ], - "time": "2022-02-28T11:07:21+00:00" + "time": "2022-12-15T16:57:16+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.13.0", + "version": "v3.14.4", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1" + "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/a6232229a8309e8811dc751c28b91cb34b2943e1", - "reference": "a6232229a8309e8811dc751c28b91cb34b2943e1", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/1b3d9dba63d93b8a202c31e824748218781eae6b", + "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b", "shasum": "" }, "require": { - "composer/semver": "^3.2", + "composer/semver": "^3.3", "composer/xdebug-handler": "^3.0.3", - "doctrine/annotations": "^1.13", + "doctrine/annotations": "^2", + "doctrine/lexer": "^2 || ^3", "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0", + "sebastian/diff": "^4.0 || ^5.0", "symfony/console": "^5.4 || ^6.0", "symfony/event-dispatcher": "^5.4 || ^6.0", "symfony/filesystem": "^5.4 || ^6.0", "symfony/finder": "^5.4 || ^6.0", "symfony/options-resolver": "^5.4 || ^6.0", - "symfony/polyfill-mbstring": "^1.23", - "symfony/polyfill-php80": "^1.25", - "symfony/polyfill-php81": "^1.25", + "symfony/polyfill-mbstring": "^1.27", + "symfony/polyfill-php80": "^1.27", + "symfony/polyfill-php81": "^1.27", "symfony/process": "^5.4 || ^6.0", "symfony/stopwatch": "^5.4 || ^6.0" }, "require-dev": { "justinrainbow/json-schema": "^5.2", "keradus/cli-executor": "^2.0", - "mikey179/vfsstream": "^1.6.10", - "php-coveralls/php-coveralls": "^2.5.2", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.5.3", "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1", - "phpspec/prophecy": "^1.15", + "phpspec/prophecy": "^1.16", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", "phpunitgoodpractices/polyfill": "^1.6", "phpunitgoodpractices/traits": "^1.9.2", - "symfony/phpunit-bridge": "^6.0", + "symfony/phpunit-bridge": "^6.2.3", "symfony/yaml": "^5.4 || ^6.0" }, "suggest": { @@ -3093,7 +2976,7 @@ "description": "A tool to automatically fix PHP code style", "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.13.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.4" }, "funding": [ { @@ -3101,7 +2984,7 @@ "type": "github" } ], - "time": "2022-10-31T19:28:50+00:00" + "time": "2023-02-09T21:49:13+00:00" }, { "name": "mikey179/vfsstream", @@ -3203,16 +3086,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.2", + "version": "v4.15.3", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", - "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", "shasum": "" }, "require": { @@ -3246,9 +3129,9 @@ "keywords": ["parser", "php"], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" }, - "time": "2022-11-12T15:38:23+00:00" + "time": "2023-01-16T22:05:37+00:00" }, { "name": "phar-io/manifest", @@ -3355,16 +3238,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.2", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d6fdf01c53978b6429f1393ba4afeca39cc68afa" + "reference": "71b28a67f01ac231f9a8f1ce242270bf4ec1f99c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d6fdf01c53978b6429f1393ba4afeca39cc68afa", - "reference": "d6fdf01c53978b6429f1393ba4afeca39cc68afa", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/71b28a67f01ac231f9a8f1ce242270bf4ec1f99c", + "reference": "71b28a67f01ac231f9a8f1ce242270bf4ec1f99c", "shasum": "" }, "require": { @@ -3384,7 +3267,7 @@ "keywords": ["dev", "static analysis"], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.2" + "source": "https://github.com/phpstan/phpstan/tree/1.10.0" }, "funding": [ { @@ -3400,20 +3283,20 @@ "type": "tidelift" } ], - "time": "2022-11-10T09:56:11+00:00" + "time": "2023-02-21T13:50:49+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.19", + "version": "10.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559" + "reference": "bf4fbc9c13af7da12b3ea807574fb460f255daba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c77b56b63e3d2031bd8997fcec43c1925ae46559", - "reference": "c77b56b63e3d2031bd8997fcec43c1925ae46559", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bf4fbc9c13af7da12b3ea807574fb460f255daba", + "reference": "bf4fbc9c13af7da12b3ea807574fb460f255daba", "shasum": "" }, "require": { @@ -3421,18 +3304,18 @@ "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.14", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcov": "*", @@ -3441,7 +3324,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "10.0-dev" } }, "autoload": { @@ -3461,7 +3344,7 @@ "keywords": ["coverage", "testing", "xunit"], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.19" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.0.0" }, "funding": [ { @@ -3469,32 +3352,32 @@ "type": "github" } ], - "time": "2022-11-18T07:47:47+00:00" + "time": "2023-02-03T07:14:34+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/fd9329ab3368f59fe1fe808a189c51086bd4b6bd", + "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -3514,7 +3397,7 @@ "keywords": ["filesystem", "iterator"], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.1" }, "funding": [ { @@ -3522,28 +3405,28 @@ "type": "github" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2023-02-10T16:53:14+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-pcntl": "*" @@ -3551,7 +3434,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -3571,7 +3454,7 @@ "keywords": ["process"], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" }, "funding": [ { @@ -3579,32 +3462,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2023-02-03T06:56:09+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -3624,7 +3507,7 @@ "keywords": ["template"], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" }, "funding": [ { @@ -3632,32 +3515,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2023-02-03T06:56:46+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -3677,7 +3560,7 @@ "keywords": ["timer"], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" }, "funding": [ { @@ -3685,24 +3568,23 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2023-02-03T06:57:52+00:00" }, { "name": "phpunit/phpunit", - "version": "9.5.26", + "version": "10.0.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" + "reference": "d18a18b07e7a9ad52d994b1785f9e301fc84b616" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", - "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d18a18b07e7a9ad52d994b1785f9e301fc84b616", + "reference": "d18a18b07e7a9ad52d994b1785f9e301fc84b616", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -3712,33 +3594,32 @@ "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", - "sebastian/version": "^3.0.2" + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.0", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.0", + "sebastian/global-state": "^6.0", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" + "ext-soap": "*" }, "bin": ["phpunit"], "type": "library", "extra": { "branch-alias": { - "dev-master": "9.5-dev" + "dev-main": "10.0-dev" } }, "autoload": { @@ -3759,7 +3640,7 @@ "keywords": ["phpunit", "testing", "xunit"], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.11" }, "funding": [ { @@ -3775,7 +3656,7 @@ "type": "tidelift" } ], - "time": "2022-10-28T06:00:21+00:00" + "time": "2023-02-20T16:39:36+00:00" }, { "name": "psr/container", @@ -3830,27 +3711,25 @@ }, { "name": "rector/rector", - "version": "0.14.8", + "version": "0.15.17", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "46ee9a173a2b2645ca92a75ffc17460139fa226e" + "reference": "7f6ee7974175138864d3b50c28ea73a7b0fd4e2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/46ee9a173a2b2645ca92a75ffc17460139fa226e", - "reference": "46ee9a173a2b2645ca92a75ffc17460139fa226e", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/7f6ee7974175138864d3b50c28ea73a7b0fd4e2d", + "reference": "7f6ee7974175138864d3b50c28ea73a7b0fd4e2d", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.9.0" + "phpstan/phpstan": "^1.9.14" }, "conflict": { "rector/rector-doctrine": "*", "rector/rector-downgrade-php": "*", - "rector/rector-php-parser": "*", - "rector/rector-phpoffice": "*", "rector/rector-phpunit": "*", "rector/rector-symfony": "*" }, @@ -3858,7 +3737,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "0.14-dev" + "dev-main": "0.15-dev" } }, "autoload": { @@ -3869,7 +3748,7 @@ "description": "Instant Upgrade and Automated Refactoring of any PHP code", "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.14.8" + "source": "https://github.com/rectorphp/rector/tree/0.15.17" }, "funding": [ { @@ -3877,32 +3756,32 @@ "type": "github" } ], - "time": "2022-11-14T14:09:49+00:00" + "time": "2023-02-17T20:34:07+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -3921,7 +3800,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" }, "funding": [ { @@ -3929,32 +3808,32 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2023-02-03T06:58:15+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -3973,7 +3852,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" }, "funding": [ { @@ -3981,32 +3860,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2023-02-03T06:58:43+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4024,7 +3903,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" }, "funding": [ { @@ -4032,34 +3911,36 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2023-02-03T06:59:15+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c", + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4090,7 +3971,7 @@ "keywords": ["comparator", "compare", "equality"], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0" }, "funding": [ { @@ -4098,33 +3979,33 @@ "type": "github" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2023-02-03T07:07:16+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4143,7 +4024,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" }, "funding": [ { @@ -4151,33 +4032,33 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-02-03T06:59:47+00:00" }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "70dd1b20bc198da394ad542e988381b44e64e39f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f", + "reference": "70dd1b20bc198da394ad542e988381b44e64e39f", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^10.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4200,7 +4081,7 @@ "keywords": ["diff", "udiff", "unidiff", "unified diff"], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0" }, "funding": [ { @@ -4208,27 +4089,27 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-02-03T07:00:31+00:00" }, { "name": "sebastian/environment", - "version": "5.1.4", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", - "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b6f3694c6386c7959915a0037652e0c40f6f69cc", + "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "suggest": { "ext-posix": "*" @@ -4236,7 +4117,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -4251,11 +4132,11 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": ["Xdebug", "environment", "hhvm"], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.0" }, "funding": [ { @@ -4263,34 +4144,34 @@ "type": "github" } ], - "time": "2022-04-03T09:37:03+00:00" + "time": "2023-02-03T07:03:04+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4325,7 +4206,7 @@ "keywords": ["export", "exporter"], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" }, "funding": [ { @@ -4333,38 +4214,35 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2023-02-03T07:06:49+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "aab257c712de87b90194febd52e4d184551c2d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44", + "reference": "aab257c712de87b90194febd52e4d184551c2d44", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -4383,7 +4261,7 @@ "keywords": ["global state"], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0" }, "funding": [ { @@ -4391,33 +4269,33 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-02-03T07:07:38+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" + "nikic/php-parser": "^4.10", + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "2.0-dev" } }, "autoload": { @@ -4436,7 +4314,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" }, "funding": [ { @@ -4444,34 +4322,34 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-02-03T07:08:02+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4489,7 +4367,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" }, "funding": [ { @@ -4497,32 +4375,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2023-02-03T07:08:32+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4540,7 +4418,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" }, "funding": [ { @@ -4548,32 +4426,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2023-02-03T07:06:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -4596,10 +4474,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" }, "funding": [ { @@ -4607,83 +4485,32 @@ "type": "github" } ], - "time": "2020-10-26T13:17:30+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": ["src/"] - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["BSD-3-Clause"], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2023-02-03T07:05:40+00:00" }, { "name": "sebastian/type", - "version": "3.2.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", - "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -4702,7 +4529,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.0" + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" }, "funding": [ { @@ -4710,29 +4537,29 @@ "type": "github" } ], - "time": "2022-09-12T14:47:03+00:00" + "time": "2023-02-03T07:10:45+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -4751,7 +4578,7 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" }, "funding": [ { @@ -4759,7 +4586,7 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2023-02-07T11:34:05+00:00" }, { "name": "sebastianfeldmann/camino", @@ -4923,91 +4750,18 @@ ], "time": "2022-10-23T11:29:41+00:00" }, - { - "name": "symfony/config", - "version": "v6.1.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "a0645dc585d378b73c01115dd7ab9348f7d40c85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/a0645dc585d378b73c01115dd7ab9348f7d40c85", - "reference": "a0645dc585d378b73c01115dd7ab9348f7d40c85", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^5.4|^6.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<5.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": ["/Tests/"] - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v6.1.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-07-20T15:00:40+00:00" - }, { "name": "symfony/console", - "version": "v6.1.7", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815" + "reference": "3e294254f2191762c1d137aed4b94e966965e985" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a1282bd0c096e0bdb8800b104177e2ce404d8815", - "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815", + "url": "https://api.github.com/repos/symfony/console/zipball/3e294254f2191762c1d137aed4b94e966965e985", + "reference": "3e294254f2191762c1d137aed4b94e966965e985", "shasum": "" }, "require": { @@ -5065,7 +4819,7 @@ "homepage": "https://symfony.com", "keywords": ["cli", "command line", "console", "terminal"], "support": { - "source": "https://github.com/symfony/console/tree/v6.1.7" + "source": "https://github.com/symfony/console/tree/v6.2.5" }, "funding": [ { @@ -5081,103 +4835,20 @@ "type": "tidelift" } ], - "time": "2022-10-26T21:42:49+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v6.1.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b9c797c9d56afc290d4265854bafd01b4e379240" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b9c797c9d56afc290d4265854bafd01b4e379240", - "reference": "b9c797c9d56afc290d4265854bafd01b4e379240", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/service-contracts": "^1.1.6|^2.0|^3.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<5.4", - "symfony/yaml": "<5.4" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "symfony/config": "^6.1", - "symfony/expression-language": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": ["/Tests/"] - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.1.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-09-28T16:00:52+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.1.0", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347" + "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347", - "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", + "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", "shasum": "" }, "require": { @@ -5227,7 +4898,7 @@ "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/v6.1.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.5" }, "funding": [ { @@ -5243,20 +4914,20 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:51:07+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "02ff5eea2f453731cfbc6bc215e456b781480448" + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448", - "reference": "02ff5eea2f453731cfbc6bc215e456b781480448", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", "shasum": "" }, "require": { @@ -5269,7 +4940,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -5304,7 +4975,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0" }, "funding": [ { @@ -5320,20 +4991,20 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/filesystem", - "version": "v6.1.5", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "4d216a2beef096edf040a070117c39ca2abce307" + "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/4d216a2beef096edf040a070117c39ca2abce307", - "reference": "4d216a2beef096edf040a070117c39ca2abce307", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e59e8a4006afd7f5654786a83b4fcb8da98f4593", + "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593", "shasum": "" }, "require": { @@ -5363,7 +5034,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.1.5" + "source": "https://github.com/symfony/filesystem/tree/v6.2.5" }, "funding": [ { @@ -5379,20 +5050,20 @@ "type": "tidelift" } ], - "time": "2022-09-21T20:29:40+00:00" + "time": "2023-01-20T17:45:48+00:00" }, { "name": "symfony/finder", - "version": "v6.1.3", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" + "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", - "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "url": "https://api.github.com/repos/symfony/finder/zipball/c90dc446976a612e3312a97a6ec0069ab0c2099c", + "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c", "shasum": "" }, "require": { @@ -5423,7 +5094,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.1.3" + "source": "https://github.com/symfony/finder/tree/v6.2.5" }, "funding": [ { @@ -5439,20 +5110,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:42:06+00:00" + "time": "2023-01-20T17:45:48+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.1.0", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4" + "reference": "e8324d44f5af99ec2ccec849934a242f64458f86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4", - "reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/e8324d44f5af99ec2ccec849934a242f64458f86", + "reference": "e8324d44f5af99ec2ccec849934a242f64458f86", "shasum": "" }, "require": { @@ -5482,7 +5153,7 @@ "homepage": "https://symfony.com", "keywords": ["config", "configuration", "options"], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.1.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.2.5" }, "funding": [ { @@ -5498,7 +5169,7 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -5656,17 +5327,85 @@ "time": "2022-11-03T14:55:06+00:00" }, { - "name": "symfony/process", - "version": "v6.1.3", + "name": "symfony/polyfill-php81", + "version": "v1.27.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/a6506e99cfad7059b1ab5cab395854a0a0c21292", - "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": ["bootstrap.php"], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": ["Resources/stubs"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": ["compatibility", "polyfill", "portable", "shim"], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v6.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/9ead139f63dfa38c4e4a9049cc64a8b2748c83b7", + "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7", "shasum": "" }, "require": { @@ -5694,7 +5433,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.1.3" + "source": "https://github.com/symfony/process/tree/v6.2.5" }, "funding": [ { @@ -5710,20 +5449,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:24:16+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", - "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", "shasum": "" }, "require": { @@ -5739,7 +5478,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -5775,7 +5514,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.2.0" }, "funding": [ { @@ -5791,20 +5530,20 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:18:58+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.1.5", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7" + "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/266636bb8f3fbdccc302491df7b3a1b9a8c238a7", - "reference": "266636bb8f3fbdccc302491df7b3a1b9a8c238a7", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/00b6ac156aacffc53487c930e0ab14587a6607f6", + "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6", "shasum": "" }, "require": { @@ -5833,7 +5572,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.1.5" + "source": "https://github.com/symfony/stopwatch/tree/v6.2.5" }, "funding": [ { @@ -5849,20 +5588,20 @@ "type": "tidelift" } ], - "time": "2022-09-28T16:00:52+00:00" + "time": "2023-01-01T08:36:55+00:00" }, { "name": "symfony/string", - "version": "v6.1.7", + "version": "v6.2.5", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" + "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", + "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", + "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", "shasum": "" }, "require": { @@ -5878,6 +5617,7 @@ "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", "symfony/translation-contracts": "^2.0|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, @@ -5905,7 +5645,7 @@ "homepage": "https://symfony.com", "keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.7" + "source": "https://github.com/symfony/string/tree/v6.2.5" }, "funding": [ { @@ -5921,141 +5661,44 @@ "type": "tidelift" } ], - "time": "2022-10-10T09:34:31+00:00" - }, - { - "name": "symplify/autowire-array-parameter", - "version": "10.3.3", - "source": { - "type": "git", - "url": "https://github.com/symplify/autowire-array-parameter.git", - "reference": "e3ca795122712fab224a5c10339b1fb278505420" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symplify/autowire-array-parameter/zipball/e3ca795122712fab224a5c10339b1fb278505420", - "reference": "e3ca795122712fab224a5c10339b1fb278505420", - "shasum": "" - }, - "require": { - "nette/utils": "^3.2", - "php": ">=8.0", - "symfony/dependency-injection": "^6.0", - "symplify/package-builder": "^10.3.3" - }, - "conflict": { - "symplify/astral": "<10.3.3", - "symplify/coding-standard": "<10.3.3", - "symplify/composer-json-manipulator": "<10.3.3", - "symplify/config-transformer": "<10.3.3", - "symplify/easy-ci": "<10.3.3", - "symplify/easy-coding-standard": "<10.3.3", - "symplify/easy-parallel": "<10.3.3", - "symplify/easy-testing": "<10.3.3", - "symplify/monorepo-builder": "<10.3.3", - "symplify/neon-config-dumper": "<10.3.3", - "symplify/php-config-printer": "<10.3.3", - "symplify/phpstan-extensions": "<10.3.3", - "symplify/phpstan-rules": "<10.3.3", - "symplify/rule-doc-generator": "<10.3.3", - "symplify/rule-doc-generator-contracts": "<10.3.3", - "symplify/skipper": "<10.3.3", - "symplify/smart-file-system": "<10.3.3", - "symplify/symfony-static-dumper": "<10.3.3", - "symplify/symplify-kernel": "<10.3.3", - "symplify/vendor-patches": "<10.3.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symplify\\AutowireArrayParameter\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "description": "Autowire array parameters for your Symfony applications", - "support": { - "source": "https://github.com/symplify/autowire-array-parameter/tree/10.3.3" - }, - "funding": [ - { - "url": "https://www.paypal.me/rectorphp", - "type": "custom" - }, - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2022-06-13T14:05:31+00:00" + "time": "2023-01-01T08:38:09+00:00" }, { "name": "symplify/coding-standard", - "version": "10.3.3", + "version": "11.3.0", "source": { "type": "git", "url": "https://github.com/symplify/coding-standard.git", - "reference": "07e8a9f67dd74ede6038dc70750654449e80e9ab" + "reference": "96f6eda6790bbb93b3182a08afd2fde3790fa132" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/coding-standard/zipball/07e8a9f67dd74ede6038dc70750654449e80e9ab", - "reference": "07e8a9f67dd74ede6038dc70750654449e80e9ab", + "url": "https://api.github.com/repos/symplify/coding-standard/zipball/96f6eda6790bbb93b3182a08afd2fde3790fa132", + "reference": "96f6eda6790bbb93b3182a08afd2fde3790fa132", "shasum": "" }, "require": { - "friendsofphp/php-cs-fixer": "^3.8", + "friendsofphp/php-cs-fixer": "^3.13", "nette/utils": "^3.2", - "php": ">=8.0", - "symplify/autowire-array-parameter": "^10.3.3", - "symplify/package-builder": "^10.3.3", - "symplify/rule-doc-generator-contracts": "^10.3.3", - "symplify/symplify-kernel": "^10.3.3" - }, - "conflict": { - "symplify/astral": "<10.3.3", - "symplify/composer-json-manipulator": "<10.3.3", - "symplify/config-transformer": "<10.3.3", - "symplify/easy-ci": "<10.3.3", - "symplify/easy-coding-standard": "<10.3.3", - "symplify/easy-parallel": "<10.3.3", - "symplify/easy-testing": "<10.3.3", - "symplify/monorepo-builder": "<10.3.3", - "symplify/neon-config-dumper": "<10.3.3", - "symplify/php-config-printer": "<10.3.3", - "symplify/phpstan-extensions": "<10.3.3", - "symplify/phpstan-rules": "<10.3.3", - "symplify/rule-doc-generator": "<10.3.3", - "symplify/skipper": "<10.3.3", - "symplify/smart-file-system": "<10.3.3", - "symplify/symfony-static-dumper": "<10.3.3", - "symplify/vendor-patches": "<10.3.3" + "php": ">=8.1", + "symplify/rule-doc-generator-contracts": "^11.1" }, "require-dev": { "cweagans/composer-patches": "^1.7", - "doctrine/orm": "^2.10", - "nette/application": "^3.1", - "nette/bootstrap": "^3.1", - "phpunit/phpunit": "^9.5", - "symfony/framework-bundle": "^6.0", - "symplify/easy-coding-standard": "^10.3.3", - "symplify/rule-doc-generator": "^10.3.3", - "symplify/smart-file-system": "^10.3.3", - "symplify/symplify-kernel": "^10.3.3" + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5.26", + "rector/rector": "*", + "squizlabs/php_codesniffer": "^3.7.1", + "symfony/framework-bundle": "6.1.*", + "symplify/easy-ci": "^11.1", + "symplify/easy-coding-standard": "^11.1", + "symplify/phpstan-extensions": "^11.1", + "symplify/rule-doc-generator": "^11.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "10.4-dev" - }, "enable-patching": true, "patches": { "symfony/dependency-injection": [ @@ -6072,7 +5715,8 @@ "license": ["MIT"], "description": "Set of Symplify rules for PHP_CodeSniffer and PHP CS Fixer.", "support": { - "source": "https://github.com/symplify/coding-standard/tree/10.3.3" + "issues": "https://github.com/symplify/coding-standard/issues", + "source": "https://github.com/symplify/coding-standard/tree/11.3.0" }, "funding": [ { @@ -6084,97 +5728,20 @@ "type": "github" } ], - "time": "2022-06-13T14:05:35+00:00" - }, - { - "name": "symplify/composer-json-manipulator", - "version": "10.3.3", - "source": { - "type": "git", - "url": "https://github.com/symplify/composer-json-manipulator.git", - "reference": "84f716bd543d946921c4ef6d2197a9f2877c7691" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symplify/composer-json-manipulator/zipball/84f716bd543d946921c4ef6d2197a9f2877c7691", - "reference": "84f716bd543d946921c4ef6d2197a9f2877c7691", - "shasum": "" - }, - "require": { - "nette/utils": "^3.2", - "php": ">=8.0", - "symfony/config": "^6.0", - "symfony/dependency-injection": "^6.0", - "symfony/filesystem": "^6.0", - "symplify/package-builder": "^10.3.3", - "symplify/smart-file-system": "^10.3.3", - "symplify/symplify-kernel": "^10.3.3" - }, - "conflict": { - "symplify/astral": "<10.3.3", - "symplify/autowire-array-parameter": "<10.3.3", - "symplify/coding-standard": "<10.3.3", - "symplify/config-transformer": "<10.3.3", - "symplify/easy-ci": "<10.3.3", - "symplify/easy-coding-standard": "<10.3.3", - "symplify/easy-parallel": "<10.3.3", - "symplify/easy-testing": "<10.3.3", - "symplify/monorepo-builder": "<10.3.3", - "symplify/neon-config-dumper": "<10.3.3", - "symplify/php-config-printer": "<10.3.3", - "symplify/phpstan-extensions": "<10.3.3", - "symplify/phpstan-rules": "<10.3.3", - "symplify/rule-doc-generator": "<10.3.3", - "symplify/rule-doc-generator-contracts": "<10.3.3", - "symplify/skipper": "<10.3.3", - "symplify/symfony-static-dumper": "<10.3.3", - "symplify/symplify-kernel": "<9.4.70", - "symplify/vendor-patches": "<10.3.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-main": "10.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symplify\\ComposerJsonManipulator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "description": "Package to load, merge and save composer.json file(s)", - "support": { - "source": "https://github.com/symplify/composer-json-manipulator/tree/10.3.3" - }, - "funding": [ - { - "url": "https://www.paypal.me/rectorphp", - "type": "custom" - }, - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2022-06-13T14:06:01+00:00" + "time": "2023-01-30T16:13:00+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "10.3.3", + "version": "11.2.9", "source": { "type": "git", - "url": "https://github.com/symplify/easy-coding-standard.git", - "reference": "c93878b3c052321231519b6540e227380f90be17" + "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", + "reference": "947267668efb055bf78c7b68416cb206285f21d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/easy-coding-standard/zipball/c93878b3c052321231519b6540e227380f90be17", - "reference": "c93878b3c052321231519b6540e227380f90be17", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/947267668efb055bf78c7b68416cb206285f21d4", + "reference": "947267668efb055bf78c7b68416cb206285f21d4", "shasum": "" }, "require": { @@ -6186,19 +5753,15 @@ }, "bin": ["bin/ecs"], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.3-dev" - } - }, "autoload": { "files": ["bootstrap.php"] }, "notification-url": "https://packagist.org/downloads/", "license": ["MIT"], - "description": "Prefixed scoped version of ECS package", + "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer", "support": { - "source": "https://github.com/symplify/easy-coding-standard/tree/10.3.3" + "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/11.2.9" }, "funding": [ { @@ -6210,208 +5773,41 @@ "type": "github" } ], - "time": "2022-06-13T14:03:37+00:00" - }, - { - "name": "symplify/easy-testing", - "version": "10.3.3", - "source": { - "type": "git", - "url": "https://github.com/symplify/easy-testing.git", - "reference": "d4a78c8d55282143754d9be0d9577865394c073c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symplify/easy-testing/zipball/d4a78c8d55282143754d9be0d9577865394c073c", - "reference": "d4a78c8d55282143754d9be0d9577865394c073c", - "shasum": "" - }, - "require": { - "nette/utils": "^3.2", - "php": ">=8.0", - "symfony/console": "^6.0", - "symfony/dependency-injection": "^6.0", - "symfony/finder": "^6.0", - "symplify/package-builder": "^10.3.3", - "symplify/smart-file-system": "^10.3.3", - "symplify/symplify-kernel": "^10.3.3" - }, - "conflict": { - "symplify/astral": "<10.3.3", - "symplify/autowire-array-parameter": "<10.3.3", - "symplify/coding-standard": "<10.3.3", - "symplify/composer-json-manipulator": "<10.3.3", - "symplify/config-transformer": "<10.3.3", - "symplify/easy-ci": "<10.3.3", - "symplify/easy-coding-standard": "<10.3.3", - "symplify/easy-parallel": "<10.3.3", - "symplify/monorepo-builder": "<10.3.3", - "symplify/neon-config-dumper": "<10.3.3", - "symplify/php-config-printer": "<10.3.3", - "symplify/phpstan-extensions": "<10.3.3", - "symplify/phpstan-rules": "<10.3.3", - "symplify/rule-doc-generator": "<10.3.3", - "symplify/rule-doc-generator-contracts": "<10.3.3", - "symplify/skipper": "<10.3.3", - "symplify/symfony-static-dumper": "<10.3.3", - "symplify/vendor-patches": "<10.3.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "bin": ["bin/easy-testing"], - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-main": "10.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symplify\\EasyTesting\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "description": "Testing made easy", - "support": { - "source": "https://github.com/symplify/easy-testing/tree/10.3.3" - }, - "funding": [ - { - "url": "https://www.paypal.me/rectorphp", - "type": "custom" - }, - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2022-06-13T14:05:39+00:00" - }, - { - "name": "symplify/package-builder", - "version": "10.3.3", - "source": { - "type": "git", - "url": "https://github.com/symplify/package-builder.git", - "reference": "bc785e064429f2341d035cc88cc954a56f220040" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symplify/package-builder/zipball/bc785e064429f2341d035cc88cc954a56f220040", - "reference": "bc785e064429f2341d035cc88cc954a56f220040", - "shasum": "" - }, - "require": { - "nette/utils": "^3.2", - "php": ">=8.0", - "sebastian/diff": "^4.0", - "symfony/config": "^6.0", - "symfony/console": "^6.0", - "symfony/dependency-injection": "^6.0", - "symfony/finder": "^6.0", - "symplify/easy-testing": "^10.3.3", - "symplify/symplify-kernel": "^10.3.3" - }, - "conflict": { - "symplify/astral": "<10.3.3", - "symplify/autowire-array-parameter": "<10.3.3", - "symplify/coding-standard": "<10.3.3", - "symplify/composer-json-manipulator": "<10.3.3", - "symplify/config-transformer": "<10.3.3", - "symplify/easy-ci": "<10.3.3", - "symplify/easy-coding-standard": "<10.3.3", - "symplify/easy-parallel": "<10.3.3", - "symplify/monorepo-builder": "<10.3.3", - "symplify/neon-config-dumper": "<10.3.3", - "symplify/php-config-printer": "<10.3.3", - "symplify/phpstan-extensions": "<10.3.3", - "symplify/phpstan-rules": "<10.3.3", - "symplify/rule-doc-generator": "<10.3.3", - "symplify/rule-doc-generator-contracts": "<10.3.3", - "symplify/skipper": "<10.3.3", - "symplify/smart-file-system": "<10.3.3", - "symplify/symfony-static-dumper": "<10.3.3", - "symplify/vendor-patches": "<10.3.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symplify\\PackageBuilder\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "description": "Dependency Injection, Console and Kernel toolkit for Symplify packages.", - "support": { - "source": "https://github.com/symplify/package-builder/tree/10.3.3" - }, - "funding": [ - { - "url": "https://www.paypal.me/rectorphp", - "type": "custom" - }, - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2022-06-13T14:05:45+00:00" + "time": "2023-02-21T11:31:15+00:00" }, { "name": "symplify/rule-doc-generator-contracts", - "version": "10.3.3", + "version": "11.1.26", "source": { "type": "git", "url": "https://github.com/symplify/rule-doc-generator-contracts.git", - "reference": "6c5f2661fdd9a290d455b31aa3619c80702119cd" + "reference": "3e66b3fec678b74a076395ec629d535fb95293b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/rule-doc-generator-contracts/zipball/6c5f2661fdd9a290d455b31aa3619c80702119cd", - "reference": "6c5f2661fdd9a290d455b31aa3619c80702119cd", + "url": "https://api.github.com/repos/symplify/rule-doc-generator-contracts/zipball/3e66b3fec678b74a076395ec629d535fb95293b5", + "reference": "3e66b3fec678b74a076395ec629d535fb95293b5", "shasum": "" }, "require": { "nette/utils": "^3.2", - "php": ">=8.0" + "php": ">=8.1" }, - "conflict": { - "symplify/astral": "<10.3.3", - "symplify/autowire-array-parameter": "<10.3.3", - "symplify/coding-standard": "<10.3.3", - "symplify/composer-json-manipulator": "<10.3.3", - "symplify/config-transformer": "<10.3.3", - "symplify/easy-ci": "<10.3.3", - "symplify/easy-coding-standard": "<10.3.3", - "symplify/easy-parallel": "<10.3.3", - "symplify/easy-testing": "<10.3.3", - "symplify/monorepo-builder": "<10.3.3", - "symplify/neon-config-dumper": "<10.3.3", - "symplify/package-builder": "<10.3.3", - "symplify/php-config-printer": "<10.3.3", - "symplify/phpstan-extensions": "<10.3.3", - "symplify/phpstan-rules": "<10.3.3", - "symplify/rule-doc-generator": "<10.3.3", - "symplify/skipper": "<10.3.3", - "symplify/smart-file-system": "<10.3.3", - "symplify/symfony-static-dumper": "<10.3.3", - "symplify/symplify-kernel": "<10.3.3", - "symplify/vendor-patches": "<10.3.3" + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.2", + "rector/rector": "^0.15.10", + "symplify/easy-ci": "^11.1", + "symplify/easy-coding-standard": "^11.1", + "symplify/easy-testing": "^11.1", + "symplify/phpstan-extensions": "^11.1", + "symplify/phpstan-rules": "11.2.3.72", + "tomasvotruba/unused-public": "^0.0.34" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "10.4-dev" + "dev-main": "11.2-dev" } }, "autoload": { @@ -6423,7 +5819,7 @@ "license": ["MIT"], "description": "Contracts for production code of RuleDocGenerator", "support": { - "source": "https://github.com/symplify/rule-doc-generator-contracts/tree/10.3.3" + "source": "https://github.com/symplify/rule-doc-generator-contracts/tree/11.1.26" }, "funding": [ { @@ -6435,148 +5831,7 @@ "type": "github" } ], - "time": "2022-06-13T14:03:35+00:00" - }, - { - "name": "symplify/smart-file-system", - "version": "10.3.3", - "source": { - "type": "git", - "url": "https://github.com/symplify/smart-file-system.git", - "reference": "0b465fcf7490ac89708510551a044961b9124493" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symplify/smart-file-system/zipball/0b465fcf7490ac89708510551a044961b9124493", - "reference": "0b465fcf7490ac89708510551a044961b9124493", - "shasum": "" - }, - "require": { - "nette/utils": "^3.2", - "php": ">=8.0", - "symfony/filesystem": "^6.0", - "symfony/finder": "^6.0" - }, - "conflict": { - "symplify/astral": "<10.3.3", - "symplify/autowire-array-parameter": "<10.3.3", - "symplify/coding-standard": "<10.3.3", - "symplify/composer-json-manipulator": "<10.3.3", - "symplify/config-transformer": "<10.3.3", - "symplify/easy-ci": "<10.3.3", - "symplify/easy-coding-standard": "<10.3.3", - "symplify/easy-parallel": "<10.3.3", - "symplify/easy-testing": "<10.3.3", - "symplify/monorepo-builder": "<10.3.3", - "symplify/neon-config-dumper": "<10.3.3", - "symplify/package-builder": "<10.3.3", - "symplify/php-config-printer": "<10.3.3", - "symplify/phpstan-extensions": "<10.3.3", - "symplify/phpstan-rules": "<10.3.3", - "symplify/rule-doc-generator": "<10.3.3", - "symplify/rule-doc-generator-contracts": "<10.3.3", - "symplify/skipper": "<10.3.3", - "symplify/symfony-static-dumper": "<10.3.3", - "symplify/symplify-kernel": "<10.3.3", - "symplify/vendor-patches": "<10.3.3" - }, - "require-dev": { - "nette/finder": "^2.5", - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symplify\\SmartFileSystem\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "description": "Sanitized FileInfo with safe getRealPath() and other handy methods", - "support": { - "source": "https://github.com/symplify/smart-file-system/tree/10.3.3" - }, - "funding": [ - { - "url": "https://www.paypal.me/rectorphp", - "type": "custom" - }, - { - "url": "https://github.com/tomasvotruba", - "type": "github" - } - ], - "time": "2022-06-13T14:03:57+00:00" - }, - { - "name": "symplify/symplify-kernel", - "version": "10.3.3", - "source": { - "type": "git", - "url": "https://github.com/symplify/symplify-kernel.git", - "reference": "951838b8c4cee31c347a132755428c39437585c8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symplify/symplify-kernel/zipball/951838b8c4cee31c347a132755428c39437585c8", - "reference": "951838b8c4cee31c347a132755428c39437585c8", - "shasum": "" - }, - "require": { - "php": ">=8.0", - "symfony/console": "^6.0", - "symfony/dependency-injection": "^6.0", - "symplify/autowire-array-parameter": "^10.3.3", - "symplify/composer-json-manipulator": "^10.3.3", - "symplify/package-builder": "^10.3.3", - "symplify/smart-file-system": "^10.3.3", - "webmozart/assert": "^1.10" - }, - "conflict": { - "symplify/astral": "<10.3.3", - "symplify/coding-standard": "<10.3.3", - "symplify/config-transformer": "<10.3.3", - "symplify/easy-ci": "<10.3.3", - "symplify/easy-coding-standard": "<10.3.3", - "symplify/easy-parallel": "<10.3.3", - "symplify/easy-testing": "<10.3.3", - "symplify/monorepo-builder": "<10.3.3", - "symplify/neon-config-dumper": "<10.3.3", - "symplify/php-config-printer": "<10.3.3", - "symplify/phpstan-extensions": "<10.3.3", - "symplify/phpstan-rules": "<10.3.3", - "symplify/rule-doc-generator": "<10.3.3", - "symplify/rule-doc-generator-contracts": "<10.3.3", - "symplify/skipper": "<10.3.3", - "symplify/symfony-static-dumper": "<10.3.3", - "symplify/vendor-patches": "<10.3.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symplify\\SymplifyKernel\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "description": "Internal Kernel for Symplify packages", - "support": { - "source": "https://github.com/symplify/symplify-kernel/tree/10.3.3" - }, - "time": "2022-06-13T14:06:24+00:00" + "time": "2023-02-07T07:16:13+00:00" }, { "name": "theseer/tokenizer", @@ -6623,64 +5878,12 @@ } ], "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": ["assert", "check", "validate"], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": { - "james-heinrich/getid3": 20, + "james-heinrich/getid3": 10, "michalsn/codeigniter4-uuid": 20, "codeigniter4/shield": 10 }, diff --git a/docker/ci/Dockerfile b/docker/ci/Dockerfile new file mode 100644 index 00000000..09475553 --- /dev/null +++ b/docker/ci/Dockerfile @@ -0,0 +1,34 @@ +#################################################### +# Castopod CI/CD docker file +#################################################### +# ⚠️ NOT optimized for production +# should be used only for continuous integration +#--------------------------------------------------- +FROM php:8.1-fpm-alpine3.17 + +LABEL maintainer="Yassine Doghri " + +RUN \ + # install composer + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer \ + # install ci requirements + && apk add --no-cache \ + nodejs \ + git \ + unzip \ + wget \ + jq \ + zip \ + rsync \ + mysql \ + mysql-client \ + && docker-php-ext-install \ + mysqli \ + # install pnpm + && wget -qO- https://get.pnpm.io/install.sh | ENV="~/.shrc" SHELL="$(which sh)" sh - \ + && mv ~/.local/share/pnpm/pnpm /usr/bin/pnpm \ + && rm -rf ~/.local \ + # set pnpm store directory + && pnpm config set store-dir .pnpm-store \ + # set composer cache directory + && composer config -g cache-dir .composer-cache diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index 824074a9..7cc0ddca 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -15,20 +15,12 @@ WORKDIR /castopod COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # Install server requirements -RUN apt-get update \ - # gnupg to sign commits with gpg - && apt-get install --yes --no-install-recommends gnupg \ - # npm through the nodejs package - && curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \ +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \ && apt-get update \ && apt-get install --yes --no-install-recommends nodejs \ - # update npm - && npm install --global npm@8 \ - && apt-get update \ - && apt-get install --yes --no-install-recommends \ - git \ + # gnupg to sign commits with gpg + gnupg \ openssh-client \ - vim \ # cron for scheduled tasks cron \ # unzip used by composer diff --git a/docker/production/app/Dockerfile b/docker/production/app/Dockerfile index 2fc667d8..47117b94 100644 --- a/docker/production/app/Dockerfile +++ b/docker/production/app/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/php:8.1-fpm-alpine3.16 +FROM docker.io/php:8.1-fpm-alpine3.17 COPY docker/production/app/entrypoint.sh /entrypoint.sh diff --git a/docs/src/sv/contributing/setup-development.md b/docs/src/sv/contributing/setup-development.md index 6aafb50b..1970e01e 100644 --- a/docs/src/sv/contributing/setup-development.md +++ b/docs/src/sv/contributing/setup-development.md @@ -34,7 +34,7 @@ to help you kickstart your contribution. ```ini CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server + # If set to development, you must run `pnpm run dev` to start the static assets server vite.environment="development" # By default, this is set to true in the app config. @@ -90,7 +90,7 @@ required services will be loaded automagically! 🪄 ```bash # run Vite dev server - npm run dev + pnpm run dev ``` If there is any issue with the php server not running, you can restart them @@ -113,8 +113,8 @@ required services will be loaded automagically! 🪄 # Composer is installed composer -V - # npm is installed - npm -v + # pnpm is installed + pnpm -v # git is installed git version @@ -181,8 +181,8 @@ You do not wish to use the VSCode devcontainer? No problem! # use Composer docker-compose run --rm app composer -V - # use npm - docker-compose run --rm app npm -v + # use pnpm + docker-compose run --rm app pnpm -v # use git docker-compose run --rm app git version @@ -210,18 +210,19 @@ You do not wish to use the VSCode devcontainer? No problem! ::: -2. Install javascript dependencies with [npm](https://www.npmjs.com/) +2. Install javascript dependencies with [pnpm](https://pnpm.io/) ```bash - npm install + pnpm install ``` ::: info Note - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). + The javascript dependencies aren't included in the repository. pnPM will + check the `package.json` and `pnpm-lock.yaml` files to download the packages + with the right versions. The dependencies will live under the `node_module` + folder. For more info, check out the + [pnPM documentation](https://pnpm.io/motivation). ::: @@ -229,11 +230,11 @@ You do not wish to use the VSCode devcontainer? No problem! ```bash # build all static assets at once - npm run build:static + pnpm run build:static # build specific assets - npm run build:icons - npm run build:svg + pnpm run build:icons + pnpm run build:svg ``` ::: info Note @@ -372,10 +373,10 @@ more insights. ### Allocation failed - JavaScript heap out of memory -This happens when running `npm install`. +This happens when running `pnpm install`. 👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. +and run `pnpm install` again. ### (Linux) Files created inside container are attributed to root locally diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index e472ca9e..00000000 --- a/package-lock.json +++ /dev/null @@ -1,28902 +0,0 @@ -{ - "name": "castopod-host", - "version": "1.1.2", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "castopod-host", - "version": "1.1.2", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@amcharts/amcharts4": "^4.10.29", - "@amcharts/amcharts4-geodata": "^4.1.23", - "@codemirror/commands": "^6.1.2", - "@codemirror/lang-xml": "^6.0.0", - "@codemirror/language": "^6.2.1", - "@codemirror/state": "^6.1.2", - "@floating-ui/dom": "^1.0.2", - "@github/clipboard-copy-element": "^1.1.2", - "@github/hotkey": "^2.0.1", - "@github/markdown-toolbar-element": "^2.1.1", - "@github/time-elements": "^3.1.4", - "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e", - "@vime/core": "^5.3.3", - "choices.js": "^10.1.0", - "codemirror": "^6.0.1", - "flatpickr": "^4.6.13", - "leaflet": "^1.9.2", - "leaflet.markercluster": "^1.5.3", - "lit": "^2.4.0", - "marked": "^4.1.1", - "wavesurfer.js": "^6.3.0", - "xml-formatter": "^2.6.1" - }, - "devDependencies": { - "@commitlint/cli": "^17.1.2", - "@commitlint/config-conventional": "^17.1.0", - "@semantic-release/changelog": "^6.0.1", - "@semantic-release/exec": "^6.0.3", - "@semantic-release/git": "^10.0.1", - "@semantic-release/gitlab": "^9.4.2", - "@tailwindcss/forms": "^0.5.3", - "@tailwindcss/line-clamp": "^0.4.2", - "@tailwindcss/typography": "^0.5.7", - "@types/leaflet": "^1.9.0", - "@types/marked": "^4.0.7", - "@types/wavesurfer.js": "^6.0.3", - "@typescript-eslint/eslint-plugin": "^5.40.0", - "@typescript-eslint/parser": "^5.40.0", - "all-contributors-cli": "^6.24.0", - "cross-env": "^7.0.3", - "cssnano": "^5.1.13", - "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.25.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "husky": "^8.0.1", - "is-ci": "^3.0.1", - "lint-staged": "^13.0.3", - "postcss-import": "^15.0.0", - "postcss-nesting": "^10.2.0", - "postcss-preset-env": "^7.8.2", - "postcss-reporter": "^7.0.5", - "prettier": "2.7.1", - "prettier-plugin-organize-imports": "^3.1.1", - "semantic-release": "^19.0.5", - "stylelint": "^14.14.0", - "stylelint-config-standard": "^29.0.0", - "svgo": "^2.8.0", - "tailwindcss": "^3.1.8", - "typescript": "^4.8.4", - "vite": "2.8.6", - "vite-plugin-pwa": "^0.12.8", - "workbox-build": "^6.5.4", - "workbox-core": "^6.5.4", - "workbox-routing": "^6.5.4", - "workbox-strategies": "^6.5.4" - } - }, - "node_modules/@amcharts/amcharts4": { - "version": "4.10.29", - "resolved": "https://registry.npmjs.org/@amcharts/amcharts4/-/amcharts4-4.10.29.tgz", - "integrity": "sha512-uDCvm4V0Xs2jtI0Aa7XFH0jqoyEGx9I2ukFEwaaQzYq11vwowhJsgE3sSv2jsfKETYUvPXb32NbzrXZulE2ESg==", - "dependencies": { - "@babel/runtime": "^7.6.3", - "core-js": "^3.0.0", - "d3-force": "^3.0.0", - "d3-geo": "^3.0.1", - "d3-geo-projection": "^4.0.0", - "d3-selection": "^3.0.0", - "d3-transition": "^3.0.1", - "pdfmake": "^0.2.2", - "polylabel": "^1.0.2", - "raf": "^3.4.1", - "regression": "^2.0.1", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "tslib": "^2.0.1", - "xlsx": "^0.17.0" - } - }, - "node_modules/@amcharts/amcharts4-geodata": { - "version": "4.1.23", - "resolved": "https://registry.npmjs.org/@amcharts/amcharts4-geodata/-/amcharts4-geodata-4.1.23.tgz", - "integrity": "sha512-/hFqTuc2SUB0tAgygc8yj1xvTUdddltI7/15fAT9L5XHGERgF8qAa+AisQQ0UMITvrWIr5awJupWE3vDTlWsjQ==" - }, - "node_modules/@amcharts/amcharts4/node_modules/tslib": { - "version": "2.1.0", - "license": "0BSD" - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", - "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", - "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.1.2.tgz", - "integrity": "sha512-sO3jdX1s0pam6lIdeSJLMN3DQ6mPEbM4yLvyKkdqtmd/UDwhXA5+AwFJ89rRXm6vTeOXBsE5cAmlos/t7MJdgg==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-xml": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.0.0.tgz", - "integrity": "sha512-M/HLWxIiP956xGjtrxkeHkCmDGVQGKu782x8pOH5CLJIMkWtiB1DWfDoDHqpFjdEE9dkfcqPWvYfVi6GbhuXEg==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/xml": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-xml/node_modules/@codemirror/autocomplete": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.0.2.tgz", - "integrity": "sha512-9PDjnllmXan/7Uax87KGORbxerDJ/cu10SB+n4Jz0zXMEvIh3+TGgZxhIvDOtaQ4jDBQEM7kHYW4vLdQB0DGZQ==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - }, - "peerDependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.2.1.tgz", - "integrity": "sha512-MC3svxuvIj0MRpFlGHxLS6vPyIdbTr2KKPEW46kCoCXw2ktb4NTkpkPBI/lSP/FoNXLCBJ0mrnUi1OoZxtpW1Q==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/state": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.2.tgz", - "integrity": "sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==" - }, - "node_modules/@codemirror/view": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.0.2.tgz", - "integrity": "sha512-mnVT/q1JvKPjpmjXJNeCi/xHyaJ3abGJsumIVpdQ1nE1MXAyHf7GHWt8QpWMUvDiqF0j+inkhVR2OviTdFFX7Q==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@commitlint/cli": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.1.2.tgz", - "integrity": "sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==", - "dev": true, - "dependencies": { - "@commitlint/format": "^17.0.0", - "@commitlint/lint": "^17.1.0", - "@commitlint/load": "^17.1.2", - "@commitlint/read": "^17.1.0", - "@commitlint/types": "^17.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/cli/node_modules/yargs": { - "version": "17.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "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.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@commitlint/cli/node_modules/yargs-parser": { - "version": "21.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.1.0.tgz", - "integrity": "sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==", - "dev": true, - "dependencies": { - "conventional-changelog-conventionalcommits": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz", - "integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/ensure": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", - "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", - "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/format": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", - "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/is-ignored": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.1.0.tgz", - "integrity": "sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "semver": "7.3.7" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/is-ignored/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/lint": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.1.0.tgz", - "integrity": "sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==", - "dev": true, - "dependencies": { - "@commitlint/is-ignored": "^17.1.0", - "@commitlint/parse": "^17.0.0", - "@commitlint/rules": "^17.0.0", - "@commitlint/types": "^17.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.1.2.tgz", - "integrity": "sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^17.1.0", - "@commitlint/execute-rule": "^17.0.0", - "@commitlint/resolve-extends": "^17.1.0", - "@commitlint/types": "^17.0.0", - "@types/node": "^14.0.0", - "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/load/node_modules/@types/node": { - "version": "14.18.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.26.tgz", - "integrity": "sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA==", - "dev": true - }, - "node_modules/@commitlint/message": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz", - "integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/parse": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz", - "integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==", - "dev": true, - "dependencies": { - "@commitlint/types": "^17.0.0", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/read": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.1.0.tgz", - "integrity": "sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==", - "dev": true, - "dependencies": { - "@commitlint/top-level": "^17.0.0", - "@commitlint/types": "^17.0.0", - "fs-extra": "^10.0.0", - "git-raw-commits": "^2.0.0", - "minimist": "^1.2.6" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/read/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@commitlint/read/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz", - "integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==", - "dev": true, - "dependencies": { - "@commitlint/config-validator": "^17.1.0", - "@commitlint/types": "^17.0.0", - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/rules": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz", - "integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==", - "dev": true, - "dependencies": { - "@commitlint/ensure": "^17.0.0", - "@commitlint/message": "^17.0.0", - "@commitlint/to-lines": "^17.0.0", - "@commitlint/types": "^17.0.0", - "execa": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", - "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", - "dev": true, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/top-level": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", - "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/top-level/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/top-level/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@commitlint/types": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", - "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@floating-ui/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.0.1.tgz", - "integrity": "sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA==" - }, - "node_modules/@floating-ui/dom": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.0.2.tgz", - "integrity": "sha512-5X9WSvZ8/fjy3gDu8yx9HAA4KG1lazUN2P4/VnaXLxTO9Dz53HI1oYoh1OlhqFNlHgGDiwFX5WhFCc2ljbW3yA==", - "dependencies": { - "@floating-ui/core": "^1.0.1" - } - }, - "node_modules/@foliojs-fork/fontkit": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "@foliojs-fork/restructure": "^2.0.2", - "brfs": "^2.0.0", - "brotli": "^1.2.0", - "browserify-optional": "^1.0.1", - "clone": "^1.0.4", - "deep-equal": "^1.0.0", - "dfa": "^1.2.0", - "tiny-inflate": "^1.0.2", - "unicode-properties": "^1.2.2", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/@foliojs-fork/linebreak": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "base64-js": "1.3.1", - "brfs": "^2.0.2", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/@foliojs-fork/pdfkit": { - "version": "0.12.3", - "license": "MIT", - "dependencies": { - "@foliojs-fork/fontkit": "^1.9.1", - "@foliojs-fork/linebreak": "^1.1.1", - "crypto-js": "^4.0.0", - "png-js": "^1.0.0" - } - }, - "node_modules/@foliojs-fork/restructure": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/@github/clipboard-copy-element": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/@github/hotkey": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@github/hotkey/-/hotkey-2.0.1.tgz", - "integrity": "sha512-qKXjAJjtheJbf4ie3hi8IwrHWJZHB5qdojR6JGo6jvQNPpsdUbk/NIdU8sxu4PW41CjW80vfciDMu3MAP3j2Fg==" - }, - "node_modules/@github/markdown-toolbar-element": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@github/markdown-toolbar-element/-/markdown-toolbar-element-2.1.1.tgz", - "integrity": "sha512-J++rpd5H9baztabJQB82h26jtueOeBRSTqetk9Cri+Lj/s28ndu6Tovn0uHQaOKtBWDobFunk9b5pP5vcqt7cA==" - }, - "node_modules/@github/time-elements": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@github/time-elements/-/time-elements-3.1.4.tgz", - "integrity": "sha512-DTe/w0uKVeciKzGtYadNdfS8D86pXdGF+OrKg+vi8PKlotJ45zAc26zNpmmfCcMblBBg2+uoi3OxmUm7am/0sg==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@lezer/common": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.0.tgz", - "integrity": "sha512-ohydQe+Hb+w4oMDvXzs8uuJd2NoA3D8YDcLiuDsLqH+yflDTPEpgCsWI3/6rH5C3BAedtH1/R51dxENldQceEA==" - }, - "node_modules/@lezer/highlight": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.0.0.tgz", - "integrity": "sha512-nsCnNtim90UKsB5YxoX65v3GEIw3iCHw9RM2DtdgkiqAbKh9pCdvi8AWNwkYf10Lu6fxNhXPpkpHbW6mihhvJA==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.1.0.tgz", - "integrity": "sha512-Iad04uVwk1PvSnj25mqj7zEEIRAsasbsTRmVzI0AUTs/+1Dz1//iYAaoLr7A+Xa7bZDfql5MKTxZmSlkYZD3Dg==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/xml": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.0.tgz", - "integrity": "sha512-73iI9UK8iqSvWtLlOEl/g+50ivwQn8Ge6foHVN66AXUS1RccFnAoc7BYU8b3c8/rP6dfCOGqAGaWLxBzhj60MA==", - "dependencies": { - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lit/reactive-element": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.4.1.tgz", - "integrity": "sha512-qDv4851VFSaBWzpS02cXHclo40jsbAjRXnebNXpm0uVg32kCneZPo9RYVQtrTNICtZ+1wAYHu1ZtxWSWMbKrBw==" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/core": { - "version": "3.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "11.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.17.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.34.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.13.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.34.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "5.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest": { - "version": "18.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "node_modules/@octokit/types": { - "version": "6.34.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^11.2.0" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@semantic-release/changelog": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^9.0.0", - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/commit-analyzer/node_modules/import-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/exec": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "parse-json": "^5.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/exec/node_modules/parse-json": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/git": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/github": { - "version": "8.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/rest": "^18.0.0", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@semantic-release/github/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@semantic-release/github/node_modules/fs-extra": { - "version": "10.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/github/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@semantic-release/github/node_modules/universalify": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@semantic-release/gitlab": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-9.4.2.tgz", - "integrity": "sha512-ZfMe4N613C/tqfRdxDPprOoBA7HHyHFHvk+TA4HqOmNpgUKiifyJPpYJsc3PLNtec9I0TA1OOTuY82VDG+FVXw==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "escape-string-regexp": "^3.0.0", - "form-data": "^4.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.0", - "got": "^11.0.0", - "hpagent": "^1.0.0", - "lodash": "^4.17.11", - "parse-url": "^8.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/gitlab/node_modules/escape-string-regexp": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/gitlab/node_modules/form-data": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@semantic-release/gitlab/node_modules/fs-extra": { - "version": "10.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/gitlab/node_modules/universalify": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@semantic-release/npm": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.0.tgz", - "integrity": "sha512-hj2jqayS2SPUmFtCMCOQMX975uMDfRoymj1HvMSwYdaoI6hVZvhrTFPBgJeM85O0C+G3IFviAUar5gel/1VGDQ==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^10.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^4.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" - }, - "engines": { - "node": ">=16 || ^14.17" - }, - "peerDependencies": { - "semantic-release": ">=19.0.0" - } - }, - "node_modules/@semantic-release/npm/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/npm/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@semantic-release/npm/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/release-notes-generator/node_modules/import-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@stencil/core": { - "version": "2.5.2", - "license": "MIT", - "bin": { - "stencil": "bin/stencil" - }, - "engines": { - "node": ">=12.10.0", - "npm": ">=6.0.0" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dev": true, - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", - "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", - "dev": true, - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" - } - }, - "node_modules/@tailwindcss/line-clamp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.4.2.tgz", - "integrity": "sha512-HFzAQuqYCjyy/SX9sLGB1lroPzmcnWv1FHkIpmypte10hptf4oPUfucryMKovZh2u0uiS9U5Ty3GghWfEJGwVw==", - "dev": true, - "peerDependencies": { - "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" - } - }, - "node_modules/@tailwindcss/nesting": { - "version": "0.0.0-insiders.565cd3e", - "resolved": "https://registry.npmjs.org/@tailwindcss/nesting/-/nesting-0.0.0-insiders.565cd3e.tgz", - "integrity": "sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==", - "dependencies": { - "postcss-nested": "^5.0.5" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.7.tgz", - "integrity": "sha512-JTTSTrgZfp6Ki4svhPA4mkd9nmQ/j9EfE7SbHJ1cLtthKkpW2OxsFXzSmxbhYbEkfNIyAyhle5p4SYyKRbz/jg==", - "dev": true, - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-epMsEE85fi4lfmJUH/89/iV/LI+F5CvNIvmgs5g5jYFPfhO2S/ae8WSsLOKWdwtoaZw9Q2IhJ4tQ5tFCcS/4HA==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@types/fscreen": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/@types/geojson": { - "version": "7946.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/leaflet": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.0.tgz", - "integrity": "sha512-7LeOSj7EloC5UcyOMo+1kc3S1UT3MjJxwqsMT1d2PTyvQz53w0Y0oSSk9nwZnOZubCmBvpSNGceucxiq+ZPEUw==", - "dev": true, - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/marked": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", - "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "17.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/@types/wavesurfer.js": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/wavesurfer.js/-/wavesurfer.js-6.0.3.tgz", - "integrity": "sha512-5Sb5s3pEkOmDosaaP1DWp1Unnx8HhVorm5608TIVdT5jCMvJ6eqM19UD8n7DEbJ7rzreS9RqHmzR8TlcdQBvbA==", - "dev": true, - "dependencies": { - "@types/debounce": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.0.tgz", - "integrity": "sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/type-utils": "5.40.0", - "@typescript-eslint/utils": "5.40.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.0.tgz", - "integrity": "sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.0.tgz", - "integrity": "sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.0.tgz", - "integrity": "sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.40.0", - "@typescript-eslint/utils": "5.40.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.0.tgz", - "integrity": "sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.0.tgz", - "integrity": "sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.0.tgz", - "integrity": "sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.0.tgz", - "integrity": "sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.40.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vime/core": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@vime/core/-/core-5.3.3.tgz", - "integrity": "sha512-bGn6bwiOwI/0d+P+gLH9U3ySK4tar6Qiv7g+RR+c7iuCsl0S16/wP1G677PiglJTvM3wuo2wD3hztMEkiWfvhw==", - "dependencies": { - "@stencil/core": "2.5.2", - "@types/fscreen": "^1.0.1", - "fscreen": "^1.2.0", - "mitt": "^3.0.0", - "stencil-wormhole": "^3.4.1" - } - }, - "node_modules/abab": { - "version": "2.0.5", - "license": "BSD-3-Clause" - }, - "node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "license": "Apache-2.0", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adler-32": { - "version": "1.2.0", - "license": "Apache-2.0", - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "adler32": "bin/adler32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/all-contributors-cli": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.24.0.tgz", - "integrity": "sha512-7oSKr2PnqxsOotuSwciltcFTS1eVRdjR0cn99hbElfff7gRQBShVhsf/XBprY41sLcgqTk0l0MKgKv6QNgZdMg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.6", - "async": "^3.1.0", - "chalk": "^4.0.0", - "didyoumean": "^1.2.1", - "inquirer": "^7.3.3", - "json-fixer": "^1.6.8", - "lodash": "^4.11.2", - "node-fetch": "^2.6.0", - "pify": "^5.0.0", - "yargs": "^15.0.1" - }, - "bin": { - "all-contributors": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/all-contributors-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/all-contributors-cli/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/all-contributors-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/all-contributors-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/all-contributors-cli/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/all-contributors-cli/node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/all-contributors-cli/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/all-contributors-cli/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/all-contributors-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/all-contributors-cli/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/all-contributors-cli/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "license": "BSD-3-Clause OR MIT", - "optional": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/array-from": { - "version": "2.1.1", - "license": "MIT" - }, - "node_modules/array-ify": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-transform": { - "version": "0.0.0", - "license": "MIT", - "dependencies": { - "escodegen": "~1.2.0", - "esprima": "~1.0.4", - "through": "~2.3.4" - } - }, - "node_modules/ast-transform/node_modules/esprima": { - "version": "1.0.4", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ast-types": { - "version": "0.7.8", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "license": "MIT", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/core-js": { - "version": "2.6.12", - "hasInstallScript": true, - "license": "MIT" - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.3.1", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "2.2.2", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brfs": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^3.0.2", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/brotli": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "base64-js": "^1.1.2" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "license": "BSD-2-Clause" - }, - "node_modules/browser-resolve": { - "version": "1.11.3", - "license": "MIT", - "dependencies": { - "resolve": "1.1.7" - } - }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", - "license": "MIT" - }, - "node_modules/browserify-optional": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "ast-transform": "0.0.0", - "ast-types": "^0.7.0", - "browser-resolve": "^1.8.1" - } - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001412", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001412.tgz", - "integrity": "sha512-+TeEIee1gS5bYOiuf+PS/kp2mrXic37Hl66VY6EAfxasIk5fELTktK2oOezYed12H8w7jt3s512PpulQidPjwA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "dev": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/cfb": { - "version": "1.2.1", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0", - "printj": "~1.3.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cfb/node_modules/adler-32": { - "version": "1.3.0", - "license": "Apache-2.0", - "dependencies": { - "printj": "~1.2.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cfb/node_modules/adler-32/node_modules/printj": { - "version": "1.2.3", - "license": "Apache-2.0", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cfb/node_modules/printj": { - "version": "1.3.0", - "license": "Apache-2.0", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "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/ansi-styles": { - "version": "4.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/choices.js": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/choices.js/-/choices.js-10.1.0.tgz", - "integrity": "sha512-NtrFt7c7ZQEGmkWsAV+EHynJhADWoZ82JEfg1+vQ9MMKJD4Ax2rzYPxXe+Q64i0HgUgWG/XTN3gN2pB8UFFFlA==", - "dependencies": { - "deepmerge": "^4.2.2", - "fuse.js": "^6.5.3", - "redux": "^4.1.2" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "3.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "1.4.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/codemirror": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", - "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/codemirror/node_modules/@codemirror/autocomplete": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.0.2.tgz", - "integrity": "sha512-9PDjnllmXan/7Uax87KGORbxerDJ/cu10SB+n4Jz0zXMEvIh3+TGgZxhIvDOtaQ4jDBQEM7kHYW4vLdQB0DGZQ==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - }, - "peerDependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/codemirror/node_modules/@codemirror/lint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.0.0.tgz", - "integrity": "sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/codemirror/node_modules/@codemirror/search": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.0.0.tgz", - "integrity": "sha512-rL0rd3AhI0TAsaJPUaEwC63KHLO7KL0Z/dYozXj6E7L3wNHRyx7RfE0/j5HsIf912EE5n2PCb4Vg0rGYmDv4UQ==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/codepage": { - "version": "1.15.0", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", - "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/commitizen": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.2.5.tgz", - "integrity": "sha512-9sXju8Qrz1B4Tw7kC5KhnvwYQN88qs2zbiB8oyMsnXZyJ24PPGiNM3nHr73d32dnE3i8VJEXddBFIbOgYSEXtQ==", - "dev": true, - "dependencies": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.4", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.6", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" - }, - "bin": { - "commitizen": "bin/commitizen", - "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/commitizen/node_modules/find-node-modules": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "findup-sync": "^4.0.0", - "merge": "^2.1.0" - } - }, - "node_modules/commitizen/node_modules/findup-sync": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/commitizen/node_modules/merge": { - "version": "2.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/compare-func": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", - "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commit-types": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-js": { - "version": "3.6.5", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", - "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.0", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.0.0.tgz", - "integrity": "sha512-cVpucSc2Tf+VPwCCR7SZzmQTQkPbkk4O01yXsYqXBIbjE1bhwqSyAgYQkRK1un4i0OPziTleqFhdkmOc4RQ/9g==", - "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=3" - } - }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crc-32": { - "version": "1.2.0", - "license": "Apache-2.0", - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/crelt": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz", - "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", - "dev": true, - "engines": { - "node": ">=12.22" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssdb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.0.1.tgz", - "integrity": "sha512-pT3nzyGM78poCKLAEy2zWIVX2hikq6dIrjuZzLV98MumBg+xMTNYfHx7paUlfiRTgg91O/vR889CIf+qiv79Rw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "license": "MIT" - }, - "node_modules/cz-conventional-changelog": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@commitlint/load": ">6.1.1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/d": { - "version": "1.0.1", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/d3-array": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", - "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", - "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo-projection": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", - "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", - "dependencies": { - "commander": "7", - "d3-array": "1 - 3", - "d3-geo": "1.12.0 - 3" - }, - "bin": { - "geo2svg": "bin/geo2svg.js", - "geograticule": "bin/geograticule.js", - "geoproject": "bin/geoproject.js", - "geoquantize": "bin/geoquantize.js", - "geostitch": "bin/geostitch.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo-projection/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dash-ast": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/data-urls": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.3.1", - "license": "MIT" - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "dev": true, - "license": "ISC" - }, - "node_modules/detect-file": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/dfa": { - "version": "1.2.0", - "license": "MIT" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.264", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.264.tgz", - "integrity": "sha512-AZ6ZRkucHOQT8wke50MktxtmcWZr67kE17X/nAXFf62NIdMdgY6xfsaJD5Szoy84lnkuPWH+4tTNE3s2+bPCiw==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-ci": { - "version": "5.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, - "engines": { - "node": ">=10.17" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "license": "ISC", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-map": { - "version": "0.1.5", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "node_modules/es6-set": { - "version": "0.1.5", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "node_modules/es6-set/node_modules/es6-symbol": { - "version": "3.1.1", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "1.2.0", - "dependencies": { - "esprima": "~1.0.4", - "estraverse": "~1.5.0", - "esutils": "~1.0.0" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.4.0" - }, - "optionalDependencies": { - "source-map": "~0.1.30" - } - }, - "node_modules/escodegen/node_modules/esprima": { - "version": "1.0.4", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "1.5.1", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/escodegen/node_modules/esutils": { - "version": "1.0.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.1.43", - "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-is-function": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/exit-on-epipe": { - "version": "1.0.1", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ext": { - "version": "1.5.0", - "license": "ISC", - "dependencies": { - "type": "^2.5.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "license": "ISC" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.8.0", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.3.11", - "license": "MIT" - }, - "node_modules/figures": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-versions": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver-regex": "^3.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatpickr": { - "version": "4.6.13", - "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", - "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" - }, - "node_modules/flatted": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/fontkit": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.26.0", - "brfs": "^2.0.0", - "brotli": "^1.2.0", - "browserify-optional": "^1.0.1", - "clone": "^1.0.4", - "deep-equal": "^1.0.0", - "dfa": "^1.2.0", - "restructure": "^0.5.3", - "tiny-inflate": "^1.0.2", - "unicode-properties": "^1.2.2", - "unicode-trie": "^0.3.0" - } - }, - "node_modules/fontkit/node_modules/unicode-trie": { - "version": "0.3.1", - "license": "MIT", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "node_modules/form-data": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/frac": { - "version": "1.1.2", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/fscreen": { - "version": "1.2.0", - "license": "MIT" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/fuse.js": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.5.3.tgz", - "integrity": "sha512-sA5etGE7yD/pOqivZRBvUBd/NaL2sjAu6QuSaFoe1H2BrJSkH/T/UXAJ8CdXdw7DvY3Hs8CXKYkDWX7RiP5KOg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "license": "Apache-2.0" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/git-log-parser": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globjoin": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "dev": true, - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.7", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hook-std": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hosted-git-info": { - "version": "4.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hpagent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.0.0.tgz", - "integrity": "sha512-SCleE2Uc1bM752ymxg8QXYGW0TWtAV4ZW3TqH1aOnyi6T6YW2xadCcclm5qeVjvMvfQ2RKNtZxO7uVb9CTPt1A==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/husky": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", - "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", - "dev": true, - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idb": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.2.tgz", - "integrity": "sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==", - "dev": true - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/inquirer/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/into-stream": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "license": "MIT", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.5.0", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsdom/node_modules/escodegen": { - "version": "2.0.0", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/jsdom/node_modules/estraverse": { - "version": "5.2.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jsdom/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsdom/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsdom/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsdom/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsdom/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-fixer": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/json-fixer/-/json-fixer-1.6.13.tgz", - "integrity": "sha512-DKQ71M+0uwAG3QsUkeVgh6XREw/OkpnTfHfM+sdmxRjHvYZ8PlcMVF4ibsHQ1ckR63NROs68qUr1I0u6yPVePQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.14.6", - "chalk": "^4.1.2", - "pegjs": "^0.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/jsonpointer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", - "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/keyv": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/known-css-properties": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz", - "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==", - "dev": true - }, - "node_modules/leaflet": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.2.tgz", - "integrity": "sha512-Kc77HQvWO+y9y2oIs3dn5h5sy2kr3j41ewdqCMEUA4N89lgfUUfOBy7wnnHEstDpefiGFObq12FdopGRMx4J7g==" - }, - "node_modules/leaflet.markercluster": { - "version": "1.5.3", - "license": "MIT", - "peerDependencies": { - "leaflet": "^1.3.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/linebreak": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "base64-js": "0.0.8", - "brfs": "^2.0.2", - "unicode-trie": "^1.0.0" - } - }, - "node_modules/linebreak/node_modules/base64-js": { - "version": "0.0.8", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/linebreak/node_modules/unicode-trie": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "dev": true, - "license": "MIT" - }, - "node_modules/lint-staged": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", - "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", - "dev": true, - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.17", - "commander": "^9.3.0", - "debug": "^4.3.4", - "execa": "^6.1.0", - "lilconfig": "2.0.5", - "listr2": "^4.0.5", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.2", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.1.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/string-width": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.0.1.tgz", - "integrity": "sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==", - "dev": true, - "dependencies": { - "emoji-regex": "^9.2.2", - "is-fullwidth-code-point": "^4.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.5", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/listr2/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/lit": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.4.0.tgz", - "integrity": "sha512-fdgzxEtLrZFQU/BqTtxFQCLwlZd9bdat+ltzSFjvWkZrs7eBmeX0L5MHUMb3kYIkuS8Xlfnii/iI5klirF8/Xg==", - "dependencies": { - "@lit/reactive-element": "^1.4.0", - "lit-element": "^3.2.0", - "lit-html": "^2.4.0" - } - }, - "node_modules/lit-element": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.0.tgz", - "integrity": "sha512-HbE7yt2SnUtg5DCrWt028oaU4D5F4k/1cntAFHTkzY8ZIa8N0Wmu92PxSxucsQSOXlODFrICkQ5x/tEshKi13g==", - "dependencies": { - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.2.0" - } - }, - "node_modules/lit-html": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.4.0.tgz", - "integrity": "sha512-G6qXu4JNUpY6aaF2VMfaszhO9hlWw0hOTRFDmuMheg/nDYGB+2RztUSOyrzALAbr8Nh0Y7qjhYkReh3rPnplVg==", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/longest": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.25.1", - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.1" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/map-obj": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", - "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.0.0.tgz", - "integrity": "sha512-26604GmGmW63ElxcXpE2xfMdbtgD/qiwIqOh/+5+uPe6NVU4bU433+wvPTfq6NZcGr16KWqwu/dzsKxg3IL2Xw==", - "dev": true, - "dependencies": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.0", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": " >=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.0.tgz", - "integrity": "sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/marked-terminal/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mathml-tag-names": { - "version": "2.1.3", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/meow": { - "version": "8.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.45.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.28", - "license": "MIT", - "dependencies": { - "mime-db": "1.45.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mitt": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/modify-values": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", - "dev": true - }, - "node_modules/next-tick": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "3.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.5", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "8.13.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.13.2.tgz", - "integrity": "sha512-aS6q/QKxkw9mTX8gR7Ft38BcRkW1i+h3sI1yAFmfQ30Yl1a1G4ZX3oNGDzaLCilU5ThFZQBS1F4ZSZsrVxJ7HA==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.0.4", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.1.0", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.1.5", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.1", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.0.0", - "ini": "^3.0.0", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.2", - "libnpmdiff": "^4.0.2", - "libnpmexec": "^4.0.2", - "libnpmfund": "^3.0.1", - "libnpmhook": "^8.0.2", - "libnpmorg": "^4.0.2", - "libnpmpack": "^4.0.2", - "libnpmpublish": "^6.0.2", - "libnpmsearch": "^5.0.2", - "libnpmteam": "^4.0.2", - "libnpmversion": "^3.0.1", - "make-fetch-happen": "^10.1.8", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.0.0", - "nopt": "^5.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.2", - "npm-pick-manifest": "^7.0.1", - "npm-profile": "^6.1.0", - "npm-registry-fetch": "^13.1.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.1", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.0", - "cacache": "^16.0.6", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "inBundle": 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/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "1.1.8", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.9.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.0.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^5.0.0", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/run-script": "^4.1.3", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.9.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.1.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "3.1.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^1.1.2", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "dev": true, - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "dev": true, - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": 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/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "4.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "0.2.9", - "license": "MIT" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pdfkit": { - "version": "0.12.3", - "license": "MIT", - "dependencies": { - "crypto-js": "^4.0.0", - "fontkit": "^1.8.1", - "linebreak": "^1.0.2", - "png-js": "^1.0.0" - } - }, - "node_modules/pdfmake": { - "version": "0.2.2", - "license": "MIT", - "dependencies": { - "@foliojs-fork/linebreak": "^1.1.1", - "@foliojs-fork/pdfkit": "^0.12.3", - "iconv-lite": "^0.6.3", - "svg-to-pdfkit": "^0.1.8", - "xmldoc": "^1.1.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/pdfmake/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pegjs": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==", - "dev": true, - "bin": { - "pegjs": "bin/pegjs" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/png-js": { - "version": "1.0.0" - }, - "node_modules/polylabel": { - "version": "1.1.0", - "license": "ISC", - "dependencies": { - "tinyqueue": "^2.0.3" - } - }, - "node_modules/postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "dependencies": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.9", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.9.tgz", - "integrity": "sha512-/E7PRvK8DAVljBbeWrcEQJPG72jaImxF3vvCNFwv9cC8CzigVoNIpeyfnJzphnN3Fd8/auBf5wvkw6W9MfmTyg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-nested": { - "version": "5.0.6", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.6" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.2.tgz", - "integrity": "sha512-rSMUEaOCnovKnwc5LvBDHUDzpGP+nrUeWZGWt9M72fBvckCi45JmnJigUr4QG4zZeOHmOCNCZnd2LKDvP++ZuQ==", - "dev": true, - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.0", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.11", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.1", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.9", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-reporter": { - "version": "7.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/prettier-plugin-organize-imports": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.1.1.tgz", - "integrity": "sha512-6bHIQzybqA644h0WGUW3gpWEVbMBvzui5wCMRBi7qA++d5ov2xjjfDk8pxJJ/ardfZrGAwizKMq/fQMFdJ+0Zw==", - "dev": true, - "peerDependencies": { - "@volar/vue-typescript": ">=0.40.2", - "prettier": ">=2.0", - "typescript": ">=2.9" - }, - "peerDependenciesMeta": { - "@volar/vue-typescript": { - "optional": true - } - } - }, - "node_modules/pretty-bytes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", - "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==", - "dev": true, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/printj": { - "version": "1.1.2", - "license": "Apache-2.0", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/psl": { - "version": "1.8.0", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/raf": { - "version": "3.4.1", - "license": "MIT", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dev": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/redux": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", - "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.7", - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/regression": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/responselike": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restructure": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "browserify-optional": "^1.0.0" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rgbcolor": { - "version": "1.0.1", - "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", - "engines": { - "node": ">= 0.8.15" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.1.9", - "dev": true, - "license": "MIT" - }, - "node_modules/rxjs": { - "version": "6.6.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.2.4", - "license": "ISC" - }, - "node_modules/saxes": { - "version": "5.0.1", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/scope-analyzer": { - "version": "2.1.1", - "license": "Apache-2.0", - "dependencies": { - "array-from": "^2.1.1", - "dash-ast": "^1.0.0", - "es6-map": "^0.1.5", - "es6-set": "^0.1.5", - "es6-symbol": "^3.1.1", - "estree-is-function": "^1.0.0", - "get-assigned-identifiers": "^1.1.0" - } - }, - "node_modules/semantic-release": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", - "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", - "dev": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=16 || ^14.17" - } - }, - "node_modules/semantic-release/node_modules/figures": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semantic-release/node_modules/semver": { - "version": "7.3.5", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/signale": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "license": "MIT" - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.7", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/split": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "dev": true, - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ssf": { - "version": "0.11.2", - "license": "Apache-2.0", - "dependencies": { - "frac": "~1.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "dev": true, - "license": "MIT" - }, - "node_modules/stackblur-canvas": { - "version": "2.5.0", - "license": "MIT", - "engines": { - "node": ">=0.1.14" - } - }, - "node_modules/static-eval": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "escodegen": "^1.11.1" - } - }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "1.14.3", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-eval/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-eval/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-module": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "acorn-node": "^1.3.0", - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "^1.11.1", - "has": "^1.0.1", - "magic-string": "0.25.1", - "merge-source-map": "1.0.4", - "object-inspect": "^1.6.0", - "readable-stream": "~2.3.3", - "scope-analyzer": "^2.0.1", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.5", - "through2": "~2.0.3" - } - }, - "node_modules/static-module/node_modules/escodegen": { - "version": "1.14.3", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-module/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/stencil-wormhole": { - "version": "3.4.1", - "license": "MIT" - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-mod": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", - "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" - }, - "node_modules/style-search": { - "version": "0.1.0", - "dev": true, - "license": "ISC" - }, - "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/stylelint": { - "version": "14.14.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz", - "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^7.0.1", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.0", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.25.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.17", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", - "svg-tags": "^1.0.0", - "table": "^6.8.0", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" - }, - "bin": { - "stylelint": "bin/stylelint.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - } - }, - "node_modules/stylelint-config-recommended": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", - "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", - "dev": true, - "peerDependencies": { - "stylelint": "^14.10.0" - } - }, - "node_modules/stylelint-config-standard": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", - "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", - "dev": true, - "dependencies": { - "stylelint-config-recommended": "^9.0.0" - }, - "peerDependencies": { - "stylelint": "^14.14.0" - } - }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/stylelint/node_modules/global-modules": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stylelint/node_modules/global-prefix": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stylelint/node_modules/meow": { - "version": "9.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-tags": { - "version": "1.0.0", - "dev": true - }, - "node_modules/svg-to-pdfkit": { - "version": "0.1.8", - "license": "MIT", - "dependencies": { - "pdfkit": ">=0.8.1" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "4.1.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/css-what": { - "version": "5.0.1", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domelementtype": { - "version": "2.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/svgo/node_modules/domhandler": { - "version": "4.2.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "2.7.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/svgo/node_modules/nth-check": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "license": "MIT" - }, - "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", - "dev": true, - "dependencies": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tailwindcss/node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/tailwindcss/node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/tailwindcss/node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/thenby": { - "version": "1.3.4", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/through": { - "version": "2.3.8", - "license": "MIT" - }, - "node_modules/through2": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/tinyqueue": { - "version": "2.0.3", - "license": "ISC" - }, - "node_modules/tmp": { - "version": "0.0.33", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/traverse": { - "version": "0.6.6", - "dev": true, - "license": "MIT" - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", - "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/tslib": { - "version": "1.13.0", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.18.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.14.5", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-properties": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vite": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz", - "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==", - "dev": true, - "dependencies": { - "esbuild": "^0.14.14", - "postcss": "^8.4.6", - "resolve": "^1.22.0", - "rollup": "^2.59.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": ">=12.2.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "less": "*", - "sass": "*", - "stylus": "*" - }, - "peerDependenciesMeta": { - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - } - } - }, - "node_modules/vite-plugin-pwa": { - "version": "0.12.8", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz", - "integrity": "sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "fast-glob": "^3.2.11", - "pretty-bytes": "^6.0.0", - "rollup": "^2.75.7", - "workbox-build": "^6.5.3", - "workbox-window": "^6.5.3" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0-0", - "workbox-build": "^6.4.0", - "workbox-window": "^6.4.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", - "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wavesurfer.js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-6.3.0.tgz", - "integrity": "sha512-x7efObHMHY3nwqWzIC0yeZTo0u/aC9T5Av6KhSdhTlsgtKdTG7JAE3mNqnYBXUjq0yGYfTB9F85/pks9830Vjw==" - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "license": "MIT", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/wmf": { - "version": "1.0.2", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word": { - "version": "0.4.0", - "license": "Apache-2.0", - "dependencies": { - "cfb": "^1.2.0", - "jsdom": "^16.2.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/workbox-background-sync": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", - "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", - "dev": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.5.4" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", - "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", - "dev": true, - "dependencies": { - "workbox-core": "6.5.4" - } - }, - "node_modules/workbox-build": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", - "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", - "dev": true, - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.5.4", - "workbox-broadcast-update": "6.5.4", - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-google-analytics": "6.5.4", - "workbox-navigation-preload": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-range-requests": "6.5.4", - "workbox-recipes": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4", - "workbox-streams": "6.5.4", - "workbox-sw": "6.5.4", - "workbox-window": "6.5.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dev": true, - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", - "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", - "dev": true, - "dependencies": { - "workbox-core": "6.5.4" - } - }, - "node_modules/workbox-core": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", - "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==", - "dev": true - }, - "node_modules/workbox-expiration": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", - "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", - "dev": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.5.4" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", - "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", - "dev": true, - "dependencies": { - "workbox-background-sync": "6.5.4", - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", - "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", - "dev": true, - "dependencies": { - "workbox-core": "6.5.4" - } - }, - "node_modules/workbox-precaching": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", - "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", - "dev": true, - "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", - "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", - "dev": true, - "dependencies": { - "workbox-core": "6.5.4" - } - }, - "node_modules/workbox-recipes": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", - "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", - "dev": true, - "dependencies": { - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" - } - }, - "node_modules/workbox-routing": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", - "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", - "dev": true, - "dependencies": { - "workbox-core": "6.5.4" - } - }, - "node_modules/workbox-strategies": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", - "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", - "dev": true, - "dependencies": { - "workbox-core": "6.5.4" - } - }, - "node_modules/workbox-streams": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", - "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", - "dev": true, - "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4" - } - }, - "node_modules/workbox-sw": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", - "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==", - "dev": true - }, - "node_modules/workbox-window": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", - "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", - "dev": true, - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.4" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "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/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "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/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "7.5.5", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xlsx": { - "version": "0.17.2", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.2.0", - "cfb": "^1.1.4", - "codepage": "~1.15.0", - "commander": "~2.17.1", - "crc-32": "~1.2.0", - "exit-on-epipe": "~1.0.1", - "fflate": "^0.3.8", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.4.0" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xlsx/node_modules/commander": { - "version": "2.17.1", - "license": "MIT" - }, - "node_modules/xml-formatter": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz", - "integrity": "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw==", - "dependencies": { - "xml-parser-xo": "^3.2.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "license": "Apache-2.0" - }, - "node_modules/xml-parser-xo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz", - "integrity": "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/xmldoc": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "sax": "^1.2.1" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.7", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@amcharts/amcharts4": { - "version": "4.10.29", - "resolved": "https://registry.npmjs.org/@amcharts/amcharts4/-/amcharts4-4.10.29.tgz", - "integrity": "sha512-uDCvm4V0Xs2jtI0Aa7XFH0jqoyEGx9I2ukFEwaaQzYq11vwowhJsgE3sSv2jsfKETYUvPXb32NbzrXZulE2ESg==", - "requires": { - "@babel/runtime": "^7.6.3", - "core-js": "^3.0.0", - "d3-force": "^3.0.0", - "d3-geo": "^3.0.1", - "d3-geo-projection": "^4.0.0", - "d3-selection": "^3.0.0", - "d3-transition": "^3.0.1", - "pdfmake": "^0.2.2", - "polylabel": "^1.0.2", - "raf": "^3.4.1", - "regression": "^2.0.1", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "tslib": "^2.0.1", - "xlsx": "^0.17.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0" - } - } - }, - "@amcharts/amcharts4-geodata": { - "version": "4.1.23", - "resolved": "https://registry.npmjs.org/@amcharts/amcharts4-geodata/-/amcharts4-geodata-4.1.23.tgz", - "integrity": "sha512-/hFqTuc2SUB0tAgygc8yj1xvTUdddltI7/15fAT9L5XHGERgF8qAa+AisQQ0UMITvrWIr5awJupWE3vDTlWsjQ==" - }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", - "dev": true - }, - "@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", - "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", - "dev": true, - "requires": { - "@babel/types": "^7.18.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", - "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", - "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@codemirror/commands": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.1.2.tgz", - "integrity": "sha512-sO3jdX1s0pam6lIdeSJLMN3DQ6mPEbM4yLvyKkdqtmd/UDwhXA5+AwFJ89rRXm6vTeOXBsE5cAmlos/t7MJdgg==", - "requires": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - }, - "@codemirror/lang-xml": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.0.0.tgz", - "integrity": "sha512-M/HLWxIiP956xGjtrxkeHkCmDGVQGKu782x8pOH5CLJIMkWtiB1DWfDoDHqpFjdEE9dkfcqPWvYfVi6GbhuXEg==", - "requires": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/xml": "^1.0.0" - }, - "dependencies": { - "@codemirror/autocomplete": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.0.2.tgz", - "integrity": "sha512-9PDjnllmXan/7Uax87KGORbxerDJ/cu10SB+n4Jz0zXMEvIh3+TGgZxhIvDOtaQ4jDBQEM7kHYW4vLdQB0DGZQ==", - "requires": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - } - } - }, - "@codemirror/language": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.2.1.tgz", - "integrity": "sha512-MC3svxuvIj0MRpFlGHxLS6vPyIdbTr2KKPEW46kCoCXw2ktb4NTkpkPBI/lSP/FoNXLCBJ0mrnUi1OoZxtpW1Q==", - "requires": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "@codemirror/state": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.2.tgz", - "integrity": "sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==" - }, - "@codemirror/view": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.0.2.tgz", - "integrity": "sha512-mnVT/q1JvKPjpmjXJNeCi/xHyaJ3abGJsumIVpdQ1nE1MXAyHf7GHWt8QpWMUvDiqF0j+inkhVR2OviTdFFX7Q==", - "requires": { - "@codemirror/state": "^6.0.0", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, - "@commitlint/cli": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.1.2.tgz", - "integrity": "sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==", - "dev": true, - "requires": { - "@commitlint/format": "^17.0.0", - "@commitlint/lint": "^17.1.0", - "@commitlint/load": "^17.1.2", - "@commitlint/read": "^17.1.0", - "@commitlint/types": "^17.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - }, - "dependencies": { - "yargs": { - "version": "17.3.0", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "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.0.0" - } - }, - "yargs-parser": { - "version": "21.0.0", - "dev": true - } - } - }, - "@commitlint/config-conventional": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.1.0.tgz", - "integrity": "sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==", - "dev": true, - "requires": { - "conventional-changelog-conventionalcommits": "^5.0.0" - } - }, - "@commitlint/config-validator": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.1.0.tgz", - "integrity": "sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "ajv": "^8.11.0" - } - }, - "@commitlint/ensure": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", - "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "lodash": "^4.17.19" - } - }, - "@commitlint/execute-rule": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", - "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", - "dev": true - }, - "@commitlint/format": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", - "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "chalk": "^4.1.0" - } - }, - "@commitlint/is-ignored": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.1.0.tgz", - "integrity": "sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "semver": "7.3.7" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@commitlint/lint": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.1.0.tgz", - "integrity": "sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==", - "dev": true, - "requires": { - "@commitlint/is-ignored": "^17.1.0", - "@commitlint/parse": "^17.0.0", - "@commitlint/rules": "^17.0.0", - "@commitlint/types": "^17.0.0" - } - }, - "@commitlint/load": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.1.2.tgz", - "integrity": "sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==", - "dev": true, - "requires": { - "@commitlint/config-validator": "^17.1.0", - "@commitlint/execute-rule": "^17.0.0", - "@commitlint/resolve-extends": "^17.1.0", - "@commitlint/types": "^17.0.0", - "@types/node": "^14.0.0", - "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4" - }, - "dependencies": { - "@types/node": { - "version": "14.18.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.26.tgz", - "integrity": "sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA==", - "dev": true - } - } - }, - "@commitlint/message": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz", - "integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==", - "dev": true - }, - "@commitlint/parse": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz", - "integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==", - "dev": true, - "requires": { - "@commitlint/types": "^17.0.0", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - } - }, - "@commitlint/read": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.1.0.tgz", - "integrity": "sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==", - "dev": true, - "requires": { - "@commitlint/top-level": "^17.0.0", - "@commitlint/types": "^17.0.0", - "fs-extra": "^10.0.0", - "git-raw-commits": "^2.0.0", - "minimist": "^1.2.6" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@commitlint/resolve-extends": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.1.0.tgz", - "integrity": "sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==", - "dev": true, - "requires": { - "@commitlint/config-validator": "^17.1.0", - "@commitlint/types": "^17.0.0", - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - } - }, - "@commitlint/rules": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz", - "integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==", - "dev": true, - "requires": { - "@commitlint/ensure": "^17.0.0", - "@commitlint/message": "^17.0.0", - "@commitlint/to-lines": "^17.0.0", - "@commitlint/types": "^17.0.0", - "execa": "^5.0.0" - } - }, - "@commitlint/to-lines": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", - "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", - "dev": true - }, - "@commitlint/top-level": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", - "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "@commitlint/types": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", - "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", - "dev": true, - "requires": { - "chalk": "^4.1.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "requires": {} - }, - "@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "dev": true, - "optional": true - }, - "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "@floating-ui/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.0.1.tgz", - "integrity": "sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA==" - }, - "@floating-ui/dom": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.0.2.tgz", - "integrity": "sha512-5X9WSvZ8/fjy3gDu8yx9HAA4KG1lazUN2P4/VnaXLxTO9Dz53HI1oYoh1OlhqFNlHgGDiwFX5WhFCc2ljbW3yA==", - "requires": { - "@floating-ui/core": "^1.0.1" - } - }, - "@foliojs-fork/fontkit": { - "version": "1.9.1", - "requires": { - "@foliojs-fork/restructure": "^2.0.2", - "brfs": "^2.0.0", - "brotli": "^1.2.0", - "browserify-optional": "^1.0.1", - "clone": "^1.0.4", - "deep-equal": "^1.0.0", - "dfa": "^1.2.0", - "tiny-inflate": "^1.0.2", - "unicode-properties": "^1.2.2", - "unicode-trie": "^2.0.0" - } - }, - "@foliojs-fork/linebreak": { - "version": "1.1.1", - "requires": { - "base64-js": "1.3.1", - "brfs": "^2.0.2", - "unicode-trie": "^2.0.0" - } - }, - "@foliojs-fork/pdfkit": { - "version": "0.12.3", - "requires": { - "@foliojs-fork/fontkit": "^1.9.1", - "@foliojs-fork/linebreak": "^1.1.1", - "crypto-js": "^4.0.0", - "png-js": "^1.0.0" - } - }, - "@foliojs-fork/restructure": { - "version": "2.0.2" - }, - "@github/clipboard-copy-element": { - "version": "1.1.2" - }, - "@github/hotkey": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@github/hotkey/-/hotkey-2.0.1.tgz", - "integrity": "sha512-qKXjAJjtheJbf4ie3hi8IwrHWJZHB5qdojR6JGo6jvQNPpsdUbk/NIdU8sxu4PW41CjW80vfciDMu3MAP3j2Fg==" - }, - "@github/markdown-toolbar-element": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@github/markdown-toolbar-element/-/markdown-toolbar-element-2.1.1.tgz", - "integrity": "sha512-J++rpd5H9baztabJQB82h26jtueOeBRSTqetk9Cri+Lj/s28ndu6Tovn0uHQaOKtBWDobFunk9b5pP5vcqt7cA==" - }, - "@github/time-elements": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@github/time-elements/-/time-elements-3.1.4.tgz", - "integrity": "sha512-DTe/w0uKVeciKzGtYadNdfS8D86pXdGF+OrKg+vi8PKlotJ45zAc26zNpmmfCcMblBBg2+uoi3OxmUm7am/0sg==" - }, - "@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@lezer/common": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.0.tgz", - "integrity": "sha512-ohydQe+Hb+w4oMDvXzs8uuJd2NoA3D8YDcLiuDsLqH+yflDTPEpgCsWI3/6rH5C3BAedtH1/R51dxENldQceEA==" - }, - "@lezer/highlight": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.0.0.tgz", - "integrity": "sha512-nsCnNtim90UKsB5YxoX65v3GEIw3iCHw9RM2DtdgkiqAbKh9pCdvi8AWNwkYf10Lu6fxNhXPpkpHbW6mihhvJA==", - "requires": { - "@lezer/common": "^1.0.0" - } - }, - "@lezer/lr": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.1.0.tgz", - "integrity": "sha512-Iad04uVwk1PvSnj25mqj7zEEIRAsasbsTRmVzI0AUTs/+1Dz1//iYAaoLr7A+Xa7bZDfql5MKTxZmSlkYZD3Dg==", - "requires": { - "@lezer/common": "^1.0.0" - } - }, - "@lezer/xml": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.0.tgz", - "integrity": "sha512-73iI9UK8iqSvWtLlOEl/g+50ivwQn8Ge6foHVN66AXUS1RccFnAoc7BYU8b3c8/rP6dfCOGqAGaWLxBzhj60MA==", - "requires": { - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "@lit/reactive-element": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.4.1.tgz", - "integrity": "sha512-qDv4851VFSaBWzpS02cXHclo40jsbAjRXnebNXpm0uVg32kCneZPo9RYVQtrTNICtZ+1wAYHu1ZtxWSWMbKrBw==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "2.5.0", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3" - } - }, - "@octokit/core": { - "version": "3.5.1", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.12", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "4.8.0", - "dev": true, - "requires": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "11.2.0", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "2.17.0", - "dev": true, - "requires": { - "@octokit/types": "^6.34.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "dev": true, - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "5.13.0", - "dev": true, - "requires": { - "@octokit/types": "^6.34.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "5.6.2", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "2.1.0", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "18.12.0", - "dev": true, - "requires": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" - } - }, - "@octokit/types": { - "version": "6.34.0", - "dev": true, - "requires": { - "@octokit/openapi-types": "^11.2.0" - } - }, - "@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "dependencies": { - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@semantic-release/changelog": { - "version": "6.0.1", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^9.0.0", - "lodash": "^4.17.4" - } - }, - "@semantic-release/commit-analyzer": { - "version": "9.0.2", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "dependencies": { - "import-from": { - "version": "4.0.0", - "dev": true - } - } - }, - "@semantic-release/error": { - "version": "3.0.0", - "dev": true - }, - "@semantic-release/exec": { - "version": "6.0.3", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "parse-json": "^5.0.0" - }, - "dependencies": { - "parse-json": { - "version": "5.1.0", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - } - } - }, - "@semantic-release/git": { - "version": "10.0.1", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "execa": "^5.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.0", - "p-reduce": "^2.0.0" - } - }, - "@semantic-release/github": { - "version": "8.0.2", - "dev": true, - "requires": { - "@octokit/rest": "^18.0.0", - "@semantic-release/error": "^2.2.0", - "aggregate-error": "^3.0.0", - "bottleneck": "^2.18.1", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "p-retry": "^4.0.0", - "url-join": "^4.0.0" - }, - "dependencies": { - "@semantic-release/error": { - "version": "2.2.0", - "dev": true - }, - "@tootallnate/once": { - "version": "2.0.0", - "dev": true - }, - "fs-extra": { - "version": "10.0.0", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "universalify": { - "version": "2.0.0", - "dev": true - } - } - }, - "@semantic-release/gitlab": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-9.4.2.tgz", - "integrity": "sha512-ZfMe4N613C/tqfRdxDPprOoBA7HHyHFHvk+TA4HqOmNpgUKiifyJPpYJsc3PLNtec9I0TA1OOTuY82VDG+FVXw==", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "escape-string-regexp": "^3.0.0", - "form-data": "^4.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.0", - "got": "^11.0.0", - "hpagent": "^1.0.0", - "lodash": "^4.17.11", - "parse-url": "^8.0.0", - "url-join": "^4.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "3.0.0", - "dev": true - }, - "form-data": { - "version": "4.0.0", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "10.0.0", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "dev": true - } - } - }, - "@semantic-release/npm": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.0.tgz", - "integrity": "sha512-hj2jqayS2SPUmFtCMCOQMX975uMDfRoymj1HvMSwYdaoI6hVZvhrTFPBgJeM85O0C+G3IFviAUar5gel/1VGDQ==", - "dev": true, - "requires": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^10.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^4.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@semantic-release/release-notes-generator": { - "version": "10.0.3", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "dev": true - }, - "import-from": { - "version": "4.0.0", - "dev": true - } - } - }, - "@sindresorhus/is": { - "version": "4.2.0", - "dev": true - }, - "@stencil/core": { - "version": "2.5.2" - }, - "@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dev": true, - "requires": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tailwindcss/forms": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", - "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", - "dev": true, - "requires": { - "mini-svg-data-uri": "^1.2.3" - } - }, - "@tailwindcss/line-clamp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.4.2.tgz", - "integrity": "sha512-HFzAQuqYCjyy/SX9sLGB1lroPzmcnWv1FHkIpmypte10hptf4oPUfucryMKovZh2u0uiS9U5Ty3GghWfEJGwVw==", - "dev": true, - "requires": {} - }, - "@tailwindcss/nesting": { - "version": "0.0.0-insiders.565cd3e", - "resolved": "https://registry.npmjs.org/@tailwindcss/nesting/-/nesting-0.0.0-insiders.565cd3e.tgz", - "integrity": "sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==", - "requires": { - "postcss-nested": "^5.0.5" - } - }, - "@tailwindcss/typography": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.7.tgz", - "integrity": "sha512-JTTSTrgZfp6Ki4svhPA4mkd9nmQ/j9EfE7SbHJ1cLtthKkpW2OxsFXzSmxbhYbEkfNIyAyhle5p4SYyKRbz/jg==", - "dev": true, - "requires": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - } - }, - "@tootallnate/once": { - "version": "1.1.2" - }, - "@trysound/sax": { - "version": "0.2.0", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/cacheable-request": { - "version": "6.0.2", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/color-name": { - "version": "1.1.1", - "dev": true - }, - "@types/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-epMsEE85fi4lfmJUH/89/iV/LI+F5CvNIvmgs5g5jYFPfhO2S/ae8WSsLOKWdwtoaZw9Q2IhJ4tQ5tFCcS/4HA==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/fscreen": { - "version": "1.0.1" - }, - "@types/geojson": { - "version": "7946.0.8", - "dev": true - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.3", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/leaflet": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.0.tgz", - "integrity": "sha512-7LeOSj7EloC5UcyOMo+1kc3S1UT3MjJxwqsMT1d2PTyvQz53w0Y0oSSk9nwZnOZubCmBvpSNGceucxiq+ZPEUw==", - "dev": true, - "requires": { - "@types/geojson": "*" - } - }, - "@types/marked": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", - "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.1", - "dev": true - }, - "@types/node": { - "version": "17.0.5", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "dev": true - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/responselike": { - "version": "1.0.0", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/retry": { - "version": "0.12.1", - "dev": true - }, - "@types/trusted-types": { - "version": "2.0.2" - }, - "@types/wavesurfer.js": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/wavesurfer.js/-/wavesurfer.js-6.0.3.tgz", - "integrity": "sha512-5Sb5s3pEkOmDosaaP1DWp1Unnx8HhVorm5608TIVdT5jCMvJ6eqM19UD8n7DEbJ7rzreS9RqHmzR8TlcdQBvbA==", - "dev": true, - "requires": { - "@types/debounce": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.0.tgz", - "integrity": "sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/type-utils": "5.40.0", - "@typescript-eslint/utils": "5.40.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.0.tgz", - "integrity": "sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.0.tgz", - "integrity": "sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.0.tgz", - "integrity": "sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.40.0", - "@typescript-eslint/utils": "5.40.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.0.tgz", - "integrity": "sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.0.tgz", - "integrity": "sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.0.tgz", - "integrity": "sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.0.tgz", - "integrity": "sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.40.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@vime/core": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@vime/core/-/core-5.3.3.tgz", - "integrity": "sha512-bGn6bwiOwI/0d+P+gLH9U3ySK4tar6Qiv7g+RR+c7iuCsl0S16/wP1G677PiglJTvM3wuo2wD3hztMEkiWfvhw==", - "requires": { - "@stencil/core": "2.5.2", - "@types/fscreen": "^1.0.1", - "fscreen": "^1.2.0", - "mitt": "^3.0.0", - "stencil-wormhole": "^3.4.1" - } - }, - "abab": { - "version": "2.0.5" - }, - "acorn": { - "version": "7.4.1" - }, - "acorn-globals": { - "version": "6.0.0", - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-node": { - "version": "1.8.2", - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "acorn-walk": { - "version": "7.2.0" - }, - "adler-32": { - "version": "1.2.0", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "agent-base": { - "version": "6.0.2", - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "all-contributors-cli": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.24.0.tgz", - "integrity": "sha512-7oSKr2PnqxsOotuSwciltcFTS1eVRdjR0cn99hbElfff7gRQBShVhsf/XBprY41sLcgqTk0l0MKgKv6QNgZdMg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.6", - "async": "^3.1.0", - "chalk": "^4.0.0", - "didyoumean": "^1.2.1", - "inquirer": "^7.3.3", - "json-fixer": "^1.6.8", - "lodash": "^4.11.2", - "node-fetch": "^2.6.0", - "pify": "^5.0.0", - "yargs": "^15.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "amdefine": { - "version": "1.0.1", - "optional": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "argv-formatter": { - "version": "1.0.0", - "dev": true - }, - "array-from": { - "version": "2.1.1" - }, - "array-ify": { - "version": "1.0.0", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "dev": true - }, - "ast-transform": { - "version": "0.0.0", - "requires": { - "escodegen": "~1.2.0", - "esprima": "~1.0.4", - "through": "~2.3.4" - }, - "dependencies": { - "esprima": { - "version": "1.0.4" - } - } - }, - "ast-types": { - "version": "0.7.8" - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0" - }, - "at-least-node": { - "version": "1.0.0", - "dev": true - }, - "autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - } - }, - "babel-runtime": { - "version": "6.26.0", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.12" - }, - "regenerator-runtime": { - "version": "0.11.1" - } - } - }, - "balanced-match": { - "version": "1.0.0", - "dev": true - }, - "base64-js": { - "version": "1.3.1" - }, - "before-after-hook": { - "version": "2.2.2", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "boolbase": { - "version": "1.0.0", - "dev": true - }, - "bottleneck": { - "version": "2.19.5", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brfs": { - "version": "2.0.2", - "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^3.0.2", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "brotli": { - "version": "1.3.2", - "requires": { - "base64-js": "^1.1.2" - } - }, - "browser-process-hrtime": { - "version": "1.0.0" - }, - "browser-resolve": { - "version": "1.11.3", - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7" - } - } - }, - "browserify-optional": { - "version": "1.0.1", - "requires": { - "ast-transform": "0.0.0", - "ast-types": "^0.7.0", - "browser-resolve": "^1.8.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-equal": { - "version": "0.0.1" - }, - "buffer-from": { - "version": "1.1.2" - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "cacheable-lookup": { - "version": "5.0.4", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "dev": true - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001412", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001412.tgz", - "integrity": "sha512-+TeEIee1gS5bYOiuf+PS/kp2mrXic37Hl66VY6EAfxasIk5fELTktK2oOezYed12H8w7jt3s512PpulQidPjwA==", - "dev": true - }, - "cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "cfb": { - "version": "1.2.1", - "requires": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0", - "printj": "~1.3.0" - }, - "dependencies": { - "adler-32": { - "version": "1.3.0", - "requires": { - "printj": "~1.2.2" - }, - "dependencies": { - "printj": { - "version": "1.2.3" - } - } - }, - "printj": { - "version": "1.3.0" - } - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chardet": { - "version": "0.7.0", - "dev": true - }, - "choices.js": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/choices.js/-/choices.js-10.1.0.tgz", - "integrity": "sha512-NtrFt7c7ZQEGmkWsAV+EHynJhADWoZ82JEfg1+vQ9MMKJD4Ax2rzYPxXe+Q64i0HgUgWG/XTN3gN2pB8UFFFlA==", - "requires": { - "deepmerge": "^4.2.2", - "fuse.js": "^6.5.3", - "redux": "^4.1.2" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "3.3.0", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true - }, - "cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, - "requires": { - "colors": "1.4.0", - "string-width": "^4.2.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4" - }, - "clone-response": { - "version": "1.0.2", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "codemirror": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", - "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", - "requires": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "dependencies": { - "@codemirror/autocomplete": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.0.2.tgz", - "integrity": "sha512-9PDjnllmXan/7Uax87KGORbxerDJ/cu10SB+n4Jz0zXMEvIh3+TGgZxhIvDOtaQ4jDBQEM7kHYW4vLdQB0DGZQ==", - "requires": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - }, - "@codemirror/lint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.0.0.tgz", - "integrity": "sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==", - "requires": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "@codemirror/search": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.0.0.tgz", - "integrity": "sha512-rL0rd3AhI0TAsaJPUaEwC63KHLO7KL0Z/dYozXj6E7L3wNHRyx7RfE0/j5HsIf912EE5n2PCb4Vg0rGYmDv4UQ==", - "requires": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - } - } - }, - "codepage": { - "version": "1.15.0" - }, - "color-convert": { - "version": "1.9.3", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.8", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", - "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", - "dev": true - }, - "commitizen": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.2.5.tgz", - "integrity": "sha512-9sXju8Qrz1B4Tw7kC5KhnvwYQN88qs2zbiB8oyMsnXZyJ24PPGiNM3nHr73d32dnE3i8VJEXddBFIbOgYSEXtQ==", - "dev": true, - "requires": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.4", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.6", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" - }, - "dependencies": { - "find-node-modules": { - "version": "2.1.2", - "dev": true, - "requires": { - "findup-sync": "^4.0.0", - "merge": "^2.1.0" - } - }, - "findup-sync": { - "version": "4.0.0", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - } - }, - "merge": { - "version": "2.1.1", - "dev": true - } - } - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-conventionalcommits": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", - "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - } - }, - "conventional-changelog-writer": { - "version": "5.0.0", - "dev": true, - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - } - }, - "conventional-commit-types": { - "version": "3.0.0", - "dev": true - }, - "conventional-commits-filter": { - "version": "2.0.7", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.3", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "core-js": { - "version": "3.6.5" - }, - "core-js-compat": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", - "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", - "dev": true, - "requires": { - "browserslist": "^4.21.0", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2" - }, - "cosmiconfig": { - "version": "7.0.1", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "dependencies": { - "parse-json": { - "version": "5.2.0", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - } - } - }, - "cosmiconfig-typescript-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.0.0.tgz", - "integrity": "sha512-cVpucSc2Tf+VPwCCR7SZzmQTQkPbkk4O01yXsYqXBIbjE1bhwqSyAgYQkRK1un4i0OPziTleqFhdkmOc4RQ/9g==", - "dev": true, - "requires": {} - }, - "crc-32": { - "version": "1.2.0", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "crelt": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz", - "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==" - }, - "cross-env": { - "version": "7.0.3", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "crypto-js": { - "version": "4.1.1" - }, - "crypto-random-string": { - "version": "2.0.0", - "dev": true - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "requires": {} - }, - "css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", - "dev": true - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "requires": {} - }, - "css-tree": { - "version": "1.1.3", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } - } - }, - "cssdb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.0.1.tgz", - "integrity": "sha512-pT3nzyGM78poCKLAEy2zWIVX2hikq6dIrjuZzLV98MumBg+xMTNYfHx7paUlfiRTgg91O/vR889CIf+qiv79Rw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0" - }, - "cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "cssom": { - "version": "0.4.4" - }, - "cssstyle": { - "version": "2.3.0", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8" - } - } - }, - "cz-conventional-changelog": { - "version": "3.3.0", - "dev": true, - "requires": { - "@commitlint/load": ">6.1.1", - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "d": { - "version": "1.0.1", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "d3-array": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", - "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" - }, - "d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" - }, - "d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" - }, - "d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "d3-geo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", - "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", - "requires": { - "d3-array": "2.5.0 - 3" - } - }, - "d3-geo-projection": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", - "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", - "requires": { - "commander": "7", - "d3-array": "1 - 3", - "d3-geo": "1.12.0 - 3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - } - } - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "requires": { - "d3-color": "1 - 3" - } - }, - "d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" - }, - "d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" - }, - "d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" - }, - "d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "requires": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - } - }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true - }, - "dash-ast": { - "version": "1.0.0" - }, - "data-urls": { - "version": "2.0.0", - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "dateformat": { - "version": "3.0.3", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "dev": true - } - } - }, - "decimal.js": { - "version": "10.3.1" - }, - "decompress-response": { - "version": "6.0.0", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "dev": true - } - } - }, - "dedent": { - "version": "0.7.0", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3" - }, - "deepmerge": { - "version": "4.2.2" - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0" - }, - "deprecation": { - "version": "2.3.1", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "dev": true - }, - "detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "dfa": { - "version": "1.2.0" - }, - "didyoumean": { - "version": "1.2.2", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0" - } - } - }, - "dot-prop": { - "version": "5.3.0", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer2": { - "version": "0.1.4", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "electron-to-chromium": { - "version": "1.4.264", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.264.tgz", - "integrity": "sha512-AZ6ZRkucHOQT8wke50MktxtmcWZr67kE17X/nAXFf62NIdMdgY6xfsaJD5Szoy84lnkuPWH+4tTNE3s2+bPCiw==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "2.2.0", - "dev": true - }, - "env-ci": { - "version": "5.4.1", - "dev": true, - "requires": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - } - }, - "error-ex": { - "version": "1.3.2", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "dev": true - } - } - }, - "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, - "es6-symbol": { - "version": "3.1.3", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "requires": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "dev": true - }, - "escodegen": { - "version": "1.2.0", - "requires": { - "esprima": "~1.0.4", - "estraverse": "~1.5.0", - "esutils": "~1.0.0", - "source-map": "~0.1.30" - }, - "dependencies": { - "esprima": { - "version": "1.0.4" - }, - "estraverse": { - "version": "1.5.1" - }, - "esutils": { - "version": "1.0.0" - }, - "source-map": { - "version": "0.1.43", - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1" - }, - "esquery": { - "version": "1.4.0", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0" - }, - "estree-is-function": { - "version": "1.0.0" - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3" - }, - "event-emitter": { - "version": "0.3.5", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "execa": { - "version": "5.1.1", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "dev": true - } - } - }, - "exit-on-epipe": { - "version": "1.0.1" - }, - "expand-tilde": { - "version": "2.0.2", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "ext": { - "version": "1.5.0", - "requires": { - "type": "^2.5.0" - }, - "dependencies": { - "type": { - "version": "2.5.0" - } - } - }, - "external-editor": { - "version": "3.1.0", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6" - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.8.0", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fflate": { - "version": "0.3.11" - }, - "figures": { - "version": "2.0.0", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "7.0.1", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-root": { - "version": "1.1.0", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-versions": { - "version": "4.0.0", - "dev": true, - "requires": { - "semver-regex": "^3.1.2" - } - }, - "flat-cache": { - "version": "3.0.4", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatpickr": { - "version": "4.6.13", - "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", - "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" - }, - "flatted": { - "version": "3.1.1", - "dev": true - }, - "fontkit": { - "version": "1.8.1", - "requires": { - "babel-runtime": "^6.26.0", - "brfs": "^2.0.0", - "brotli": "^1.2.0", - "browserify-optional": "^1.0.1", - "clone": "^1.0.4", - "deep-equal": "^1.0.0", - "dfa": "^1.2.0", - "restructure": "^0.5.3", - "tiny-inflate": "^1.0.2", - "unicode-properties": "^1.2.2", - "unicode-trie": "^0.3.0" - }, - "dependencies": { - "unicode-trie": { - "version": "0.3.1", - "requires": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - } - } - }, - "form-data": { - "version": "3.0.0", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "frac": { - "version": "1.1.2" - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "from2": { - "version": "2.3.0", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fromentries": { - "version": "1.3.2", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "fscreen": { - "version": "1.2.0" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "fuse.js": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.5.3.tgz", - "integrity": "sha512-sA5etGE7yD/pOqivZRBvUBd/NaL2sjAu6QuSaFoe1H2BrJSkH/T/UXAJ8CdXdw7DvY3Hs8CXKYkDWX7RiP5KOg==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-assigned-identifiers": { - "version": "1.2.0" - }, - "get-caller-file": { - "version": "2.0.5", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "git-log-parser": { - "version": "1.2.0", - "dev": true, - "requires": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - }, - "dependencies": { - "split2": { - "version": "1.0.0", - "dev": true, - "requires": { - "through2": "~2.0.0" - } - }, - "through2": { - "version": "2.0.5", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "0.1.1", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "global-modules": { - "version": "1.0.0", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globjoin": { - "version": "0.1.4", - "dev": true - }, - "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } - } - }, - "hard-rejection": { - "version": "2.1.0", - "dev": true - }, - "has": { - "version": "1.0.3", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hook-std": { - "version": "2.0.0", - "dev": true - }, - "hosted-git-info": { - "version": "4.0.2", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "hpagent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.0.0.tgz", - "integrity": "sha512-SCleE2Uc1bM752ymxg8QXYGW0TWtAV4ZW3TqH1aOnyi6T6YW2xadCcclm5qeVjvMvfQ2RKNtZxO7uVb9CTPt1A==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "dependencies": { - "quick-lru": { - "version": "5.1.1", - "dev": true - } - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true - }, - "husky": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", - "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idb": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.2.tgz", - "integrity": "sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "dev": true - } - } - }, - "import-lazy": { - "version": "4.0.0", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4" - }, - "ini": { - "version": "1.3.8", - "dev": true - }, - "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" - }, - "into-stream": { - "version": "6.0.0", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "is-arguments": { - "version": "1.1.0", - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-ci": { - "version": "3.0.1", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.2" - }, - "is-extglob": { - "version": "2.1.1", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1" - }, - "is-regex": { - "version": "1.1.4", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.0", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-text-path": { - "version": "1.0.1", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "dev": true - }, - "isarray": { - "version": "1.0.0" - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "issue-parser": { - "version": "6.0.0", - "dev": true, - "requires": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - } - }, - "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - } - }, - "java-properties": { - "version": "1.0.2", - "dev": true - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdom": { - "version": "16.7.0", - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.5.0" - }, - "escodegen": { - "version": "2.0.0", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "estraverse": { - "version": "5.2.0" - }, - "levn": { - "version": "0.3.0", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2" - }, - "source-map": { - "version": "0.6.1", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "dev": true - }, - "json-fixer": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/json-fixer/-/json-fixer-1.6.13.tgz", - "integrity": "sha512-DKQ71M+0uwAG3QsUkeVgh6XREw/OkpnTfHfM+sdmxRjHvYZ8PlcMVF4ibsHQ1ckR63NROs68qUr1I0u6yPVePQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.14.6", - "chalk": "^4.1.2", - "pegjs": "^0.10.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.0", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "jsonparse": { - "version": "1.3.1", - "dev": true - }, - "jsonpointer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", - "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "keyv": { - "version": "4.0.4", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "dev": true - }, - "known-css-properties": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz", - "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==", - "dev": true - }, - "leaflet": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.2.tgz", - "integrity": "sha512-Kc77HQvWO+y9y2oIs3dn5h5sy2kr3j41ewdqCMEUA4N89lgfUUfOBy7wnnHEstDpefiGFObq12FdopGRMx4J7g==" - }, - "leaflet.markercluster": { - "version": "1.5.3", - "requires": {} - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true - }, - "linebreak": { - "version": "1.0.2", - "requires": { - "base64-js": "0.0.8", - "brfs": "^2.0.2", - "unicode-trie": "^1.0.0" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8" - }, - "unicode-trie": { - "version": "1.0.0", - "requires": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - } - } - }, - "lines-and-columns": { - "version": "1.1.6", - "dev": true - }, - "lint-staged": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.3.tgz", - "integrity": "sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==", - "dev": true, - "requires": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.17", - "commander": "^9.3.0", - "debug": "^4.3.4", - "execa": "^6.1.0", - "lilconfig": "2.0.5", - "listr2": "^4.0.5", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.2", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", - "dev": true - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - } - }, - "string-width": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.0.1.tgz", - "integrity": "sha512-5ohWO/M4//8lErlUUtrFy3b11GtNOuMOU0ysKCDXFcfXuuvUXu95akgj/i8ofmaGdN0hCqyl6uu9i8dS/mQp5g==", - "dev": true, - "requires": { - "emoji-regex": "^9.2.2", - "is-fullwidth-code-point": "^4.0.0", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - }, - "yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", - "dev": true - } - } - }, - "listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", - "dev": true, - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.5", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } - } - }, - "lit": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.4.0.tgz", - "integrity": "sha512-fdgzxEtLrZFQU/BqTtxFQCLwlZd9bdat+ltzSFjvWkZrs7eBmeX0L5MHUMb3kYIkuS8Xlfnii/iI5klirF8/Xg==", - "requires": { - "@lit/reactive-element": "^1.4.0", - "lit-element": "^3.2.0", - "lit-html": "^2.4.0" - } - }, - "lit-element": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.0.tgz", - "integrity": "sha512-HbE7yt2SnUtg5DCrWt028oaU4D5F4k/1cntAFHTkzY8ZIa8N0Wmu92PxSxucsQSOXlODFrICkQ5x/tEshKi13g==", - "requires": { - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.2.0" - } - }, - "lit-html": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.4.0.tgz", - "integrity": "sha512-G6qXu4JNUpY6aaF2VMfaszhO9hlWw0hOTRFDmuMheg/nDYGB+2RztUSOyrzALAbr8Nh0Y7qjhYkReh3rPnplVg==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "dev": true - } - } - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21" - }, - "lodash.capitalize": { - "version": "4.2.1", - "dev": true - }, - "lodash.castarray": { - "version": "4.4.0", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "dev": true - }, - "lodash.map": { - "version": "4.6.0", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "lodash.uniqby": { - "version": "4.7.0", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "longest": { - "version": "2.0.1", - "dev": true - }, - "lowercase-keys": { - "version": "2.0.0", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.25.1", - "requires": { - "sourcemap-codec": "^1.4.1" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "map-obj": { - "version": "4.2.0", - "dev": true - }, - "marked": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.1.tgz", - "integrity": "sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==" - }, - "marked-terminal": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.0.0.tgz", - "integrity": "sha512-26604GmGmW63ElxcXpE2xfMdbtgD/qiwIqOh/+5+uPe6NVU4bU433+wvPTfq6NZcGr16KWqwu/dzsKxg3IL2Xw==", - "dev": true, - "requires": { - "ansi-escapes": "^5.0.0", - "cardinal": "^2.1.1", - "chalk": "^5.0.0", - "cli-table3": "^0.6.0", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.2.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "requires": { - "type-fest": "^1.0.2" - } - }, - "chalk": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.0.tgz", - "integrity": "sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==", - "dev": true - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "mathml-tag-names": { - "version": "2.1.3", - "dev": true - }, - "mdn-data": { - "version": "2.0.14", - "dev": true - }, - "meow": { - "version": "8.1.2", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "merge-source-map": { - "version": "1.0.4", - "requires": { - "source-map": "^0.5.6" - } - }, - "merge-stream": { - "version": "2.0.0", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "3.0.0", - "dev": true - }, - "mime-db": { - "version": "1.45.0" - }, - "mime-types": { - "version": "2.1.28", - "requires": { - "mime-db": "1.45.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "dev": true - }, - "mini-svg-data-uri": { - "version": "1.2.3", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minimist-options": { - "version": "4.1.0", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mitt": { - "version": "3.0.0" - }, - "modify-values": { - "version": "1.0.1", - "dev": true - }, - "ms": { - "version": "2.1.2" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - }, - "natural-compare": { - "version": "1.4.0", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "dev": true - }, - "nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", - "dev": true - }, - "next-tick": { - "version": "1.0.0" - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-package-data": { - "version": "3.0.2", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "dev": true - }, - "npm": { - "version": "8.13.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.13.2.tgz", - "integrity": "sha512-aS6q/QKxkw9mTX8gR7Ft38BcRkW1i+h3sI1yAFmfQ30Yl1a1G4ZX3oNGDzaLCilU5ThFZQBS1F4ZSZsrVxJ7HA==", - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.0.4", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.1.0", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.1.5", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.1", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.0.0", - "ini": "^3.0.0", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.2", - "libnpmdiff": "^4.0.2", - "libnpmexec": "^4.0.2", - "libnpmfund": "^3.0.1", - "libnpmhook": "^8.0.2", - "libnpmorg": "^4.0.2", - "libnpmpack": "^4.0.2", - "libnpmpublish": "^6.0.2", - "libnpmsearch": "^5.0.2", - "libnpmteam": "^4.0.2", - "libnpmversion": "^3.0.1", - "make-fetch-happen": "^10.1.8", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.0.0", - "nopt": "^5.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.2", - "npm-pick-manifest": "^7.0.1", - "npm-profile": "^6.1.0", - "npm-registry-fetch": "^13.1.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.1", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "@gar/promisify": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "@npmcli/arborist": { - "version": "5.2.3", - "bundled": true, - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.0", - "cacache": "^16.0.6", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/ci-detect": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "@npmcli/config": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/disparity-colors": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "bundled": true, - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/map-workspaces": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - } - }, - "@npmcli/metavuln-calculator": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "@npmcli/node-gyp": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "@npmcli/package-json": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "@npmcli/promise-spawn": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "4.1.5", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "asap": { - "version": "2.0.6", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "bin-links": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "builtins": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "16.1.1", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - } - }, - "chalk": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "cli-columns": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "cli-table3": { - "version": "0.6.2", - "bundled": true, - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clone": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "cmd-shim": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "columnify": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "defaults": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "depd": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "dezalgo": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "dev": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "bundled": true, - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "gauge": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "8.0.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "bundled": true, - "dev": true - }, - "has": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore-walk": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "minimatch": "^5.0.1" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "ini": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "init-package-json": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - } - }, - "ip": { - "version": "1.1.8", - "bundled": true, - "dev": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true, - "dev": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "bundled": true, - "dev": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true, - "dev": true - }, - "just-diff": { - "version": "5.0.2", - "bundled": true, - "dev": true - }, - "just-diff-apply": { - "version": "5.2.0", - "bundled": true, - "dev": true - }, - "libnpmaccess": { - "version": "6.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmdiff": { - "version": "4.0.4", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.0.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - } - }, - "libnpmexec": { - "version": "4.0.8", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^5.0.0", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/run-script": "^4.1.3", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "walk-up-path": "^1.0.0" - } - }, - "libnpmfund": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/arborist": "^5.0.0" - } - }, - "libnpmhook": { - "version": "8.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmorg": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmpack": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - } - }, - "libnpmpublish": { - "version": "6.0.4", - "bundled": true, - "dev": true, - "requires": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - } - }, - "libnpmsearch": { - "version": "5.0.3", - "bundled": true, - "dev": true, - "requires": { - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmteam": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - } - }, - "libnpmversion": { - "version": "3.0.6", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - } - }, - "lru-cache": { - "version": "7.9.0", - "bundled": true, - "dev": true - }, - "make-fetch-happen": { - "version": "10.1.8", - "bundled": true, - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "3.1.6", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true, - "dev": true - }, - "mkdirp-infer-owner": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - } - }, - "ms": { - "version": "2.1.3", - "bundled": true, - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "bundled": true, - "dev": true - }, - "node-gyp": { - "version": "9.0.0", - "bundled": true, - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-audit-report": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "npm-bundled": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "npm-package-arg": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - }, - "npm-packlist": { - "version": "5.1.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^1.1.2", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "7.0.1", - "bundled": true, - "dev": true, - "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - } - }, - "npm-profile": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - } - }, - "npm-registry-fetch": { - "version": "13.1.1", - "bundled": true, - "dev": true, - "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - } - }, - "npm-user-validate": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "npmlog": { - "version": "6.0.2", - "bundled": true, - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.2", - "bundled": true, - "dev": true - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "13.6.1", - "bundled": true, - "dev": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - } - }, - "parse-conflict-json": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "proc-log": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-call-limit": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "dev": true, - "requires": { - "read": "1" - } - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "read": { - "version": "1.0.7", - "bundled": true, - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "read-package-json": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "read-package-json-fast": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "bundled": true, - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "7.3.7", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true, - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true, - "dev": true - }, - "socks": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "bundled": true, - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "spdx-correct": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "bundled": true, - "dev": true - }, - "ssri": { - "version": "9.0.1", - "bundled": true, - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.11", - "bundled": true, - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true, - "dev": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true, - "dev": true - }, - "treeverse": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "walk-up-path": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true, - "dev": true - } - } - }, - "npm-run-path": { - "version": "4.0.1", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.0" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "object-is": { - "version": "1.1.5", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1" - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "once": { - "version": "1.4.0", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "dev": true - }, - "p-each-series": { - "version": "2.2.0", - "dev": true - }, - "p-filter": { - "version": "2.1.0", - "dev": true, - "requires": { - "p-map": "^2.0.0" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "dev": true - } - } - }, - "p-is-promise": { - "version": "3.0.0", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-reduce": { - "version": "2.1.0", - "dev": true - }, - "p-retry": { - "version": "4.6.1", - "dev": true, - "requires": { - "@types/retry": "^0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "dev": true - }, - "pako": { - "version": "0.2.9" - }, - "parent-module": { - "version": "1.0.1", - "dev": true, - "requires": { - "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "dev": true - } - } - }, - "parse-json": { - "version": "4.0.0", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "dev": true - }, - "parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "requires": { - "protocols": "^2.0.0" - } - }, - "parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "requires": { - "parse-path": "^7.0.0" - } - }, - "parse5": { - "version": "6.0.1" - }, - "path-exists": { - "version": "4.0.0", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "dev": true - }, - "path-parse": { - "version": "1.0.7" - }, - "path-type": { - "version": "4.0.0", - "dev": true - }, - "pdfkit": { - "version": "0.12.3", - "requires": { - "crypto-js": "^4.0.0", - "fontkit": "^1.8.1", - "linebreak": "^1.0.2", - "png-js": "^1.0.0" - } - }, - "pdfmake": { - "version": "0.2.2", - "requires": { - "@foliojs-fork/linebreak": "^1.1.1", - "@foliojs-fork/pdfkit": "^0.12.3", - "iconv-lite": "^0.6.3", - "svg-to-pdfkit": "^0.1.8", - "xmldoc": "^1.1.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "pegjs": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==", - "dev": true - }, - "performance-now": { - "version": "2.1.0" - }, - "picocolors": { - "version": "1.0.0" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "dev": true - }, - "pkg-conf": { - "version": "2.1.0", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "dev": true - } - } - }, - "png-js": { - "version": "1.0.0" - }, - "polylabel": { - "version": "1.1.0", - "requires": { - "tinyqueue": "^2.0.3" - } - }, - "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "requires": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-properties": { - "version": "12.1.9", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.9.tgz", - "integrity": "sha512-/E7PRvK8DAVljBbeWrcEQJPG72jaImxF3vvCNFwv9cC8CzigVoNIpeyfnJzphnN3Fd8/auBf5wvkw6W9MfmTyg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} - }, - "postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "dev": true - }, - "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-nested": { - "version": "5.0.6", - "requires": { - "postcss-selector-parser": "^6.0.6" - } - }, - "postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "requires": {} - }, - "postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.2.tgz", - "integrity": "sha512-rSMUEaOCnovKnwc5LvBDHUDzpGP+nrUeWZGWt9M72fBvckCi45JmnJigUr4QG4zZeOHmOCNCZnd2LKDvP++ZuQ==", - "dev": true, - "requires": { - "@csstools/postcss-cascade-layers": "^1.1.0", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.11", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.1", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.9", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "requires": {} - }, - "postcss-reporter": { - "version": "7.0.5", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - } - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "dev": true - }, - "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "requires": {} - }, - "postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "dev": true - }, - "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "prettier-plugin-organize-imports": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.1.1.tgz", - "integrity": "sha512-6bHIQzybqA644h0WGUW3gpWEVbMBvzui5wCMRBi7qA++d5ov2xjjfDk8pxJJ/ardfZrGAwizKMq/fQMFdJ+0Zw==", - "dev": true, - "requires": {} - }, - "pretty-bytes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", - "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==", - "dev": true - }, - "printj": { - "version": "1.1.2" - }, - "process-nextick-args": { - "version": "2.0.1" - }, - "protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "psl": { - "version": "1.8.0" - }, - "pump": { - "version": "3.0.0", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1" - }, - "q": { - "version": "1.5.1", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "dev": true - }, - "quote-stream": { - "version": "1.0.2", - "requires": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "raf": { - "version": "3.4.1", - "requires": { - "performance-now": "^2.1.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "read-cache": { - "version": "1.0.0", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "parse-json": { - "version": "5.2.0", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "semver": { - "version": "5.7.1", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.7", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "redux": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz", - "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==", - "requires": { - "@babel/runtime": "^7.9.2" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.7" - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "dev": true - }, - "regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, - "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "regression": { - "version": "2.0.1" - }, - "require-directory": { - "version": "2.1.1", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "dev": true - }, - "resolve-dir": { - "version": "1.0.1", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "dev": true - }, - "resolve-global": { - "version": "1.0.0", - "dev": true, - "requires": { - "global-dirs": "^0.1.1" - } - }, - "responselike": { - "version": "2.0.0", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "restructure": { - "version": "0.5.4", - "requires": { - "browserify-optional": "^1.0.0" - } - }, - "retry": { - "version": "0.13.1", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rgbcolor": { - "version": "1.0.1" - }, - "rimraf": { - "version": "3.0.2", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - } - }, - "run-async": { - "version": "2.4.1", - "dev": true - }, - "run-parallel": { - "version": "1.1.9", - "dev": true - }, - "rxjs": { - "version": "6.6.2", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2" - }, - "safer-buffer": { - "version": "2.1.2" - }, - "sax": { - "version": "1.2.4" - }, - "saxes": { - "version": "5.0.1", - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scope-analyzer": { - "version": "2.1.1", - "requires": { - "array-from": "^2.1.1", - "dash-ast": "^1.0.0", - "es6-map": "^0.1.5", - "es6-set": "^0.1.5", - "es6-symbol": "^3.1.1", - "estree-is-function": "^1.0.0", - "get-assigned-identifiers": "^1.1.0" - } - }, - "semantic-release": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", - "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", - "dev": true, - "requires": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, - "dependencies": { - "figures": { - "version": "3.2.0", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "get-stream": { - "version": "6.0.1", - "dev": true - }, - "semver": { - "version": "7.3.5", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "semver": { - "version": "6.3.0", - "dev": true - }, - "semver-diff": { - "version": "3.1.1", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, - "semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "shallow-copy": { - "version": "0.0.1" - }, - "shebang-command": { - "version": "2.0.0", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "signale": { - "version": "1.4.0", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "slash": { - "version": "3.0.0", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sourcemap-codec": { - "version": "1.4.8" - }, - "spawn-error-forwarder": { - "version": "1.0.0", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "dev": true - }, - "split": { - "version": "1.0.1", - "dev": true, - "requires": { - "through": "2" - } - }, - "split2": { - "version": "3.2.2", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "ssf": { - "version": "0.11.2", - "requires": { - "frac": "~1.1.2" - } - }, - "stable": { - "version": "0.1.8", - "dev": true - }, - "stackblur-canvas": { - "version": "2.5.0" - }, - "static-eval": { - "version": "2.1.0", - "requires": { - "escodegen": "^1.11.1" - }, - "dependencies": { - "escodegen": { - "version": "1.14.3", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "levn": { - "version": "0.3.0", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2" - }, - "source-map": { - "version": "0.6.1", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "static-module": { - "version": "3.0.4", - "requires": { - "acorn-node": "^1.3.0", - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "^1.11.1", - "has": "^1.0.1", - "magic-string": "0.25.1", - "merge-source-map": "1.0.4", - "object-inspect": "^1.6.0", - "readable-stream": "~2.3.3", - "scope-analyzer": "^2.0.1", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.5", - "through2": "~2.0.3" - }, - "dependencies": { - "escodegen": { - "version": "1.14.3", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "levn": { - "version": "0.3.0", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2" - }, - "source-map": { - "version": "0.6.1", - "optional": true - }, - "through2": { - "version": "2.0.5", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "type-check": { - "version": "0.3.2", - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "stencil-wormhole": { - "version": "3.4.1" - }, - "stream-combiner2": { - "version": "1.1.1", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "string_decoder": { - "version": "1.1.1", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-argv": { - "version": "0.3.1", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "dev": true - }, - "strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-mod": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", - "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==" - }, - "style-search": { - "version": "0.1.0", - "dev": true - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "stylelint": { - "version": "14.14.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz", - "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^7.0.1", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.0", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.25.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.17", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", - "svg-tags": "^1.0.0", - "table": "^6.8.0", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "2.0.0", - "dev": true - }, - "global-modules": { - "version": "2.0.0", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "meow": { - "version": "9.0.0", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - } - } - }, - "stylelint-config-recommended": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", - "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", - "dev": true, - "requires": {} - }, - "stylelint-config-standard": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", - "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^9.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-tags": { - "version": "1.0.0", - "dev": true - }, - "svg-to-pdfkit": { - "version": "0.1.8", - "requires": { - "pdfkit": ">=0.8.1" - } - }, - "svgo": { - "version": "2.8.0", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "dev": true - }, - "css-select": { - "version": "4.1.3", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - } - }, - "css-what": { - "version": "5.0.1", - "dev": true - }, - "dom-serializer": { - "version": "1.3.2", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "dev": true - }, - "domhandler": { - "version": "4.2.0", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.7.0", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "nth-check": { - "version": "2.0.1", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4" - }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - } - } - }, - "tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", - "dev": true, - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "dependencies": { - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "quick-lru": { - "version": "5.1.1", - "dev": true - } - } - }, - "temp-dir": { - "version": "2.0.0", - "dev": true - }, - "tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, - "requires": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true - } - } - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "text-extensions": { - "version": "1.9.0", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "dev": true - }, - "thenby": { - "version": "1.3.4", - "dev": true - }, - "through": { - "version": "2.3.8" - }, - "through2": { - "version": "4.0.2", - "dev": true, - "requires": { - "readable-stream": "3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "tiny-inflate": { - "version": "1.0.3" - }, - "tinyqueue": { - "version": "2.0.3" - }, - "tmp": { - "version": "0.0.33", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.0.0", - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "tr46": { - "version": "2.1.0", - "requires": { - "punycode": "^2.1.1" - } - }, - "traverse": { - "version": "0.6.6", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "dev": true - }, - "ts-node": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", - "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - } - } - }, - "tslib": { - "version": "1.13.0", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type": { - "version": "1.2.0" - }, - "type-check": { - "version": "0.4.0", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.18.1", - "dev": true - }, - "typedarray": { - "version": "0.0.6" - }, - "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true - }, - "uglify-js": { - "version": "3.14.5", - "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true - }, - "unicode-properties": { - "version": "1.3.1", - "requires": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" - } - }, - "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true - }, - "unicode-trie": { - "version": "2.0.0", - "requires": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "unique-string": { - "version": "2.0.0", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "dev": true - }, - "universalify": { - "version": "0.1.2" - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-join": { - "version": "4.0.1", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2" - }, - "v8-compile-cache": { - "version": "2.3.0", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vite": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz", - "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==", - "dev": true, - "requires": { - "esbuild": "^0.14.14", - "fsevents": "~2.3.2", - "postcss": "^8.4.6", - "resolve": "^1.22.0", - "rollup": "^2.59.0" - } - }, - "vite-plugin-pwa": { - "version": "0.12.8", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.12.8.tgz", - "integrity": "sha512-pSiFHmnJGMQJJL8aJzQ8SaraZBSBPMGvGUkCNzheIq9UQCEk/eP3UmANNmS9eupuhIpTK8AdxTOHcaMcAqAbCA==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "fast-glob": "^3.2.11", - "pretty-bytes": "^6.0.0", - "rollup": "^2.75.7", - "workbox-build": "^6.5.3", - "workbox-window": "^6.5.3" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-keyname": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz", - "integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==" - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "wavesurfer.js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-6.3.0.tgz", - "integrity": "sha512-x7efObHMHY3nwqWzIC0yeZTo0u/aC9T5Av6KhSdhTlsgtKdTG7JAE3mNqnYBXUjq0yGYfTB9F85/pks9830Vjw==" - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "6.1.0" - }, - "whatwg-encoding": { - "version": "1.0.5", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0" - }, - "whatwg-url": { - "version": "8.7.0", - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "1.3.1", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "wmf": { - "version": "1.0.2" - }, - "word": { - "version": "0.4.0", - "requires": { - "cfb": "^1.2.0", - "jsdom": "^16.2.2" - } - }, - "word-wrap": { - "version": "1.2.3" - }, - "wordwrap": { - "version": "1.0.0", - "dev": true - }, - "workbox-background-sync": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", - "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", - "dev": true, - "requires": { - "idb": "^7.0.1", - "workbox-core": "6.5.4" - } - }, - "workbox-broadcast-update": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", - "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", - "dev": true, - "requires": { - "workbox-core": "6.5.4" - } - }, - "workbox-build": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", - "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", - "dev": true, - "requires": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.5.4", - "workbox-broadcast-update": "6.5.4", - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-google-analytics": "6.5.4", - "workbox-navigation-preload": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-range-requests": "6.5.4", - "workbox-recipes": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4", - "workbox-streams": "6.5.4", - "workbox-sw": "6.5.4", - "workbox-window": "6.5.4" - }, - "dependencies": { - "@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dev": true, - "requires": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - } - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - }, - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "requires": { - "whatwg-url": "^7.0.0" - } - }, - "tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "workbox-cacheable-response": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", - "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", - "dev": true, - "requires": { - "workbox-core": "6.5.4" - } - }, - "workbox-core": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", - "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==", - "dev": true - }, - "workbox-expiration": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", - "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", - "dev": true, - "requires": { - "idb": "^7.0.1", - "workbox-core": "6.5.4" - } - }, - "workbox-google-analytics": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", - "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", - "dev": true, - "requires": { - "workbox-background-sync": "6.5.4", - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" - } - }, - "workbox-navigation-preload": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", - "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", - "dev": true, - "requires": { - "workbox-core": "6.5.4" - } - }, - "workbox-precaching": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", - "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", - "dev": true, - "requires": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" - } - }, - "workbox-range-requests": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", - "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", - "dev": true, - "requires": { - "workbox-core": "6.5.4" - } - }, - "workbox-recipes": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", - "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", - "dev": true, - "requires": { - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" - } - }, - "workbox-routing": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", - "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", - "dev": true, - "requires": { - "workbox-core": "6.5.4" - } - }, - "workbox-strategies": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", - "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", - "dev": true, - "requires": { - "workbox-core": "6.5.4" - } - }, - "workbox-streams": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", - "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", - "dev": true, - "requires": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4" - } - }, - "workbox-sw": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", - "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==", - "dev": true - }, - "workbox-window": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", - "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", - "dev": true, - "requires": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.4" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "7.5.5", - "requires": {} - }, - "xlsx": { - "version": "0.17.2", - "requires": { - "adler-32": "~1.2.0", - "cfb": "^1.1.4", - "codepage": "~1.15.0", - "commander": "~2.17.1", - "crc-32": "~1.2.0", - "exit-on-epipe": "~1.0.1", - "fflate": "^0.3.8", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.4.0" - }, - "dependencies": { - "commander": { - "version": "2.17.1" - } - } - }, - "xml-formatter": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz", - "integrity": "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw==", - "requires": { - "xml-parser-xo": "^3.2.0" - } - }, - "xml-name-validator": { - "version": "3.0.0" - }, - "xml-parser-xo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz", - "integrity": "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg==" - }, - "xmlchars": { - "version": "2.2.0" - }, - "xmldoc": { - "version": "1.1.2", - "requires": { - "sax": "^1.2.1" - } - }, - "xtend": { - "version": "4.0.2" - }, - "y18n": { - "version": "5.0.5", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.7", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 114e342a..1b8cdff8 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "castopod-host", + "name": "castopod", "version": "1.1.2", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, @@ -12,7 +12,7 @@ "dev": "vite", "build": "tsc && vite build", "serve": "vite preview", - "build:static": "npm run build:icons && npm run build:svg", + "build:static": "pnpm run build:icons && pnpm run build:svg", "build:icons": "svgo -f app/Resources/icons -o public/assets/icons -r --config=./.svgo.icons.js", "build:svg": "svgo -f app/Resources/images -o public/assets/images -r --config=./.svgo.js", "lint": "eslint --ext js,ts app/Resources", @@ -27,68 +27,71 @@ "prepare": "is-ci || husky install" }, "dependencies": { - "@amcharts/amcharts4": "^4.10.29", - "@amcharts/amcharts4-geodata": "^4.1.23", - "@codemirror/commands": "^6.1.2", - "@codemirror/lang-xml": "^6.0.0", - "@codemirror/language": "^6.2.1", - "@codemirror/state": "^6.1.2", - "@floating-ui/dom": "^1.0.2", + "@amcharts/amcharts4": "^4.10.34", + "@amcharts/amcharts4-geodata": "^4.1.26", + "@codemirror/commands": "^6.2.1", + "@codemirror/lang-xml": "^6.0.2", + "@codemirror/language": "^6.6.0", + "@codemirror/state": "^6.2.0", + "@codemirror/view": "^6.9.1", + "@floating-ui/dom": "^1.2.1", "@github/clipboard-copy-element": "^1.1.2", "@github/hotkey": "^2.0.1", "@github/markdown-toolbar-element": "^2.1.1", - "@github/time-elements": "^3.1.4", - "@tailwindcss/nesting": "^0.0.0-insiders.565cd3e", - "@vime/core": "^5.3.3", - "choices.js": "^10.1.0", + "@github/time-elements": "^4.0.0", + "@tailwindcss/nesting": "0.0.0-insiders.565cd3e", + "@vime/core": "^5.4.0", + "choices.js": "^10.2.0", "codemirror": "^6.0.1", "flatpickr": "^4.6.13", - "leaflet": "^1.9.2", + "leaflet": "^1.9.3", "leaflet.markercluster": "^1.5.3", - "lit": "^2.4.0", - "marked": "^4.1.1", - "wavesurfer.js": "^6.3.0", - "xml-formatter": "^2.6.1" + "lit": "^2.6.1", + "marked": "^4.2.12", + "wavesurfer.js": "^6.4.0", + "xml-formatter": "^3.2.0" }, "devDependencies": { - "@commitlint/cli": "^17.1.2", - "@commitlint/config-conventional": "^17.1.0", - "@semantic-release/changelog": "^6.0.1", + "@commitlint/cli": "^17.4.4", + "@commitlint/config-conventional": "^17.4.4", + "@semantic-release/changelog": "^6.0.2", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", - "@semantic-release/gitlab": "^9.4.2", + "@semantic-release/gitlab": "^11.0.1", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.2", - "@tailwindcss/typography": "^0.5.7", - "@types/leaflet": "^1.9.0", - "@types/marked": "^4.0.7", + "@tailwindcss/typography": "^0.5.9", + "@types/leaflet": "^1.9.1", + "@types/marked": "^4.0.8", "@types/wavesurfer.js": "^6.0.3", - "@typescript-eslint/eslint-plugin": "^5.40.0", - "@typescript-eslint/parser": "^5.40.0", + "@typescript-eslint/eslint-plugin": "^5.53.0", + "@typescript-eslint/parser": "^5.53.0", "all-contributors-cli": "^6.24.0", + "commitizen": "^4.3.0", "cross-env": "^7.0.3", - "cssnano": "^5.1.13", + "cssnano": "^5.1.15", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.25.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.34.0", + "eslint-config-prettier": "^8.6.0", "eslint-plugin-prettier": "^4.2.1", - "husky": "^8.0.1", + "husky": "^8.0.3", "is-ci": "^3.0.1", - "lint-staged": "^13.0.3", - "postcss-import": "^15.0.0", - "postcss-nesting": "^10.2.0", - "postcss-preset-env": "^7.8.2", + "lint-staged": "^13.1.2", + "postcss": "^8.4.21", + "postcss-import": "^15.1.0", + "postcss-nesting": "^11.2.1", + "postcss-preset-env": "^8.0.1", "postcss-reporter": "^7.0.5", - "prettier": "2.7.1", - "prettier-plugin-organize-imports": "^3.1.1", - "semantic-release": "^19.0.5", - "stylelint": "^14.14.0", - "stylelint-config-standard": "^29.0.0", - "svgo": "^2.8.0", - "tailwindcss": "^3.1.8", - "typescript": "^4.8.4", - "vite": "2.8.6", - "vite-plugin-pwa": "^0.12.8", + "prettier": "2.8.4", + "prettier-plugin-organize-imports": "^3.2.2", + "semantic-release": "^20.1.0", + "stylelint": "^15.2.0", + "stylelint-config-standard": "^30.0.1", + "svgo": "^3.0.2", + "tailwindcss": "^3.2.7", + "typescript": "^4.9.5", + "vite": "4.1.3", + "vite-plugin-pwa": "^0.14.4", "workbox-build": "^6.5.4", "workbox-core": "^6.5.4", "workbox-routing": "^6.5.4", diff --git a/phpunit.xml.dist b/phpunit.xml.dist index dcd86923..459e5a6a 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,56 +1,45 @@ - - - - ./app - - - ./app/Views - ./app/Config/Routes.php - - - - - - - - - - - ./tests - - - - - - - - - - - - - - - - - - - - - - - - + + + + ./app + + + ./app/Views + ./app/Config/Routes.php + + + + + + + + + + + ./tests + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..ad6a2cca --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,13125 @@ +lockfileVersion: 5.4 + +specifiers: + "@amcharts/amcharts4": ^4.10.34 + "@amcharts/amcharts4-geodata": ^4.1.26 + "@codemirror/commands": ^6.2.1 + "@codemirror/lang-xml": ^6.0.2 + "@codemirror/language": ^6.6.0 + "@codemirror/state": ^6.2.0 + "@codemirror/view": ^6.9.1 + "@commitlint/cli": ^17.4.4 + "@commitlint/config-conventional": ^17.4.4 + "@floating-ui/dom": ^1.2.1 + "@github/clipboard-copy-element": ^1.1.2 + "@github/hotkey": ^2.0.1 + "@github/markdown-toolbar-element": ^2.1.1 + "@github/time-elements": ^4.0.0 + "@semantic-release/changelog": ^6.0.2 + "@semantic-release/exec": ^6.0.3 + "@semantic-release/git": ^10.0.1 + "@semantic-release/gitlab": ^11.0.1 + "@tailwindcss/forms": ^0.5.3 + "@tailwindcss/line-clamp": ^0.4.2 + "@tailwindcss/nesting": 0.0.0-insiders.565cd3e + "@tailwindcss/typography": ^0.5.9 + "@types/leaflet": ^1.9.1 + "@types/marked": ^4.0.8 + "@types/wavesurfer.js": ^6.0.3 + "@typescript-eslint/eslint-plugin": ^5.53.0 + "@typescript-eslint/parser": ^5.53.0 + "@vime/core": ^5.4.0 + all-contributors-cli: ^6.24.0 + choices.js: ^10.2.0 + codemirror: ^6.0.1 + commitizen: ^4.3.0 + cross-env: ^7.0.3 + cssnano: ^5.1.15 + cz-conventional-changelog: ^3.3.0 + eslint: ^8.34.0 + eslint-config-prettier: ^8.6.0 + eslint-plugin-prettier: ^4.2.1 + flatpickr: ^4.6.13 + husky: ^8.0.3 + is-ci: ^3.0.1 + leaflet: ^1.9.3 + leaflet.markercluster: ^1.5.3 + lint-staged: ^13.1.2 + lit: ^2.6.1 + marked: ^4.2.12 + postcss: ^8.4.21 + postcss-import: ^15.1.0 + postcss-nesting: ^11.2.1 + postcss-preset-env: ^8.0.1 + postcss-reporter: ^7.0.5 + prettier: 2.8.4 + prettier-plugin-organize-imports: ^3.2.2 + semantic-release: ^20.1.0 + stylelint: ^15.2.0 + stylelint-config-standard: ^30.0.1 + svgo: ^3.0.2 + tailwindcss: ^3.2.7 + typescript: ^4.9.5 + vite: 4.1.3 + vite-plugin-pwa: ^0.14.4 + wavesurfer.js: ^6.4.0 + workbox-build: ^6.5.4 + workbox-core: ^6.5.4 + workbox-routing: ^6.5.4 + workbox-strategies: ^6.5.4 + xml-formatter: ^3.2.0 + +dependencies: + "@amcharts/amcharts4": 4.10.34 + "@amcharts/amcharts4-geodata": 4.1.26 + "@codemirror/commands": 6.2.1 + "@codemirror/lang-xml": 6.0.2_@codemirror+view@6.9.1 + "@codemirror/language": 6.6.0 + "@codemirror/state": 6.2.0 + "@codemirror/view": 6.9.1 + "@floating-ui/dom": 1.2.1 + "@github/clipboard-copy-element": 1.1.2 + "@github/hotkey": 2.0.1 + "@github/markdown-toolbar-element": 2.1.1 + "@github/time-elements": 4.0.0 + "@tailwindcss/nesting": 0.0.0-insiders.565cd3e_postcss@8.4.21 + "@vime/core": 5.4.0 + choices.js: 10.2.0 + codemirror: 6.0.1 + flatpickr: 4.6.13 + leaflet: 1.9.3 + leaflet.markercluster: 1.5.3_leaflet@1.9.3 + lit: 2.6.1 + marked: 4.2.12 + wavesurfer.js: 6.4.0 + xml-formatter: 3.2.0 + +devDependencies: + "@commitlint/cli": 17.4.4 + "@commitlint/config-conventional": 17.4.4 + "@semantic-release/changelog": 6.0.2_semantic-release@20.1.0 + "@semantic-release/exec": 6.0.3_semantic-release@20.1.0 + "@semantic-release/git": 10.0.1_semantic-release@20.1.0 + "@semantic-release/gitlab": 11.0.1_semantic-release@20.1.0 + "@tailwindcss/forms": 0.5.3_tailwindcss@3.2.7 + "@tailwindcss/line-clamp": 0.4.2_tailwindcss@3.2.7 + "@tailwindcss/typography": 0.5.9_tailwindcss@3.2.7 + "@types/leaflet": 1.9.1 + "@types/marked": 4.0.8 + "@types/wavesurfer.js": 6.0.3 + "@typescript-eslint/eslint-plugin": 5.53.0_ny4s7qc6yg74faf3d6xty2ofzy + "@typescript-eslint/parser": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm + all-contributors-cli: 6.24.0 + commitizen: 4.3.0 + cross-env: 7.0.3 + cssnano: 5.1.15_postcss@8.4.21 + cz-conventional-changelog: 3.3.0 + eslint: 8.34.0 + eslint-config-prettier: 8.6.0_eslint@8.34.0 + eslint-plugin-prettier: 4.2.1_u5wnrdwibbfomslmnramz52buy + husky: 8.0.3 + is-ci: 3.0.1 + lint-staged: 13.1.2 + postcss: 8.4.21 + postcss-import: 15.1.0_postcss@8.4.21 + postcss-nesting: 11.2.1_postcss@8.4.21 + postcss-preset-env: 8.0.1_postcss@8.4.21 + postcss-reporter: 7.0.5_postcss@8.4.21 + prettier: 2.8.4 + prettier-plugin-organize-imports: 3.2.2_silln3pw57har7jydmecgzoypa + semantic-release: 20.1.0 + stylelint: 15.2.0 + stylelint-config-standard: 30.0.1_stylelint@15.2.0 + svgo: 3.0.2 + tailwindcss: 3.2.7_postcss@8.4.21 + typescript: 4.9.5 + vite: 4.1.3 + vite-plugin-pwa: 0.14.4_rcpzravakhu7gk56p6427hsr2y + workbox-build: 6.5.4 + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + +packages: + /@amcharts/amcharts4-geodata/4.1.26: + resolution: + { + integrity: sha512-QbApahAJyKnt4kBfg93gmi4IIwV+B0ZITBL+e0X1vCYC/r2WrRTzojzUlbhihn0r5VI7tNqswvfWRms5jTfrxQ==, + } + dev: false + + /@amcharts/amcharts4/4.10.34: + resolution: + { + integrity: sha512-v4y72nepV/GXEF0UaT7Yl3VuFCwRyCB72+Zo55UpnXCGGukH+hXwFDEBoFav+zF0BDna6/JrCp4S7OkoWRWgNQ==, + } + dependencies: + "@babel/runtime": 7.21.0 + core-js: 3.28.0 + d3-force: 3.0.0 + d3-geo: 3.1.0 + d3-geo-projection: 4.0.0 + d3-selection: 3.0.0 + d3-transition: 3.0.1_d3-selection@3.0.0 + pdfmake: 0.2.7 + polylabel: 1.1.0 + raf: 3.4.1 + regression: 2.0.1 + rgbcolor: 1.0.1 + stackblur-canvas: 2.5.0 + tslib: 2.5.0 + xlsx: 0.18.5 + dev: false + + /@ampproject/remapping/2.2.0: + resolution: + { + integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, + } + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/gen-mapping": 0.1.1 + "@jridgewell/trace-mapping": 0.3.17 + dev: true + + /@apideck/better-ajv-errors/0.3.6_ajv@8.12.0: + resolution: + { + integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==, + } + engines: { node: ">=10" } + peerDependencies: + ajv: ">=8" + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + + /@babel/code-frame/7.18.6: + resolution: + { + integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/highlight": 7.18.6 + dev: true + + /@babel/compat-data/7.21.0: + resolution: + { + integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==, + } + engines: { node: ">=6.9.0" } + dev: true + + /@babel/core/7.21.0: + resolution: + { + integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@ampproject/remapping": 2.2.0 + "@babel/code-frame": 7.18.6 + "@babel/generator": 7.21.1 + "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-module-transforms": 7.21.0 + "@babel/helpers": 7.21.0 + "@babel/parser": 7.21.1 + "@babel/template": 7.20.7 + "@babel/traverse": 7.21.0 + "@babel/types": 7.21.0 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.21.1: + resolution: + { + integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + "@jridgewell/gen-mapping": 0.3.2 + "@jridgewell/trace-mapping": 0.3.17 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: + { + integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + resolution: + { + integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-explode-assignable-expression": 7.18.6 + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/compat-data": 7.21.0 + "@babel/core": 7.21.0 + "@babel/helper-validator-option": 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-annotate-as-pure": 7.18.6 + "@babel/helper-environment-visitor": 7.18.9 + "@babel/helper-function-name": 7.21.0 + "@babel/helper-member-expression-to-functions": 7.21.0 + "@babel/helper-optimise-call-expression": 7.18.6 + "@babel/helper-replace-supers": 7.20.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.20.0 + "@babel/helper-split-export-declaration": 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-annotate-as-pure": 7.18.6 + regexpu-core: 5.3.1 + dev: true + + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==, + } + peerDependencies: + "@babel/core": ^7.4.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: + { + integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, + } + engines: { node: ">=6.9.0" } + dev: true + + /@babel/helper-explode-assignable-expression/7.18.6: + resolution: + { + integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-function-name/7.21.0: + resolution: + { + integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/template": 7.20.7 + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: + { + integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-member-expression-to-functions/7.21.0: + resolution: + { + integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: + { + integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-module-transforms/7.21.0: + resolution: + { + integrity: sha512-eD/JQ21IG2i1FraJnTMbUarAUkA7G988ofehG5MDCRXaUU91rEBJuCeSoou2Sk1y4RbLYXzqEg1QLwEmRU4qcQ==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-environment-visitor": 7.18.9 + "@babel/helper-module-imports": 7.18.6 + "@babel/helper-simple-access": 7.20.2 + "@babel/helper-split-export-declaration": 7.18.6 + "@babel/helper-validator-identifier": 7.19.1 + "@babel/template": 7.20.7 + "@babel/traverse": 7.21.0 + "@babel/types": 7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression/7.18.6: + resolution: + { + integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-plugin-utils/7.20.2: + resolution: + { + integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==, + } + engines: { node: ">=6.9.0" } + dev: true + + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.0: + resolution: + { + integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-annotate-as-pure": 7.18.6 + "@babel/helper-environment-visitor": 7.18.9 + "@babel/helper-wrap-function": 7.20.5 + "@babel/types": 7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers/7.20.7: + resolution: + { + integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-environment-visitor": 7.18.9 + "@babel/helper-member-expression-to-functions": 7.21.0 + "@babel/helper-optimise-call-expression": 7.18.6 + "@babel/template": 7.20.7 + "@babel/traverse": 7.21.0 + "@babel/types": 7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access/7.20.2: + resolution: + { + integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + resolution: + { + integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: + { + integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: + { + integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, + } + engines: { node: ">=6.9.0" } + dev: true + + /@babel/helper-validator-identifier/7.19.1: + resolution: + { + integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, + } + engines: { node: ">=6.9.0" } + dev: true + + /@babel/helper-validator-option/7.21.0: + resolution: + { + integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==, + } + engines: { node: ">=6.9.0" } + dev: true + + /@babel/helper-wrap-function/7.20.5: + resolution: + { + integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-function-name": 7.21.0 + "@babel/template": 7.20.7 + "@babel/traverse": 7.21.0 + "@babel/types": 7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers/7.21.0: + resolution: + { + integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/template": 7.20.7 + "@babel/traverse": 7.21.0 + "@babel/types": 7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: + { + integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-validator-identifier": 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.21.1: + resolution: + { + integrity: sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==, + } + engines: { node: ">=6.0.0" } + hasBin: true + dependencies: + "@babel/types": 7.21.0 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.13.0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-skip-transparent-expression-wrappers": 7.20.0 + "@babel/plugin-proposal-optional-chaining": 7.21.0_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-environment-visitor": 7.18.9 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-remap-async-to-generator": 7.18.9_@babel+core@7.21.0 + "@babel/plugin-syntax-async-generators": 7.8.4_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-create-class-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.12.0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-create-class-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-class-static-block": 7.14.5_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-dynamic-import": 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.0: + resolution: + { + integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-export-namespace-from": 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-json-strings": 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-numeric-separator": 7.10.4_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/compat-data": 7.21.0 + "@babel/core": 7.21.0 + "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-object-rest-spread": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-transform-parameters": 7.20.7_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-optional-catch-binding": 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-skip-transparent-expression-wrappers": 7.20.0 + "@babel/plugin-syntax-optional-chaining": 7.8.3_@babel+core@7.21.0 + dev: true + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-create-class-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-annotate-as-pure": 7.18.6 + "@babel/helper-create-class-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-syntax-private-property-in-object": 7.14.5_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==, + } + engines: { node: ">=4" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-create-regexp-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.0: + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.0: + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.0: + resolution: + { + integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.0: + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.0: + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.0: + resolution: + { + integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.0: + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-module-imports": 7.18.6 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-remap-async-to-generator": 7.18.9_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-annotate-as-pure": 7.18.6 + "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-environment-visitor": 7.18.9 + "@babel/helper-function-name": 7.21.0 + "@babel/helper-optimise-call-expression": 7.18.6 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-replace-supers": 7.20.7 + "@babel/helper-split-export-declaration": 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/template": 7.20.7 + dev: true + + /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-create-regexp-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.0: + resolution: + { + integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-builder-binary-assignment-operator-visitor": 7.18.9 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.0: + resolution: + { + integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-function-name": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.0: + resolution: + { + integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.0: + resolution: + { + integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-module-transforms": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.20.11_@babel+core@7.21.0: + resolution: + { + integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-module-transforms": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-simple-access": 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.0: + resolution: + { + integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-hoist-variables": 7.18.6 + "@babel/helper-module-transforms": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-validator-identifier": 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-module-transforms": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.0: + resolution: + { + integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-create-regexp-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-replace-supers": 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.0: + resolution: + { + integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + regenerator-transform: 0.15.1 + dev: true + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.0: + resolution: + { + integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-skip-transparent-expression-wrappers": 7.20.0 + dev: true + + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.0: + resolution: + { + integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.0: + resolution: + { + integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.0: + resolution: + { + integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.0: + resolution: + { + integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-create-regexp-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + dev: true + + /@babel/preset-env/7.20.2_@babel+core@7.21.0: + resolution: + { + integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/compat-data": 7.21.0 + "@babel/core": 7.21.0 + "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/helper-validator-option": 7.21.0 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-proposal-async-generator-functions": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-proposal-class-properties": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-proposal-class-static-block": 7.21.0_@babel+core@7.21.0 + "@babel/plugin-proposal-dynamic-import": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-proposal-export-namespace-from": 7.18.9_@babel+core@7.21.0 + "@babel/plugin-proposal-json-strings": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-proposal-logical-assignment-operators": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-proposal-nullish-coalescing-operator": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-proposal-numeric-separator": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-proposal-object-rest-spread": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-proposal-optional-catch-binding": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-proposal-optional-chaining": 7.21.0_@babel+core@7.21.0 + "@babel/plugin-proposal-private-methods": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-proposal-private-property-in-object": 7.21.0_@babel+core@7.21.0 + "@babel/plugin-proposal-unicode-property-regex": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-syntax-async-generators": 7.8.4_@babel+core@7.21.0 + "@babel/plugin-syntax-class-properties": 7.12.13_@babel+core@7.21.0 + "@babel/plugin-syntax-class-static-block": 7.14.5_@babel+core@7.21.0 + "@babel/plugin-syntax-dynamic-import": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-export-namespace-from": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-import-assertions": 7.20.0_@babel+core@7.21.0 + "@babel/plugin-syntax-json-strings": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4_@babel+core@7.21.0 + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-numeric-separator": 7.10.4_@babel+core@7.21.0 + "@babel/plugin-syntax-object-rest-spread": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-optional-catch-binding": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-optional-chaining": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-private-property-in-object": 7.14.5_@babel+core@7.21.0 + "@babel/plugin-syntax-top-level-await": 7.14.5_@babel+core@7.21.0 + "@babel/plugin-transform-arrow-functions": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-transform-async-to-generator": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-transform-block-scoped-functions": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-block-scoping": 7.21.0_@babel+core@7.21.0 + "@babel/plugin-transform-classes": 7.21.0_@babel+core@7.21.0 + "@babel/plugin-transform-computed-properties": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-transform-destructuring": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-transform-dotall-regex": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-duplicate-keys": 7.18.9_@babel+core@7.21.0 + "@babel/plugin-transform-exponentiation-operator": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-for-of": 7.21.0_@babel+core@7.21.0 + "@babel/plugin-transform-function-name": 7.18.9_@babel+core@7.21.0 + "@babel/plugin-transform-literals": 7.18.9_@babel+core@7.21.0 + "@babel/plugin-transform-member-expression-literals": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-modules-amd": 7.20.11_@babel+core@7.21.0 + "@babel/plugin-transform-modules-commonjs": 7.20.11_@babel+core@7.21.0 + "@babel/plugin-transform-modules-systemjs": 7.20.11_@babel+core@7.21.0 + "@babel/plugin-transform-modules-umd": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-named-capturing-groups-regex": 7.20.5_@babel+core@7.21.0 + "@babel/plugin-transform-new-target": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-object-super": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-parameters": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-transform-property-literals": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-regenerator": 7.20.5_@babel+core@7.21.0 + "@babel/plugin-transform-reserved-words": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-shorthand-properties": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-spread": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-transform-sticky-regex": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-template-literals": 7.18.9_@babel+core@7.21.0 + "@babel/plugin-transform-typeof-symbol": 7.18.9_@babel+core@7.21.0 + "@babel/plugin-transform-unicode-escapes": 7.18.10_@babel+core@7.21.0 + "@babel/plugin-transform-unicode-regex": 7.18.6_@babel+core@7.21.0 + "@babel/preset-modules": 0.1.5_@babel+core@7.21.0 + "@babel/types": 7.21.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.0 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.0 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.0 + core-js-compat: 3.28.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules/0.1.5_@babel+core@7.21.0: + resolution: + { + integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-plugin-utils": 7.20.2 + "@babel/plugin-proposal-unicode-property-regex": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-transform-dotall-regex": 7.18.6_@babel+core@7.21.0 + "@babel/types": 7.21.0 + esutils: 2.0.3 + dev: true + + /@babel/regjsgen/0.8.0: + resolution: + { + integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==, + } + dev: true + + /@babel/runtime/7.21.0: + resolution: + { + integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==, + } + engines: { node: ">=6.9.0" } + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template/7.20.7: + resolution: + { + integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/code-frame": 7.18.6 + "@babel/parser": 7.21.1 + "@babel/types": 7.21.0 + dev: true + + /@babel/traverse/7.21.0: + resolution: + { + integrity: sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/code-frame": 7.18.6 + "@babel/generator": 7.21.1 + "@babel/helper-environment-visitor": 7.18.9 + "@babel/helper-function-name": 7.21.0 + "@babel/helper-hoist-variables": 7.18.6 + "@babel/helper-split-export-declaration": 7.18.6 + "@babel/parser": 7.21.1 + "@babel/types": 7.21.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.21.0: + resolution: + { + integrity: sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-string-parser": 7.19.4 + "@babel/helper-validator-identifier": 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@codemirror/autocomplete/6.4.2_dtwlkgx6567fllxi7sgvnep6hy: + resolution: + { + integrity: sha512-8WE2xp+D0MpWEv5lZ6zPW1/tf4AGb358T5GWYiKEuCP8MvFfT3tH2mIF9Y2yr2e3KbHuSvsVhosiEyqCpiJhZQ==, + } + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + dependencies: + "@codemirror/language": 6.6.0 + "@codemirror/state": 6.2.0 + "@codemirror/view": 6.9.1 + "@lezer/common": 1.0.2 + dev: false + + /@codemirror/commands/6.2.1: + resolution: + { + integrity: sha512-FFiNKGuHA5O8uC6IJE5apI5rT9gyjlw4whqy4vlcX0wE/myxL6P1s0upwDhY4HtMWLOwzwsp0ap3bjdQhvfDOA==, + } + dependencies: + "@codemirror/language": 6.6.0 + "@codemirror/state": 6.2.0 + "@codemirror/view": 6.9.1 + "@lezer/common": 1.0.2 + dev: false + + /@codemirror/lang-xml/6.0.2_@codemirror+view@6.9.1: + resolution: + { + integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, + } + dependencies: + "@codemirror/autocomplete": 6.4.2_dtwlkgx6567fllxi7sgvnep6hy + "@codemirror/language": 6.6.0 + "@codemirror/state": 6.2.0 + "@lezer/common": 1.0.2 + "@lezer/xml": 1.0.1 + transitivePeerDependencies: + - "@codemirror/view" + dev: false + + /@codemirror/language/6.6.0: + resolution: + { + integrity: sha512-cwUd6lzt3MfNYOobdjf14ZkLbJcnv4WtndYaoBkbor/vF+rCNguMPK0IRtvZJG4dsWiaWPcK8x1VijhvSxnstg==, + } + dependencies: + "@codemirror/state": 6.2.0 + "@codemirror/view": 6.9.1 + "@lezer/common": 1.0.2 + "@lezer/highlight": 1.1.3 + "@lezer/lr": 1.3.3 + style-mod: 4.0.0 + dev: false + + /@codemirror/lint/6.1.1: + resolution: + { + integrity: sha512-e+M543x0NVHGayNHQzLP4XByJsvbu/ojY6+0VF2Y4Uu66Rt1nADuxNflZwECLf7gS009smIsptSUa6bUj/U/rw==, + } + dependencies: + "@codemirror/state": 6.2.0 + "@codemirror/view": 6.9.1 + crelt: 1.0.5 + dev: false + + /@codemirror/search/6.2.3: + resolution: + { + integrity: sha512-V9n9233lopQhB1dyjsBK2Wc1i+8hcCqxl1wQ46c5HWWLePoe4FluV3TGHoZ04rBRlGjNyz9DTmpJErig8UE4jw==, + } + dependencies: + "@codemirror/state": 6.2.0 + "@codemirror/view": 6.9.1 + crelt: 1.0.5 + dev: false + + /@codemirror/state/6.2.0: + resolution: + { + integrity: sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==, + } + dev: false + + /@codemirror/view/6.9.1: + resolution: + { + integrity: sha512-bzfSjJn9dAADVpabLKWKNmMG4ibyTV2e3eOGowjElNPTdTkSbi6ixPYHm2u0ADcETfKsi2/R84Rkmi91dH9yEg==, + } + dependencies: + "@codemirror/state": 6.2.0 + style-mod: 4.0.0 + w3c-keyname: 2.2.6 + dev: false + + /@colors/colors/1.5.0: + resolution: + { + integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, + } + engines: { node: ">=0.1.90" } + requiresBuild: true + dev: true + optional: true + + /@commitlint/cli/17.4.4: + resolution: + { + integrity: sha512-HwKlD7CPVMVGTAeFZylVNy14Vm5POVY0WxPkZr7EXLC/os0LH/obs6z4HRvJtH/nHCMYBvUBQhGwnufKfTjd5g==, + } + engines: { node: ">=v14" } + hasBin: true + dependencies: + "@commitlint/format": 17.4.4 + "@commitlint/lint": 17.4.4 + "@commitlint/load": 17.4.4 + "@commitlint/read": 17.4.4 + "@commitlint/types": 17.4.4 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.1 + transitivePeerDependencies: + - "@swc/core" + - "@swc/wasm" + dev: true + + /@commitlint/config-conventional/17.4.4: + resolution: + { + integrity: sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==, + } + engines: { node: ">=v14" } + dependencies: + conventional-changelog-conventionalcommits: 5.0.0 + dev: true + + /@commitlint/config-validator/17.4.4: + resolution: + { + integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/types": 17.4.4 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure/17.4.4: + resolution: + { + integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/types": 17.4.4 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule/17.4.0: + resolution: + { + integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==, + } + engines: { node: ">=v14" } + dev: true + + /@commitlint/format/17.4.4: + resolution: + { + integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/types": 17.4.4 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored/17.4.4: + resolution: + { + integrity: sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/types": 17.4.4 + semver: 7.3.8 + dev: true + + /@commitlint/lint/17.4.4: + resolution: + { + integrity: sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/is-ignored": 17.4.4 + "@commitlint/parse": 17.4.4 + "@commitlint/rules": 17.4.4 + "@commitlint/types": 17.4.4 + dev: true + + /@commitlint/load/17.4.4: + resolution: + { + integrity: sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/config-validator": 17.4.4 + "@commitlint/execute-rule": 17.4.0 + "@commitlint/resolve-extends": 17.4.4 + "@commitlint/types": 17.4.4 + "@types/node": 18.14.0 + chalk: 4.1.2 + cosmiconfig: 8.0.0 + cosmiconfig-typescript-loader: 4.3.0_ipkhww4xc5z2tt2x53vp2mt2be + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1_tncu2ai53lzgmizdedur7lbibe + typescript: 4.9.5 + transitivePeerDependencies: + - "@swc/core" + - "@swc/wasm" + dev: true + + /@commitlint/message/17.4.2: + resolution: + { + integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==, + } + engines: { node: ">=v14" } + dev: true + + /@commitlint/parse/17.4.4: + resolution: + { + integrity: sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/types": 17.4.4 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read/17.4.4: + resolution: + { + integrity: sha512-B2TvUMJKK+Svzs6eji23WXsRJ8PAD+orI44lVuVNsm5zmI7O8RSGJMvdEZEikiA4Vohfb+HevaPoWZ7PiFZ3zA==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/top-level": 17.4.0 + "@commitlint/types": 17.4.4 + fs-extra: 11.1.0 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends/17.4.4: + resolution: + { + integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/config-validator": 17.4.4 + "@commitlint/types": 17.4.4 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules/17.4.4: + resolution: + { + integrity: sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==, + } + engines: { node: ">=v14" } + dependencies: + "@commitlint/ensure": 17.4.4 + "@commitlint/message": 17.4.2 + "@commitlint/to-lines": 17.4.0 + "@commitlint/types": 17.4.4 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines/17.4.0: + resolution: + { + integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==, + } + engines: { node: ">=v14" } + dev: true + + /@commitlint/top-level/17.4.0: + resolution: + { + integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==, + } + engines: { node: ">=v14" } + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types/17.4.4: + resolution: + { + integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==, + } + engines: { node: ">=v14" } + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-support/0.8.1: + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: ">=12" } + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + dev: true + + /@csstools/cascade-layer-name-parser/1.0.1_ppok7cytzjc65mcyxmtit3wdyi: + resolution: + { + integrity: sha512-SAAi5DpgJJWkfTvWSaqkgyIsTawa83hMwKrktkj6ra2h+q6ZN57vOGZ6ySHq6RSo+CbP64fA3aPChPBRDDUgtw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.0.0 + "@csstools/css-tokenizer": ^2.0.0 + dependencies: + "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-tokenizer": 2.1.0 + dev: true + + /@csstools/color-helpers/1.0.0: + resolution: + { + integrity: sha512-tgqtiV8sU/VaWYjOB3O7PWs7HR/MmOLl2kTYRW2qSsTSEniJq7xmyAYFB1LPpXvvQcE5u2ih2dK9fyc8BnrAGQ==, + } + engines: { node: ^14 || ^16 || >=18 } + dev: true + + /@csstools/css-parser-algorithms/2.0.1_5vzy4lghjvuzkedkkk4tqwjftm: + resolution: + { + integrity: sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-tokenizer": ^2.0.0 + dependencies: + "@csstools/css-tokenizer": 2.1.0 + dev: true + + /@csstools/css-tokenizer/2.1.0: + resolution: + { + integrity: sha512-dtqFyoJBHUxGi9zPZdpCKP1xk8tq6KPHJ/NY4qWXiYo6IcSGwzk3L8x2XzZbbyOyBs9xQARoGveU2AsgLj6D2A==, + } + engines: { node: ^14 || ^16 || >=18 } + dev: true + + /@csstools/media-query-list-parser/2.0.1_ppok7cytzjc65mcyxmtit3wdyi: + resolution: + { + integrity: sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.0.0 + "@csstools/css-tokenizer": ^2.0.0 + dependencies: + "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-tokenizer": 2.1.0 + dev: true + + /@csstools/postcss-cascade-layers/3.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-dD8W98dOYNOH/yX4V4HXOhfCOnvVAg8TtsL+qCGNoKXuq5z2C/d026wGWgySgC8cajXXo/wNezS31Glj5GcqrA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /@csstools/postcss-color-function/2.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-XBoCClLyWchlYGHGlmMOa6M2UXZNrZm63HVfsvgD/z1RPm/s3+FhHyT6VkDo+OvEBPhCgn6xz4IeCu4pRctKDQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/color-helpers": 1.0.0 + "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-font-format-keywords/2.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-iKYZlIs6JsNT7NKyRjyIyezTCHLh4L4BBB3F5Nx7Dc4Z/QmBgX+YJFuUSar8IM6KclGiAUFGomXFdYxAwJydlA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-hwb-function/2.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-XijKzdxBdH2hU6IcPWmnaU85FKEF1XE5hGy0d6dQC6XznFUIRu1T4uebL3krayX40m4xIcxfCBsQm5zphzVrtg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/color-helpers": 1.0.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-ic-unit/2.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-N84qGTJkfLTPj2qOG5P4CIqGjpZBbjOEMKMn+UjO5wlb9lcBTfBsxCF0lQsFdWJUzBHYFOz19dL66v71WF3Pig==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-is-pseudo-class/3.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-hhiacuby4YdUnnxfCYCRMBIobyJImozf0u+gHSbQ/tNOdwvmrZtVROvgW7zmfYuRkHVDNZJWZslq2v5jOU+j/A==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /@csstools/postcss-logical-float-and-clear/1.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-eO9z2sMLddvlfFEW5Fxbjyd03zaO7cJafDurK4rCqyRt9P7aaWwha0LcSzoROlcZrw1NBV2JAp2vMKfPMQO1xw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + dev: true + + /@csstools/postcss-logical-resize/1.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-x1ge74eCSvpBkDDWppl+7FuD2dL68WP+wwP2qvdUcKY17vJksz+XoE1ZRV38uJgS6FNUwC0AxrPW5gy3MxsDHQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-logical-viewport-units/1.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-nnKFywBqRMYjv5jyjSplD/nbAnboUEGFfdxKw1o34Y1nvycgqjQavhKkmxbORxroBBIDwC5y6SfgENcPPUcOxQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/css-tokenizer": 2.1.0 + postcss: 8.4.21 + dev: true + + /@csstools/postcss-media-queries-aspect-ratio-number-values/1.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-V9yQqXdje6OfqDf6EL5iGOpi6N0OEczwYK83rql9UapQwFEryXlAehR5AqH8QqLYb6+y31wUXK6vMxCp0920Zg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-tokenizer": 2.1.0 + "@csstools/media-query-list-parser": 2.0.1_ppok7cytzjc65mcyxmtit3wdyi + postcss: 8.4.21 + dev: true + + /@csstools/postcss-nested-calc/2.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-jbwrP8rN4e7LNaRcpx3xpMUjhtt34I9OV+zgbcsYAAk6k1+3kODXJBf95/JMYWhu9g1oif7r06QVUgfWsKxCFw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-normalize-display-values/2.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-TQT5g3JQ5gPXC239YuRK8jFceXF9d25ZvBkyjzBGGoW5st5sPXFVQS8OjYb9IJ/K3CdfK4528y483cgS2DJR/w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-oklab-function/2.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-U/odSNjOVhagNRu+RDaNVbn8vaqA9GyCOoneQA2je7697KOrtRDc7/POrYsP7QioO2aaezDzKNX02wBzc99fkQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/color-helpers": 1.0.0 + "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-progressive-custom-properties/2.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-tRX1rinsXajZlc4WiU7s9Y6O9EdSHScT997zDsvDUjQ1oZL2nvnL6Bt0s9KyQZZTdC3lrG2PIdBqdOIWXSEPlQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-scope-pseudo-class/2.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-6Pvo4uexUCXt+Hz5iUtemQAcIuCYnL+ePs1khFR6/xPgC92aQLJ0zGHonWoewiBE+I++4gXK3pr+R1rlOFHe5w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /@csstools/postcss-stepped-value-functions/2.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-VimD+M69GsZF/XssivjUwo6jXLgi86ar/gRSH7bautnCULSLxCr/HuY32N4rLRUr7qWF8oF/JTv06ceb66Q1jA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-text-decoration-shorthand/2.2.1_postcss@8.4.21: + resolution: + { + integrity: sha512-Ow6/cWWdjjVvA83mkm3kLRvvWsbzoe1AbJCxkpC+c9ibUjyS8pifm+LpZslQUKcxRVQ69ztKHDBEbFGTDhNeUw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/color-helpers": 1.0.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-trigonometric-functions/2.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-uGmmVWGHozyWe6+I4w321fKUC034OB1OYW0ZP4ySHA23n+r9y93K+1yrmW+hThpSfApKhaWySoD4I71LLlFUYQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /@csstools/postcss-unset-value/2.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-oJ9Xl29/yU8U7/pnMJRqAZd4YXNCfGEdcP4ywREuqm/xMqcgDNDppYRoCGDt40aaZQIEKBS79LytUDN/DHf0Ew==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + dev: true + + /@csstools/selector-specificity/2.1.1_wajs5nedgkikc5pcuwett7legi: + resolution: + { + integrity: sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + postcss-selector-parser: ^6.0.10 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /@esbuild/android-arm/0.16.17: + resolution: + { + integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.16.17: + resolution: + { + integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.16.17: + resolution: + { + integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.16.17: + resolution: + { + integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.16.17: + resolution: + { + integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.16.17: + resolution: + { + integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.16.17: + resolution: + { + integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.16.17: + resolution: + { + integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.16.17: + resolution: + { + integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.16.17: + resolution: + { + integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.16.17: + resolution: + { + integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.16.17: + resolution: + { + integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.16.17: + resolution: + { + integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.16.17: + resolution: + { + integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.16.17: + resolution: + { + integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.16.17: + resolution: + { + integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.16.17: + resolution: + { + integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.16.17: + resolution: + { + integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.16.17: + resolution: + { + integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.16.17: + resolution: + { + integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.16.17: + resolution: + { + integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.16.17: + resolution: + { + integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint/eslintrc/1.4.1: + resolution: + { + integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.4.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@floating-ui/core/1.2.1: + resolution: + { + integrity: sha512-LSqwPZkK3rYfD7GKoIeExXOyYx6Q1O4iqZWwIehDNuv3Dv425FIAE8PRwtAx1imEolFTHgBEcoFHm9MDnYgPCg==, + } + dev: false + + /@floating-ui/dom/1.2.1: + resolution: + { + integrity: sha512-Rt45SmRiV8eU+xXSB9t0uMYiQ/ZWGE/jumse2o3i5RGlyvcbqOF4q+1qBnzLE2kZ5JGhq0iMkcGXUKbFe7MpTA==, + } + dependencies: + "@floating-ui/core": 1.2.1 + dev: false + + /@foliojs-fork/fontkit/1.9.1: + resolution: + { + integrity: sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==, + } + dependencies: + "@foliojs-fork/restructure": 2.0.2 + brfs: 2.0.2 + brotli: 1.3.3 + browserify-optional: 1.0.1 + clone: 1.0.4 + deep-equal: 1.1.1 + dfa: 1.2.0 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + dev: false + + /@foliojs-fork/linebreak/1.1.1: + resolution: + { + integrity: sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==, + } + dependencies: + base64-js: 1.3.1 + brfs: 2.0.2 + unicode-trie: 2.0.0 + dev: false + + /@foliojs-fork/pdfkit/0.13.0: + resolution: + { + integrity: sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==, + } + dependencies: + "@foliojs-fork/fontkit": 1.9.1 + "@foliojs-fork/linebreak": 1.1.1 + crypto-js: 4.1.1 + png-js: 1.0.0 + dev: false + + /@foliojs-fork/restructure/2.0.2: + resolution: + { + integrity: sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==, + } + dev: false + + /@github/clipboard-copy-element/1.1.2: + resolution: + { + integrity: sha512-L6CMrcA5we0udafvoSuRCE/Ci/3xrLWKYRGup2IlhxF771bQYsQ2EB1of182pI8ZWM4oxgwzu37+igMeoZjN/A==, + } + dev: false + + /@github/hotkey/2.0.1: + resolution: + { + integrity: sha512-qKXjAJjtheJbf4ie3hi8IwrHWJZHB5qdojR6JGo6jvQNPpsdUbk/NIdU8sxu4PW41CjW80vfciDMu3MAP3j2Fg==, + } + dev: false + + /@github/markdown-toolbar-element/2.1.1: + resolution: + { + integrity: sha512-J++rpd5H9baztabJQB82h26jtueOeBRSTqetk9Cri+Lj/s28ndu6Tovn0uHQaOKtBWDobFunk9b5pP5vcqt7cA==, + } + dev: false + + /@github/time-elements/4.0.0: + resolution: + { + integrity: sha512-oTPpERR/FylYCyUdVjufmF5MmlrIZ7gYzN59xe5mF3aQA+zn5IWiNj+5/D/6NgQWFNXoRB84DILnP/YlkETKhg==, + } + deprecated: Please use @github/relative-time-element insteadd + dev: false + + /@humanwhocodes/config-array/0.11.8: + resolution: + { + integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer/1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: + { + integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + } + dev: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: + { + integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, + } + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/set-array": 1.1.2 + "@jridgewell/sourcemap-codec": 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: + { + integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==, + } + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/set-array": 1.1.2 + "@jridgewell/sourcemap-codec": 1.4.14 + "@jridgewell/trace-mapping": 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: + { + integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, + } + engines: { node: ">=6.0.0" } + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: + { + integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + } + engines: { node: ">=6.0.0" } + dev: true + + /@jridgewell/source-map/0.3.2: + resolution: + { + integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==, + } + dependencies: + "@jridgewell/gen-mapping": 0.3.2 + "@jridgewell/trace-mapping": 0.3.17 + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: + { + integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, + } + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: + { + integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==, + } + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + dev: true + + /@lezer/common/1.0.2: + resolution: + { + integrity: sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng==, + } + dev: false + + /@lezer/highlight/1.1.3: + resolution: + { + integrity: sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==, + } + dependencies: + "@lezer/common": 1.0.2 + dev: false + + /@lezer/lr/1.3.3: + resolution: + { + integrity: sha512-JPQe3mwJlzEVqy67iQiiGozhcngbO8QBgpqZM6oL1Wj/dXckrEexpBLeFkq0edtW5IqnPRFxA24BHJni8Js69w==, + } + dependencies: + "@lezer/common": 1.0.2 + dev: false + + /@lezer/xml/1.0.1: + resolution: + { + integrity: sha512-jMDXrV953sDAUEMI25VNrI9dz94Ai96FfeglytFINhhwQ867HKlCE2jt3AwZTCT7M528WxdDWv/Ty8e9wizwmQ==, + } + dependencies: + "@lezer/highlight": 1.1.3 + "@lezer/lr": 1.3.3 + dev: false + + /@lit-labs/ssr-dom-shim/1.0.0: + resolution: + { + integrity: sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==, + } + dev: false + + /@lit/reactive-element/1.6.1: + resolution: + { + integrity: sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==, + } + dependencies: + "@lit-labs/ssr-dom-shim": 1.0.0 + dev: false + + /@nodelib/fs.scandir/2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + dev: true + + /@octokit/auth-token/3.0.3: + resolution: + { + integrity: sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==, + } + engines: { node: ">= 14" } + dependencies: + "@octokit/types": 9.0.0 + dev: true + + /@octokit/core/4.2.0: + resolution: + { + integrity: sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==, + } + engines: { node: ">= 14" } + dependencies: + "@octokit/auth-token": 3.0.3 + "@octokit/graphql": 5.0.5 + "@octokit/request": 6.2.3 + "@octokit/request-error": 3.0.3 + "@octokit/types": 9.0.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/endpoint/7.0.5: + resolution: + { + integrity: sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==, + } + engines: { node: ">= 14" } + dependencies: + "@octokit/types": 9.0.0 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: true + + /@octokit/graphql/5.0.5: + resolution: + { + integrity: sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==, + } + engines: { node: ">= 14" } + dependencies: + "@octokit/request": 6.2.3 + "@octokit/types": 9.0.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/openapi-types/16.0.0: + resolution: + { + integrity: sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==, + } + dev: true + + /@octokit/plugin-paginate-rest/6.0.0_@octokit+core@4.2.0: + resolution: + { + integrity: sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==, + } + engines: { node: ">= 14" } + peerDependencies: + "@octokit/core": ">=4" + dependencies: + "@octokit/core": 4.2.0 + "@octokit/types": 9.0.0 + dev: true + + /@octokit/plugin-request-log/1.0.4_@octokit+core@4.2.0: + resolution: + { + integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, + } + peerDependencies: + "@octokit/core": ">=3" + dependencies: + "@octokit/core": 4.2.0 + dev: true + + /@octokit/plugin-rest-endpoint-methods/7.0.1_@octokit+core@4.2.0: + resolution: + { + integrity: sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==, + } + engines: { node: ">= 14" } + peerDependencies: + "@octokit/core": ">=3" + dependencies: + "@octokit/core": 4.2.0 + "@octokit/types": 9.0.0 + deprecation: 2.3.1 + dev: true + + /@octokit/request-error/3.0.3: + resolution: + { + integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==, + } + engines: { node: ">= 14" } + dependencies: + "@octokit/types": 9.0.0 + deprecation: 2.3.1 + once: 1.4.0 + dev: true + + /@octokit/request/6.2.3: + resolution: + { + integrity: sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==, + } + engines: { node: ">= 14" } + dependencies: + "@octokit/endpoint": 7.0.5 + "@octokit/request-error": 3.0.3 + "@octokit/types": 9.0.0 + is-plain-object: 5.0.0 + node-fetch: 2.6.9 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/rest/19.0.7: + resolution: + { + integrity: sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==, + } + engines: { node: ">= 14" } + dependencies: + "@octokit/core": 4.2.0 + "@octokit/plugin-paginate-rest": 6.0.0_@octokit+core@4.2.0 + "@octokit/plugin-request-log": 1.0.4_@octokit+core@4.2.0 + "@octokit/plugin-rest-endpoint-methods": 7.0.1_@octokit+core@4.2.0 + transitivePeerDependencies: + - encoding + dev: true + + /@octokit/types/9.0.0: + resolution: + { + integrity: sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==, + } + dependencies: + "@octokit/openapi-types": 16.0.0 + dev: true + + /@pnpm/network.ca-file/1.0.2: + resolution: + { + integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==, + } + engines: { node: ">=12.22.0" } + dependencies: + graceful-fs: 4.2.10 + dev: true + + /@pnpm/npm-conf/1.0.5: + resolution: + { + integrity: sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==, + } + engines: { node: ">=12" } + dependencies: + "@pnpm/network.ca-file": 1.0.2 + config-chain: 1.1.13 + dev: true + + /@rollup/plugin-babel/5.3.1_4tnfxcmsyr7y5qv3uwkivwqysm: + resolution: + { + integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, + } + engines: { node: ">= 10.0.0" } + peerDependencies: + "@babel/core": ^7.0.0 + "@types/babel__core": ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + "@types/babel__core": + optional: true + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-module-imports": 7.18.6 + "@rollup/pluginutils": 3.1.0_rollup@2.79.1 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-node-resolve/11.2.1_rollup@2.79.1: + resolution: + { + integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==, + } + engines: { node: ">= 10.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + "@rollup/pluginutils": 3.1.0_rollup@2.79.1 + "@types/resolve": 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.0 + is-module: 1.0.0 + resolve: 1.22.1 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-replace/2.4.2_rollup@2.79.1: + resolution: + { + integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, + } + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + "@rollup/pluginutils": 3.1.0_rollup@2.79.1 + magic-string: 0.25.9 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-replace/5.0.2_rollup@3.17.2: + resolution: + { + integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + "@rollup/pluginutils": 5.0.2_rollup@3.17.2 + magic-string: 0.27.0 + rollup: 3.17.2 + dev: true + + /@rollup/pluginutils/3.1.0_rollup@2.79.1: + resolution: + { + integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, + } + engines: { node: ">= 8.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + "@types/estree": 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils/5.0.2_rollup@3.17.2: + resolution: + { + integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + "@types/estree": 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.17.2 + dev: true + + /@semantic-release/changelog/6.0.2_semantic-release@20.1.0: + resolution: + { + integrity: sha512-jHqfTkoPbDEOAgAP18mGP53IxeMwxTISN+GwTRy9uLu58UjARoZU8ScCgWGeO2WPkEsm57H8AkyY02W2ntIlIw==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0" + dependencies: + "@semantic-release/error": 3.0.0 + aggregate-error: 3.1.0 + fs-extra: 11.1.0 + lodash: 4.17.21 + semantic-release: 20.1.0 + dev: true + + /@semantic-release/commit-analyzer/9.0.2_semantic-release@20.1.0: + resolution: + { + integrity: sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0-beta.1" + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + debug: 4.3.4 + import-from: 4.0.0 + lodash: 4.17.21 + micromatch: 4.0.5 + semantic-release: 20.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@semantic-release/error/3.0.0: + resolution: + { + integrity: sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==, + } + engines: { node: ">=14.17" } + dev: true + + /@semantic-release/exec/6.0.3_semantic-release@20.1.0: + resolution: + { + integrity: sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0" + dependencies: + "@semantic-release/error": 3.0.0 + aggregate-error: 3.1.0 + debug: 4.3.4 + execa: 5.1.1 + lodash: 4.17.21 + parse-json: 5.2.0 + semantic-release: 20.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@semantic-release/git/10.0.1_semantic-release@20.1.0: + resolution: + { + integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0" + dependencies: + "@semantic-release/error": 3.0.0 + aggregate-error: 3.1.0 + debug: 4.3.4 + dir-glob: 3.0.1 + execa: 5.1.1 + lodash: 4.17.21 + micromatch: 4.0.5 + p-reduce: 2.1.0 + semantic-release: 20.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@semantic-release/github/8.0.7_semantic-release@20.1.0: + resolution: + { + integrity: sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0-beta.1" + dependencies: + "@octokit/rest": 19.0.7 + "@semantic-release/error": 3.0.0 + aggregate-error: 3.1.0 + bottleneck: 2.19.5 + debug: 4.3.4 + dir-glob: 3.0.1 + fs-extra: 11.1.0 + globby: 11.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + issue-parser: 6.0.0 + lodash: 4.17.21 + mime: 3.0.0 + p-filter: 2.1.0 + p-retry: 4.6.2 + semantic-release: 20.1.0 + url-join: 4.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@semantic-release/gitlab/11.0.1_semantic-release@20.1.0: + resolution: + { + integrity: sha512-CWXHlLZonwrUR2pbYaoERVu1cDVsi5W4H0WXDDCcDwicMmizsTkKJlpP9CQowoluqHKIJYrLkr2b+lYXCnBJZw==, + } + engines: { node: ">=18" } + peerDependencies: + semantic-release: ">=20.1.0" + dependencies: + "@semantic-release/error": 3.0.0 + aggregate-error: 4.0.1 + debug: 4.3.4 + dir-glob: 3.0.1 + escape-string-regexp: 5.0.0 + form-data: 4.0.0 + fs-extra: 11.1.0 + globby: 11.1.0 + got: 12.5.3 + hpagent: 1.2.0 + lodash-es: 4.17.21 + parse-url: 8.1.0 + semantic-release: 20.1.0 + url-join: 4.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@semantic-release/npm/9.0.2_semantic-release@20.1.0: + resolution: + { + integrity: sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==, + } + engines: { node: ">=16 || ^14.17" } + peerDependencies: + semantic-release: ">=19.0.0" + dependencies: + "@semantic-release/error": 3.0.0 + aggregate-error: 3.1.0 + execa: 5.1.1 + fs-extra: 11.1.0 + lodash: 4.17.21 + nerf-dart: 1.0.0 + normalize-url: 6.1.0 + npm: 8.19.4 + rc: 1.2.8 + read-pkg: 5.2.0 + registry-auth-token: 5.0.1 + semantic-release: 20.1.0 + semver: 7.3.8 + tempy: 1.0.1 + dev: true + + /@semantic-release/release-notes-generator/10.0.3_semantic-release@20.1.0: + resolution: + { + integrity: sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0-beta.1" + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-writer: 5.0.1 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + debug: 4.3.4 + get-stream: 6.0.1 + import-from: 4.0.0 + into-stream: 6.0.0 + lodash: 4.17.21 + read-pkg-up: 7.0.1 + semantic-release: 20.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sindresorhus/is/5.3.0: + resolution: + { + integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==, + } + engines: { node: ">=14.16" } + dev: true + + /@stencil/core/2.5.2: + resolution: + { + integrity: sha512-bgjPXkSzzg1WnTgVUm6m5ZzpKt602WmA/QljODAW1xVN40OHJdbGblzF/F6MFzqv2c5Cy30CB41arc8qADIdcQ==, + } + engines: { node: ">=12.10.0", npm: ">=6.0.0" } + hasBin: true + dev: false + + /@surma/rollup-plugin-off-main-thread/2.2.3: + resolution: + { + integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, + } + dependencies: + ejs: 3.1.8 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.8 + dev: true + + /@szmarczak/http-timer/5.0.1: + resolution: + { + integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, + } + engines: { node: ">=14.16" } + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@tailwindcss/forms/0.5.3_tailwindcss@3.2.7: + resolution: + { + integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==, + } + peerDependencies: + tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1" + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.2.7_postcss@8.4.21 + dev: true + + /@tailwindcss/line-clamp/0.4.2_tailwindcss@3.2.7: + resolution: + { + integrity: sha512-HFzAQuqYCjyy/SX9sLGB1lroPzmcnWv1FHkIpmypte10hptf4oPUfucryMKovZh2u0uiS9U5Ty3GghWfEJGwVw==, + } + peerDependencies: + tailwindcss: ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" + dependencies: + tailwindcss: 3.2.7_postcss@8.4.21 + dev: true + + /@tailwindcss/nesting/0.0.0-insiders.565cd3e_postcss@8.4.21: + resolution: + { + integrity: sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==, + } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-nested: 5.0.6_postcss@8.4.21 + dev: false + + /@tailwindcss/typography/0.5.9_tailwindcss@3.2.7: + resolution: + { + integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==, + } + peerDependencies: + tailwindcss: ">=3.0.0 || insiders" + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.2.7_postcss@8.4.21 + dev: true + + /@tootallnate/once/2.0.0: + resolution: + { + integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, + } + engines: { node: ">= 10" } + dev: true + + /@trysound/sax/0.2.0: + resolution: + { + integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, + } + engines: { node: ">=10.13.0" } + dev: true + + /@tsconfig/node10/1.0.9: + resolution: + { + integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, + } + dev: true + + /@tsconfig/node12/1.0.11: + resolution: + { + integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, + } + dev: true + + /@tsconfig/node14/1.0.3: + resolution: + { + integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, + } + dev: true + + /@tsconfig/node16/1.0.3: + resolution: + { + integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==, + } + dev: true + + /@types/debounce/1.2.1: + resolution: + { + integrity: sha512-epMsEE85fi4lfmJUH/89/iV/LI+F5CvNIvmgs5g5jYFPfhO2S/ae8WSsLOKWdwtoaZw9Q2IhJ4tQ5tFCcS/4HA==, + } + dev: true + + /@types/estree/0.0.39: + resolution: + { + integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==, + } + dev: true + + /@types/estree/1.0.0: + resolution: + { + integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==, + } + dev: true + + /@types/fscreen/1.0.1: + resolution: + { + integrity: sha512-hV2d0BreihMGtrg+EdAFOIl/O2EL5vhAheHJUztGE/lPFZIN8ZCpGFL8hCbtyi1CfhKjDRCf47sHjP+FwJ4q0Q==, + } + dev: false + + /@types/geojson/7946.0.10: + resolution: + { + integrity: sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==, + } + dev: true + + /@types/http-cache-semantics/4.0.1: + resolution: + { + integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==, + } + dev: true + + /@types/json-schema/7.0.11: + resolution: + { + integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==, + } + dev: true + + /@types/leaflet/1.9.1: + resolution: + { + integrity: sha512-lYawM3I3lLO6rmBASaqdGgY6zUL4YHr3H79/axx7FNYyPXuj0P1DZHbkNo8Itbv0i7Y9EryLWtDXXROMygXhRA==, + } + dependencies: + "@types/geojson": 7946.0.10 + dev: true + + /@types/marked/4.0.8: + resolution: + { + integrity: sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw==, + } + dev: true + + /@types/minimist/1.2.2: + resolution: + { + integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, + } + dev: true + + /@types/node/18.14.0: + resolution: + { + integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==, + } + dev: true + + /@types/normalize-package-data/2.4.1: + resolution: + { + integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, + } + dev: true + + /@types/resolve/1.17.1: + resolution: + { + integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, + } + dependencies: + "@types/node": 18.14.0 + dev: true + + /@types/retry/0.12.0: + resolution: + { + integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, + } + dev: true + + /@types/semver/7.3.13: + resolution: + { + integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==, + } + dev: true + + /@types/trusted-types/2.0.3: + resolution: + { + integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==, + } + + /@types/wavesurfer.js/6.0.3: + resolution: + { + integrity: sha512-5Sb5s3pEkOmDosaaP1DWp1Unnx8HhVorm5608TIVdT5jCMvJ6eqM19UD8n7DEbJ7rzreS9RqHmzR8TlcdQBvbA==, + } + dependencies: + "@types/debounce": 1.2.1 + dev: true + + /@typescript-eslint/eslint-plugin/5.53.0_ny4s7qc6yg74faf3d6xty2ofzy: + resolution: + { + integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/parser": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm + "@typescript-eslint/scope-manager": 5.53.0 + "@typescript-eslint/type-utils": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm + "@typescript-eslint/utils": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm + debug: 4.3.4 + eslint: 8.34.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.53.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: + { + integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": 5.53.0 + "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/typescript-estree": 5.53.0_typescript@4.9.5 + debug: 4.3.4 + eslint: 8.34.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager/5.53.0: + resolution: + { + integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/visitor-keys": 5.53.0 + dev: true + + /@typescript-eslint/type-utils/5.53.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: + { + integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: "*" + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": 5.53.0_typescript@4.9.5 + "@typescript-eslint/utils": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm + debug: 4.3.4 + eslint: 8.34.0 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types/5.53.0: + resolution: + { + integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /@typescript-eslint/typescript-estree/5.53.0_typescript@4.9.5: + resolution: + { + integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/visitor-keys": 5.53.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.53.0_7kw3g6rralp5ps6mg3uyzz6azm: + resolution: + { + integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + "@types/json-schema": 7.0.11 + "@types/semver": 7.3.13 + "@typescript-eslint/scope-manager": 5.53.0 + "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/typescript-estree": 5.53.0_typescript@4.9.5 + eslint: 8.34.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.34.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys/5.53.0: + resolution: + { + integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + "@typescript-eslint/types": 5.53.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@vime/core/5.4.0: + resolution: + { + integrity: sha512-ZP19/+9RDeX8q0dPGW1Au77/c7hqb8Lsd/4zV0pAsld+op/cYVMoByu5wd6luQ0R6AKwe/mYdNTDatAHZlhHZw==, + } + dependencies: + "@stencil/core": 2.5.2 + "@types/fscreen": 1.0.1 + fscreen: 1.2.0 + mitt: 3.0.0 + stencil-wormhole: 3.4.1 + dev: false + + /JSONStream/1.3.5: + resolution: + { + integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, + } + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /acorn-jsx/5.3.2_acorn@8.8.2: + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn-node/1.8.2: + resolution: + { + integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==, + } + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + + /acorn-walk/7.2.0: + resolution: + { + integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, + } + engines: { node: ">=0.4.0" } + + /acorn-walk/8.2.0: + resolution: + { + integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, + } + engines: { node: ">=0.4.0" } + dev: true + + /acorn/7.4.1: + resolution: + { + integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /acorn/8.8.2: + resolution: + { + integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==, + } + engines: { node: ">=0.4.0" } + hasBin: true + dev: true + + /adler-32/1.3.1: + resolution: + { + integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==, + } + engines: { node: ">=0.8" } + dev: false + + /agent-base/6.0.2: + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: ">= 6.0.0" } + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error/3.1.0: + resolution: + { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: ">=8" } + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /aggregate-error/4.0.1: + resolution: + { + integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==, + } + engines: { node: ">=12" } + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + dev: true + + /ajv/6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv/8.12.0: + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /all-contributors-cli/6.24.0: + resolution: + { + integrity: sha512-7oSKr2PnqxsOotuSwciltcFTS1eVRdjR0cn99hbElfff7gRQBShVhsf/XBprY41sLcgqTk0l0MKgKv6QNgZdMg==, + } + engines: { node: ">=4" } + hasBin: true + dependencies: + "@babel/runtime": 7.21.0 + async: 3.2.4 + chalk: 4.1.2 + didyoumean: 1.2.2 + inquirer: 7.3.3 + json-fixer: 1.6.15 + lodash: 4.17.21 + node-fetch: 2.6.9 + pify: 5.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - encoding + dev: true + + /amdefine/1.0.1: + resolution: + { + integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==, + } + engines: { node: ">=0.4.2" } + dev: false + optional: true + + /ansi-escapes/4.3.2: + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-escapes/5.0.0: + resolution: + { + integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==, + } + engines: { node: ">=12" } + dependencies: + type-fest: 1.4.0 + dev: true + + /ansi-regex/5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + dev: true + + /ansi-regex/6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } + dev: true + + /ansi-styles/3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles/6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + dev: true + + /ansicolors/0.3.2: + resolution: + { + integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==, + } + dev: true + + /anymatch/3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg/4.1.3: + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } + dev: true + + /arg/5.0.2: + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } + dev: true + + /argparse/2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + dev: true + + /argv-formatter/1.0.0: + resolution: + { + integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==, + } + dev: true + + /array-from/2.1.1: + resolution: + { + integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, + } + dev: false + + /array-ify/1.0.0: + resolution: + { + integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, + } + dev: true + + /array-union/2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: true + + /arrify/1.0.1: + resolution: + { + integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /ast-transform/0.0.0: + resolution: + { + integrity: sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==, + } + dependencies: + escodegen: 1.2.0 + esprima: 1.0.4 + through: 2.3.8 + dev: false + + /ast-types/0.7.8: + resolution: + { + integrity: sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==, + } + engines: { node: ">= 0.6" } + dev: false + + /astral-regex/2.0.0: + resolution: + { + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, + } + engines: { node: ">=8" } + dev: true + + /async/3.2.4: + resolution: + { + integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, + } + dev: true + + /asynckit/0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: true + + /at-least-node/1.0.0: + resolution: + { + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, + } + engines: { node: ">= 4.0.0" } + dev: true + + /autoprefixer/10.4.13_postcss@8.4.21: + resolution: + { + integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==, + } + engines: { node: ^10 || ^12 || >=14 } + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.5 + caniuse-lite: 1.0.30001457 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays/1.0.5: + resolution: + { + integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, + } + engines: { node: ">= 0.4" } + dev: true + + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.0: + resolution: + { + integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/compat-data": 7.21.0 + "@babel/core": 7.21.0 + "@babel/helper-define-polyfill-provider": 0.3.3_@babel+core@7.21.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.0: + resolution: + { + integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-define-polyfill-provider": 0.3.3_@babel+core@7.21.0 + core-js-compat: 3.28.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.0: + resolution: + { + integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.21.0 + "@babel/helper-define-polyfill-provider": 0.3.3_@babel+core@7.21.0 + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match/1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + dev: true + + /balanced-match/2.0.0: + resolution: + { + integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==, + } + dev: true + + /base64-js/1.3.1: + resolution: + { + integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==, + } + dev: false + + /base64-js/1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + /before-after-hook/2.2.3: + resolution: + { + integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, + } + dev: true + + /binary-extensions/2.2.0: + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + } + engines: { node: ">=8" } + dev: true + + /bl/4.1.0: + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: true + + /boolbase/1.0.0: + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } + dev: true + + /bottleneck/2.19.5: + resolution: + { + integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, + } + dev: true + + /brace-expansion/1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion/2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces/3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + dev: true + + /brfs/2.0.2: + resolution: + { + integrity: sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==, + } + hasBin: true + dependencies: + quote-stream: 1.0.2 + resolve: 1.22.1 + static-module: 3.0.4 + through2: 2.0.5 + dev: false + + /brotli/1.3.3: + resolution: + { + integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==, + } + dependencies: + base64-js: 1.5.1 + dev: false + + /browser-resolve/1.11.3: + resolution: + { + integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==, + } + dependencies: + resolve: 1.1.7 + dev: false + + /browserify-optional/1.0.1: + resolution: + { + integrity: sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==, + } + dependencies: + ast-transform: 0.0.0 + ast-types: 0.7.8 + browser-resolve: 1.11.3 + dev: false + + /browserslist/4.21.5: + resolution: + { + integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001457 + electron-to-chromium: 1.4.304 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10_browserslist@4.21.5 + dev: true + + /buffer-equal/0.0.1: + resolution: + { + integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==, + } + engines: { node: ">=0.4.0" } + dev: false + + /buffer-from/1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + + /buffer/5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-modules/3.3.0: + resolution: + { + integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, + } + engines: { node: ">=6" } + dev: true + + /cacheable-lookup/7.0.0: + resolution: + { + integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, + } + engines: { node: ">=14.16" } + dev: true + + /cacheable-request/10.2.7: + resolution: + { + integrity: sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==, + } + engines: { node: ">=14.16" } + dependencies: + "@types/http-cache-semantics": 4.0.1 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.2 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: true + + /cachedir/2.3.0: + resolution: + { + integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==, + } + engines: { node: ">=6" } + dev: true + + /call-bind/1.0.2: + resolution: + { + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, + } + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.0 + + /callsites/3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + dev: true + + /camelcase-css/2.0.1: + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: ">= 6" } + dev: true + + /camelcase-keys/6.2.2: + resolution: + { + integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, + } + engines: { node: ">=8" } + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase/5.3.1: + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: ">=6" } + dev: true + + /caniuse-api/3.0.0: + resolution: + { + integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, + } + dependencies: + browserslist: 4.21.5 + caniuse-lite: 1.0.30001457 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + dev: true + + /caniuse-lite/1.0.30001457: + resolution: + { + integrity: sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==, + } + dev: true + + /cardinal/2.1.1: + resolution: + { + integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==, + } + hasBin: true + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + dev: true + + /cfb/1.2.2: + resolution: + { + integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==, + } + engines: { node: ">=0.8" } + dependencies: + adler-32: 1.3.1 + crc-32: 1.2.2 + dev: false + + /chalk/2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk/5.2.0: + resolution: + { + integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + /chardet/0.7.0: + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } + dev: true + + /choices.js/10.2.0: + resolution: + { + integrity: sha512-8PKy6wq7BMjNwDTZwr3+Zry6G2+opJaAJDDA/j3yxvqSCnvkKe7ZIFfIyOhoc7htIWFhsfzF9tJpGUATcpUtPg==, + } + dependencies: + deepmerge: 4.3.0 + fuse.js: 6.6.2 + redux: 4.2.1 + dev: false + + /chokidar/3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /ci-info/3.8.0: + resolution: + { + integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==, + } + engines: { node: ">=8" } + dev: true + + /clean-stack/2.2.0: + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: ">=6" } + dev: true + + /clean-stack/4.2.0: + resolution: + { + integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==, + } + engines: { node: ">=12" } + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /cli-cursor/3.1.0: + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: ">=8" } + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners/2.7.0: + resolution: + { + integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==, + } + engines: { node: ">=6" } + dev: true + + /cli-table3/0.6.3: + resolution: + { + integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, + } + engines: { node: 10.* || >= 12.* } + dependencies: + string-width: 4.2.3 + optionalDependencies: + "@colors/colors": 1.5.0 + dev: true + + /cli-truncate/2.1.0: + resolution: + { + integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==, + } + engines: { node: ">=8" } + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate/3.1.0: + resolution: + { + integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cli-width/3.0.0: + resolution: + { + integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, + } + engines: { node: ">= 10" } + dev: true + + /cliui/6.0.0: + resolution: + { + integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, + } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /cliui/8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone/1.0.4: + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + } + engines: { node: ">=0.8" } + + /codemirror/6.0.1: + resolution: + { + integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, + } + dependencies: + "@codemirror/autocomplete": 6.4.2_dtwlkgx6567fllxi7sgvnep6hy + "@codemirror/commands": 6.2.1 + "@codemirror/language": 6.6.0 + "@codemirror/lint": 6.1.1 + "@codemirror/search": 6.2.3 + "@codemirror/state": 6.2.0 + "@codemirror/view": 6.9.1 + dev: false + + /codepage/1.15.0: + resolution: + { + integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==, + } + engines: { node: ">=0.8" } + dev: false + + /color-convert/1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + dev: true + + /color-name/1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + dev: true + + /colord/2.9.3: + resolution: + { + integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, + } + dev: true + + /colorette/2.0.19: + resolution: + { + integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==, + } + dev: true + + /combined-stream/1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander/2.20.3: + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } + dev: true + + /commander/7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: ">= 10" } + + /commander/9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: true + + /commitizen/4.3.0: + resolution: + { + integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==, + } + engines: { node: ">= 12" } + hasBin: true + dependencies: + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0 + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.5 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.7 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - "@swc/core" + - "@swc/wasm" + dev: true + + /common-tags/1.8.2: + resolution: + { + integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, + } + engines: { node: ">=4.0.0" } + dev: true + + /compare-func/2.0.0: + resolution: + { + integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, + } + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /concat-map/0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + dev: true + + /concat-stream/1.6.2: + resolution: + { + integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, + } + engines: { "0": node >= 0.8 } + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.7 + typedarray: 0.0.6 + dev: false + + /config-chain/1.1.13: + resolution: + { + integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, + } + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: true + + /conventional-changelog-angular/5.0.13: + resolution: + { + integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, + } + engines: { node: ">=10" } + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits/5.0.0: + resolution: + { + integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==, + } + engines: { node: ">=10" } + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-writer/5.0.1: + resolution: + { + integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.0 + split: 1.0.1 + through2: 4.0.2 + dev: true + + /conventional-commit-types/3.0.0: + resolution: + { + integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==, + } + dev: true + + /conventional-commits-filter/2.0.7: + resolution: + { + integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==, + } + engines: { node: ">=10" } + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser/3.2.4: + resolution: + { + integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /convert-source-map/1.9.0: + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } + + /core-js-compat/3.28.0: + resolution: + { + integrity: sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==, + } + dependencies: + browserslist: 4.21.5 + dev: true + + /core-js/3.28.0: + resolution: + { + integrity: sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==, + } + requiresBuild: true + dev: false + + /core-util-is/1.0.3: + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } + + /cosmiconfig-typescript-loader/4.3.0_ipkhww4xc5z2tt2x53vp2mt2be: + resolution: + { + integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==, + } + engines: { node: ">=12", npm: ">=6" } + peerDependencies: + "@types/node": "*" + cosmiconfig: ">=7" + ts-node: ">=10" + typescript: ">=3" + dependencies: + "@types/node": 18.14.0 + cosmiconfig: 8.0.0 + ts-node: 10.9.1_tncu2ai53lzgmizdedur7lbibe + typescript: 4.9.5 + dev: true + + /cosmiconfig/8.0.0: + resolution: + { + integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==, + } + engines: { node: ">=14" } + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /crc-32/1.2.2: + resolution: + { + integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, + } + engines: { node: ">=0.8" } + hasBin: true + dev: false + + /create-require/1.1.1: + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } + dev: true + + /crelt/1.0.5: + resolution: + { + integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==, + } + dev: false + + /cross-env/7.0.3: + resolution: + { + integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, + } + engines: { node: ">=10.14", npm: ">=6", yarn: ">=1" } + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-spawn/7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-js/4.1.1: + resolution: + { + integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==, + } + dev: false + + /crypto-random-string/2.0.0: + resolution: + { + integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, + } + engines: { node: ">=8" } + dev: true + + /css-blank-pseudo/5.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-aCU4AZ7uEcVSUzagTlA9pHciz7aWPKA/YzrEkpdSopJ2pvhIxiQ5sYeMz1/KByxlIo4XBdvMNJAVKMg/GRnhfw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /css-declaration-sorter/6.3.1_postcss@8.4.21: + resolution: + { + integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==, + } + engines: { node: ^10 || ^12 || >=14 } + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.21 + dev: true + + /css-functions-list/3.1.0: + resolution: + { + integrity: sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==, + } + engines: { node: ">=12.22" } + dev: true + + /css-has-pseudo/5.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-q+U+4QdwwB7T9VEW/LyO6CFrLAeLqOykC5mDqJXc7aKZAhDbq7BvGT13VGJe+IwBfdN2o3Xdw2kJ5IxwV1Sc9Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + dev: true + + /css-prefers-color-scheme/8.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-OvFghizHJ45x7nsJJUSYLyQNTzsCU8yWjxAc/nhPQg1pbs18LMoET8N3kOweFDPy0JV0OSXN2iqRFhPBHYOeMA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + dev: true + + /css-select/4.3.0: + resolution: + { + integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, + } + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-select/5.1.0: + resolution: + { + integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, + } + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.0.1 + nth-check: 2.1.1 + dev: true + + /css-tree/1.1.3: + resolution: + { + integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, + } + engines: { node: ">=8.0.0" } + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-tree/2.2.1: + resolution: + { + integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.0.2 + dev: true + + /css-tree/2.3.1: + resolution: + { + integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: true + + /css-what/6.1.0: + resolution: + { + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + } + engines: { node: ">= 6" } + dev: true + + /cssdb/7.4.1: + resolution: + { + integrity: sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ==, + } + dev: true + + /cssesc/3.0.0: + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } + hasBin: true + + /cssnano-preset-default/5.2.14_postcss@8.4.21: + resolution: + { + integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.3.1_postcss@8.4.21 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-calc: 8.2.4_postcss@8.4.21 + postcss-colormin: 5.3.1_postcss@8.4.21 + postcss-convert-values: 5.1.3_postcss@8.4.21 + postcss-discard-comments: 5.1.2_postcss@8.4.21 + postcss-discard-duplicates: 5.1.0_postcss@8.4.21 + postcss-discard-empty: 5.1.1_postcss@8.4.21 + postcss-discard-overridden: 5.1.0_postcss@8.4.21 + postcss-merge-longhand: 5.1.7_postcss@8.4.21 + postcss-merge-rules: 5.1.4_postcss@8.4.21 + postcss-minify-font-values: 5.1.0_postcss@8.4.21 + postcss-minify-gradients: 5.1.1_postcss@8.4.21 + postcss-minify-params: 5.1.4_postcss@8.4.21 + postcss-minify-selectors: 5.2.1_postcss@8.4.21 + postcss-normalize-charset: 5.1.0_postcss@8.4.21 + postcss-normalize-display-values: 5.1.0_postcss@8.4.21 + postcss-normalize-positions: 5.1.1_postcss@8.4.21 + postcss-normalize-repeat-style: 5.1.1_postcss@8.4.21 + postcss-normalize-string: 5.1.0_postcss@8.4.21 + postcss-normalize-timing-functions: 5.1.0_postcss@8.4.21 + postcss-normalize-unicode: 5.1.1_postcss@8.4.21 + postcss-normalize-url: 5.1.0_postcss@8.4.21 + postcss-normalize-whitespace: 5.1.1_postcss@8.4.21 + postcss-ordered-values: 5.1.3_postcss@8.4.21 + postcss-reduce-initial: 5.1.2_postcss@8.4.21 + postcss-reduce-transforms: 5.1.0_postcss@8.4.21 + postcss-svgo: 5.1.0_postcss@8.4.21 + postcss-unique-selectors: 5.1.1_postcss@8.4.21 + dev: true + + /cssnano-utils/3.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: true + + /cssnano/5.1.15_postcss@8.4.21: + resolution: + { + integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.2.14_postcss@8.4.21 + lilconfig: 2.0.6 + postcss: 8.4.21 + yaml: 1.10.2 + dev: true + + /csso/4.2.0: + resolution: + { + integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, + } + engines: { node: ">=8.0.0" } + dependencies: + css-tree: 1.1.3 + dev: true + + /csso/5.0.5: + resolution: + { + integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + dependencies: + css-tree: 2.2.1 + dev: true + + /cz-conventional-changelog/3.3.0: + resolution: + { + integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, + } + engines: { node: ">= 10" } + dependencies: + chalk: 2.4.2 + commitizen: 4.3.0 + conventional-commit-types: 3.0.0 + lodash.map: 4.6.0 + longest: 2.0.1 + word-wrap: 1.2.3 + optionalDependencies: + "@commitlint/load": 17.4.4 + transitivePeerDependencies: + - "@swc/core" + - "@swc/wasm" + dev: true + + /d/1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: false + + /d3-array/3.2.2: + resolution: + { + integrity: sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==, + } + engines: { node: ">=12" } + dependencies: + internmap: 2.0.3 + dev: false + + /d3-color/3.1.0: + resolution: + { + integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, + } + engines: { node: ">=12" } + dev: false + + /d3-dispatch/3.0.1: + resolution: + { + integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==, + } + engines: { node: ">=12" } + dev: false + + /d3-ease/3.0.1: + resolution: + { + integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, + } + engines: { node: ">=12" } + dev: false + + /d3-force/3.0.0: + resolution: + { + integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==, + } + engines: { node: ">=12" } + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + dev: false + + /d3-geo-projection/4.0.0: + resolution: + { + integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==, + } + engines: { node: ">=12" } + hasBin: true + dependencies: + commander: 7.2.0 + d3-array: 3.2.2 + d3-geo: 3.1.0 + dev: false + + /d3-geo/3.1.0: + resolution: + { + integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==, + } + engines: { node: ">=12" } + dependencies: + d3-array: 3.2.2 + dev: false + + /d3-interpolate/3.0.1: + resolution: + { + integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, + } + engines: { node: ">=12" } + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-quadtree/3.0.1: + resolution: + { + integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==, + } + engines: { node: ">=12" } + dev: false + + /d3-selection/3.0.0: + resolution: + { + integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==, + } + engines: { node: ">=12" } + dev: false + + /d3-timer/3.0.1: + resolution: + { + integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, + } + engines: { node: ">=12" } + dev: false + + /d3-transition/3.0.1_d3-selection@3.0.0: + resolution: + { + integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==, + } + engines: { node: ">=12" } + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: false + + /dargs/7.0.0: + resolution: + { + integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, + } + engines: { node: ">=8" } + dev: true + + /dash-ast/2.0.1: + resolution: + { + integrity: sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==, + } + dev: false + + /dateformat/3.0.3: + resolution: + { + integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, + } + dev: true + + /debug/4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys/1.1.1: + resolution: + { + integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, + } + engines: { node: ">=0.10.0" } + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize/1.2.0: + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /decompress-response/6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: ">=10" } + dependencies: + mimic-response: 3.1.0 + dev: true + + /dedent/0.7.0: + resolution: + { + integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, + } + dev: true + + /deep-equal/1.1.1: + resolution: + { + integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==, + } + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.5 + object-keys: 1.1.1 + regexp.prototype.flags: 1.4.3 + dev: false + + /deep-extend/0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: ">=4.0.0" } + dev: true + + /deep-is/0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + /deepmerge/4.3.0: + resolution: + { + integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==, + } + engines: { node: ">=0.10.0" } + + /defaults/1.0.4: + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } + dependencies: + clone: 1.0.4 + dev: true + + /defer-to-connect/2.0.1: + resolution: + { + integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, + } + engines: { node: ">=10" } + dev: true + + /define-properties/1.2.0: + resolution: + { + integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==, + } + engines: { node: ">= 0.4" } + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + /defined/1.0.1: + resolution: + { + integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==, + } + dev: true + + /del/6.1.1: + resolution: + { + integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==, + } + engines: { node: ">=10" } + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.10 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + + /delayed-stream/1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + dev: true + + /deprecation/2.3.1: + resolution: + { + integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, + } + dev: true + + /detect-file/1.0.0: + resolution: + { + integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, + } + engines: { node: ">=0.10.0" } + dev: true + + /detect-indent/6.1.0: + resolution: + { + integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, + } + engines: { node: ">=8" } + dev: true + + /detective/5.2.1: + resolution: + { + integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==, + } + engines: { node: ">=0.8.0" } + hasBin: true + dependencies: + acorn-node: 1.8.2 + defined: 1.0.1 + minimist: 1.2.8 + dev: true + + /dfa/1.2.0: + resolution: + { + integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==, + } + dev: false + + /didyoumean/1.2.2: + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } + dev: true + + /diff/4.0.2: + resolution: + { + integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, + } + engines: { node: ">=0.3.1" } + dev: true + + /dir-glob/3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: true + + /dlv/1.1.3: + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } + dev: true + + /doctrine/3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer/1.4.1: + resolution: + { + integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, + } + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom-serializer/2.0.0: + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: true + + /domelementtype/2.3.0: + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } + dev: true + + /domhandler/4.3.1: + resolution: + { + integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, + } + engines: { node: ">= 4" } + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler/5.0.3: + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/2.8.0: + resolution: + { + integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, + } + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /domutils/3.0.1: + resolution: + { + integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==, + } + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-prop/5.3.0: + resolution: + { + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, + } + engines: { node: ">=8" } + dependencies: + is-obj: 2.0.0 + dev: true + + /duplexer2/0.1.4: + resolution: + { + integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, + } + dependencies: + readable-stream: 2.3.7 + + /eastasianwidth/0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + dev: true + + /ejs/3.1.8: + resolution: + { + integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==, + } + engines: { node: ">=0.10.0" } + hasBin: true + dependencies: + jake: 10.8.5 + dev: true + + /electron-to-chromium/1.4.304: + resolution: + { + integrity: sha512-6c8M+ojPgDIXN2NyfGn8oHASXYnayj+gSEnGeLMKb9zjsySeVB/j7KkNAAG9yDcv8gNlhvFg5REa1N/kQU6pgA==, + } + dev: true + + /emoji-regex/8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + dev: true + + /emoji-regex/9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + dev: true + + /entities/2.2.0: + resolution: + { + integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, + } + dev: true + + /entities/4.4.0: + resolution: + { + integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==, + } + engines: { node: ">=0.12" } + dev: true + + /env-ci/8.0.0: + resolution: + { + integrity: sha512-W+3BqGZozFua9MPeXpmTm5eYEBtGgL76jGu/pwMVp/L8PdECSCEWaIp7d4Mw7kuUrbUldK0oV0bNd6ZZjLiMiA==, + } + engines: { node: ^16.10 || >=18 } + dependencies: + execa: 6.1.0 + java-properties: 1.0.2 + dev: true + + /error-ex/1.3.2: + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract/1.21.1: + resolution: + { + integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==, + } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.1 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-set-tostringtag/2.0.1: + resolution: + { + integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==, + } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-to-primitive/1.2.1: + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: ">= 0.4" } + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-ext/0.10.62: + resolution: + { + integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==, + } + engines: { node: ">=0.10" } + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: false + + /es6-iterator/2.0.3: + resolution: + { + integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: false + + /es6-map/0.1.5: + resolution: + { + integrity: sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-set: 0.1.6 + es6-symbol: 3.1.3 + event-emitter: 0.3.5 + dev: false + + /es6-set/0.1.6: + resolution: + { + integrity: sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==, + } + engines: { node: ">=0.12" } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + event-emitter: 0.3.5 + type: 2.7.2 + dev: false + + /es6-symbol/3.1.3: + resolution: + { + integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, + } + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: false + + /esbuild/0.16.17: + resolution: + { + integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/android-arm": 0.16.17 + "@esbuild/android-arm64": 0.16.17 + "@esbuild/android-x64": 0.16.17 + "@esbuild/darwin-arm64": 0.16.17 + "@esbuild/darwin-x64": 0.16.17 + "@esbuild/freebsd-arm64": 0.16.17 + "@esbuild/freebsd-x64": 0.16.17 + "@esbuild/linux-arm": 0.16.17 + "@esbuild/linux-arm64": 0.16.17 + "@esbuild/linux-ia32": 0.16.17 + "@esbuild/linux-loong64": 0.16.17 + "@esbuild/linux-mips64el": 0.16.17 + "@esbuild/linux-ppc64": 0.16.17 + "@esbuild/linux-riscv64": 0.16.17 + "@esbuild/linux-s390x": 0.16.17 + "@esbuild/linux-x64": 0.16.17 + "@esbuild/netbsd-x64": 0.16.17 + "@esbuild/openbsd-x64": 0.16.17 + "@esbuild/sunos-x64": 0.16.17 + "@esbuild/win32-arm64": 0.16.17 + "@esbuild/win32-ia32": 0.16.17 + "@esbuild/win32-x64": 0.16.17 + dev: true + + /escalade/3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: ">=6" } + dev: true + + /escape-string-regexp/1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } + dev: true + + /escape-string-regexp/4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + dev: true + + /escape-string-regexp/5.0.0: + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: ">=12" } + dev: true + + /escodegen/1.14.3: + resolution: + { + integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, + } + engines: { node: ">=4.0" } + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /escodegen/1.2.0: + resolution: + { + integrity: sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==, + } + engines: { node: ">=0.4.0" } + hasBin: true + dependencies: + esprima: 1.0.4 + estraverse: 1.5.1 + esutils: 1.0.0 + optionalDependencies: + source-map: 0.1.43 + dev: false + + /eslint-config-prettier/8.6.0_eslint@8.34.0: + resolution: + { + integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==, + } + hasBin: true + peerDependencies: + eslint: ">=7.0.0" + dependencies: + eslint: 8.34.0 + dev: true + + /eslint-plugin-prettier/4.2.1_u5wnrdwibbfomslmnramz52buy: + resolution: + { + integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, + } + engines: { node: ">=12.0.0" } + peerDependencies: + eslint: ">=7.28.0" + eslint-config-prettier: "*" + prettier: ">=2.0.0" + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.34.0 + eslint-config-prettier: 8.6.0_eslint@8.34.0 + prettier: 2.8.4 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-scope/5.1.1: + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: ">=8.0.0" } + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope/7.1.1: + resolution: + { + integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.34.0: + resolution: + { + integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, + } + engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } + peerDependencies: + eslint: ">=5" + dependencies: + eslint: 8.34.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-visitor-keys/2.1.0: + resolution: + { + integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, + } + engines: { node: ">=10" } + dev: true + + /eslint-visitor-keys/3.3.0: + resolution: + { + integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /eslint/8.34.0: + resolution: + { + integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint/eslintrc": 1.4.1 + "@humanwhocodes/config-array": 0.11.8 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.34.0 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.2 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.3.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/9.4.1: + resolution: + { + integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2_acorn@8.8.2 + eslint-visitor-keys: 3.3.0 + dev: true + + /esprima/1.0.4: + resolution: + { + integrity: sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==, + } + engines: { node: ">=0.4.0" } + hasBin: true + dev: false + + /esprima/4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } + hasBin: true + + /esquery/1.4.2: + resolution: + { + integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/1.5.1: + resolution: + { + integrity: sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==, + } + engines: { node: ">=0.4.0" } + dev: false + + /estraverse/4.3.0: + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: ">=4.0" } + + /estraverse/5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + dev: true + + /estree-is-function/1.0.0: + resolution: + { + integrity: sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==, + } + dev: false + + /estree-walker/1.0.1: + resolution: + { + integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==, + } + dev: true + + /estree-walker/2.0.2: + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } + dev: true + + /esutils/1.0.0: + resolution: + { + integrity: sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==, + } + engines: { node: ">=0.10.0" } + dev: false + + /esutils/2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } + + /event-emitter/0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: false + + /execa/5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa/6.1.0: + resolution: + { + integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 3.0.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /expand-tilde/2.0.2: + resolution: + { + integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, + } + engines: { node: ">=0.10.0" } + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /ext/1.7.0: + resolution: + { + integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, + } + dependencies: + type: 2.7.2 + dev: false + + /external-editor/3.1.0: + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: ">=4" } + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /fast-deep-equal/3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + dev: true + + /fast-diff/1.2.0: + resolution: + { + integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==, + } + dev: true + + /fast-glob/3.2.12: + resolution: + { + integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + dev: true + + /fast-levenshtein/2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastest-levenshtein/1.0.16: + resolution: + { + integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, + } + engines: { node: ">= 4.9.1" } + dev: true + + /fastq/1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + dev: true + + /figures/2.0.0: + resolution: + { + integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==, + } + engines: { node: ">=4" } + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /figures/3.2.0: + resolution: + { + integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, + } + engines: { node: ">=8" } + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /figures/5.0.0: + resolution: + { + integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==, + } + engines: { node: ">=14" } + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: true + + /file-entry-cache/6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.0.4 + dev: true + + /filelist/1.0.4: + resolution: + { + integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, + } + dependencies: + minimatch: 5.1.6 + dev: true + + /fill-range/7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-node-modules/2.1.3: + resolution: + { + integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==, + } + dependencies: + findup-sync: 4.0.0 + merge: 2.1.1 + dev: true + + /find-root/1.1.0: + resolution: + { + integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, + } + dev: true + + /find-up/2.1.0: + resolution: + { + integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, + } + engines: { node: ">=4" } + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up/4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up/5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-up/6.3.0: + resolution: + { + integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + + /find-versions/5.1.0: + resolution: + { + integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==, + } + engines: { node: ">=12" } + dependencies: + semver-regex: 4.0.5 + dev: true + + /findup-sync/4.0.0: + resolution: + { + integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==, + } + engines: { node: ">= 8" } + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + dev: true + + /flat-cache/3.0.4: + resolution: + { + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatpickr/4.6.13: + resolution: + { + integrity: sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==, + } + dev: false + + /flatted/3.2.7: + resolution: + { + integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, + } + dev: true + + /for-each/0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } + dependencies: + is-callable: 1.2.7 + dev: true + + /form-data-encoder/2.1.4: + resolution: + { + integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==, + } + engines: { node: ">= 14.17" } + dev: true + + /form-data/4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /frac/1.1.2: + resolution: + { + integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==, + } + engines: { node: ">=0.8" } + dev: false + + /fraction.js/4.2.0: + resolution: + { + integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==, + } + dev: true + + /from2/2.3.0: + resolution: + { + integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==, + } + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.7 + dev: true + + /fs-extra/11.1.0: + resolution: + { + integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==, + } + engines: { node: ">=14.14" } + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra/9.1.0: + resolution: + { + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, + } + engines: { node: ">=10" } + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath/1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + dev: true + + /fscreen/1.2.0: + resolution: + { + integrity: sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg==, + } + dev: false + + /fsevents/2.3.2: + resolution: + { + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: + { + integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, + } + + /function.prototype.name/1.1.5: + resolution: + { + integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } + + /fuse.js/6.6.2: + resolution: + { + integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==, + } + engines: { node: ">=10" } + dev: false + + /gensync/1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } + dev: true + + /get-assigned-identifiers/1.2.0: + resolution: + { + integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==, + } + dev: false + + /get-caller-file/2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + dev: true + + /get-intrinsic/1.2.0: + resolution: + { + integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==, + } + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + + /get-own-enumerable-property-symbols/3.0.2: + resolution: + { + integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, + } + dev: true + + /get-stream/6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } + dev: true + + /get-symbol-description/1.0.0: + resolution: + { + integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + + /git-log-parser/1.2.0: + resolution: + { + integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==, + } + dependencies: + argv-formatter: 1.0.0 + spawn-error-forwarder: 1.0.0 + split2: 1.0.0 + stream-combiner2: 1.1.1 + through2: 2.0.5 + traverse: 0.6.7 + dev: true + + /git-raw-commits/2.0.11: + resolution: + { + integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /glob-parent/5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-dirs/0.1.1: + resolution: + { + integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, + } + engines: { node: ">=4" } + dependencies: + ini: 1.3.8 + dev: true + + /global-modules/1.0.0: + resolution: + { + integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, + } + engines: { node: ">=0.10.0" } + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: true + + /global-modules/2.0.0: + resolution: + { + integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, + } + engines: { node: ">=6" } + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix/1.0.2: + resolution: + { + integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, + } + engines: { node: ">=0.10.0" } + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: true + + /global-prefix/3.0.0: + resolution: + { + integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, + } + engines: { node: ">=6" } + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + + /globals/11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } + dev: true + + /globals/13.20.0: + resolution: + { + integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis/1.0.3: + resolution: + { + integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==, + } + engines: { node: ">= 0.4" } + dependencies: + define-properties: 1.2.0 + dev: true + + /globby/11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globjoin/0.1.4: + resolution: + { + integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==, + } + dev: true + + /gopd/1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /got/12.5.3: + resolution: + { + integrity: sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==, + } + engines: { node: ">=14.16" } + dependencies: + "@sindresorhus/is": 5.3.0 + "@szmarczak/http-timer": 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.7 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.0 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: true + + /graceful-fs/4.2.10: + resolution: + { + integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, + } + dev: true + + /grapheme-splitter/1.0.4: + resolution: + { + integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, + } + dev: true + + /handlebars/4.7.7: + resolution: + { + integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==, + } + engines: { node: ">=0.4.7" } + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /hard-rejection/2.1.0: + resolution: + { + integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, + } + engines: { node: ">=6" } + dev: true + + /has-bigints/1.0.2: + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + } + dev: true + + /has-flag/3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } + dev: true + + /has-flag/4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + dev: true + + /has-property-descriptors/1.0.0: + resolution: + { + integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, + } + dependencies: + get-intrinsic: 1.2.0 + + /has-proto/1.0.1: + resolution: + { + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, + } + engines: { node: ">= 0.4" } + dev: true + + /has-symbols/1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } + + /has-tostringtag/1.0.0: + resolution: + { + integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, + } + engines: { node: ">= 0.4" } + dependencies: + has-symbols: 1.0.3 + + /has/1.0.3: + resolution: + { + integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, + } + engines: { node: ">= 0.4.0" } + dependencies: + function-bind: 1.1.1 + + /homedir-polyfill/1.0.3: + resolution: + { + integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, + } + engines: { node: ">=0.10.0" } + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hook-std/3.0.0: + resolution: + { + integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /hosted-git-info/2.8.9: + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } + dev: true + + /hosted-git-info/4.1.0: + resolution: + { + integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, + } + engines: { node: ">=10" } + dependencies: + lru-cache: 6.0.0 + dev: true + + /hosted-git-info/6.1.1: + resolution: + { + integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + lru-cache: 7.16.1 + dev: true + + /hpagent/1.2.0: + resolution: + { + integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==, + } + engines: { node: ">=14" } + dev: true + + /html-tags/3.2.0: + resolution: + { + integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==, + } + engines: { node: ">=8" } + dev: true + + /http-cache-semantics/4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + dev: true + + /http-proxy-agent/5.0.0: + resolution: + { + integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, + } + engines: { node: ">= 6" } + dependencies: + "@tootallnate/once": 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /http2-wrapper/2.2.0: + resolution: + { + integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==, + } + engines: { node: ">=10.19.0" } + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /https-proxy-agent/5.0.1: + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + } + engines: { node: ">= 6" } + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals/2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } + dev: true + + /human-signals/3.0.1: + resolution: + { + integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==, + } + engines: { node: ">=12.20.0" } + dev: true + + /husky/8.0.3: + resolution: + { + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + + /iconv-lite/0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: ">=0.10.0" } + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite/0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: ">=0.10.0" } + dependencies: + safer-buffer: 2.1.2 + dev: false + + /idb/7.1.1: + resolution: + { + integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, + } + dev: true + + /ieee754/1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: true + + /ignore/5.2.4: + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + } + engines: { node: ">= 4" } + dev: true + + /import-fresh/3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-from/4.0.0: + resolution: + { + integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==, + } + engines: { node: ">=12.2" } + dev: true + + /import-lazy/4.0.0: + resolution: + { + integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==, + } + engines: { node: ">=8" } + dev: true + + /imurmurhash/0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + dev: true + + /indent-string/4.0.0: + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: ">=8" } + dev: true + + /indent-string/5.0.0: + resolution: + { + integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==, + } + engines: { node: ">=12" } + dev: true + + /inflight/1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini/1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + dev: true + + /inquirer/7.3.3: + resolution: + { + integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==, + } + engines: { node: ">=8.0.0" } + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + dev: true + + /inquirer/8.2.5: + resolution: + { + integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, + } + engines: { node: ">=12.0.0" } + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /internal-slot/1.0.5: + resolution: + { + integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, + } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /internmap/2.0.3: + resolution: + { + integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, + } + engines: { node: ">=12" } + dev: false + + /into-stream/6.0.0: + resolution: + { + integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==, + } + engines: { node: ">=10" } + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-arguments/1.1.1: + resolution: + { + integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-array-buffer/3.0.1: + resolution: + { + integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==, + } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + + /is-arrayish/0.2.1: + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } + dev: true + + /is-bigint/1.0.4: + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path/2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object/1.1.2: + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable/1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: ">= 0.4" } + dev: true + + /is-ci/3.0.1: + resolution: + { + integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, + } + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-core-module/2.11.0: + resolution: + { + integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==, + } + dependencies: + has: 1.0.3 + + /is-date-object/1.0.5: + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.0 + + /is-extglob/2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + dev: true + + /is-fullwidth-code-point/4.0.0: + resolution: + { + integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, + } + engines: { node: ">=12" } + dev: true + + /is-glob/4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-interactive/1.0.0: + resolution: + { + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, + } + engines: { node: ">=8" } + dev: true + + /is-module/1.0.0: + resolution: + { + integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, + } + dev: true + + /is-negative-zero/2.0.2: + resolution: + { + integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, + } + engines: { node: ">= 0.4" } + dev: true + + /is-number-object/1.0.7: + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + dev: true + + /is-obj/1.0.1: + resolution: + { + integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, + } + engines: { node: ">=0.10.0" } + dev: true + + /is-obj/2.0.0: + resolution: + { + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, + } + engines: { node: ">=8" } + dev: true + + /is-path-cwd/2.2.0: + resolution: + { + integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==, + } + engines: { node: ">=6" } + dev: true + + /is-path-inside/3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + dev: true + + /is-plain-obj/1.1.0: + resolution: + { + integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, + } + engines: { node: ">=0.10.0" } + dev: true + + /is-plain-object/5.0.0: + resolution: + { + integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, + } + engines: { node: ">=0.10.0" } + dev: true + + /is-regex/1.1.4: + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-regexp/1.0.0: + resolution: + { + integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: + { + integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, + } + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream/2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + dev: true + + /is-stream/3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /is-string/1.0.7: + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: ">= 0.4" } + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path/1.0.1: + resolution: + { + integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, + } + engines: { node: ">=0.10.0" } + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array/1.1.10: + resolution: + { + integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, + } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /is-unicode-supported/0.1.0: + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: ">=10" } + dev: true + + /is-unicode-supported/1.3.0: + resolution: + { + integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, + } + engines: { node: ">=12" } + dev: true + + /is-utf8/0.2.1: + resolution: + { + integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, + } + dev: true + + /is-weakref/1.0.2: + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } + dependencies: + call-bind: 1.0.2 + dev: true + + /is-windows/1.0.2: + resolution: + { + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /isarray/1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } + + /isexe/2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + dev: true + + /issue-parser/6.0.0: + resolution: + { + integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==, + } + engines: { node: ">=10.13" } + dependencies: + lodash.capitalize: 4.2.1 + lodash.escaperegexp: 4.1.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.uniqby: 4.7.0 + dev: true + + /jake/10.8.5: + resolution: + { + integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + + /java-properties/1.0.2: + resolution: + { + integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==, + } + engines: { node: ">= 0.6.0" } + dev: true + + /jest-worker/26.6.2: + resolution: + { + integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, + } + engines: { node: ">= 10.13.0" } + dependencies: + "@types/node": 18.14.0 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /js-sdsl/4.3.0: + resolution: + { + integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==, + } + dev: true + + /js-tokens/4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + dev: true + + /js-yaml/4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc/0.5.0: + resolution: + { + integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, + } + hasBin: true + dev: true + + /jsesc/2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: ">=4" } + hasBin: true + dev: true + + /json-buffer/3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + dev: true + + /json-fixer/1.6.15: + resolution: + { + integrity: sha512-TuDuZ5KrgyjoCIppdPXBMqiGfota55+odM+j2cQ5rt/XKyKmqGB3Whz1F8SN8+60yYGy/Nu5lbRZ+rx8kBIvBw==, + } + engines: { node: ">=10" } + dependencies: + "@babel/runtime": 7.21.0 + chalk: 4.1.2 + pegjs: 0.10.0 + dev: true + + /json-parse-better-errors/1.0.2: + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } + dev: true + + /json-schema-traverse/0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + dev: true + + /json-schema-traverse/1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + dev: true + + /json-schema/0.4.0: + resolution: + { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, + } + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + dev: true + + /json-stringify-safe/5.0.1: + resolution: + { + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, + } + dev: true + + /json5/2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + dev: true + + /jsonfile/6.1.0: + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /jsonparse/1.3.1: + resolution: + { + integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, + } + engines: { "0": node >= 0.2.0 } + dev: true + + /jsonpointer/5.0.1: + resolution: + { + integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, + } + engines: { node: ">=0.10.0" } + dev: true + + /keyv/4.5.2: + resolution: + { + integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==, + } + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of/6.0.3: + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: ">=0.10.0" } + dev: true + + /known-css-properties/0.26.0: + resolution: + { + integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==, + } + dev: true + + /leaflet.markercluster/1.5.3_leaflet@1.9.3: + resolution: + { + integrity: sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==, + } + peerDependencies: + leaflet: ^1.3.1 + dependencies: + leaflet: 1.9.3 + dev: false + + /leaflet/1.9.3: + resolution: + { + integrity: sha512-iB2cR9vAkDOu5l3HAay2obcUHZ7xwUBBjph8+PGtmW/2lYhbLizWtG7nTeYht36WfOslixQF9D/uSIzhZgGMfQ==, + } + dev: false + + /leven/3.1.0: + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + } + engines: { node: ">=6" } + dev: true + + /levn/0.3.0: + resolution: + { + integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: false + + /levn/0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig/2.0.6: + resolution: + { + integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==, + } + engines: { node: ">=10" } + dev: true + + /lines-and-columns/1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + dev: true + + /lint-staged/13.1.2: + resolution: + { + integrity: sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==, + } + engines: { node: ^14.13.1 || >=16.0.0 } + hasBin: true + dependencies: + cli-truncate: 3.1.0 + colorette: 2.0.19 + commander: 9.5.0 + debug: 4.3.4 + execa: 6.1.0 + lilconfig: 2.0.6 + listr2: 5.0.7 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.12.3 + pidtree: 0.6.0 + string-argv: 0.3.1 + yaml: 2.2.1 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + + /listr2/5.0.7: + resolution: + { + integrity: sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==, + } + engines: { node: ^14.13.1 || >=16.0.0 } + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.19 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.0 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /lit-element/3.2.2: + resolution: + { + integrity: sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==, + } + dependencies: + "@lit/reactive-element": 1.6.1 + lit-html: 2.6.1 + dev: false + + /lit-html/2.6.1: + resolution: + { + integrity: sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==, + } + dependencies: + "@types/trusted-types": 2.0.3 + dev: false + + /lit/2.6.1: + resolution: + { + integrity: sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==, + } + dependencies: + "@lit/reactive-element": 1.6.1 + lit-element: 3.2.2 + lit-html: 2.6.1 + dev: false + + /load-json-file/4.0.0: + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: ">=4" } + dependencies: + graceful-fs: 4.2.10 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /locate-path/2.0.0: + resolution: + { + integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, + } + engines: { node: ">=4" } + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path/6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + dev: true + + /locate-path/7.2.0: + resolution: + { + integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + p-locate: 6.0.0 + dev: true + + /lodash-es/4.17.21: + resolution: + { + integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, + } + dev: true + + /lodash.camelcase/4.3.0: + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } + dev: true + + /lodash.capitalize/4.2.1: + resolution: + { + integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==, + } + dev: true + + /lodash.castarray/4.4.0: + resolution: + { + integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==, + } + dev: true + + /lodash.debounce/4.0.8: + resolution: + { + integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, + } + dev: true + + /lodash.escaperegexp/4.1.2: + resolution: + { + integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==, + } + dev: true + + /lodash.isfunction/3.0.9: + resolution: + { + integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==, + } + dev: true + + /lodash.ismatch/4.4.0: + resolution: + { + integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, + } + dev: true + + /lodash.isplainobject/4.0.6: + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } + dev: true + + /lodash.isstring/4.0.1: + resolution: + { + integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, + } + dev: true + + /lodash.kebabcase/4.1.1: + resolution: + { + integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==, + } + dev: true + + /lodash.map/4.6.0: + resolution: + { + integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==, + } + dev: true + + /lodash.memoize/4.1.2: + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } + dev: true + + /lodash.merge/4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + dev: true + + /lodash.mergewith/4.6.2: + resolution: + { + integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, + } + dev: true + + /lodash.snakecase/4.1.1: + resolution: + { + integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==, + } + dev: true + + /lodash.sortby/4.7.0: + resolution: + { + integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, + } + dev: true + + /lodash.startcase/4.4.0: + resolution: + { + integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, + } + dev: true + + /lodash.truncate/4.4.2: + resolution: + { + integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, + } + dev: true + + /lodash.uniq/4.5.0: + resolution: + { + integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, + } + dev: true + + /lodash.uniqby/4.7.0: + resolution: + { + integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==, + } + dev: true + + /lodash.upperfirst/4.3.1: + resolution: + { + integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==, + } + dev: true + + /lodash/4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + dev: true + + /log-symbols/4.1.0: + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: ">=10" } + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update/4.0.0: + resolution: + { + integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==, + } + engines: { node: ">=10" } + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /longest/2.0.1: + resolution: + { + integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==, + } + engines: { node: ">=0.10.0" } + dev: true + + /lowercase-keys/3.0.0: + resolution: + { + integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /lru-cache/5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache/6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + dev: true + + /lru-cache/7.16.1: + resolution: + { + integrity: sha512-9kkuMZHnLH/8qXARvYSjNvq8S1GYFFzynQTAfKeaJ0sIrR3PUPuu37Z+EiIANiZBvpfTf2B5y8ecDLSMWlLv+w==, + } + engines: { node: ">=12" } + dev: true + + /magic-string/0.25.1: + resolution: + { + integrity: sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: false + + /magic-string/0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string/0.27.0: + resolution: + { + integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, + } + engines: { node: ">=12" } + dependencies: + "@jridgewell/sourcemap-codec": 1.4.14 + dev: true + + /make-error/1.3.6: + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } + dev: true + + /map-obj/1.0.1: + resolution: + { + integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, + } + engines: { node: ">=0.10.0" } + dev: true + + /map-obj/4.3.0: + resolution: + { + integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, + } + engines: { node: ">=8" } + dev: true + + /marked-terminal/5.1.1_marked@4.2.12: + resolution: + { + integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==, + } + engines: { node: ">=14.13.1 || >=16.0.0" } + peerDependencies: + marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + ansi-escapes: 5.0.0 + cardinal: 2.1.1 + chalk: 5.2.0 + cli-table3: 0.6.3 + marked: 4.2.12 + node-emoji: 1.11.0 + supports-hyperlinks: 2.3.0 + dev: true + + /marked/4.2.12: + resolution: + { + integrity: sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==, + } + engines: { node: ">= 12" } + hasBin: true + + /mathml-tag-names/2.1.3: + resolution: + { + integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==, + } + dev: true + + /mdn-data/2.0.14: + resolution: + { + integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, + } + dev: true + + /mdn-data/2.0.28: + resolution: + { + integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, + } + dev: true + + /mdn-data/2.0.30: + resolution: + { + integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==, + } + dev: true + + /meow/8.1.2: + resolution: + { + integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, + } + engines: { node: ">=10" } + dependencies: + "@types/minimist": 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /meow/9.0.0: + resolution: + { + integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==, + } + engines: { node: ">=10" } + dependencies: + "@types/minimist": 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-source-map/1.0.4: + resolution: + { + integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==, + } + dependencies: + source-map: 0.5.7 + dev: false + + /merge-stream/2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: true + + /merge/2.1.1: + resolution: + { + integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==, + } + dev: true + + /merge2/1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: true + + /micromatch/4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: true + + /mime-types/2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + dev: true + + /mime/3.0.0: + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: ">=10.0.0" } + hasBin: true + dev: true + + /mimic-fn/2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + dev: true + + /mimic-fn/4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + dev: true + + /mimic-response/3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + dev: true + + /mimic-response/4.0.0: + resolution: + { + integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /min-indent/1.0.1: + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: ">=4" } + dev: true + + /mini-svg-data-uri/1.4.4: + resolution: + { + integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==, + } + hasBin: true + dev: true + + /minimatch/3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch/5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options/4.1.0: + resolution: + { + integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, + } + engines: { node: ">= 6" } + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist/1.2.7: + resolution: + { + integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==, + } + dev: true + + /minimist/1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + /mitt/3.0.0: + resolution: + { + integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, + } + dev: false + + /modify-values/1.0.1: + resolution: + { + integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, + } + engines: { node: ">=0.10.0" } + dev: true + + /ms/2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + dev: true + + /mute-stream/0.0.8: + resolution: + { + integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, + } + dev: true + + /nanoid/3.3.4: + resolution: + { + integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + /natural-compare-lite/1.4.0: + resolution: + { + integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, + } + dev: true + + /natural-compare/1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + dev: true + + /neo-async/2.6.2: + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } + dev: true + + /nerf-dart/1.0.0: + resolution: + { + integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==, + } + dev: true + + /next-tick/1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + dev: false + + /node-emoji/1.11.0: + resolution: + { + integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==, + } + dependencies: + lodash: 4.17.21 + dev: true + + /node-fetch/2.6.9: + resolution: + { + integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-releases/2.0.10: + resolution: + { + integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==, + } + dev: true + + /normalize-package-data/2.5.0: + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data/3.0.3: + resolution: + { + integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, + } + engines: { node: ">=10" } + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.11.0 + semver: 7.3.8 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path/3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /normalize-range/0.1.2: + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /normalize-url/6.1.0: + resolution: + { + integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, + } + engines: { node: ">=10" } + dev: true + + /normalize-url/8.0.0: + resolution: + { + integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, + } + engines: { node: ">=14.16" } + dev: true + + /npm-run-path/4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path/5.1.0: + resolution: + { + integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + path-key: 4.0.0 + dev: true + + /npm/8.19.4: + resolution: + { + integrity: sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + hasBin: true + dev: true + bundledDependencies: + - "@isaacs/string-locale-compare" + - "@npmcli/arborist" + - "@npmcli/ci-detect" + - "@npmcli/config" + - "@npmcli/fs" + - "@npmcli/map-workspaces" + - "@npmcli/package-json" + - "@npmcli/run-script" + - abbrev + - archy + - cacache + - chalk + - chownr + - cli-columns + - cli-table3 + - columnify + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - mkdirp + - mkdirp-infer-owner + - ms + - node-gyp + - nopt + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - npmlog + - opener + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - read-package-json + - read-package-json-fast + - readdir-scoped-modules + - rimraf + - semver + - ssri + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + + /nth-check/2.1.1: + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } + dependencies: + boolbase: 1.0.0 + dev: true + + /object-hash/3.0.0: + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } + dev: true + + /object-inspect/1.12.3: + resolution: + { + integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==, + } + + /object-is/1.1.5: + resolution: + { + integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: false + + /object-keys/1.1.1: + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } + + /object.assign/4.1.4: + resolution: + { + integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /once/1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime/6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator/0.8.3: + resolution: + { + integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, + } + engines: { node: ">= 0.8.0" } + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: false + + /optionator/0.9.1: + resolution: + { + integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==, + } + engines: { node: ">= 0.8.0" } + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /ora/5.4.1: + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + } + engines: { node: ">=10" } + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.7.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-tmpdir/1.0.2: + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: ">=0.10.0" } + dev: true + + /p-cancelable/3.0.0: + resolution: + { + integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==, + } + engines: { node: ">=12.20" } + dev: true + + /p-each-series/3.0.0: + resolution: + { + integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==, + } + engines: { node: ">=12" } + dev: true + + /p-filter/2.1.0: + resolution: + { + integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==, + } + engines: { node: ">=8" } + dependencies: + p-map: 2.1.0 + dev: true + + /p-is-promise/3.0.0: + resolution: + { + integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==, + } + engines: { node: ">=8" } + dev: true + + /p-limit/1.3.0: + resolution: + { + integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, + } + engines: { node: ">=4" } + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit/2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit/3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit/4.0.0: + resolution: + { + integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate/2.0.0: + resolution: + { + integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, + } + engines: { node: ">=4" } + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate/4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: ">=8" } + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + dev: true + + /p-locate/6.0.0: + resolution: + { + integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + p-limit: 4.0.0 + dev: true + + /p-map/2.1.0: + resolution: + { + integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==, + } + engines: { node: ">=6" } + dev: true + + /p-map/4.0.0: + resolution: + { + integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, + } + engines: { node: ">=10" } + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-reduce/2.1.0: + resolution: + { + integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, + } + engines: { node: ">=8" } + dev: true + + /p-reduce/3.0.0: + resolution: + { + integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==, + } + engines: { node: ">=12" } + dev: true + + /p-retry/4.6.2: + resolution: + { + integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==, + } + engines: { node: ">=8" } + dependencies: + "@types/retry": 0.12.0 + retry: 0.13.1 + dev: true + + /p-try/1.0.0: + resolution: + { + integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, + } + engines: { node: ">=4" } + dev: true + + /p-try/2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } + dev: true + + /pako/0.2.9: + resolution: + { + integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==, + } + dev: false + + /parent-module/1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json/4.0.0: + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: ">=4" } + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json/5.2.0: + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: ">=8" } + dependencies: + "@babel/code-frame": 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-passwd/1.0.0: + resolution: + { + integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, + } + engines: { node: ">=0.10.0" } + dev: true + + /parse-path/7.0.0: + resolution: + { + integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==, + } + dependencies: + protocols: 2.0.1 + dev: true + + /parse-url/8.1.0: + resolution: + { + integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==, + } + dependencies: + parse-path: 7.0.0 + dev: true + + /path-exists/3.0.0: + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: ">=4" } + dev: true + + /path-exists/4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + dev: true + + /path-exists/5.0.0: + resolution: + { + integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /path-is-absolute/1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + dev: true + + /path-key/3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + dev: true + + /path-key/4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } + dev: true + + /path-parse/1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + /path-type/4.0.0: + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: ">=8" } + dev: true + + /pdfmake/0.2.7: + resolution: + { + integrity: sha512-ClLpgx30H5G3EDvRW1MrA1Xih6YxEaSgIVFrOyBMgAAt62V+hxsyWAi6JNP7u1Fc5JKYAbpb4RRVw8Rhvmz5cQ==, + } + engines: { node: ">=12" } + dependencies: + "@foliojs-fork/linebreak": 1.1.1 + "@foliojs-fork/pdfkit": 0.13.0 + iconv-lite: 0.6.3 + xmldoc: 1.2.0 + dev: false + + /pegjs/0.10.0: + resolution: + { + integrity: sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==, + } + engines: { node: ">=0.10" } + hasBin: true + dev: true + + /performance-now/2.1.0: + resolution: + { + integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, + } + dev: false + + /picocolors/1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + + /picomatch/2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + dev: true + + /pidtree/0.6.0: + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: ">=0.10" } + hasBin: true + dev: true + + /pify/2.3.0: + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: ">=0.10.0" } + dev: true + + /pify/3.0.0: + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: ">=4" } + dev: true + + /pify/5.0.0: + resolution: + { + integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, + } + engines: { node: ">=10" } + dev: true + + /pkg-conf/2.1.0: + resolution: + { + integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==, + } + engines: { node: ">=4" } + dependencies: + find-up: 2.1.0 + load-json-file: 4.0.0 + dev: true + + /png-js/1.0.0: + resolution: + { + integrity: sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==, + } + dev: false + + /polylabel/1.1.0: + resolution: + { + integrity: sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==, + } + dependencies: + tinyqueue: 2.0.3 + dev: false + + /postcss-attribute-case-insensitive/6.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-calc/8.2.4_postcss@8.4.21: + resolution: + { + integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==, + } + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-clamp/4.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, + } + engines: { node: ">=7.6.0" } + peerDependencies: + postcss: ^8.4.6 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-functional-notation/5.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-M6ygxWOyd6eWf3sd1Lv8xi4SeF4iBPfJvkfMU4ITh8ExJc1qhbvh/U8Cv/uOvBgUVOMDdScvCdlg8+hREQzs7w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-hex-alpha/9.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-color-rebeccapurple/8.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-xWf/JmAxVoB5bltHpXk+uGRoGFwu4WDAR7210el+iyvTdqiKpDhtcT8N3edXMoVJY0WHFMrKMUieql/wRNiXkw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-colormin/5.3.1_postcss@8.4.21: + resolution: + { + integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-convert-values/5.1.3_postcss@8.4.21: + resolution: + { + integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-custom-media/9.1.2_postcss@8.4.21: + resolution: + { + integrity: sha512-osM9g4UKq4XKimAC7RAXroqi3BXpxfwTswAJQiZdrBjWGFGEyxQrY5H2eDWI8F+MEvEUfYDxA8scqi3QWROCSw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/cascade-layer-name-parser": 1.0.1_ppok7cytzjc65mcyxmtit3wdyi + "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-tokenizer": 2.1.0 + "@csstools/media-query-list-parser": 2.0.1_ppok7cytzjc65mcyxmtit3wdyi + postcss: 8.4.21 + dev: true + + /postcss-custom-properties/13.1.3_postcss@8.4.21: + resolution: + { + integrity: sha512-15equAsfqtnr7jyzes6vyaGdAiNmKd+50FZ35/E/huBNBt7PgGMSNL/4o765nnNoP2dmaMJklb3FwJf3fdRcpA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/cascade-layer-name-parser": 1.0.1_ppok7cytzjc65mcyxmtit3wdyi + "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-tokenizer": 2.1.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-custom-selectors/7.1.2_postcss@8.4.21: + resolution: + { + integrity: sha512-jX7VlE3jrgfBIOfxiGNRFq81xUoHSZhvxhQurzE7ZFRv+bUmMwB7/XnA0nNlts2CwNtbXm4Ozy0ZAYKHlCRmBQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/cascade-layer-name-parser": 1.0.1_ppok7cytzjc65mcyxmtit3wdyi + "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-tokenizer": 2.1.0 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-dir-pseudo-class/7.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-cMnslilYxBf9k3qejnovrUONZx1rXeUZJw06fgIUBzABJe3D2LiLL5WAER7Imt3nrkaIgG05XZBztueLEf5P8w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-discard-comments/5.1.2_postcss@8.4.21: + resolution: + { + integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-discard-duplicates/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-discard-empty/5.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-discard-overridden/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-double-position-gradients/4.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-GXL1RmFREDK4Q9aYvI2RhVrA6a6qqSMQQ5ke8gSH1xgV6exsqbcJpIumC7AOgooH6/WIG3/K/T8xxAiVHy/tJg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-focus-visible/8.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-f/Vd+EC/GaKElknU59esVcRYr/Y3t1ZAQyL4u2xSOgkDy4bMCmG7VP5cGvj3+BTLNE9ETfEuz2nnt4qkZwTTeA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-focus-within/7.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-AHAJ89UQBcqBvFgQJE9XasGuwMNkKsGj4D/f9Uk60jFmEBHpAL14DrnSk3Rj+SwZTr/WUG+mh+Rvf8fid/346w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-font-variant/5.0.0_postcss@8.4.21: + resolution: + { + integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, + } + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-gap-properties/4.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-V5OuQGw4lBumPlwHWk/PRfMKjaq/LTGR4WDTemIMCaMevArVfCCA9wBJiL1VjDAd+rzuCIlkRoRvDsSiAaZ4Fg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-image-set-function/5.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-Sszjwo0ubETX0Fi5MvpYzsONwrsjeabjMoc5YqHvURFItXgIu3HdCjcVuVKGMPGzKRhgaknmdM5uVWInWPJmeg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-import/14.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.1 + dev: true + + /postcss-import/15.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.1 + dev: true + + /postcss-initial/4.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==, + } + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-js/4.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, + } + engines: { node: ^12 || ^14 || >= 16 } + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.21 + dev: true + + /postcss-lab-function/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-iZApRTNcpc71uTn7PkzjHtj5cmuZpvu6okX4jHnM5OFi2fG97sodjxkq6SpL65xhW0NviQrAMSX97ntyGVRV0w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/color-helpers": 1.0.0 + "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-load-config/3.1.4_postcss@8.4.21: + resolution: + { + integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==, + } + engines: { node: ">= 10" } + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.0.6 + postcss: 8.4.21 + yaml: 1.10.2 + dev: true + + /postcss-logical/6.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-qb1+LpClhYjxac8SfOcWotnY3unKZesDqIOm+jnGt8rTl7xaIWpE2bPGZHxflOip1E/4ETo79qlJyRL3yrHn1g==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-media-minmax/5.0.0_postcss@8.4.21: + resolution: + { + integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-media-query-parser/0.2.3: + resolution: + { + integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==, + } + dev: true + + /postcss-merge-longhand/5.1.7_postcss@8.4.21: + resolution: + { + integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1_postcss@8.4.21 + dev: true + + /postcss-merge-rules/5.1.4_postcss@8.4.21: + resolution: + { + integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-minify-font-values/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-gradients/5.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-params/5.1.4_postcss@8.4.21: + resolution: + { + integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-selectors/5.2.1_postcss@8.4.21: + resolution: + { + integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-nested/5.0.6_postcss@8.4.21: + resolution: + { + integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: false + + /postcss-nested/6.0.0_postcss@8.4.21: + resolution: + { + integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-nesting/11.2.1_postcss@8.4.21: + resolution: + { + integrity: sha512-E6Jq74Jo/PbRAtZioON54NPhUNJYxVWhwxbweYl1vAoBYuGlDIts5yhtKiZFLvkvwT73e/9nFrW3oMqAtgG+GQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-normalize-charset/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-normalize-display-values/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-positions/5.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-string/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-unicode/5.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-url/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-whitespace/5.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-opacity-percentage/1.1.3_postcss@8.4.21: + resolution: + { + integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==, + } + engines: { node: ^12 || ^14 || >=16 } + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-ordered-values/5.1.3_postcss@8.4.21: + resolution: + { + integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 3.1.0_postcss@8.4.21 + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-overflow-shorthand/4.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-HQZ0qi/9iSYHW4w3ogNqVNr2J49DHJAl7r8O2p0Meip38jsdnRPgiDW7r/LlLrrMBMe3KHkvNtAV2UmRVxzLIg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-page-break/3.0.4_postcss@8.4.21: + resolution: + { + integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, + } + peerDependencies: + postcss: ^8 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-place/8.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-Ow2LedN8sL4pq8ubukO77phSVt4QyCm35ZGCYXKvRFayAwcpgB0sjNJglDoTuRdUL32q/ZC1VkPBo0AOEr4Uiw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-preset-env/8.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-IUbymw0JlUbyVG+I85963PNWgPp3KhnFa1sxU7M/2dGthxV8e297P0VV5W9XcyypoH4hirH2fp1c6fmqh6YnSg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/postcss-cascade-layers": 3.0.1_postcss@8.4.21 + "@csstools/postcss-color-function": 2.1.0_postcss@8.4.21 + "@csstools/postcss-font-format-keywords": 2.0.2_postcss@8.4.21 + "@csstools/postcss-hwb-function": 2.1.1_postcss@8.4.21 + "@csstools/postcss-ic-unit": 2.0.2_postcss@8.4.21 + "@csstools/postcss-is-pseudo-class": 3.1.1_postcss@8.4.21 + "@csstools/postcss-logical-float-and-clear": 1.0.1_postcss@8.4.21 + "@csstools/postcss-logical-resize": 1.0.1_postcss@8.4.21 + "@csstools/postcss-logical-viewport-units": 1.0.2_postcss@8.4.21 + "@csstools/postcss-media-queries-aspect-ratio-number-values": 1.0.1_postcss@8.4.21 + "@csstools/postcss-nested-calc": 2.0.2_postcss@8.4.21 + "@csstools/postcss-normalize-display-values": 2.0.1_postcss@8.4.21 + "@csstools/postcss-oklab-function": 2.1.0_postcss@8.4.21 + "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + "@csstools/postcss-scope-pseudo-class": 2.0.2_postcss@8.4.21 + "@csstools/postcss-stepped-value-functions": 2.0.1_postcss@8.4.21 + "@csstools/postcss-text-decoration-shorthand": 2.2.1_postcss@8.4.21 + "@csstools/postcss-trigonometric-functions": 2.0.1_postcss@8.4.21 + "@csstools/postcss-unset-value": 2.0.1_postcss@8.4.21 + autoprefixer: 10.4.13_postcss@8.4.21 + browserslist: 4.21.5 + css-blank-pseudo: 5.0.2_postcss@8.4.21 + css-has-pseudo: 5.0.2_postcss@8.4.21 + css-prefers-color-scheme: 8.0.2_postcss@8.4.21 + cssdb: 7.4.1 + postcss: 8.4.21 + postcss-attribute-case-insensitive: 6.0.2_postcss@8.4.21 + postcss-clamp: 4.1.0_postcss@8.4.21 + postcss-color-functional-notation: 5.0.2_postcss@8.4.21 + postcss-color-hex-alpha: 9.0.2_postcss@8.4.21 + postcss-color-rebeccapurple: 8.0.2_postcss@8.4.21 + postcss-custom-media: 9.1.2_postcss@8.4.21 + postcss-custom-properties: 13.1.3_postcss@8.4.21 + postcss-custom-selectors: 7.1.2_postcss@8.4.21 + postcss-dir-pseudo-class: 7.0.2_postcss@8.4.21 + postcss-double-position-gradients: 4.0.2_postcss@8.4.21 + postcss-focus-visible: 8.0.2_postcss@8.4.21 + postcss-focus-within: 7.0.2_postcss@8.4.21 + postcss-font-variant: 5.0.0_postcss@8.4.21 + postcss-gap-properties: 4.0.1_postcss@8.4.21 + postcss-image-set-function: 5.0.2_postcss@8.4.21 + postcss-initial: 4.0.1_postcss@8.4.21 + postcss-lab-function: 5.1.0_postcss@8.4.21 + postcss-logical: 6.1.0_postcss@8.4.21 + postcss-media-minmax: 5.0.0_postcss@8.4.21 + postcss-nesting: 11.2.1_postcss@8.4.21 + postcss-opacity-percentage: 1.1.3_postcss@8.4.21 + postcss-overflow-shorthand: 4.0.1_postcss@8.4.21 + postcss-page-break: 3.0.4_postcss@8.4.21 + postcss-place: 8.0.1_postcss@8.4.21 + postcss-pseudo-class-any-link: 8.0.2_postcss@8.4.21 + postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.21 + postcss-selector-not: 7.0.1_postcss@8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-pseudo-class-any-link/8.0.2_postcss@8.4.21: + resolution: + { + integrity: sha512-FYTIuRE07jZ2CW8POvctRgArQJ43yxhr5vLmImdKUvjFCkR09kh8pIdlCwdx/jbFm7MiW4QP58L4oOUv3grQYA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-reduce-initial/5.1.2_postcss@8.4.21: + resolution: + { + integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + caniuse-api: 3.0.0 + postcss: 8.4.21 + dev: true + + /postcss-reduce-transforms/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.21: + resolution: + { + integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, + } + peerDependencies: + postcss: ^8.0.3 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-reporter/7.0.5_postcss@8.4.21: + resolution: + { + integrity: sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==, + } + engines: { node: ">=10" } + peerDependencies: + postcss: ^8.1.0 + dependencies: + picocolors: 1.0.0 + postcss: 8.4.21 + thenby: 1.3.4 + dev: true + + /postcss-resolve-nested-selector/0.1.1: + resolution: + { + integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==, + } + dev: true + + /postcss-safe-parser/6.0.0_postcss@8.4.21: + resolution: + { + integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.3.3 + dependencies: + postcss: 8.4.21 + dev: true + + /postcss-selector-not/7.0.1_postcss@8.4.21: + resolution: + { + integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-selector-parser/6.0.10: + resolution: + { + integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, + } + engines: { node: ">=4" } + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-selector-parser/6.0.11: + resolution: + { + integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==, + } + engines: { node: ">=4" } + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + /postcss-svgo/5.1.0_postcss@8.4.21: + resolution: + { + integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + dev: true + + /postcss-unique-selectors/5.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-value-parser/4.2.0: + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } + dev: true + + /postcss/8.4.21: + resolution: + { + integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==, + } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /prelude-ls/1.1.2: + resolution: + { + integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, + } + engines: { node: ">= 0.8.0" } + dev: false + + /prelude-ls/1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + dev: true + + /prettier-linter-helpers/1.0.0: + resolution: + { + integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + fast-diff: 1.2.0 + dev: true + + /prettier-plugin-organize-imports/3.2.2_silln3pw57har7jydmecgzoypa: + resolution: + { + integrity: sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==, + } + peerDependencies: + "@volar/vue-language-plugin-pug": ^1.0.4 + "@volar/vue-typescript": ^1.0.4 + prettier: ">=2.0" + typescript: ">=2.9" + peerDependenciesMeta: + "@volar/vue-language-plugin-pug": + optional: true + "@volar/vue-typescript": + optional: true + dependencies: + prettier: 2.8.4 + typescript: 4.9.5 + dev: true + + /prettier/2.8.4: + resolution: + { + integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==, + } + engines: { node: ">=10.13.0" } + hasBin: true + dev: true + + /pretty-bytes/5.6.0: + resolution: + { + integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, + } + engines: { node: ">=6" } + dev: true + + /pretty-bytes/6.1.0: + resolution: + { + integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==, + } + engines: { node: ^14.13.1 || >=16.0.0 } + dev: true + + /process-nextick-args/2.0.1: + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } + + /proto-list/1.2.4: + resolution: + { + integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, + } + dev: true + + /protocols/2.0.1: + resolution: + { + integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==, + } + dev: true + + /punycode/2.3.0: + resolution: + { + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + } + engines: { node: ">=6" } + dev: true + + /q/1.5.1: + resolution: + { + integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, + } + engines: { node: ">=0.6.0", teleport: ">=0.2.0" } + dev: true + + /queue-microtask/1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + dev: true + + /quick-lru/4.0.1: + resolution: + { + integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, + } + engines: { node: ">=8" } + dev: true + + /quick-lru/5.1.1: + resolution: + { + integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, + } + engines: { node: ">=10" } + dev: true + + /quote-stream/1.0.2: + resolution: + { + integrity: sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==, + } + hasBin: true + dependencies: + buffer-equal: 0.0.1 + minimist: 1.2.8 + through2: 2.0.5 + dev: false + + /raf/3.4.1: + resolution: + { + integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, + } + dependencies: + performance-now: 2.1.0 + dev: false + + /randombytes/2.1.0: + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rc/1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /read-cache/1.0.0: + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } + dependencies: + pify: 2.3.0 + dev: true + + /read-pkg-up/7.0.1: + resolution: + { + integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, + } + engines: { node: ">=8" } + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg-up/9.1.0: + resolution: + { + integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + find-up: 6.3.0 + read-pkg: 7.1.0 + type-fest: 2.19.0 + dev: true + + /read-pkg/5.2.0: + resolution: + { + integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, + } + engines: { node: ">=8" } + dependencies: + "@types/normalize-package-data": 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-pkg/7.1.0: + resolution: + { + integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==, + } + engines: { node: ">=12.20" } + dependencies: + "@types/normalize-package-data": 2.4.1 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 2.19.0 + dev: true + + /readable-stream/2.3.7: + resolution: + { + integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==, + } + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream/3.6.0: + resolution: + { + integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp/3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: true + + /redent/3.0.0: + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: ">=8" } + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redeyed/2.1.1: + resolution: + { + integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==, + } + dependencies: + esprima: 4.0.1 + dev: true + + /redux/4.2.1: + resolution: + { + integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==, + } + dependencies: + "@babel/runtime": 7.21.0 + dev: false + + /regenerate-unicode-properties/10.1.0: + resolution: + { + integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==, + } + engines: { node: ">=4" } + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate/1.4.2: + resolution: + { + integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, + } + dev: true + + /regenerator-runtime/0.13.11: + resolution: + { + integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, + } + + /regenerator-transform/0.15.1: + resolution: + { + integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==, + } + dependencies: + "@babel/runtime": 7.21.0 + dev: true + + /regexp.prototype.flags/1.4.3: + resolution: + { + integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==, + } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + + /regexpp/3.2.0: + resolution: + { + integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, + } + engines: { node: ">=8" } + dev: true + + /regexpu-core/5.3.1: + resolution: + { + integrity: sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==, + } + engines: { node: ">=4" } + dependencies: + "@babel/regjsgen": 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /registry-auth-token/5.0.1: + resolution: + { + integrity: sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==, + } + engines: { node: ">=14" } + dependencies: + "@pnpm/npm-conf": 1.0.5 + dev: true + + /regjsparser/0.9.1: + resolution: + { + integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, + } + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /regression/2.0.1: + resolution: + { + integrity: sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ==, + } + dev: false + + /require-directory/2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } + dev: true + + /require-from-string/2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } + dev: true + + /require-main-filename/2.0.0: + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } + dev: true + + /resolve-alpn/1.2.1: + resolution: + { + integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, + } + dev: true + + /resolve-dir/1.0.1: + resolution: + { + integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, + } + engines: { node: ">=0.10.0" } + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: true + + /resolve-from/4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + dev: true + + /resolve-from/5.0.0: + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: ">=8" } + dev: true + + /resolve-global/1.0.0: + resolution: + { + integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, + } + engines: { node: ">=8" } + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve/1.1.7: + resolution: + { + integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==, + } + dev: false + + /resolve/1.22.1: + resolution: + { + integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==, + } + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /responselike/3.0.0: + resolution: + { + integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, + } + engines: { node: ">=14.16" } + dependencies: + lowercase-keys: 3.0.0 + dev: true + + /restore-cursor/3.1.0: + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: ">=8" } + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /retry/0.13.1: + resolution: + { + integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, + } + engines: { node: ">= 4" } + dev: true + + /reusify/1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + dev: true + + /rfdc/1.3.0: + resolution: + { + integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==, + } + dev: true + + /rgbcolor/1.0.1: + resolution: + { + integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==, + } + engines: { node: ">= 0.8.15" } + dev: false + + /rimraf/3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup-plugin-terser/7.0.2_rollup@2.79.1: + resolution: + { + integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==, + } + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + "@babel/code-frame": 7.18.6 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.16.4 + dev: true + + /rollup/2.79.1: + resolution: + { + integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==, + } + engines: { node: ">=10.0.0" } + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /rollup/3.17.2: + resolution: + { + integrity: sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA==, + } + engines: { node: ">=14.18.0", npm: ">=8.0.0" } + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-async/2.4.1: + resolution: + { + integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, + } + engines: { node: ">=0.12.0" } + dev: true + + /run-parallel/1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs/6.6.7: + resolution: + { + integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, + } + engines: { npm: ">=2.0.0" } + dependencies: + tslib: 1.14.1 + dev: true + + /rxjs/7.8.0: + resolution: + { + integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==, + } + dependencies: + tslib: 2.5.0 + dev: true + + /safe-buffer/5.1.2: + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } + + /safe-buffer/5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: true + + /safe-regex-test/1.0.0: + resolution: + { + integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==, + } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-regex: 1.1.4 + dev: true + + /safer-buffer/2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + /sax/1.2.4: + resolution: + { + integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, + } + dev: false + + /scope-analyzer/2.1.2: + resolution: + { + integrity: sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==, + } + dependencies: + array-from: 2.1.1 + dash-ast: 2.0.1 + es6-map: 0.1.5 + es6-set: 0.1.6 + es6-symbol: 3.1.3 + estree-is-function: 1.0.0 + get-assigned-identifiers: 1.2.0 + dev: false + + /semantic-release/20.1.0: + resolution: + { + integrity: sha512-+9+n6RIr0Fz0F53cXrjpawxWlUg3O7/qr1jF9lrE+/v6WqwBrSWnavVHTPaf2WLerET2EngoqI0M4pahkKl6XQ==, + } + engines: { node: ">=18" } + hasBin: true + dependencies: + "@semantic-release/commit-analyzer": 9.0.2_semantic-release@20.1.0 + "@semantic-release/error": 3.0.0 + "@semantic-release/github": 8.0.7_semantic-release@20.1.0 + "@semantic-release/npm": 9.0.2_semantic-release@20.1.0 + "@semantic-release/release-notes-generator": 10.0.3_semantic-release@20.1.0 + aggregate-error: 4.0.1 + cosmiconfig: 8.0.0 + debug: 4.3.4 + env-ci: 8.0.0 + execa: 6.1.0 + figures: 5.0.0 + find-versions: 5.1.0 + get-stream: 6.0.1 + git-log-parser: 1.2.0 + hook-std: 3.0.0 + hosted-git-info: 6.1.1 + lodash-es: 4.17.21 + marked: 4.2.12 + marked-terminal: 5.1.1_marked@4.2.12 + micromatch: 4.0.5 + p-each-series: 3.0.0 + p-reduce: 3.0.0 + read-pkg-up: 9.1.0 + resolve-from: 5.0.0 + semver: 7.3.8 + semver-diff: 4.0.0 + signale: 1.4.0 + yargs: 17.7.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /semver-diff/4.0.0: + resolution: + { + integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==, + } + engines: { node: ">=12" } + dependencies: + semver: 7.3.8 + dev: true + + /semver-regex/4.0.5: + resolution: + { + integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==, + } + engines: { node: ">=12" } + dev: true + + /semver/5.7.1: + resolution: + { + integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==, + } + hasBin: true + dev: true + + /semver/6.3.0: + resolution: + { + integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, + } + hasBin: true + dev: true + + /semver/7.3.8: + resolution: + { + integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /serialize-javascript/4.0.0: + resolution: + { + integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, + } + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking/2.0.0: + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } + dev: true + + /shallow-copy/0.0.1: + resolution: + { + integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==, + } + dev: false + + /shebang-command/2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + dev: true + + /side-channel/1.0.4: + resolution: + { + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, + } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + dev: true + + /signal-exit/3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + dev: true + + /signale/1.4.0: + resolution: + { + integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==, + } + engines: { node: ">=6" } + dependencies: + chalk: 2.4.2 + figures: 2.0.0 + pkg-conf: 2.1.0 + dev: true + + /slash/3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } + dev: true + + /slice-ansi/3.0.0: + resolution: + { + integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==, + } + engines: { node: ">=8" } + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi/4.0.0: + resolution: + { + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi/5.0.0: + resolution: + { + integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, + } + engines: { node: ">=12" } + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js/1.0.2: + resolution: + { + integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, + } + engines: { node: ">=0.10.0" } + + /source-map-support/0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.1.43: + resolution: + { + integrity: sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==, + } + engines: { node: ">=0.8.0" } + requiresBuild: true + dependencies: + amdefine: 1.0.1 + dev: false + optional: true + + /source-map/0.5.7: + resolution: + { + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, + } + engines: { node: ">=0.10.0" } + dev: false + + /source-map/0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + + /source-map/0.8.0-beta.0: + resolution: + { + integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, + } + engines: { node: ">= 8" } + dependencies: + whatwg-url: 7.1.0 + dev: true + + /sourcemap-codec/1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + + /spawn-error-forwarder/1.0.0: + resolution: + { + integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==, + } + dev: true + + /spdx-correct/3.1.1: + resolution: + { + integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==, + } + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.12 + dev: true + + /spdx-exceptions/2.3.0: + resolution: + { + integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, + } + dev: true + + /spdx-expression-parse/3.0.1: + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.12 + dev: true + + /spdx-license-ids/3.0.12: + resolution: + { + integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==, + } + dev: true + + /split/1.0.1: + resolution: + { + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, + } + dependencies: + through: 2.3.8 + dev: true + + /split2/1.0.0: + resolution: + { + integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==, + } + dependencies: + through2: 2.0.5 + dev: true + + /split2/3.2.2: + resolution: + { + integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, + } + dependencies: + readable-stream: 3.6.0 + dev: true + + /ssf/0.11.2: + resolution: + { + integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==, + } + engines: { node: ">=0.8" } + dependencies: + frac: 1.1.2 + dev: false + + /stable/0.1.8: + resolution: + { + integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==, + } + deprecated: "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + dev: true + + /stackblur-canvas/2.5.0: + resolution: + { + integrity: sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==, + } + engines: { node: ">=0.1.14" } + dev: false + + /static-eval/2.1.0: + resolution: + { + integrity: sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==, + } + dependencies: + escodegen: 1.14.3 + dev: false + + /static-module/3.0.4: + resolution: + { + integrity: sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==, + } + dependencies: + acorn-node: 1.8.2 + concat-stream: 1.6.2 + convert-source-map: 1.9.0 + duplexer2: 0.1.4 + escodegen: 1.14.3 + has: 1.0.3 + magic-string: 0.25.1 + merge-source-map: 1.0.4 + object-inspect: 1.12.3 + readable-stream: 2.3.7 + scope-analyzer: 2.1.2 + shallow-copy: 0.0.1 + static-eval: 2.1.0 + through2: 2.0.5 + dev: false + + /stencil-wormhole/3.4.1: + resolution: + { + integrity: sha512-ppYTcWTJnIl4ZAKwF39LTA9f/ypHfbVefsHdN2hpMQGrR57wt1TieZo9tlCM/r1Y4SFiZ5yz/cjho564C921Xw==, + } + dev: false + + /stream-combiner2/1.1.1: + resolution: + { + integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==, + } + dependencies: + duplexer2: 0.1.4 + readable-stream: 2.3.7 + dev: true + + /string-argv/0.3.1: + resolution: + { + integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==, + } + engines: { node: ">=0.6.19" } + dev: true + + /string-width/4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width/5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + dev: true + + /string.prototype.matchall/4.0.8: + resolution: + { + integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==, + } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + dev: true + + /string.prototype.trimend/1.0.6: + resolution: + { + integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==, + } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string.prototype.trimstart/1.0.6: + resolution: + { + integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==, + } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 + dev: true + + /string_decoder/1.1.1: + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } + dependencies: + safe-buffer: 5.1.2 + + /string_decoder/1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringify-object/3.3.0: + resolution: + { + integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, + } + engines: { node: ">=4" } + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: true + + /strip-ansi/6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi/7.0.1: + resolution: + { + integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==, + } + engines: { node: ">=12" } + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom/3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } + dev: true + + /strip-bom/4.0.0: + resolution: + { + integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, + } + engines: { node: ">=8" } + dev: true + + /strip-comments/2.0.1: + resolution: + { + integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==, + } + engines: { node: ">=10" } + dev: true + + /strip-final-newline/2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } + dev: true + + /strip-final-newline/3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } + dev: true + + /strip-indent/3.0.0: + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: ">=8" } + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/2.0.1: + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: ">=0.10.0" } + dev: true + + /strip-json-comments/3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + dev: true + + /style-mod/4.0.0: + resolution: + { + integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==, + } + dev: false + + /style-search/0.1.0: + resolution: + { + integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==, + } + dev: true + + /stylehacks/5.1.1_postcss@8.4.21: + resolution: + { + integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.21.5 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 + dev: true + + /stylelint-config-recommended/10.0.1_stylelint@15.2.0: + resolution: + { + integrity: sha512-TQ4xQ48tW4QSlODcti7pgSRqBZcUaBzuh0jPpfiMhwJKBPkqzTIAU+IrSWL/7BgXlOM90DjB7YaNgFpx8QWhuA==, + } + peerDependencies: + stylelint: ^15.0.0 + dependencies: + stylelint: 15.2.0 + dev: true + + /stylelint-config-standard/30.0.1_stylelint@15.2.0: + resolution: + { + integrity: sha512-NbeHOmpRQhjZh5XB1B/S4MLRWvz4xxAxeDBjzl0tY2xEcayNhLbaRGF0ZQzq+DQZLCcPpOHeS2Ru1ydbkhkmLg==, + } + peerDependencies: + stylelint: ^15.0.0 + dependencies: + stylelint: 15.2.0 + stylelint-config-recommended: 10.0.1_stylelint@15.2.0 + dev: true + + /stylelint/15.2.0: + resolution: + { + integrity: sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==, + } + engines: { node: ^14.13.1 || >=16.0.0 } + hasBin: true + dependencies: + "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-tokenizer": 2.1.0 + "@csstools/media-query-list-parser": 2.0.1_ppok7cytzjc65mcyxmtit3wdyi + "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 8.0.0 + css-functions-list: 3.1.0 + css-tree: 2.3.1 + debug: 4.3.4 + fast-glob: 3.2.12 + fastest-levenshtein: 1.0.16 + file-entry-cache: 6.0.1 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.2.0 + ignore: 5.2.4 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.26.0 + mathml-tag-names: 2.1.3 + meow: 9.0.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.21 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 6.0.0_postcss@8.4.21 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + supports-hyperlinks: 2.3.0 + svg-tags: 1.0.0 + table: 6.8.1 + v8-compile-cache: 2.3.0 + write-file-atomic: 5.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /supports-color/5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks/2.3.0: + resolution: + { + integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + + /svg-tags/1.0.0: + resolution: + { + integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, + } + dev: true + + /svgo/2.8.0: + resolution: + { + integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, + } + engines: { node: ">=10.13.0" } + hasBin: true + dependencies: + "@trysound/sax": 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /svgo/3.0.2: + resolution: + { + integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==, + } + engines: { node: ">=14.0.0" } + hasBin: true + dependencies: + "@trysound/sax": 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + csso: 5.0.5 + picocolors: 1.0.0 + dev: true + + /table/6.8.1: + resolution: + { + integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==, + } + engines: { node: ">=10.0.0" } + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tailwindcss/3.2.7_postcss@8.4.21: + resolution: + { + integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==, + } + engines: { node: ">=12.13.0" } + hasBin: true + peerDependencies: + postcss: ^8.0.9 + dependencies: + arg: 5.0.2 + chokidar: 3.5.3 + color-name: 1.1.4 + detective: 5.2.1 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.2.12 + glob-parent: 6.0.2 + is-glob: 4.0.3 + lilconfig: 2.0.6 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.21 + postcss-import: 14.1.0_postcss@8.4.21 + postcss-js: 4.0.1_postcss@8.4.21 + postcss-load-config: 3.1.4_postcss@8.4.21 + postcss-nested: 6.0.0_postcss@8.4.21 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.1 + transitivePeerDependencies: + - ts-node + dev: true + + /temp-dir/2.0.0: + resolution: + { + integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, + } + engines: { node: ">=8" } + dev: true + + /tempy/0.6.0: + resolution: + { + integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==, + } + engines: { node: ">=10" } + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /tempy/1.0.1: + resolution: + { + integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==, + } + engines: { node: ">=10" } + dependencies: + del: 6.1.1 + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /terser/5.16.4: + resolution: + { + integrity: sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + "@jridgewell/source-map": 0.3.2 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /text-extensions/1.9.0: + resolution: + { + integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, + } + engines: { node: ">=0.10" } + dev: true + + /text-table/0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + dev: true + + /thenby/1.3.4: + resolution: + { + integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==, + } + dev: true + + /through/2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } + + /through2/2.0.5: + resolution: + { + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, + } + dependencies: + readable-stream: 2.3.7 + xtend: 4.0.2 + + /through2/4.0.2: + resolution: + { + integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, + } + dependencies: + readable-stream: 3.6.0 + dev: true + + /tiny-inflate/1.0.3: + resolution: + { + integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==, + } + dev: false + + /tinyqueue/2.0.3: + resolution: + { + integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==, + } + dev: false + + /tmp/0.0.33: + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: ">=0.6.0" } + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /to-fast-properties/2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } + dev: true + + /to-regex-range/5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + dev: true + + /tr46/0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: true + + /tr46/1.0.1: + resolution: + { + integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, + } + dependencies: + punycode: 2.3.0 + dev: true + + /traverse/0.6.7: + resolution: + { + integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==, + } + dev: true + + /trim-newlines/3.0.1: + resolution: + { + integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, + } + engines: { node: ">=8" } + dev: true + + /ts-node/10.9.1_tncu2ai53lzgmizdedur7lbibe: + resolution: + { + integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, + } + hasBin: true + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + dependencies: + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.9 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.3 + "@types/node": 18.14.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib/1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + dev: true + + /tslib/2.5.0: + resolution: + { + integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==, + } + + /tsutils/3.21.0_typescript@4.9.5: + resolution: + { + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, + } + engines: { node: ">= 6" } + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: true + + /type-check/0.3.2: + resolution: + { + integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.1.2 + dev: false + + /type-check/0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest/0.16.0: + resolution: + { + integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, + } + engines: { node: ">=10" } + dev: true + + /type-fest/0.18.1: + resolution: + { + integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, + } + engines: { node: ">=10" } + dev: true + + /type-fest/0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + dev: true + + /type-fest/0.21.3: + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: ">=10" } + dev: true + + /type-fest/0.6.0: + resolution: + { + integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, + } + engines: { node: ">=8" } + dev: true + + /type-fest/0.8.1: + resolution: + { + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, + } + engines: { node: ">=8" } + dev: true + + /type-fest/1.4.0: + resolution: + { + integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, + } + engines: { node: ">=10" } + dev: true + + /type-fest/2.19.0: + resolution: + { + integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, + } + engines: { node: ">=12.20" } + dev: true + + /type/1.2.0: + resolution: + { + integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, + } + dev: false + + /type/2.7.2: + resolution: + { + integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, + } + dev: false + + /typed-array-length/1.0.4: + resolution: + { + integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==, + } + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typedarray/0.0.6: + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } + dev: false + + /typescript/4.9.5: + resolution: + { + integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, + } + engines: { node: ">=4.2.0" } + hasBin: true + dev: true + + /uglify-js/3.17.4: + resolution: + { + integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, + } + engines: { node: ">=0.8.0" } + hasBin: true + requiresBuild: true + dev: true + optional: true + + /unbox-primitive/1.0.2: + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: + { + integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, + } + engines: { node: ">=4" } + dev: true + + /unicode-match-property-ecmascript/2.0.0: + resolution: + { + integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, + } + engines: { node: ">=4" } + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript/2.1.0: + resolution: + { + integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==, + } + engines: { node: ">=4" } + dev: true + + /unicode-properties/1.4.1: + resolution: + { + integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==, + } + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + dev: false + + /unicode-property-aliases-ecmascript/2.1.0: + resolution: + { + integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, + } + engines: { node: ">=4" } + dev: true + + /unicode-trie/2.0.0: + resolution: + { + integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==, + } + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + dev: false + + /unique-string/2.0.0: + resolution: + { + integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, + } + engines: { node: ">=8" } + dependencies: + crypto-random-string: 2.0.0 + dev: true + + /universal-user-agent/6.0.0: + resolution: + { + integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==, + } + dev: true + + /universalify/2.0.0: + resolution: + { + integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, + } + engines: { node: ">= 10.0.0" } + dev: true + + /upath/1.2.0: + resolution: + { + integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, + } + engines: { node: ">=4" } + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.5: + resolution: + { + integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js/4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.0 + dev: true + + /url-join/4.0.1: + resolution: + { + integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==, + } + dev: true + + /util-deprecate/1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + /v8-compile-cache-lib/3.0.1: + resolution: + { + integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, + } + dev: true + + /v8-compile-cache/2.3.0: + resolution: + { + integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==, + } + dev: true + + /validate-npm-package-license/3.0.4: + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: true + + /vite-plugin-pwa/0.14.4_rcpzravakhu7gk56p6427hsr2y: + resolution: + { + integrity: sha512-M7Ct0so8OlouMkTWgXnl8W1xU95glITSKIe7qswZf1tniAstO2idElGCnsrTJ5NPNSx1XqfTCOUj8j94S6FD7Q==, + } + peerDependencies: + vite: ^3.1.0 || ^4.0.0 + workbox-build: ^6.5.4 + dependencies: + "@rollup/plugin-replace": 5.0.2_rollup@3.17.2 + debug: 4.3.4 + fast-glob: 3.2.12 + pretty-bytes: 6.1.0 + rollup: 3.17.2 + vite: 4.1.3 + workbox-build: 6.5.4 + workbox-window: 6.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /vite/4.1.3: + resolution: + { + integrity: sha512-0Zqo4/Fr/swSOBmbl+HAAhOjrqNwju+yTtoe4hQX9UsARdcuc9njyOdr6xU0DDnV7YP0RT6mgTTOiRtZgxfCxA==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + hasBin: true + peerDependencies: + "@types/node": ">= 14" + less: "*" + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.16.17 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.17.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /w3c-keyname/2.2.6: + resolution: + { + integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==, + } + dev: false + + /wavesurfer.js/6.4.0: + resolution: + { + integrity: sha512-+i9GkYdMTm998goOWvycWqCgxfbolnuGTPgrdGss7ZbQDuu+n6AHdnJwYnqxW8RZo5A2ck6ztzXbrXGuCi0m5g==, + } + dev: false + + /wcwidth/1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions/3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + dev: true + + /webidl-conversions/4.0.2: + resolution: + { + integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, + } + dev: true + + /whatwg-url/5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /whatwg-url/7.1.0: + resolution: + { + integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, + } + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /which-boxed-primitive/1.0.2: + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module/2.0.0: + resolution: + { + integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==, + } + dev: true + + /which-typed-array/1.1.9: + resolution: + { + integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==, + } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + dev: true + + /which/1.3.1: + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which/2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wmf/1.0.2: + resolution: + { + integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==, + } + engines: { node: ">=0.8" } + dev: false + + /word-wrap/1.2.3: + resolution: + { + integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==, + } + engines: { node: ">=0.10.0" } + + /word/0.3.0: + resolution: + { + integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==, + } + engines: { node: ">=0.8" } + dev: false + + /wordwrap/1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + dev: true + + /workbox-background-sync/6.5.4: + resolution: + { + integrity: sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==, + } + dependencies: + idb: 7.1.1 + workbox-core: 6.5.4 + dev: true + + /workbox-broadcast-update/6.5.4: + resolution: + { + integrity: sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==, + } + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-build/6.5.4: + resolution: + { + integrity: sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==, + } + engines: { node: ">=10.0.0" } + dependencies: + "@apideck/better-ajv-errors": 0.3.6_ajv@8.12.0 + "@babel/core": 7.21.0 + "@babel/preset-env": 7.20.2_@babel+core@7.21.0 + "@babel/runtime": 7.21.0 + "@rollup/plugin-babel": 5.3.1_4tnfxcmsyr7y5qv3uwkivwqysm + "@rollup/plugin-node-resolve": 11.2.1_rollup@2.79.1 + "@rollup/plugin-replace": 2.4.2_rollup@2.79.1 + "@surma/rollup-plugin-off-main-thread": 2.2.3 + ajv: 8.12.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2_rollup@2.79.1 + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 6.5.4 + workbox-broadcast-update: 6.5.4 + workbox-cacheable-response: 6.5.4 + workbox-core: 6.5.4 + workbox-expiration: 6.5.4 + workbox-google-analytics: 6.5.4 + workbox-navigation-preload: 6.5.4 + workbox-precaching: 6.5.4 + workbox-range-requests: 6.5.4 + workbox-recipes: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + workbox-streams: 6.5.4 + workbox-sw: 6.5.4 + workbox-window: 6.5.4 + transitivePeerDependencies: + - "@types/babel__core" + - supports-color + dev: true + + /workbox-cacheable-response/6.5.4: + resolution: + { + integrity: sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==, + } + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-core/6.5.4: + resolution: + { + integrity: sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==, + } + dev: true + + /workbox-expiration/6.5.4: + resolution: + { + integrity: sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==, + } + dependencies: + idb: 7.1.1 + workbox-core: 6.5.4 + dev: true + + /workbox-google-analytics/6.5.4: + resolution: + { + integrity: sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==, + } + dependencies: + workbox-background-sync: 6.5.4 + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + dev: true + + /workbox-navigation-preload/6.5.4: + resolution: + { + integrity: sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==, + } + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-precaching/6.5.4: + resolution: + { + integrity: sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==, + } + dependencies: + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + dev: true + + /workbox-range-requests/6.5.4: + resolution: + { + integrity: sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==, + } + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-recipes/6.5.4: + resolution: + { + integrity: sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==, + } + dependencies: + workbox-cacheable-response: 6.5.4 + workbox-core: 6.5.4 + workbox-expiration: 6.5.4 + workbox-precaching: 6.5.4 + workbox-routing: 6.5.4 + workbox-strategies: 6.5.4 + dev: true + + /workbox-routing/6.5.4: + resolution: + { + integrity: sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==, + } + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-strategies/6.5.4: + resolution: + { + integrity: sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==, + } + dependencies: + workbox-core: 6.5.4 + dev: true + + /workbox-streams/6.5.4: + resolution: + { + integrity: sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==, + } + dependencies: + workbox-core: 6.5.4 + workbox-routing: 6.5.4 + dev: true + + /workbox-sw/6.5.4: + resolution: + { + integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==, + } + dev: true + + /workbox-window/6.5.4: + resolution: + { + integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==, + } + dependencies: + "@types/trusted-types": 2.0.3 + workbox-core: 6.5.4 + dev: true + + /wrap-ansi/6.2.0: + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: ">=8" } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi/7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + dev: true + + /write-file-atomic/5.0.0: + resolution: + { + integrity: sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /xlsx/0.18.5: + resolution: + { + integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==, + } + engines: { node: ">=0.8" } + hasBin: true + dependencies: + adler-32: 1.3.1 + cfb: 1.2.2 + codepage: 1.15.0 + crc-32: 1.2.2 + ssf: 0.11.2 + wmf: 1.0.2 + word: 0.3.0 + dev: false + + /xml-formatter/3.2.0: + resolution: + { + integrity: sha512-PYROODIUDHz1SDFePg2VThajPOuSmvo/PrYRKARcSc9xxKKs62EN9uar60IIxxknzmOSNDAxlylpw34bQp0g/Q==, + } + engines: { node: ">= 14" } + dependencies: + xml-parser-xo: 4.0.2 + dev: false + + /xml-parser-xo/4.0.2: + resolution: + { + integrity: sha512-tM9LyyGumFAf7VD3GLlcN7eIbpvgzmt7PAseAMO6thgEq6VIEHPxlcWVIzMmn6pqGD1NTZS8mSPfhePo6AETVw==, + } + engines: { node: ">= 14" } + dev: false + + /xmldoc/1.2.0: + resolution: + { + integrity: sha512-2eN8QhjBsMW2uVj7JHLHkMytpvGHLHxKXBy4J3fAT/HujsEtM6yU84iGjpESYGHg6XwK0Vu4l+KgqQ2dv2cCqg==, + } + dependencies: + sax: 1.2.4 + dev: false + + /xtend/4.0.2: + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: ">=0.4" } + + /y18n/4.0.3: + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } + dev: true + + /y18n/5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } + dev: true + + /yallist/3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + dev: true + + /yallist/4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + dev: true + + /yaml/1.10.2: + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: ">= 6" } + dev: true + + /yaml/2.2.1: + resolution: + { + integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==, + } + engines: { node: ">= 14" } + dev: true + + /yargs-parser/18.1.3: + resolution: + { + integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, + } + engines: { node: ">=6" } + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser/20.2.9: + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: ">=10" } + dev: true + + /yargs-parser/21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + dev: true + + /yargs/15.4.1: + resolution: + { + integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, + } + engines: { node: ">=8" } + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs/17.7.1: + resolution: + { + integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, + } + engines: { node: ">=12" } + 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.8 + yargs-parser: 21.1.1 + dev: true + + /yn/3.1.1: + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: ">=6" } + dev: true + + /yocto-queue/0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + dev: true + + /yocto-queue/1.0.0: + resolution: + { + integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, + } + engines: { node: ">=12.20" } + dev: true diff --git a/rector.php b/rector.php index e9500488..e68f37ac 100644 --- a/rector.php +++ b/rector.php @@ -27,7 +27,6 @@ return static function (RectorConfig $rectorConfig): void { $rectorConfig->sets([ SetList::PHP_81, SetList::TYPE_DECLARATION, - SetList::TYPE_DECLARATION_STRICT, SetList::CODE_QUALITY, SetList::CODING_STYLE, SetList::EARLY_RETURN, diff --git a/scripts/bundle-prepare.sh b/scripts/bundle-prepare.sh index 6bddd173..4d011586 100644 --- a/scripts/bundle-prepare.sh +++ b/scripts/bundle-prepare.sh @@ -1,9 +1,9 @@ -#!/bin/bash +#!/bin/sh set -e # install only production dependencies using the --no-dev option composer install --no-dev --prefer-dist --no-ansi --no-interaction --no-progress --ignore-platform-reqs # build all production static assets (css, js, images, icons, fonts, etc.) -npm run build -npm run build:static +pnpm run build +pnpm run build:static diff --git a/scripts/bundle.sh b/scripts/bundle.sh index 95e31c48..31e5bb80 100644 --- a/scripts/bundle.sh +++ b/scripts/bundle.sh @@ -1,11 +1,10 @@ -#!/bin/bash +#!/bin/sh set -e VERSION=$1 COMPOSER_VERSION=$(echo "$VERSION" | perl -pe 's/(?<=[alpha|beta])\.//g') # replace composer.json version using jq -apt-get install jq -y echo "$( jq '.version = "'$COMPOSER_VERSION'"' composer.json )" > composer.json # replace CP_VERSION constant in app/config/constants @@ -14,17 +13,11 @@ sed -i "s/^defined('CP_VERSION').*/defined('CP_VERSION') || define('CP_VERSION', # fill CP_VERSION.env for docker build echo "$VERSION" > ./CP_VERSION.env -# install wget to download archives -apt-get install wget - # download GeoLite2-City archive and extract it to writable/uploads wget -c "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=$MAXMIND_LICENCE_KEY&suffix=tar.gz" -O - | tar -xz -C ./writable/uploads/ # rename extracted archives' folders mv ./writable/uploads/GeoLite2-City* ./writable/uploads/GeoLite2-City -# install rsync for file transfers -apt-get install rsync -y - # create castopod folder bundle: uses .rsync-filter (-F) file to copy only needed files rsync -aF --progress . ./castopod diff --git a/scripts/lint-commit-msg.sh b/scripts/lint-commit-msg.sh index c48b935b..ec0da7c3 100755 --- a/scripts/lint-commit-msg.sh +++ b/scripts/lint-commit-msg.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh set -e # see https://github.com/conventional-changelog/commitlint/issues/885 diff --git a/scripts/package.sh b/scripts/package.sh index c36c8cf5..c6269f5c 100644 --- a/scripts/package.sh +++ b/scripts/package.sh @@ -1,10 +1,8 @@ -#!/bin/bash +#!/bin/sh set -e VERSION=$1 -apt-get install zip -y - # create zip and tar.gz packages for release upload zip -r castopod-$VERSION.zip castopod tar -zcvf castopod-$VERSION.tar.gz castopod diff --git a/vite-manifest-css.ts b/vite-manifest-css.ts deleted file mode 100644 index 68f2f927..00000000 --- a/vite-manifest-css.ts +++ /dev/null @@ -1,67 +0,0 @@ -// This plugin adds a `manifest-css.json` file for css assets to help reference them from the backend -// Adapted from https://github.com/ElMassimo/vite_ruby/blob/main/vite-plugin-ruby/src/manifest.ts - -import path from "path"; -import { OutputBundle } from "rollup"; -import type { Plugin, ResolvedConfig } from "vite"; - -interface AssetsManifestChunk { - src?: string; - file: string; -} - -type AssetsManifest = Map; - -// Internal: Returns the filename without the last extension. -function withoutExtension(filename: string) { - return filename.substr(0, filename.lastIndexOf(".")); -} - -// Internal: Writes a manifest file that allows to map an entrypoint asset file -// name to the corresponding output file name. -export function ManifestCSS(): Plugin { - let config: ResolvedConfig; - - // Internal: For stylesheets Vite does not output the result to the manifest, - // so we extract the file name of the processed asset from the Rollup bundle. - function extractChunkStylesheets( - bundle: OutputBundle, - manifest: AssetsManifest - ) { - const cssFiles = new Set( - Object.values(config.build.rollupOptions.input as Record) - .filter((file) => new RegExp(`\\.css$`).test(file)) - .map((file) => path.relative(config.root, file)) - ); - - Object.values(bundle) - .filter((chunk) => chunk.type === "asset" && chunk.name) - .forEach((chunk) => { - // NOTE: Rollup appends `.css` to the file so it's removed before matching. - // See `resolveEntrypointsForRollup`. - const src = withoutExtension(chunk.name!); - if (cssFiles.has(src)) { - manifest.set(src, { file: chunk.fileName, src }); - } - }); - } - - return { - name: "vite-assets-manifest", - apply: "build", - enforce: "post", - configResolved(resolvedConfig: ResolvedConfig) { - config = resolvedConfig; - }, - async generateBundle(_options, bundle) { - const manifest: AssetsManifest = new Map(); - extractChunkStylesheets(bundle, manifest); - - this.emitFile({ - fileName: "manifest-css.json", - type: "asset", - source: JSON.stringify(Object.fromEntries(manifest), null, 2), - }); - }, - }; -} diff --git a/vite.config.ts b/vite.config.ts index cd7390ce..d4ef6993 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,5 @@ import { defineConfig } from "vite"; import { VitePWA } from "vite-plugin-pwa"; -import { ManifestCSS } from "./vite-manifest-css"; // https://vitejs.dev/config/ export default defineConfig({ @@ -28,7 +27,6 @@ export default defineConfig({ }, }, plugins: [ - ManifestCSS(), VitePWA({ manifest: false, outDir: "../../public", From 84a6447fd4ed5b18a8ecb4b6c248d69567c4f543 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 22 Feb 2023 16:29:45 +0000 Subject: [PATCH 064/477] ci: fix lint and formatting issues --- .phpunit.cache/test-results | 2 +- app/Config/Database.php | 3 - app/Config/Events.php | 3 +- app/Config/Pager.php | 2 - app/Config/Services.php | 4 - app/Controllers/ColorsController.php | 3 - app/Controllers/EpisodeAudioController.php | 2 +- app/Controllers/EpisodeCommentController.php | 8 +- app/Controllers/EpisodeController.php | 8 +- app/Controllers/PodcastController.php | 6 - app/Controllers/PostController.php | 2 +- app/Entities/Category.php | 3 - app/Entities/Credit.php | 6 - app/Entities/Episode.php | 2 +- app/Entities/EpisodeComment.php | 5 - app/Entities/Podcast.php | 3 - app/Helpers/form_helper.php | 2 +- app/Helpers/misc_helper.php | 1 - app/Helpers/rss_helper.php | 10 +- app/Libraries/Router.php | 1 - app/Libraries/TranscriptParser.php | 1 - app/Libraries/Vite/Vite.php | 5 +- app/Models/ClipModel.php | 3 - app/Models/EpisodeCommentModel.php | 2 - app/Models/MediaModel.php | 7 - app/Views/errors/html/error_exception.php | 20 +- app/Views/pager/default_full.php | 24 ++- .../Controllers/PodcastPlatformController.php | 2 +- .../Admin/Controllers/SchedulerController.php | 1 - .../Admin/Controllers/SoundbiteController.php | 2 +- .../Controllers/VideoClipsController.php | 2 +- modules/Analytics/Config/Routes.php | 4 +- .../Entities/AnalyticsPodcastsByCountry.php | 3 - .../Entities/AnalyticsPodcastsByRegion.php | 3 - .../Controllers/ActivityPubController.php | 3 - .../Fediverse/Controllers/ActorController.php | 14 -- .../Fediverse/Controllers/PostController.php | 6 - modules/Fediverse/Models/PostModel.php | 2 +- .../Install/Controllers/InstallController.php | 12 +- .../Models/SubscriptionModel.php | 3 - .../WebSub/Controllers/WebSubController.php | 1 - tests/modules/Api/Rest/V1/PodcastTest.php | 7 +- themes/cp_admin/_partials/_nav_header.php | 142 +++++++------- themes/cp_admin/episode/_card.php | 32 ++-- themes/cp_admin/episode/_sidebar.php | 26 +-- themes/cp_admin/episode/create.php | 2 +- themes/cp_admin/episode/edit.php | 28 +-- themes/cp_admin/episode/publish.php | 10 +- themes/cp_admin/episode/publish_edit.php | 14 +- themes/cp_admin/episode/view.php | 24 +-- themes/cp_admin/podcast/_sidebar.php | 20 +- themes/cp_admin/podcast/analytics/index.php | 30 +-- .../podcast/analytics/listening_time.php | 20 +- .../cp_admin/podcast/analytics/locations.php | 28 +-- themes/cp_admin/podcast/analytics/players.php | 50 ++--- .../podcast/analytics/time_periods.php | 18 +- .../podcast/analytics/unique_listeners.php | 20 +- .../cp_admin/podcast/analytics/webpages.php | 36 ++-- themes/cp_admin/podcast/create.php | 4 +- themes/cp_admin/podcast/edit.php | 4 +- themes/cp_admin/podcast/latest_episodes.php | 10 +- themes/cp_admin/podcast/notifications.php | 60 +++--- themes/cp_admin/podcast/platforms.php | 94 ++++----- themes/cp_admin/podcast/publish.php | 4 +- themes/cp_admin/subscription/email/edited.php | 2 +- .../cp_admin/subscription/email/welcome.php | 2 +- themes/cp_admin/subscription/list.php | 180 +++++++++--------- themes/cp_app/_admin_navbar.php | 138 +++++++------- themes/cp_app/_persons_modal.php | 22 +-- themes/cp_app/episode/_layout.php | 31 +-- .../episode/_partials/comment_actions.php | 52 ++--- .../_partials/comment_actions_from_post.php | 64 +++---- .../cp_app/episode/_partials/comment_card.php | 40 ++-- .../_partials/comment_reply_actions.php | 38 ++-- themes/cp_app/episode/comment.php | 6 +- themes/cp_app/home.php | 52 ++--- themes/cp_app/pages/_layout.php | 12 +- themes/cp_app/pages/map.php | 12 +- themes/cp_app/podcast/_layout.php | 24 +-- .../podcast/_partials/funding_links_modal.php | 8 +- .../podcast/_partials/premium_banner.php | 4 +- themes/cp_app/podcast/_partials/sidebar.php | 62 +++--- themes/cp_app/podcast/about.php | 7 +- themes/cp_app/podcast/episodes.php | 30 +-- themes/cp_app/post/_partials/actions.php | 178 ++++++++--------- .../post/_partials/post_with_replies.php | 22 +-- themes/cp_app/post/_partials/preview_card.php | 12 +- themes/cp_app/post/_partials/reblog.php | 46 ++--- .../cp_app/post/_partials/reply_actions.php | 114 +++++------ themes/cp_app/post/post.php | 18 +- themes/cp_auth/_layout.php | 8 +- themes/cp_auth/register.php | 8 +- themes/cp_install/cache_config.php | 12 +- themes/cp_install/database_config.php | 8 +- 94 files changed, 987 insertions(+), 1104 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 317399c1..9e9a42d9 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":[],"times":{"Tests\\Database\\ExampleDatabaseTest::testModelFindAll":0.003,"Tests\\Database\\ExampleDatabaseTest::testSoftDeleteLeavesRow":0.004,"modules\\Api\\Rest\\V1\\PodcastTest::testList":0.033,"modules\\Api\\Rest\\V1\\PodcastTest::testView":0.004,"modules\\Api\\Rest\\V1\\PodcastTest::testViewNotFound":0.01,"modules\\Api\\Rest\\V1\\PodcastTest::testListEmpty":4.313,"Tests\\Session\\ExampleSessionTest::testSessionSimple":0,"HealthTest::testIsDefinedAppPath":0,"HealthTest::testBaseUrlHasBeenSet":0.005}} \ No newline at end of file +{"version":1,"defects":[],"times":{"Tests\\Database\\ExampleDatabaseTest::testModelFindAll":0.002,"Tests\\Database\\ExampleDatabaseTest::testSoftDeleteLeavesRow":0.002,"modules\\Api\\Rest\\V1\\PodcastTest::testList":0.008,"modules\\Api\\Rest\\V1\\PodcastTest::testView":0.003,"modules\\Api\\Rest\\V1\\PodcastTest::testViewNotFound":0.002,"modules\\Api\\Rest\\V1\\PodcastTest::testListEmpty":0.633,"Tests\\Session\\ExampleSessionTest::testSessionSimple":0,"HealthTest::testIsDefinedAppPath":0,"HealthTest::testBaseUrlHasBeenSet":0.001}} \ No newline at end of file diff --git a/app/Config/Database.php b/app/Config/Database.php index dbafc1f2..7871428c 100644 --- a/app/Config/Database.php +++ b/app/Config/Database.php @@ -49,8 +49,6 @@ class Database extends Config /** * This database connection is used when running PHPUnit database tests. * - * @noRector StringClassNameToClassConstantRector - * * @var array */ public array $tests = [ @@ -84,7 +82,6 @@ class Database extends Config // Ensure that we always set the database group to 'tests' if // we are currently running an automated test suite, so that // we don't overwrite live data on accident. - /** @noRector RemoveAlwaysTrueIfConditionRector */ if (ENVIRONMENT === 'testing') { $this->defaultGroup = 'tests'; } diff --git a/app/Config/Events.php b/app/Config/Events.php index 6d7f32bb..30419869 100644 --- a/app/Config/Events.php +++ b/app/Config/Events.php @@ -7,6 +7,7 @@ namespace Config; use App\Entities\Actor; use App\Entities\Post; use App\Models\EpisodeModel; +use CodeIgniter\Debug\Toolbar\Collectors\Database; use CodeIgniter\Events\Events; use CodeIgniter\Exceptions\FrameworkException; @@ -47,7 +48,7 @@ Events::on('pre_system', static function () { * If you delete, they will no longer be collected. */ if (CI_DEBUG && ! is_cli()) { - Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect'); + Events::on('DBQuery', Database::class . '::collect'); Services::toolbar()->respond(); } }); diff --git a/app/Config/Pager.php b/app/Config/Pager.php index b98b2d8f..6579aad1 100644 --- a/app/Config/Pager.php +++ b/app/Config/Pager.php @@ -21,8 +21,6 @@ class Pager extends BaseConfig * and the desired group as $pagerGroup; * * @var array - * - * @noRector Rector\Php55\Rector\String_\StringClassNameToClassConstantRector */ public $templates = [ 'default_full' => 'App\Views\pager\default_full', diff --git a/app/Config/Services.php b/app/Config/Services.php index 3fa2e092..48a3554d 100644 --- a/app/Config/Services.php +++ b/app/Config/Services.php @@ -27,8 +27,6 @@ class Services extends BaseService /** * The Router class uses a RouteCollection's array of routes, and determines the correct Controller and Method to * execute. - * - * @noRector PHPStan\Reflection\MissingMethodFromReflectionException */ public static function router( ?RouteCollectionInterface $routes = null, @@ -48,8 +46,6 @@ class Services extends BaseService /** * The Negotiate class provides the content negotiation features for working the request to determine correct * language, encoding, charset, and more. - * - * @noRector PHPStan\Reflection\MissingMethodFromReflectionException */ public static function negotiator(?RequestInterface $request = null, bool $getShared = true): Negotiate { diff --git a/app/Controllers/ColorsController.php b/app/Controllers/ColorsController.php index 50a44db8..87875a49 100644 --- a/app/Controllers/ColorsController.php +++ b/app/Controllers/ColorsController.php @@ -15,9 +15,6 @@ use CodeIgniter\HTTP\Response; class ColorsController extends Controller { - /** - * @noRector ReturnTypeDeclarationRector - */ public function index(): Response { $cacheName = 'colors.css'; diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php index 8566c64a..6d2baf17 100644 --- a/app/Controllers/EpisodeAudioController.php +++ b/app/Controllers/EpisodeAudioController.php @@ -74,7 +74,7 @@ class EpisodeAudioController extends Controller if ( ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) === null - ) { + ) { throw PageNotFoundException::forPageNotFound(); } diff --git a/app/Controllers/EpisodeCommentController.php b/app/Controllers/EpisodeCommentController.php index 9aaf2b5a..9f0a67c8 100644 --- a/app/Controllers/EpisodeCommentController.php +++ b/app/Controllers/EpisodeCommentController.php @@ -55,7 +55,7 @@ class EpisodeCommentController extends BaseController if ( ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) === null - ) { + ) { throw PageNotFoundException::forPageNotFound(); } @@ -120,9 +120,6 @@ class EpisodeCommentController extends BaseController return $cachedView; } - /** - * @noRector ReturnTypeDeclarationRector - */ public function commentObject(): Response { $commentObject = new CommentObject($this->comment); @@ -132,9 +129,6 @@ class EpisodeCommentController extends BaseController ->setBody($commentObject->toJSON()); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function replies(): Response { /** diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index 5b59cf55..455006ae 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -51,7 +51,7 @@ class EpisodeController extends BaseController if ( ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) === null - ) { + ) { throw PageNotFoundException::forPageNotFound(); } @@ -274,9 +274,6 @@ class EpisodeController extends BaseController return $this->response->setXML($oembed); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function episodeObject(): Response { $podcastObject = new PodcastEpisode($this->episode); @@ -286,9 +283,6 @@ class EpisodeController extends BaseController ->setBody($podcastObject->toJSON()); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function comments(): Response { /** diff --git a/app/Controllers/PodcastController.php b/app/Controllers/PodcastController.php index 06377d4b..7cc17a47 100644 --- a/app/Controllers/PodcastController.php +++ b/app/Controllers/PodcastController.php @@ -47,9 +47,6 @@ class PodcastController extends BaseController return $this->{$method}(...$params); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function podcastActor(): Response { $podcastActor = new PodcastActor($this->podcast); @@ -285,9 +282,6 @@ class PodcastController extends BaseController return $cachedView; } - /** - * @noRector ReturnTypeDeclarationRector - */ public function episodeCollection(): Response { if ($this->podcast->type === 'serial') { diff --git a/app/Controllers/PostController.php b/app/Controllers/PostController.php index b2bf8e8d..285603fe 100644 --- a/app/Controllers/PostController.php +++ b/app/Controllers/PostController.php @@ -45,7 +45,7 @@ class PostController extends FediversePostController public function _remap(string $method, string ...$params): mixed { if ( - ($podcast = (new PodcastModel())->getPodcastByHandle($params[0],)) === null + ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) === null ) { throw PageNotFoundException::forPageNotFound(); } diff --git a/app/Entities/Category.php b/app/Entities/Category.php index d7f57736..fd9ec35e 100644 --- a/app/Entities/Category.php +++ b/app/Entities/Category.php @@ -36,9 +36,6 @@ class Category extends Entity 'google_category' => 'string', ]; - /** - * @noRector ReturnTypeDeclarationRector - */ public function getParent(): ?self { if ($this->parent_id === null) { diff --git a/app/Entities/Credit.php b/app/Entities/Credit.php index dc12349d..358578b6 100644 --- a/app/Entities/Credit.php +++ b/app/Entities/Credit.php @@ -92,9 +92,6 @@ class Credit extends Entity return $this->episode; } - /** - * @noRector ReturnTypeDeclarationRector - */ public function getGroupLabel(): string { if ($this->person_group === null) { @@ -104,9 +101,6 @@ class Credit extends Entity return lang("PersonsTaxonomy.persons.{$this->person_group}.label"); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function getRoleLabel(): string { if ($this->person_group === '') { diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 12c20281..cf1fd027 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -450,7 +450,7 @@ class Episode extends Entity public function getEmbedUrl(string $theme = null): string { return $theme - ? url_to('embed-theme', esc($this->getPodcast()->handle), esc($this->attributes['slug']), $theme,) + ? url_to('embed-theme', esc($this->getPodcast()->handle), esc($this->attributes['slug']), $theme) : url_to('embed', esc($this->getPodcast()->handle), esc($this->attributes['slug'])); } diff --git a/app/Entities/EpisodeComment.php b/app/Entities/EpisodeComment.php index 95deefb4..561f7d0b 100644 --- a/app/Entities/EpisodeComment.php +++ b/app/Entities/EpisodeComment.php @@ -87,8 +87,6 @@ class EpisodeComment extends UuidEntity /** * Returns the comment's actor - * - * @noRector ReturnTypeDeclarationRector */ public function getActor(): ?Actor { @@ -125,9 +123,6 @@ class EpisodeComment extends UuidEntity return $this->getReplies() !== []; } - /** - * @noRector ReturnTypeDeclarationRector - */ public function getReplyToComment(): ?self { if ($this->in_reply_to_id === null) { diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index b9fb35a8..47c62e4d 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -215,9 +215,6 @@ class Podcast extends Entity return '@' . $this->handle; } - /** - * @noRector ReturnTypeDeclarationRector - */ public function getActor(): ?Actor { if ($this->actor_id === 0) { diff --git a/app/Helpers/form_helper.php b/app/Helpers/form_helper.php index 85808f64..68238513 100644 --- a/app/Helpers/form_helper.php +++ b/app/Helpers/form_helper.php @@ -61,7 +61,7 @@ if (! function_exists('parse_form_attributes')) { } } - if (! empty($attributes)) { + if ($attributes !== []) { $default = array_merge($default, $attributes); } } diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php index 22dbd172..e4a5dc93 100644 --- a/app/Helpers/misc_helper.php +++ b/app/Helpers/misc_helper.php @@ -239,7 +239,6 @@ if (! function_exists('generate_random_salt')) { if (! function_exists('file_upload_max_size')) { - /** * Returns a file size limit in bytes based on the PHP upload_max_filesize and post_max_size Adapted from: * https://stackoverflow.com/a/25370978 diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 28d81e31..c4329f77 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -125,7 +125,7 @@ if (! function_exists('get_rss_feed')) { $castopodSocialElement->addAttribute('accountUrl', $podcast->link); foreach ($podcast->social_platforms as $socialPlatform) { - $socialElement = $channel->addChild('social', null, $podcastNamespace,); + $socialElement = $channel->addChild('social', null, $podcastNamespace); $socialElement->addAttribute('priority', '2'); $socialElement->addAttribute('platform', $socialPlatform->slug); @@ -202,7 +202,7 @@ if (! function_exists('get_rss_feed')) { foreach ($podcast->persons as $person) { foreach ($person->roles as $role) { - $personElement = $channel->addChild('person', $person->full_name, $podcastNamespace,); + $personElement = $channel->addChild('person', $person->full_name, $podcastNamespace); $personElement->addAttribute('img', $person->avatar->medium_url); @@ -294,7 +294,7 @@ if (! function_exists('get_rss_feed')) { $item->addChild('guid', $episode->guid); $item->addChild('pubDate', $episode->published_at->format(DATE_RFC1123)); if ($episode->location !== null) { - $locationElement = $item->addChild('location', $episode->location->name, $podcastNamespace,); + $locationElement = $item->addChild('location', $episode->location->name, $podcastNamespace); if ($episode->location->geo !== null) { $locationElement->addAttribute('geo', $episode->location->geo); } @@ -376,11 +376,11 @@ if (! function_exists('get_rss_feed')) { foreach ($episode->persons as $person) { foreach ($person->roles as $role) { - $personElement = $item->addChild('person', esc($person->full_name), $podcastNamespace,); + $personElement = $item->addChild('person', esc($person->full_name), $podcastNamespace); $personElement->addAttribute( 'role', - esc(lang("PersonsTaxonomy.persons.{$role->group}.roles.{$role->role}.label", [], 'en'),), + esc(lang("PersonsTaxonomy.persons.{$role->group}.roles.{$role->role}.label", [], 'en')), ); $personElement->addAttribute( diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php index f42f7491..6bb71997 100644 --- a/app/Libraries/Router.php +++ b/app/Libraries/Router.php @@ -30,7 +30,6 @@ class Router extends CodeIgniterRouter */ protected function checkRoutes(string $uri): bool { - /** @noRector RemoveExtraParametersRector */ $routes = $this->collection->getRoutes($this->collection->getHTTPVerb()); // Don't waste any time diff --git a/app/Libraries/TranscriptParser.php b/app/Libraries/TranscriptParser.php index c54fec4e..b0f7f364 100644 --- a/app/Libraries/TranscriptParser.php +++ b/app/Libraries/TranscriptParser.php @@ -86,7 +86,6 @@ class TranscriptParser } break; - } } diff --git a/app/Libraries/Vite/Vite.php b/app/Libraries/Vite/Vite.php index e85a3b5b..57d7ddc0 100644 --- a/app/Libraries/Vite/Vite.php +++ b/app/Libraries/Vite/Vite.php @@ -70,7 +70,6 @@ class Vite if (array_key_exists('imports', $manifestElement)) { foreach ($manifestElement['imports'] as $importPath) { if (array_key_exists($importPath, $this->manifestData)) { - // import css dependencies if any if (array_key_exists('css', $this->manifestData[$importPath])) { foreach ($this->manifestData[$importPath]['css'] as $cssFile) { @@ -98,11 +97,11 @@ class Vite 'css' => << CODE_SAMPLE -, + , 'js' => << CODE_SAMPLE -, + , default => '', }; } diff --git a/app/Models/ClipModel.php b/app/Models/ClipModel.php index d4e01dcf..cd52b043 100644 --- a/app/Models/ClipModel.php +++ b/app/Models/ClipModel.php @@ -53,9 +53,6 @@ class ClipModel extends Model 'job_ended_at', ]; - /** - * @noRector - */ protected $returnType = BaseClip::class; /** diff --git a/app/Models/EpisodeCommentModel.php b/app/Models/EpisodeCommentModel.php index 2c35b0c7..91479f09 100644 --- a/app/Models/EpisodeCommentModel.php +++ b/app/Models/EpisodeCommentModel.php @@ -195,8 +195,6 @@ class EpisodeCommentModel extends UuidModel * Retrieves all published posts for a given episode ordered by publication date * * @return EpisodeComment[] - * - * @noRector ReturnTypeDeclarationRector */ public function getEpisodeComments(int $episodeId): array { diff --git a/app/Models/MediaModel.php b/app/Models/MediaModel.php index 7acb9608..c35263ba 100644 --- a/app/Models/MediaModel.php +++ b/app/Models/MediaModel.php @@ -28,9 +28,6 @@ class MediaModel extends Model */ protected $table = 'media'; - /** - * @noRector - */ protected $returnType = Document::class; /** @@ -135,8 +132,6 @@ class MediaModel extends Model /** * @param Document|Audio|Video|Image|Transcript|Chapters $media - * - * @noRector ReturnTypeDeclarationRector */ public function saveMedia(object $media): int | false { @@ -150,8 +145,6 @@ class MediaModel extends Model /** * @param Document|Audio|Video|Image|Transcript|Chapters $media - * - * @noRector ReturnTypeDeclarationRector */ public function updateMedia(object $media): bool { diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php index e0723098..99ce24a0 100644 --- a/app/Views/errors/html/error_exception.php +++ b/app/Views/errors/html/error_exception.php @@ -70,7 +70,7 @@ $error_id = uniqid('error', true); ?> } else { echo esc(clean_path($row['file']) . ' : ' . $row['line']); } - ?> + ?> {PHP internal code} @@ -85,14 +85,14 @@ $error_id = uniqid('error', true); ?> getParameters(); - } + $params = null; + // Reflection by name is not available for closure function + if (substr($row['function'], -1) !== '}') { + $mirror = isset($row['class']) ? new \ReflectionMethod($row['class'], $row['function']) : new \ReflectionFunction($row['function']); + $params = $mirror->getParameters(); + } - foreach ($row['args'] as $key => $value) : ?> + foreach ($row['args'] as $key => $value) : ?> @@ -310,8 +310,8 @@ $error_id = uniqid('error', true); ?> setStatusCode(http_response_code()); - ?> +$response->setStatusCode(http_response_code()); +?>
name : "#{$key}") ?>
diff --git a/app/Views/pager/default_full.php b/app/Views/pager/default_full.php index 7d942e38..e82fefa8 100644 --- a/app/Views/pager/default_full.php +++ b/app/Views/pager/default_full.php @@ -11,18 +11,18 @@ $pager->setSurroundCount(2); hasPreviousPage()): ?>
  • + 'Pager.first', + ) ?>" class="block px-3 py-2 text-skin-muted hover:bg-highlight">
  • + 'Pager.previous', + ) ?>" class="block px-3 py-2 text-skin-muted hover:bg-highlight"> + 'Pager.previous', + ) ?>
  • @@ -34,9 +34,7 @@ $pager->setSurroundCount(2); - + @@ -46,15 +44,15 @@ $pager->setSurroundCount(2); hasNextPage()): ?>
  • + 'Pager.next', + ) ?>" class="block px-3 py-2 text-skin-muted hover:bg-highlight">
  • + 'Pager.last', + ) ?>" class="block px-3 py-2 text-skin-muted hover:bg-highlight">
  • diff --git a/modules/Admin/Controllers/PodcastPlatformController.php b/modules/Admin/Controllers/PodcastPlatformController.php index 82cdfc77..46a94c9c 100644 --- a/modules/Admin/Controllers/PodcastPlatformController.php +++ b/modules/Admin/Controllers/PodcastPlatformController.php @@ -89,7 +89,7 @@ class PodcastPlatformController extends BaseController array_key_exists('visible', $podcastPlatform) && $podcastPlatform['visible'] === 'yes', 'is_on_embed' => - array_key_exists('on_embed', $podcastPlatform,) && $podcastPlatform['on_embed'] === 'yes', + array_key_exists('on_embed', $podcastPlatform) && $podcastPlatform['on_embed'] === 'yes', ]; } diff --git a/modules/Admin/Controllers/SchedulerController.php b/modules/Admin/Controllers/SchedulerController.php index d13a29e4..9246557b 100644 --- a/modules/Admin/Controllers/SchedulerController.php +++ b/modules/Admin/Controllers/SchedulerController.php @@ -47,7 +47,6 @@ class SchedulerController extends Controller // Loop through clips to generate them foreach ($scheduledClips as $scheduledClip) { try { - // set clip to pending (new ClipModel()) ->update($scheduledClip->id, [ diff --git a/modules/Admin/Controllers/SoundbiteController.php b/modules/Admin/Controllers/SoundbiteController.php index e389e645..020785b7 100644 --- a/modules/Admin/Controllers/SoundbiteController.php +++ b/modules/Admin/Controllers/SoundbiteController.php @@ -117,7 +117,7 @@ class SoundbiteController extends BaseController $newSoundbite = new Soundbite([ 'title' => $this->request->getPost('title'), 'start_time' => (float) $this->request->getPost('start_time'), - 'duration' => (float) $this->request->getPost('duration',), + 'duration' => (float) $this->request->getPost('duration'), 'type' => 'audio', 'status' => '', 'podcast_id' => $this->podcast->id, diff --git a/modules/Admin/Controllers/VideoClipsController.php b/modules/Admin/Controllers/VideoClipsController.php index 02ab95cf..cac087e5 100644 --- a/modules/Admin/Controllers/VideoClipsController.php +++ b/modules/Admin/Controllers/VideoClipsController.php @@ -165,7 +165,7 @@ class VideoClipsController extends BaseController $videoClip = new VideoClip([ 'title' => $this->request->getPost('title'), 'start_time' => (float) $this->request->getPost('start_time'), - 'duration' => (float) $this->request->getPost('duration',), + 'duration' => (float) $this->request->getPost('duration'), 'theme' => $theme, 'format' => $this->request->getPost('format'), 'type' => 'video', diff --git a/modules/Analytics/Config/Routes.php b/modules/Analytics/Config/Routes.php index 0526f1d8..d6399e9d 100644 --- a/modules/Analytics/Config/Routes.php +++ b/modules/Analytics/Config/Routes.php @@ -57,8 +57,8 @@ $routes->group('', [ /** * @deprecated Route for podcast audio file analytics (/audio/pack(podcast_id,episode_id,bytes_threshold,filesize,duration,date)/podcast_folder/filename.mp3) */ - $routes->head('audio/(:base64)/(:any)', 'EpisodeAnalyticsController::hit/$1/$2',); - $routes->get('audio/(:base64)/(:any)', 'EpisodeAnalyticsController::hit/$1/$2',); + $routes->head('audio/(:base64)/(:any)', 'EpisodeAnalyticsController::hit/$1/$2'); + $routes->get('audio/(:base64)/(:any)', 'EpisodeAnalyticsController::hit/$1/$2'); }); // Show the Unknown UserAgents diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php b/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php index 30b9dfb5..60f9883d 100644 --- a/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php +++ b/modules/Analytics/Entities/AnalyticsPodcastsByCountry.php @@ -39,9 +39,6 @@ class AnalyticsPodcastsByCountry extends Entity 'hits' => 'integer', ]; - /** - * @noRector ReturnTypeDeclarationRector - */ public function getLabels(): string { return lang('Countries.' . $this->attributes['labels']); diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php b/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php index 5de71693..d359890e 100644 --- a/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php +++ b/modules/Analytics/Entities/AnalyticsPodcastsByRegion.php @@ -44,9 +44,6 @@ class AnalyticsPodcastsByRegion extends Entity 'hits' => 'integer', ]; - /** - * @noRector ReturnTypeDeclarationRector - */ public function getCountryCode(): string { return lang('Countries.' . $this->attributes['country_code']); diff --git a/modules/Fediverse/Controllers/ActivityPubController.php b/modules/Fediverse/Controllers/ActivityPubController.php index fe94c9a1..d8fbbe86 100644 --- a/modules/Fediverse/Controllers/ActivityPubController.php +++ b/modules/Fediverse/Controllers/ActivityPubController.php @@ -15,9 +15,6 @@ use CodeIgniter\HTTP\Response; class ActivityPubController extends Controller { - /** - * @noRector ReturnTypeDeclarationRector - */ public function preflight(): Response { return $this->response->setHeader('Access-Control-Allow-Origin', '*') // for allowing any domain, insecure diff --git a/modules/Fediverse/Controllers/ActorController.php b/modules/Fediverse/Controllers/ActorController.php index bf232890..e84250c4 100644 --- a/modules/Fediverse/Controllers/ActorController.php +++ b/modules/Fediverse/Controllers/ActorController.php @@ -56,9 +56,6 @@ class ActorController extends Controller return $this->{$method}(...$params); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function index(): ResponseInterface { $actorObjectClass = $this->config->actorObject; @@ -71,8 +68,6 @@ class ActorController extends Controller /** * Handles incoming requests from fediverse servers - * - * @noRector ReturnTypeDeclarationRector */ public function inbox(): ResponseInterface { @@ -264,9 +259,6 @@ class ActorController extends Controller } } - /** - * @noRector ReturnTypeDeclarationRector - */ public function outbox(): ResponseInterface { // get published activities by publication date @@ -297,9 +289,6 @@ class ActorController extends Controller ->setBody($collection->toJSON()); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function followers(): ResponseInterface { $tablesPrefix = config('Fediverse') @@ -386,9 +375,6 @@ class ActorController extends Controller ); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function activity(string $activityId): ResponseInterface { if ( diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php index a00efb83..bf8d1b16 100644 --- a/modules/Fediverse/Controllers/PostController.php +++ b/modules/Fediverse/Controllers/PostController.php @@ -53,9 +53,6 @@ class PostController extends Controller return $this->{$method}(...$params); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function index(): Response { $noteObjectClass = $this->config->noteObject; @@ -66,9 +63,6 @@ class PostController extends Controller ->setBody($noteObject->toJSON()); } - /** - * @noRector ReturnTypeDeclarationRector - */ public function replies(): Response { /** diff --git a/modules/Fediverse/Models/PostModel.php b/modules/Fediverse/Models/PostModel.php index 2dec8b49..70ab5563 100644 --- a/modules/Fediverse/Models/PostModel.php +++ b/modules/Fediverse/Models/PostModel.php @@ -539,7 +539,7 @@ class PostModel extends BaseUuidModel ->first(); $announceActivity = new AnnounceActivity($reblogPost); - $announceActivity->set('id', url_to('activity', $reblogPost->actor->username, $activity->id),); + $announceActivity->set('id', url_to('activity', $reblogPost->actor->username, $activity->id)); $undoActivity ->set('actor', $reblogPost->actor->uri) diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index 20cbc056..b9b88922 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -115,19 +115,13 @@ class InstallController extends Controller } try { - $db = db_connect(); - // Check if instance owner has been created, meaning install was completed - if ( - $db->tableExists('users') && - (new UserModel())->where('is_owner', true) - ->first() !== null - ) { + if ((new UserModel())->where('is_owner', true) + ->first() !== null + ) { // if so, show a 404 page throw PageNotFoundException::forPageNotFound(); } - - /** @noRector */ } catch (DatabaseException) { // Could not connect to the database // show database config view to fix value diff --git a/modules/PremiumPodcasts/Models/SubscriptionModel.php b/modules/PremiumPodcasts/Models/SubscriptionModel.php index 5f79271a..ec5eb4eb 100644 --- a/modules/PremiumPodcasts/Models/SubscriptionModel.php +++ b/modules/PremiumPodcasts/Models/SubscriptionModel.php @@ -42,9 +42,6 @@ class SubscriptionModel extends Model 'updated_by', ]; - /** - * @noRector - */ protected $returnType = Subscription::class; /** diff --git a/modules/WebSub/Controllers/WebSubController.php b/modules/WebSub/Controllers/WebSubController.php index 11a0a2d7..0ca59e9c 100644 --- a/modules/WebSub/Controllers/WebSubController.php +++ b/modules/WebSub/Controllers/WebSubController.php @@ -20,7 +20,6 @@ class WebSubController extends Controller { public function publish(): void { - /** @noRector RemoveAlwaysTrueIfConditionRector */ if (ENVIRONMENT !== 'production') { return; } diff --git a/tests/modules/Api/Rest/V1/PodcastTest.php b/tests/modules/Api/Rest/V1/PodcastTest.php index 6131ad90..d7e926a1 100644 --- a/tests/modules/Api/Rest/V1/PodcastTest.php +++ b/tests/modules/Api/Rest/V1/PodcastTest.php @@ -46,12 +46,9 @@ class PodcastTest extends CIUnitTestCase private readonly string $podcastApiUrl; - /** - * @param array $data - */ - public function __construct(?string $name = null, array $data = [], $dataName = '') + public function __construct(?string $name = null) { - parent::__construct($name, $data, $dataName); + parent::__construct($name); $this->podcast = FakeSinglePodcastApiSeeder::podcast(); $this->podcast['created_at'] = []; $this->podcast['updated_at'] = []; diff --git a/themes/cp_admin/_partials/_nav_header.php b/themes/cp_admin/_partials/_nav_header.php index d3ec1f3c..279bd1d2 100644 --- a/themes/cp_admin/_partials/_nav_header.php +++ b/themes/cp_admin/_partials/_nav_header.php @@ -8,13 +8,13 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?> class="h-full pr-1 text-xl md:hidden focus:ring-accent focus:ring-inset" aria-label="">
    + 'admin', + ) ?>" class="inline-flex items-center h-full px-2 border-r border-navigation focus:ring-inset focus:ring-accent"> + 'home', + ) ?>" class="inline-flex items-center h-full px-6 text-sm font-semibold hover:underline focus:ring-inset focus:ring-accent"> @@ -27,26 +27,26 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?> 'html', - 'content' => esc(<< 'html', + 'content' => esc(<<{$notificationsTitle} CODE_SAMPLE), - ], - ]; + ], +]; - if ($userPodcasts !== []) { - foreach ($userPodcasts as $userPodcast) { - $userPodcastTitle = esc($userPodcast->title); +if ($userPodcasts !== []) { + foreach ($userPodcasts as $userPodcast) { + $userPodcastTitle = esc($userPodcast->title); - $unreadNotificationDotDisplayClass = in_array($userPodcast->actor_id, $actorIdsWithUnreadNotifications, true) ? '' : 'hidden'; + $unreadNotificationDotDisplayClass = in_array($userPodcast->actor_id, $actorIdsWithUnreadNotifications, true) ? '' : 'hidden'; - $items[] = [ - 'type' => 'link', - 'title' => << 'link', + 'title' => <<
    @@ -55,20 +55,20 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?> {$userPodcastTitle}
    CODE_SAMPLE - , - 'uri' => route_to('notification-list', $userPodcast->id), - ]; - } - } else { - $noNotificationsText = lang('Notifications.no_notifications'); - $items[] = [ - 'type' => 'html', - 'content' => esc(<< route_to('notification-list', $userPodcast->id), + ]; + } +} else { + $noNotificationsText = lang('Notifications.no_notifications'); + $items[] = [ + 'type' => 'html', + 'content' => esc(<<{$noNotificationsText} CODE_SAMPLE), - ]; - } - ?> + ]; +} +?>
    actor_id ? icon('check', 'ml-2 bg-accent-base text-accent-contrast rounded-full') : ''; - $userPodcastTitle = esc($userPodcast->title); +$interactButtons = ''; +foreach ($userPodcasts as $userPodcast) { + $checkMark = interact_as_actor_id() === $userPodcast->actor_id ? icon('check', 'ml-2 bg-accent-base text-accent-contrast rounded-full') : ''; + $userPodcastTitle = esc($userPodcast->title); - $interactButtons .= <<
    {$userPodcastTitle}{$checkMark}
    CODE_SAMPLE; - } +} - $interactAsText = lang('Common.choose_interact'); - $interactAsRoute = route_to('interact-as-actor'); - $csrfField = csrf_field(); +$interactAsText = lang('Common.choose_interact'); +$interactAsRoute = route_to('interact-as-actor'); +$csrfField = csrf_field(); - $menuItems = [ - [ - 'type' => 'link', - 'title' => lang('Navigation.account.my-account'), - 'uri' => route_to('my-account'), - ], - [ - 'type' => 'link', - 'title' => lang('Navigation.account.change-password'), - 'uri' => route_to('change-password'), - ], - [ - 'type' => 'separator', - ], - [ - 'type' => 'link', - 'title' => lang('Navigation.account.logout'), - 'uri' => route_to('logout'), - ], - ]; +$menuItems = [ + [ + 'type' => 'link', + 'title' => lang('Navigation.account.my-account'), + 'uri' => route_to('my-account'), + ], + [ + 'type' => 'link', + 'title' => lang('Navigation.account.change-password'), + 'uri' => route_to('change-password'), + ], + [ + 'type' => 'separator', + ], + [ + 'type' => 'link', + 'title' => lang('Navigation.account.logout'), + 'uri' => route_to('logout'), + ], +]; - if ($userPodcasts !== []) { - $menuItems = array_merge([ - [ - 'type' => 'html', - 'content' => esc(<< 'html', + 'content' => esc(<< {$interactAsText}
    @@ -136,12 +136,12 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?> CODE_SAMPLE), - ], - [ - 'type' => 'separator', - ], - ], $menuItems); - } - ?> + ], + [ + 'type' => 'separator', + ], + ], $menuItems); +} +?> \ No newline at end of file diff --git a/themes/cp_admin/episode/_card.php b/themes/cp_admin/episode/_card.php index c46b30ae..eac048ef 100644 --- a/themes/cp_admin/episode/_card.php +++ b/themes/cp_admin/episode/_card.php @@ -53,23 +53,23 @@ 'type' => 'separator', ], ]; - if ($episode->published_at === null) { - $items[] = [ - 'type' => 'link', - 'title' => lang('Episode.delete'), - 'uri' => route_to('episode-delete', $episode->podcast->id, $episode->id), - 'class' => 'font-semibold text-red-600', - ]; - } else { - $label = lang('Episode.delete'); - $icon = icon('forbid', 'mr-2'); - $title = lang('Episode.messages.unpublishBeforeDeleteTip'); - $items[] = [ - 'type' => 'html', - 'content' => esc(<<published_at === null) { + $items[] = [ + 'type' => 'link', + 'title' => lang('Episode.delete'), + 'uri' => route_to('episode-delete', $episode->podcast->id, $episode->id), + 'class' => 'font-semibold text-red-600', + ]; +} else { + $label = lang('Episode.delete'); + $icon = icon('forbid', 'mr-2'); + $title = lang('Episode.messages.unpublishBeforeDeleteTip'); + $items[] = [ + 'type' => 'html', + 'content' => esc(<<{$icon}{$label} CODE_SAMPLE), - ]; - } ?> + ]; +} ?> \ No newline at end of file diff --git a/themes/cp_admin/episode/_sidebar.php b/themes/cp_admin/episode/_sidebar.php index fc3291e8..fe675faf 100644 --- a/themes/cp_admin/episode/_sidebar.php +++ b/themes/cp_admin/episode/_sidebar.php @@ -34,12 +34,12 @@ $podcastNavigation = [ @@ -49,19 +49,19 @@ $podcastNavigation = [
      id, $episode->id)); ?>
    • + ? 'font-semibold opacity-100 inline-flex items-center' + : 'opacity-75' ?>" href="id, + $episode->id + ) ?>">
    diff --git a/themes/cp_admin/episode/create.php b/themes/cp_admin/episode/create.php index 64e3f995..90aff523 100644 --- a/themes/cp_admin/episode/create.php +++ b/themes/cp_admin/episode/create.php @@ -32,7 +32,7 @@ name="cover" label="" hint="" - helper="" + helper="" type="file" accept=".jpg,.jpeg,.png" /> diff --git a/themes/cp_admin/episode/edit.php b/themes/cp_admin/episode/edit.php index 346ec7da..55fe2fea 100644 --- a/themes/cp_admin/episode/edit.php +++ b/themes/cp_admin/episode/edit.php @@ -172,13 +172,13 @@ transcript) : ?>
    transcript->file_url, - icon('file-download', 'mr-1 text-skin-muted text-xl') . lang('Episode.form.transcript_download'), - [ - 'class' => 'flex-1 font-semibold hover:underline inline-flex items-center text-xs', - 'download' => '', - ], - ) . + $episode->transcript->file_url, + icon('file-download', 'mr-1 text-skin-muted text-xl') . lang('Episode.form.transcript_download'), + [ + 'class' => 'flex-1 font-semibold hover:underline inline-flex items-center text-xs', + 'download' => '', + ], + ) . anchor( route_to( 'transcript-delete', @@ -227,13 +227,13 @@ chapters) : ?>
    chapters->file_url, - icon('file-download', 'mr-1 text-skin-muted text-xl') . lang('Episode.form.chapters_download'), - [ - 'class' => 'flex-1 font-semibold hover:underline inline-flex items-center text-xs', - 'download' => '', - ], - ) . + $episode->chapters->file_url, + icon('file-download', 'mr-1 text-skin-muted text-xl') . lang('Episode.form.chapters_download'), + [ + 'class' => 'flex-1 font-semibold hover:underline inline-flex items-center text-xs', + 'download' => '', + ], + ) . anchor( route_to( 'chapters-delete', diff --git a/themes/cp_admin/episode/publish.php b/themes/cp_admin/episode/publish.php index 50cc5049..264e73bd 100644 --- a/themes/cp_admin/episode/publish.php +++ b/themes/cp_admin/episode/publish.php @@ -47,11 +47,11 @@
    title) ?> number, - $episode->season_number, - 'text-xs font-semibold text-skin-muted !no-underline border px-1 border-gray-500', - true, - ) ?> + $episode->number, + $episode->season_number, + 'text-xs font-semibold text-skin-muted !no-underline border px-1 border-gray-500', + true, + ) ?>
    diff --git a/themes/cp_admin/podcast/analytics/players.php b/themes/cp_admin/podcast/analytics/players.php index 38be6fa0..f728ca78 100644 --- a/themes/cp_admin/podcast/analytics/players.php +++ b/themes/cp_admin/podcast/analytics/players.php @@ -12,35 +12,35 @@
    + 'analytics-data', + $podcast->id, + 'PodcastByPlayer', + 'ByAppWeekly', + ) ?>" /> + 'analytics-data', + $podcast->id, + 'PodcastByService', + 'ByServiceWeekly', + ) ?>" /> + 'analytics-data', + $podcast->id, + 'PodcastByPlayer', + 'ByDeviceWeekly', + ) ?>" /> + 'analytics-data', + $podcast->id, + 'PodcastByPlayer', + 'ByOsWeekly', + ) ?>" /> + 'analytics-data', + $podcast->id, + 'PodcastByPlayer', + 'Bots', + ) ?>" />
    + 'analytics-data', + $podcast->id, + 'Podcast', + 'ByWeekday', + ) ?>" /> + 'analytics-full-data', + $podcast->id, + 'PodcastByHour', + ) ?>" />
    + 'analytics-data', + $podcast->id, + 'Podcast', + 'UniqueListenersByDay', + ) ?>"/> + 'analytics-data', + $podcast->id, + 'Podcast', + 'UniqueListenersByMonth', + ) ?>"/>
    + 'analytics-data', + $podcast->id, + 'WebsiteByReferer', + 'ByDomainWeekly', + ) ?>" /> + 'analytics-data', + $podcast->id, + 'WebsiteByReferer', + 'ByDomainYearly', + ) ?>" /> + 'analytics-full-data', + $podcast->id, + 'WebsiteByEntryPage', + ) ?>" /> + 'analytics-full-data', + $podcast->id, + 'WebsiteByBrowser', + ) ?>" />
    diff --git a/themes/cp_admin/podcast/create.php b/themes/cp_admin/podcast/create.php index 74492e18..330f9426 100644 --- a/themes/cp_admin/podcast/create.php +++ b/themes/cp_admin/podcast/create.php @@ -111,11 +111,11 @@ + isChecked="false" > + isChecked="false" > diff --git a/themes/cp_admin/podcast/edit.php b/themes/cp_admin/podcast/edit.php index 4995fd7f..794e446c 100644 --- a/themes/cp_admin/podcast/edit.php +++ b/themes/cp_admin/podcast/edit.php @@ -128,11 +128,11 @@ + isChecked="parental_advisory === 'clean' ? 'true' : 'false' ?>" > + isChecked="parental_advisory === 'explicit' ? 'true' : 'false' ?>" > diff --git a/themes/cp_admin/podcast/latest_episodes.php b/themes/cp_admin/podcast/latest_episodes.php index 337005c6..6070dff7 100644 --- a/themes/cp_admin/podcast/latest_episodes.php +++ b/themes/cp_admin/podcast/latest_episodes.php @@ -2,9 +2,9 @@
    + 'episode-list', + $podcast->id, + ) ?>" class="inline-flex items-center text-sm underline hover:no-underline focus:ring-accent"> @@ -13,8 +13,8 @@
    $episode, - ]) ?> + 'episode' => $episode, + ]) ?>
    diff --git a/themes/cp_admin/podcast/notifications.php b/themes/cp_admin/podcast/notifications.php index 3b960d0b..025d1a8c 100644 --- a/themes/cp_admin/podcast/notifications.php +++ b/themes/cp_admin/podcast/notifications.php @@ -19,47 +19,47 @@
    read_at === null ? 'bg-heading-background' : 'bg-base'; - ?> + $backgroundColor = $notification->read_at === null ? 'bg-heading-background' : 'bg-base'; + ?>
    post_id !== null ? $notification->post : null; + $post = $notification->post_id !== null ? $notification->post : null; - $actorUsername = '@' . esc($notification->actor - ->username) . - ($notification->actor->is_local - ? '' - : '@' . esc($notification->actor->domain)); + $actorUsername = '@' . esc($notification->actor + ->username) . + ($notification->actor->is_local + ? '' + : '@' . esc($notification->actor->domain)); - $actorUsernameHtml = <<{$actorUsername} CODE_SAMPLE; - $targetActorUsername = '@' . esc($notification->target_actor->username); + $targetActorUsername = '@' . esc($notification->target_actor->username); - $targetActorUsernameHtml = <<{$targetActorUsername} CODE_SAMPLE; - $notificationTitle = match ($notification->type) { - 'reply' => lang('Notifications.reply', [ - 'actor_username' => $actorUsernameHtml, - ], null, false), - 'like' => lang('Notifications.favourite', [ - 'actor_username' => $actorUsernameHtml, - ], null, false), - 'share' => lang('Notifications.reblog', [ - 'actor_username' => $actorUsernameHtml, - ], null, false), - 'follow' => lang('Notifications.follow', [ - 'actor_username' => $actorUsernameHtml, - ], null, false), - default => '', - }; - $notificationContent = $post !== null ? $post->message_html : null; + $notificationTitle = match ($notification->type) { + 'reply' => lang('Notifications.reply', [ + 'actor_username' => $actorUsernameHtml, + ], null, false), + 'like' => lang('Notifications.favourite', [ + 'actor_username' => $actorUsernameHtml, + ], null, false), + 'share' => lang('Notifications.reblog', [ + 'actor_username' => $actorUsernameHtml, + ], null, false), + 'follow' => lang('Notifications.follow', [ + 'actor_username' => $actorUsernameHtml, + ], null, false), + default => '', + }; + $notificationContent = $post !== null ? $post->message_html : null; - $postLink = $post !== null ? route_to('post', esc($podcast->handle), $post->id) : route_to('podcast-activity', esc($podcast->handle)); - $link = $notification->read_at !== null ? $postLink : route_to('notification-mark-as-read', $podcast->id, $notification->id); + $postLink = $post !== null ? route_to('post', esc($podcast->handle), $post->id) : route_to('podcast-activity', esc($podcast->handle)); + $link = $notification->read_at !== null ? $postLink : route_to('notification-mark-as-read', $podcast->id, $notification->id); ?>
    @@ -76,7 +76,7 @@ 'follow' => icon('user-follow', 'text-violet-500 text-base'), default => '', }; - ?> + ?>
    diff --git a/themes/cp_admin/podcast/platforms.php b/themes/cp_admin/podcast/platforms.php index 45771d39..511cb080 100644 --- a/themes/cp_admin/podcast/platforms.php +++ b/themes/cp_admin/podcast/platforms.php @@ -23,28 +23,28 @@
    submit_url === ''): ?> slug), - 'text-skin-muted text-4xl', - $platform->type -) ?> + esc($platform->slug), + 'text-skin-muted text-4xl', + $platform->type + ) ?> submit_url, - icon( - esc($platform->slug), - 'text-skin-muted text-4xl', - $platform->type - ), - [ - 'class' => 'text-skin-muted hover:text-skin-base', - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'data-tooltip' => 'bottom', - 'title' => lang('Platforms.submit_url', [ - 'platformName' => $platform->label, - ]), - ], -) ?> + $platform->submit_url, + icon( + esc($platform->slug), + 'text-skin-muted text-4xl', + $platform->type + ), + [ + 'class' => 'text-skin-muted hover:text-skin-base', + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'data-tooltip' => 'bottom', + 'title' => lang('Platforms.submit_url', [ + 'platformName' => $platform->label, + ]), + ], + ) ?>
    home_url, icon('external-link', 'mx-auto'), [ @@ -57,37 +57,37 @@ ]), ]) ?> submit_url - ? anchor($platform->submit_url, icon('add', 'mx-auto'), [ - 'class' => 'flex-1 text-skin-muted hover:text-skin-base', - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'data-tooltip' => 'bottom', - 'title' => lang('Platforms.submit_url', [ - 'platformName' => $platform->label, - ]), - ]) - : '' ?> + ? anchor($platform->submit_url, icon('add', 'mx-auto'), [ + 'class' => 'flex-1 text-skin-muted hover:text-skin-base', + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'data-tooltip' => 'bottom', + 'title' => lang('Platforms.submit_url', [ + 'platformName' => $platform->label, + ]), + ]) + : '' ?>
    link_url - ? anchor( - route_to( - 'podcast-platform-remove', - $podcast->id, - esc($platform->slug), - ), - icon('delete-bin', 'mx-auto'), - [ - 'class' => - 'absolute right-0 p-1 bg-red-100 rounded-full text-red-700 hover:text-red-900', - 'data-tooltip' => 'bottom', - 'title' => lang('Platforms.remove', [ - 'platformName' => $platform->label, - ]), - ], - ) - : '' ?> + ? anchor( + route_to( + 'podcast-platform-remove', + $podcast->id, + esc($platform->slug), + ), + icon('delete-bin', 'mx-auto'), + [ + 'class' => + 'absolute right-0 p-1 bg-red-100 rounded-full text-red-700 hover:text-red-900', + 'data-tooltip' => 'bottom', + 'title' => lang('Platforms.remove', [ + 'platformName' => $platform->label, + ]), + ], + ) + : '' ?>
    label ?> + 'Podcast.publish_form.publication_date', + ) ?>
    expires_at): ?> podcast->language_code, IntlDateFormatter::LONG, IntlDateFormatter::LONG); - $translatedDate = $subscription->expires_at->toLocalizedString($formatter->getPattern()); + $translatedDate = $subscription->expires_at->toLocalizedString($formatter->getPattern()); ?> '' . $subscription->podcast->title . '', diff --git a/themes/cp_admin/subscription/email/welcome.php b/themes/cp_admin/subscription/email/welcome.php index 8fa9c848..73b5fc32 100644 --- a/themes/cp_admin/subscription/email/welcome.php +++ b/themes/cp_admin/subscription/email/welcome.php @@ -11,7 +11,7 @@ expires_at): ?> podcast->language_code, IntlDateFormatter::LONG, IntlDateFormatter::LONG); - $translatedDate = $subscription->expires_at->toLocalizedString($formatter->getPattern()); + $translatedDate = $subscription->expires_at->toLocalizedString($formatter->getPattern()); ?> ' . $translatedDate . ''], $subscription->podcast->language_code, false) ?> diff --git a/themes/cp_admin/subscription/list.php b/themes/cp_admin/subscription/list.php index c63833a6..db3b1791 100644 --- a/themes/cp_admin/subscription/list.php +++ b/themes/cp_admin/subscription/list.php @@ -32,99 +32,99 @@
    lang('Subscription.list.number'), - 'cell' => function ($subscription) { - return '#' . $subscription->id; - }, - ], - [ - 'header' => lang('Subscription.list.email'), - 'cell' => function ($subscription) { - return esc($subscription->email); - }, - ], - [ - 'header' => lang('Subscription.list.expiration_date'), - 'cell' => function ($subscription) { - return $subscription->expires_at ? local_date($subscription->expires_at) : lang('Subscription.list.unlimited'); - }, - ], - [ - 'header' => lang('Subscription.list.downloads'), - 'cell' => function ($subscription) { - return $subscription->downloads_last_3_months; - }, - ], - [ - 'header' => lang('Subscription.list.status'), - 'cell' => function ($subscription) { - $statusMapping = [ - 'active' => 'success', - 'suspended' => 'warning', - 'expired' => 'default', - ]; + [ + [ + 'header' => lang('Subscription.list.number'), + 'cell' => function ($subscription) { + return '#' . $subscription->id; + }, + ], + [ + 'header' => lang('Subscription.list.email'), + 'cell' => function ($subscription) { + return esc($subscription->email); + }, + ], + [ + 'header' => lang('Subscription.list.expiration_date'), + 'cell' => function ($subscription) { + return $subscription->expires_at ? local_date($subscription->expires_at) : lang('Subscription.list.unlimited'); + }, + ], + [ + 'header' => lang('Subscription.list.downloads'), + 'cell' => function ($subscription) { + return $subscription->downloads_last_3_months; + }, + ], + [ + 'header' => lang('Subscription.list.status'), + 'cell' => function ($subscription) { + $statusMapping = [ + 'active' => 'success', + 'suspended' => 'warning', + 'expired' => 'default', + ]; - return '' . lang('Subscription.status.' . $subscription->status) . ''; - }, - ], - [ - 'header' => lang('Common.actions'), - 'cell' => function ($subscription, $podcast) { - $items = [ - [ - 'type' => 'link', - 'title' => lang('Subscription.view'), - 'uri' => route_to('subscription-view', $podcast->id, $subscription->id), - ], - [ - 'type' => 'link', - 'title' => lang('Subscription.edit'), - 'uri' => route_to('subscription-edit', $podcast->id, $subscription->id), - ], - [ - 'type' => 'link', - 'title' => lang('Subscription.regenerate_token'), - 'uri' => route_to('subscription-regenerate-token', $podcast->id, $subscription->id), - ], - [ - 'type' => 'separator', - ], - [ - 'type' => 'link', - 'title' => lang('Subscription.delete'), - 'uri' => route_to('subscription-delete', $podcast->id, $subscription->id), - 'class' => 'font-semibold text-red-600', - ], - ]; + return '' . lang('Subscription.status.' . $subscription->status) . ''; + }, + ], + [ + 'header' => lang('Common.actions'), + 'cell' => function ($subscription, $podcast) { + $items = [ + [ + 'type' => 'link', + 'title' => lang('Subscription.view'), + 'uri' => route_to('subscription-view', $podcast->id, $subscription->id), + ], + [ + 'type' => 'link', + 'title' => lang('Subscription.edit'), + 'uri' => route_to('subscription-edit', $podcast->id, $subscription->id), + ], + [ + 'type' => 'link', + 'title' => lang('Subscription.regenerate_token'), + 'uri' => route_to('subscription-regenerate-token', $podcast->id, $subscription->id), + ], + [ + 'type' => 'separator', + ], + [ + 'type' => 'link', + 'title' => lang('Subscription.delete'), + 'uri' => route_to('subscription-delete', $podcast->id, $subscription->id), + 'class' => 'font-semibold text-red-600', + ], + ]; - if ($subscription->status === 'suspended') { - $suspendAction = [[ - 'type' => 'link', - 'title' => lang('Subscription.resume'), - 'uri' => route_to('subscription-resume', $podcast->id, $subscription->id), - ]]; - } else { - $suspendAction = [[ - 'type' => 'link', - 'title' => lang('Subscription.suspend'), - 'uri' => route_to('subscription-suspend', $podcast->id, $subscription->id), - ]]; - } + if ($subscription->status === 'suspended') { + $suspendAction = [[ + 'type' => 'link', + 'title' => lang('Subscription.resume'), + 'uri' => route_to('subscription-resume', $podcast->id, $subscription->id), + ]]; + } else { + $suspendAction = [[ + 'type' => 'link', + 'title' => lang('Subscription.suspend'), + 'uri' => route_to('subscription-suspend', $podcast->id, $subscription->id), + ]]; + } - array_splice($items, 3, 0, $suspendAction); + array_splice($items, 3, 0, $suspendAction); - return '' . - ''; - }, - ], - ], - $podcast->subscriptions, - '', - $podcast, - ) ?> + return '' . + ''; + }, + ], + ], + $podcast->subscriptions, + '', + $podcast, +) ?> endSection() ?> diff --git a/themes/cp_app/_admin_navbar.php b/themes/cp_app/_admin_navbar.php index f17ea0d8..8e31084e 100644 --- a/themes/cp_app/_admin_navbar.php +++ b/themes/cp_app/_admin_navbar.php @@ -7,7 +7,7 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?>
    - + @@ -23,24 +23,24 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?> 'html', - 'content' => esc(<< 'html', + 'content' => esc(<<{$notificationsTitle} CODE_SAMPLE), - ], - ]; + ], +]; - if ($userPodcasts !== []) { - foreach ($userPodcasts as $userPodcast) { - $userPodcastTitle = esc($userPodcast->title); +if ($userPodcasts !== []) { + foreach ($userPodcasts as $userPodcast) { + $userPodcastTitle = esc($userPodcast->title); - $unreadNotificationDotDisplayClass = in_array($userPodcast->actor_id, $actorIdsWithUnreadNotifications, true) ? '' : 'hidden'; + $unreadNotificationDotDisplayClass = in_array($userPodcast->actor_id, $actorIdsWithUnreadNotifications, true) ? '' : 'hidden'; - $items[] = [ - 'type' => 'link', - 'title' => << 'link', + 'title' => <<
    @@ -49,20 +49,20 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?> {$userPodcastTitle}
    CODE_SAMPLE - , - 'uri' => route_to('notification-list', $userPodcast->id), - ]; - } - } else { - $noNotificationsText = lang('Notifications.no_notifications'); - $items[] = [ - 'type' => 'html', - 'content' => esc(<< route_to('notification-list', $userPodcast->id), + ]; + } +} else { + $noNotificationsText = lang('Notifications.no_notifications'); + $items[] = [ + 'type' => 'html', + 'content' => esc(<<{$noNotificationsText} CODE_SAMPLE), - ]; - } - ?> + ]; +} +?> user(), $userPodcast->id, 'interact-as')) { - $checkMark = interact_as_actor_id() === $userPodcast->actor_id ? icon('check', 'ml-2 bg-accent-base text-accent-contrast rounded-full') : ''; - $userPodcastTitle = esc($userPodcast->title); +$interactButtons = ''; +foreach ($userPodcasts as $userPodcast) { + if (can_podcast(auth()->user(), $userPodcast->id, 'interact-as')) { + $checkMark = interact_as_actor_id() === $userPodcast->actor_id ? icon('check', 'ml-2 bg-accent-base text-accent-contrast rounded-full') : ''; + $userPodcastTitle = esc($userPodcast->title); - $interactButtons .= <<
    {$userPodcastTitle}{$checkMark}
    CODE_SAMPLE; - } - } + } +} - $interactAsText = lang('Common.choose_interact'); - $interactAsRoute = route_to('interact-as-actor'); - $csrfField = csrf_field(); +$interactAsText = lang('Common.choose_interact'); +$interactAsRoute = route_to('interact-as-actor'); +$csrfField = csrf_field(); - $menuItems = [ - [ - 'type' => 'link', - 'title' => lang('Navigation.account.my-account'), - 'uri' => route_to('my-account'), - ], - [ - 'type' => 'link', - 'title' => lang('Navigation.account.change-password'), - 'uri' => route_to('change-password'), - ], - [ - 'type' => 'separator', - ], - [ - 'type' => 'link', - 'title' => lang('Navigation.account.logout'), - 'uri' => route_to('logout'), - ], - ]; +$menuItems = [ + [ + 'type' => 'link', + 'title' => lang('Navigation.account.my-account'), + 'uri' => route_to('my-account'), + ], + [ + 'type' => 'link', + 'title' => lang('Navigation.account.change-password'), + 'uri' => route_to('change-password'), + ], + [ + 'type' => 'separator', + ], + [ + 'type' => 'link', + 'title' => lang('Navigation.account.logout'), + 'uri' => route_to('logout'), + ], +]; - if ($userPodcasts !== []) { - $menuItems = array_merge([ - [ - 'type' => 'html', - 'content' => esc(<< 'html', + 'content' => esc(<< {$interactAsText}
    @@ -136,13 +136,13 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?> CODE_SAMPLE), - ], - [ - 'type' => 'separator', - ], - ], $menuItems); - } - ?> + ], + [ + 'type' => 'separator', + ], + ], $menuItems); +} +?>
    \ No newline at end of file diff --git a/themes/cp_app/_persons_modal.php b/themes/cp_app/_persons_modal.php index 6294fe90..237fefee 100644 --- a/themes/cp_app/_persons_modal.php +++ b/themes/cp_app/_persons_modal.php @@ -27,17 +27,17 @@

    group . - '.roles.' . - $role->role . - '.label', - ); - }, $person->roles), -) ?>

    + ', ', + array_map(function ($role) { + return lang( + 'PersonsTaxonomy.persons.' . + $role->group . + '.roles.' . + $role->role . + '.label', + ); + }, $person->roles), + ) ?>

    diff --git a/themes/cp_app/episode/_layout.php b/themes/cp_app/episode/_layout.php index 48e1a0ed..8bf65fd3 100644 --- a/themes/cp_app/episode/_layout.php +++ b/themes/cp_app/episode/_layout.php @@ -63,18 +63,18 @@ handle)), - icon( - 'social/castopod', - 'mr-2 text-xl text-black/75 group-hover:text-black', - ) . lang('Podcast.follow'), - [ - 'width' => 420, - 'height' => 620, - 'class' => - 'group inline-flex items-center px-3 leading-8 text-xs tracking-wider font-semibold text-black uppercase rounded-full shadow focus:ring-accent bg-white', - ], - ) ?> + route_to('follow', esc($podcast->handle)), + icon( + 'social/castopod', + 'mr-2 text-xl text-black/75 group-hover:text-black', + ) . lang('Podcast.follow'), + [ + 'width' => 420, + 'height' => 620, + 'class' => + 'group inline-flex items-center px-3 leading-8 text-xs tracking-wider font-semibold text-black uppercase rounded-full shadow focus:ring-accent bg-white', + ], + ) ?>
    @@ -98,9 +98,10 @@ persons as $person): ?> <?= esc($person->full_name) ?> - + episode->podcast->handle), esc($comment->episode->slug), $comment->id) ?>" method="POST" class="flex items-center gap-x-4"> + 'Comment.likes', + [ + 'numberOfLikes' => $comment->likes_count, + ], + ) ?>">likes_count ?> replies_count): ?> episode->podcast->handle), esc($comment->episode->slug), $comment->id), - icon('caret-down', 'text-xl mr-1') . lang('Comment.view_replies', [ - 'numberOfReplies' => $comment->replies_count, - ]), - [ - 'class' => 'inline-flex items-center text-xs hover:underline', - ] -) ?> + route_to('episode-comment', esc($comment->episode->podcast->handle), esc($comment->episode->slug), $comment->id), + icon('caret-down', 'text-xl mr-1') . lang('Comment.view_replies', [ + 'numberOfReplies' => $comment->replies_count, + ]), + [ + 'class' => 'inline-flex items-center text-xs hover:underline', + ] + ) ?> + 'Comment.like', + [ + 'numberOfLikes' => $comment->likes_count, + ], + ) ?>">likes_count ?> replies_count): ?> episode->podcast->handle), esc($comment->episode->slug), $comment->id), - icon('caret-down', 'text-xl mr-1') . lang('Comment.view_replies', [ - 'numberOfReplies' => $comment->replies_count, - ]), - [ - 'class' => 'inline-flex items-center text-xs hover:underline', - ] -) ?> + route_to('episode-comment', esc($comment->episode->podcast->handle), esc($comment->episode->slug), $comment->id), + icon('caret-down', 'text-xl mr-1') . lang('Comment.view_replies', [ + 'numberOfReplies' => $comment->replies_count, + ]), + [ + 'class' => 'inline-flex items-center text-xs hover:underline', + ] + ) ?> diff --git a/themes/cp_app/episode/_partials/comment_actions_from_post.php b/themes/cp_app/episode/_partials/comment_actions_from_post.php index 803b53b6..1cf35210 100644 --- a/themes/cp_app/episode/_partials/comment_actions_from_post.php +++ b/themes/cp_app/episode/_partials/comment_actions_from_post.php @@ -3,47 +3,47 @@
    + 'Comment.likes', + [ + 'numberOfLikes' => $comment->likes_count, + ], + ) ?>">likes_count ?> replies_count): ?> handle), $comment->id), - icon('caret-down', 'text-xl mr-1') . lang('Comment.view_replies', [ - 'numberOfReplies' => $comment->replies_count, - ]), - [ - 'class' => 'inline-flex items-center text-xs hover:underline', - ] -) ?> + route_to('post', esc($podcast->handle), $comment->id), + icon('caret-down', 'text-xl mr-1') . lang('Comment.view_replies', [ + 'numberOfReplies' => $comment->replies_count, + ]), + [ + 'class' => 'inline-flex items-center text-xs hover:underline', + ] + ) ?> handle), $comment->id, 'favourite'), - icon('heart', 'text-xl mr-1 opacity-40') . $comment->likes_count, - [ - 'class' => 'inline-flex items-center hover:underline', - 'width' => 420, - 'height' => 620, - 'title' => lang('Post.favourites', [ - 'numberOfFavourites' => $comment->likes_count, - ]), - ], -) ?> + route_to('post-remote-action', esc($podcast->handle), $comment->id, 'favourite'), + icon('heart', 'text-xl mr-1 opacity-40') . $comment->likes_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'width' => 420, + 'height' => 620, + 'title' => lang('Post.favourites', [ + 'numberOfFavourites' => $comment->likes_count, + ]), + ], + ) ?> replies_count): ?> handle), $comment->id), - icon('caret-down', 'text-xl mr-1') . lang('Comment.view_replies', [ - 'numberOfReplies' => $comment->replies_count, - ]), - [ - 'class' => 'inline-flex items-center text-xs hover:underline', - ] -) ?> + route_to('post', esc($podcast->handle), $comment->id), + icon('caret-down', 'text-xl mr-1') . lang('Comment.view_replies', [ + 'numberOfReplies' => $comment->replies_count, + ]), + [ + 'class' => 'inline-flex items-center text-xs hover:underline', + ] + ) ?> diff --git a/themes/cp_app/episode/_partials/comment_card.php b/themes/cp_app/episode/_partials/comment_card.php index bb937715..eac26a0f 100644 --- a/themes/cp_app/episode/_partials/comment_card.php +++ b/themes/cp_app/episode/_partials/comment_card.php @@ -25,29 +25,29 @@ + 'Comment.likes', + [ + 'numberOfLikes' => $comment->likes_count, + ], + ) ?>"> $comment->likes_count, + ], + ) ?> + 'Comment.likes', + [ + 'numberOfLikes' => $comment->likes_count, + ], + ) ?>"> $comment->likes_count, + ], + ) ?> diff --git a/themes/cp_app/episode/_partials/comment_reply_actions.php b/themes/cp_app/episode/_partials/comment_reply_actions.php index 837f73d5..f4f3464e 100644 --- a/themes/cp_app/episode/_partials/comment_reply_actions.php +++ b/themes/cp_app/episode/_partials/comment_reply_actions.php @@ -4,31 +4,31 @@ + 'Comment.likes', + [ + 'numberOfLikes' => $reply->likes_count, + ], + ) ?>">likes_count ?> + 'Comment.likes', + [ + 'numberOfLikes' => $reply->likes_count, + ], + ) ?>">likes_count ?> replies_count): ?> episode->podcast->handle), esc($reply->episode->slug), $reply->id), - icon('chat', 'text-2xl mr-1 opacity-40') . $reply->replies_count, - [ - 'class' => 'inline-flex items-center hover:underline', - 'title' => lang('Comment.replies', [ - 'numberOfReplies' => $reply->replies_count, - ]), - ], -) ?> + route_to('episode-comment', esc($reply->episode->podcast->handle), esc($reply->episode->slug), $reply->id), + icon('chat', 'text-2xl mr-1 opacity-40') . $reply->replies_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'title' => lang('Comment.replies', [ + 'numberOfReplies' => $reply->replies_count, + ]), + ], + ) ?> diff --git a/themes/cp_app/episode/comment.php b/themes/cp_app/episode/comment.php index 18d26a11..a7a54ce6 100644 --- a/themes/cp_app/episode/comment.php +++ b/themes/cp_app/episode/comment.php @@ -5,9 +5,9 @@
    include('episode/_partials/comment_with_replies') ?> diff --git a/themes/cp_app/home.php b/themes/cp_app/home.php index b04f2994..aa6eedda 100644 --- a/themes/cp_app/home.php +++ b/themes/cp_app/home.php @@ -39,8 +39,8 @@

    " class="inline-flex items-baseline text-3xl font-semibold font-display">get('App.siteName') === 'Castopod' ? 'castopod' . svg('castopod-logo-base', 'h-6 ml-2') : esc(service('settings') ->get('App.siteName')) ?> @@ -49,29 +49,29 @@
    () + $podcasts, + ) ?>) + [ + 'type' => 'link', + 'title' => ($sortBy === 'activity' ? '✓ ' : '') . lang('Home.sort_options.activity'), + 'uri' => route_to('home') . '?sort=activity', + 'class' => $sortBy === 'activity' ? 'font-semibold' : '', + ], + [ + 'type' => 'link', + 'title' => ($sortBy === 'created_desc' ? '✓ ' : '') . lang('Home.sort_options.created_desc'), + 'uri' => route_to('home') . '?sort=created_desc', + 'class' => $sortBy === 'created_desc' ? 'font-semibold' : '', + ], + [ + 'type' => 'link', + 'title' => ($sortBy === 'created_asc' ? '✓ ' : '') . lang('Home.sort_options.created_asc'), + 'uri' => route_to('home') . '?sort=created_asc', + 'class' => $sortBy === 'created_asc' ? 'font-semibold' : '', + ], + ])) ?>" />
    @@ -105,8 +105,8 @@ diff --git a/themes/cp_app/pages/_layout.php b/themes/cp_app/pages/_layout.php index 0e3134fe..466d9a94 100644 --- a/themes/cp_app/pages/_layout.php +++ b/themes/cp_app/pages/_layout.php @@ -42,9 +42,9 @@
    + 'arrow-left', + 'mr-2', + ) . lang('Page.back_to_home') ?> title) ?>

    @@ -54,8 +54,8 @@
    - 'Castopod', - ], null, false) ?> + 'castopod' => + 'Castopod', + ], null, false) ?>
    diff --git a/themes/cp_app/pages/map.php b/themes/cp_app/pages/map.php index 228f1488..a0629f7b 100644 --- a/themes/cp_app/pages/map.php +++ b/themes/cp_app/pages/map.php @@ -45,9 +45,9 @@
    + 'arrow-left', + 'mr-2', + ) . lang('Page.back_to_home') ?>
    @@ -57,8 +57,8 @@ diff --git a/themes/cp_app/podcast/_layout.php b/themes/cp_app/podcast/_layout.php index 2136465a..372002ab 100644 --- a/themes/cp_app/podcast/_layout.php +++ b/themes/cp_app/podcast/_layout.php @@ -62,18 +62,18 @@ handle)), - icon( - 'social/castopod', - 'mr-2 text-xl text-black/75 group-hover:text-black', - ) . lang('Podcast.follow'), - [ - 'width' => 420, - 'height' => 620, - 'class' => - 'group inline-flex items-center px-4 text-xs tracking-wider font-semibold text-black uppercase rounded-full leading-8 shadow focus:ring-accent bg-white', - ], - ) ?> + route_to('follow', esc($podcast->handle)), + icon( + 'social/castopod', + 'mr-2 text-xl text-black/75 group-hover:text-black', + ) . lang('Podcast.follow'), + [ + 'width' => 420, + 'height' => 620, + 'class' => + 'group inline-flex items-center px-4 text-xs tracking-wider font-semibold text-black uppercase rounded-full leading-8 shadow focus:ring-accent bg-white', + ], + ) ?>
    include('podcast/_partials/navigation') ?> diff --git a/themes/cp_app/podcast/_partials/funding_links_modal.php b/themes/cp_app/podcast/_partials/funding_links_modal.php index 25bfcbce..d2d0e0c7 100644 --- a/themes/cp_app/podcast/_partials/funding_links_modal.php +++ b/themes/cp_app/podcast/_partials/funding_links_modal.php @@ -26,10 +26,10 @@ rel="noopener noreferrer" class="inline-flex items-center w-full font-semibold text-accent-base hover:text-accent-hover focus:ring-accent"> slug), - 'mr-2 flex-shrink-0', - $fundingPlatform->type - ) . '' . esc($fundingPlatform->link_url) . '' ?> + esc($fundingPlatform->slug), + 'mr-2 flex-shrink-0', + $fundingPlatform->type + ) . '' . esc($fundingPlatform->link_url) . '' ?> diff --git a/themes/cp_app/podcast/_partials/premium_banner.php b/themes/cp_app/podcast/_partials/premium_banner.php index 69b6e636..b49c7dad 100644 --- a/themes/cp_app/podcast/_partials/premium_banner.php +++ b/themes/cp_app/podcast/_partials/premium_banner.php @@ -4,8 +4,8 @@ if ($podcast->is_premium): ?> isUnlocked($podcast->handle); - $shownIcon = $isUnlocked ? 'lock-unlock' : 'lock'; - $hiddenIcon = $isUnlocked ? 'lock' : 'lock-unlock'; + $shownIcon = $isUnlocked ? 'lock-unlock' : 'lock'; + $hiddenIcon = $isUnlocked ? 'lock' : 'lock-unlock'; ?>

    diff --git a/themes/cp_app/podcast/_partials/sidebar.php b/themes/cp_app/podcast/_partials/sidebar.php index ead51a4b..7a70ba3f 100644 --- a/themes/cp_app/podcast/_partials/sidebar.php +++ b/themes/cp_app/podcast/_partials/sidebar.php @@ -14,20 +14,20 @@ socialPlatforms as $socialPlatform): ?> is_visible): ?> link_url), - icon( - esc($socialPlatform->slug), - '', - $socialPlatform->type - ), - [ - 'class' => 'text-2xl text-skin-muted hover:text-skin-base w-8 h-8 items-center inline-flex justify-center', - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'data-tooltip' => 'bottom', - 'title' => $socialPlatform->label, - ], - ) ?> + esc($socialPlatform->link_url), + icon( + esc($socialPlatform->slug), + '', + $socialPlatform->type + ), + [ + 'class' => 'text-2xl text-skin-muted hover:text-skin-base w-8 h-8 items-center inline-flex justify-center', + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'data-tooltip' => 'bottom', + 'title' => $socialPlatform->label, + ], + ) ?>
    @@ -41,20 +41,20 @@ podcastingPlatforms as $podcastingPlatform): ?> is_visible): ?> link_url), - icon( - esc($podcastingPlatform->slug), - '', - $podcastingPlatform->type - ), - [ - 'class' => 'text-2xl text-skin-muted hover:text-skin-base w-8 h-8 items-center inline-flex justify-center', - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'data-tooltip' => 'bottom', - 'title' => $podcastingPlatform->label, - ], - ) ?> + esc($podcastingPlatform->link_url), + icon( + esc($podcastingPlatform->slug), + '', + $podcastingPlatform->type + ), + [ + 'class' => 'text-2xl text-skin-muted hover:text-skin-base w-8 h-8 items-center inline-flex justify-center', + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'data-tooltip' => 'bottom', + 'title' => $podcastingPlatform->label, + ], + ) ?> @@ -64,9 +64,9 @@

    copyright) ?>

    - 'Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '', - ], null, false) ?>

    + 'castopod' => + 'Castopod' . icon('castopod', 'ml-1 text-lg', 'social') . '', + ], null, false) ?>

    diff --git a/themes/cp_app/podcast/about.php b/themes/cp_app/podcast/about.php index 4a721c98..7909f3ba 100644 --- a/themes/cp_app/podcast/about.php +++ b/themes/cp_app/podcast/about.php @@ -22,9 +22,10 @@ persons as $person): ?> <?= esc($person->full_name) ?> - + - 'px-2 py-1 whitespace-nowrap hover:bg-highlight ' . - ($link['is_active'] - ? 'font-semibold' - : 'text-skin-muted hover:text-skin-base'), - ], -) ?> + $link['route'], + $link['label'] . ' (' . $link['number_of_episodes'] . ')', + [ + 'class' => + 'px-2 py-1 whitespace-nowrap hover:bg-highlight ' . + ($link['is_active'] + ? 'font-semibold' + : 'text-skin-muted hover:text-skin-base'), + ], + ) ?> @@ -41,15 +41,15 @@
    $episode, - 'podcast' => $podcast, - ]) ?> + 'episode' => $episode, + 'podcast' => $podcast, + ]) ?>

    + 'Podcast.no_episode', + ) ?> endSection() diff --git a/themes/cp_app/post/_partials/actions.php b/themes/cp_app/post/_partials/actions.php index 721ef7b0..ffb13974 100644 --- a/themes/cp_app/post/_partials/actions.php +++ b/themes/cp_app/post/_partials/actions.php @@ -3,122 +3,122 @@
    handle), $post->id), - icon('chat', 'text-2xl mr-1 opacity-40') . $post->replies_count, - [ - 'class' => 'inline-flex items-center hover:underline', - 'title' => lang('Post.replies', [ - 'numberOfReplies' => $post->replies_count, - ]), - ], -) ?> + route_to('post', esc($podcast->handle), $post->id), + icon('chat', 'text-2xl mr-1 opacity-40') . $post->replies_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'title' => lang('Post.replies', [ + 'numberOfReplies' => $post->replies_count, + ]), + ], + ) ?> + 'Post.reblogs', + [ + 'numberOfReblogs' => $post->reblogs_count, + ], + ) ?>">reblogs_count ?> + 'Post.favourites', + [ + 'numberOfFavourites' => $post->favourites_count, + ], + ) ?>">favourites_count ?> handle), $post->id), - icon('chat', 'text-2xl mr-1 opacity-40') . $post->replies_count, - [ - 'class' => 'inline-flex items-center hover:underline', - 'title' => lang('Post.replies', [ - 'numberOfReplies' => $post->replies_count, - ]), - ], - ) ?> + route_to('post', esc($podcast->handle), $post->id), + icon('chat', 'text-2xl mr-1 opacity-40') . $post->replies_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'title' => lang('Post.replies', [ + 'numberOfReplies' => $post->replies_count, + ]), + ], + ) ?> handle), $post->id, 'reblog'), - icon('repeat', 'text-2xl mr-1 opacity-40') . $post->reblogs_count, - [ - 'class' => 'inline-flex items-center hover:underline', - 'width' => 420, - 'height' => 620, - 'title' => lang('Post.reblogs', [ - 'numberOfReblogs' => $post->reblogs_count, - ]), - ], - ) ?> + route_to('post-remote-action', esc($podcast->handle), $post->id, 'reblog'), + icon('repeat', 'text-2xl mr-1 opacity-40') . $post->reblogs_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'width' => 420, + 'height' => 620, + 'title' => lang('Post.reblogs', [ + 'numberOfReblogs' => $post->reblogs_count, + ]), + ], + ) ?> handle), $post->id, 'favourite'), - icon('heart', 'text-2xl mr-1 opacity-40') . $post->favourites_count, - [ - 'class' => 'inline-flex items-center hover:underline', - 'width' => 420, - 'height' => 620, - 'title' => lang('Post.favourites', [ - 'numberOfFavourites' => $post->favourites_count, - ]), - ], - ) ?> + route_to('post-remote-action', esc($podcast->handle), $post->id, 'favourite'), + icon('heart', 'text-2xl mr-1 opacity-40') . $post->favourites_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'width' => 420, + 'height' => 620, + 'title' => lang('Post.favourites', [ + 'numberOfFavourites' => $post->favourites_count, + ]), + ], + ) ?> diff --git a/themes/cp_app/post/_partials/post_with_replies.php b/themes/cp_app/post/_partials/post_with_replies.php index 21ed54dd..e3c58031 100644 --- a/themes/cp_app/post/_partials/post_with_replies.php +++ b/themes/cp_app/post/_partials/post_with_replies.php @@ -37,17 +37,17 @@ if ($post->in_reply_to_id): ?> handle), $post->id, 'reply'), - lang('Post.reply_to', [ - 'actorUsername' => esc($post->actor->username), - ]), - [ - 'class' => - 'text-center justify-center font-semibold rounded-full shadow relative z-10 px-4 py-2 w-full bg-accent-base text-accent-contrast inline-flex items-center hover:bg-accent-hover', - 'width' => 420, - 'height' => 620, - ], - ) ?> + route_to('post-remote-action', esc($podcast->handle), $post->id, 'reply'), + lang('Post.reply_to', [ + 'actorUsername' => esc($post->actor->username), + ]), + [ + 'class' => + 'text-center justify-center font-semibold rounded-full shadow relative z-10 px-4 py-2 w-full bg-accent-base text-accent-contrast inline-flex items-center hover:bg-accent-hover', + 'width' => 420, + 'height' => 620, + ], + ) ?> diff --git a/themes/cp_app/post/_partials/preview_card.php b/themes/cp_app/post/_partials/preview_card.php index 552331ce..f3a6d48d 100644 --- a/themes/cp_app/post/_partials/preview_card.php +++ b/themes/cp_app/post/_partials/preview_card.php @@ -5,9 +5,9 @@ if ($preview_card->type === 'image'): ?> image): ?>
    + 'external-link', + 'absolute inset-0 m-auto text-6xl bg-accent-base bg-opacity-50 group-hover:bg-opacity-100 text-accent-contrast rounded-full p-2', + ) ?> <?= esc($preview_card->title) ?>
    @@ -21,9 +21,9 @@ if ($preview_card->type === 'image'): ?> image): ?>
    + 'play', + 'absolute inset-0 m-auto text-6xl bg-accent-base bg-opacity-50 group-hover:bg-opacity-100 text-accent-contrast rounded-full p-2', + ) ?> <?= esc($preview_card->title) ?>
    diff --git a/themes/cp_app/post/_partials/reblog.php b/themes/cp_app/post/_partials/reblog.php index 70d6c003..220f3310 100644 --- a/themes/cp_app/post/_partials/reblog.php +++ b/themes/cp_app/post/_partials/reblog.php @@ -1,44 +1,32 @@

    esc($post->actor->display_name), - ]) ?>

    + 'repeat', + 'text-lg mr-2 opacity-40', + ) . lang('Post.actor_shared', [ + 'actor' => esc($post->actor->display_name), + ]) ?>

    - <?= esc($post->actor->display_name) ?> + <?= esc($post->actor->display_name) ?>
    message_html ?>
    - episode_id): ?> + episode_id) : ?> $index, - 'episode' => $post->episode, - ]) ?> - preview_card_id): ?> + 'index' => $index, + 'episode' => $post->episode, + ]) ?> + preview_card_id) : ?> $post->preview_card, - ]) ?> + 'preview_card' => $post->preview_card, + ]) ?> include('post/_partials/actions') ?>
    diff --git a/themes/cp_app/post/_partials/reply_actions.php b/themes/cp_app/post/_partials/reply_actions.php index 0e2b853f..fce6befb 100644 --- a/themes/cp_app/post/_partials/reply_actions.php +++ b/themes/cp_app/post/_partials/reply_actions.php @@ -5,85 +5,85 @@ if (can_user_interact()): ?>
    handle), $reply->id), - icon('chat', 'text-lg mr-1 opacity-40') . $reply->replies_count, - [ - 'class' => 'inline-flex items-center hover:underline text-sm', - 'title' => lang('Post.replies', [ - 'numberOfReplies' => $reply->replies_count, - ]), - ], -) ?> - - + ) ?> + + diff --git a/themes/cp_app/post/post.php b/themes/cp_app/post/post.php index 47a09e6a..a0a6998c 100644 --- a/themes/cp_app/post/post.php +++ b/themes/cp_app/post/post.php @@ -4,18 +4,18 @@
    1, - 'post' => $post, - 'podcast' => $podcast, - ]) ?> + 'index' => 1, + 'post' => $post, + 'podcast' => $podcast, + ]) ?>
    endSection() ?> diff --git a/themes/cp_auth/_layout.php b/themes/cp_auth/_layout.php index 166dff03..f000eae4 100644 --- a/themes/cp_auth/_layout.php +++ b/themes/cp_auth/_layout.php @@ -18,15 +18,15 @@
    + 'home', + ) ?>" class="inline-flex items-baseline text-4xl font-bold font-display text-accent-base focus:ring-accent">
    renderSection( - 'title', - ) ?> + 'title', + ) ?> renderSection('content') ?>
    diff --git a/themes/cp_auth/register.php b/themes/cp_auth/register.php index c8eeccc2..af5e06df 100644 --- a/themes/cp_auth/register.php +++ b/themes/cp_auth/register.php @@ -53,10 +53,10 @@

    + 'Auth.haveAccount', + ) ?>

    endSection() ?> diff --git a/themes/cp_install/cache_config.php b/themes/cp_install/cache_config.php index abc477e0..093f3e16 100644 --- a/themes/cp_install/cache_config.php +++ b/themes/cp_install/cache_config.php @@ -12,8 +12,8 @@

    + 'Install.form.cache_config_hint', + ) ?>

    lang('Install.form.cacheHandlerOptions.file'), + 'redis' => lang('Install.form.cacheHandlerOptions.redis'), + 'predis' => lang('Install.form.cacheHandlerOptions.predis'), + ])) ?>" selected="file" required="true" /> diff --git a/themes/cp_install/database_config.php b/themes/cp_install/database_config.php index 90a4f550..2357d659 100644 --- a/themes/cp_install/database_config.php +++ b/themes/cp_install/database_config.php @@ -9,13 +9,13 @@
    2/4 + 'Install.form.database_config', + ) ?>

    + 'Install.form.database_config_hint', + ) ?>

    Date: Wed, 22 Feb 2023 16:50:24 +0000 Subject: [PATCH 065/477] ci: add intl extension to ci docker image --- .phpunit.cache/test-results | 1 - docker/ci/Dockerfile | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) delete mode 100644 .phpunit.cache/test-results diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results deleted file mode 100644 index 9e9a42d9..00000000 --- a/.phpunit.cache/test-results +++ /dev/null @@ -1 +0,0 @@ -{"version":1,"defects":[],"times":{"Tests\\Database\\ExampleDatabaseTest::testModelFindAll":0.002,"Tests\\Database\\ExampleDatabaseTest::testSoftDeleteLeavesRow":0.002,"modules\\Api\\Rest\\V1\\PodcastTest::testList":0.008,"modules\\Api\\Rest\\V1\\PodcastTest::testView":0.003,"modules\\Api\\Rest\\V1\\PodcastTest::testViewNotFound":0.002,"modules\\Api\\Rest\\V1\\PodcastTest::testListEmpty":0.633,"Tests\\Session\\ExampleSessionTest::testSessionSimple":0,"HealthTest::testIsDefinedAppPath":0,"HealthTest::testBaseUrlHasBeenSet":0.001}} \ No newline at end of file diff --git a/docker/ci/Dockerfile b/docker/ci/Dockerfile index 09475553..58fe8f12 100644 --- a/docker/ci/Dockerfile +++ b/docker/ci/Dockerfile @@ -20,10 +20,14 @@ RUN \ jq \ zip \ rsync \ + icu-libs \ mysql \ mysql-client \ + && apk add --no-cache --virtual .php-ext-build-dep icu-dev \ && docker-php-ext-install \ + intl \ mysqli \ + && apk del .php-ext-build-dep \ # install pnpm && wget -qO- https://get.pnpm.io/install.sh | ENV="~/.shrc" SHELL="$(which sh)" sh - \ && mv ~/.local/share/pnpm/pnpm /usr/bin/pnpm \ From e0c3ddb07d129b8723c558a99bef4cefb508a62b Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 22 Feb 2023 16:59:28 +0000 Subject: [PATCH 066/477] ci: use pnpx in lint-commit-msg script --- scripts/lint-commit-msg.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/lint-commit-msg.sh b/scripts/lint-commit-msg.sh index ec0da7c3..22b81624 100755 --- a/scripts/lint-commit-msg.sh +++ b/scripts/lint-commit-msg.sh @@ -6,14 +6,14 @@ set -e if [ "${CI_COMMIT_BEFORE_SHA}" = "0000000000000000000000000000000000000000" ]; then echo "commitlint from HEAD^" - npx commitlint --from=HEAD^ + pnpx commitlint --from=HEAD^ else echo "commitlint from ${CI_COMMIT_BEFORE_SHA}" br=`git branch -r --contains ${CI_COMMIT_BEFORE_SHA}` if [ ! -n $br ]; then - npx commitlint --from=HEAD^ + pnpx commitlint --from=HEAD^ else - npx commitlint --from="${CI_COMMIT_BEFORE_SHA}" + pnpx commitlint --from="${CI_COMMIT_BEFORE_SHA}" fi fi From 9ef58808fc473343d06ad271e2cee693732f3d25 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 22 Feb 2023 17:25:14 +0000 Subject: [PATCH 067/477] ci: update bundle scripts to use `pnpm exec` + add openssh-client to ci docker image --- .husky/commit-msg | 2 +- .husky/pre-commit | 4 ++-- .releaserc.json | 2 +- docker/ci/Dockerfile | 1 + docs/.gitlab-ci.yml | 10 +++------- scripts/lint-commit-msg.sh | 6 +++--- 6 files changed, 11 insertions(+), 14 deletions(-) diff --git a/.husky/commit-msg b/.husky/commit-msg index cdb7c8da..ae61f5b1 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -npx --no-install commitlint --verbose --edit "$1" +pnpm exec commitlint --verbose --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit index 39c89b16..bc1c3599 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -7,5 +7,5 @@ INTERACTIVE="--no-interaction" vendor/bin/captainhook $INTERACTIVE --configuration=captainhook.json --bootstrap=vendor/autoload.php hook:pre-commit "$@" <&0 -npm run typecheck -npx lint-staged +pnpm run typecheck +pnpm exec lint-staged diff --git a/.releaserc.json b/.releaserc.json index a9deb773..af98b785 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -17,7 +17,7 @@ [ "@semantic-release/exec", { - "prepareCmd": "./scripts/bundle.sh ${nextRelease.version} && ./scripts/package.sh ${nextRelease.version} && npx prettier --write CHANGELOG.md" + "prepareCmd": "./scripts/bundle.sh ${nextRelease.version} && ./scripts/package.sh ${nextRelease.version} && pnpm exec prettier --write CHANGELOG.md" } ], "@semantic-release/npm", diff --git a/docker/ci/Dockerfile b/docker/ci/Dockerfile index 58fe8f12..f24e3689 100644 --- a/docker/ci/Dockerfile +++ b/docker/ci/Dockerfile @@ -19,6 +19,7 @@ RUN \ wget \ jq \ zip \ + openssh-client \ rsync \ icu-libs \ mysql \ diff --git a/docs/.gitlab-ci.yml b/docs/.gitlab-ci.yml index f9c992b7..1569b949 100644 --- a/docs/.gitlab-ci.yml +++ b/docs/.gitlab-ci.yml @@ -9,7 +9,7 @@ stages: - cd docs - chmod +x ./scripts/i18n-filter.sh - ./scripts/i18n-filter.sh src - - npm ci + - pnpm install cache: paths: @@ -20,7 +20,7 @@ build: extends: .documentation-setup stage: build script: - - npm run build + - pnpm run build except: - main - beta @@ -33,7 +33,7 @@ build-production: name: production url: https://docs.castopod.org/ script: - - npm run build + - pnpm run build artifacts: paths: - docs/.vitepress/dist @@ -56,10 +56,6 @@ deploy: SSH_PORT: 3242 SOURCE_FOLDER: "docs/.vitepress/dist/" before_script: - # install rsync for file transfers - - apt-get update && apt-get install rsync -y - # ssh config - - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )" # Run ssh-agent (inside the build environment) - eval $(ssh-agent -s) # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store diff --git a/scripts/lint-commit-msg.sh b/scripts/lint-commit-msg.sh index 22b81624..173d5821 100755 --- a/scripts/lint-commit-msg.sh +++ b/scripts/lint-commit-msg.sh @@ -6,14 +6,14 @@ set -e if [ "${CI_COMMIT_BEFORE_SHA}" = "0000000000000000000000000000000000000000" ]; then echo "commitlint from HEAD^" - pnpx commitlint --from=HEAD^ + pnpm exec commitlint --from=HEAD^ else echo "commitlint from ${CI_COMMIT_BEFORE_SHA}" br=`git branch -r --contains ${CI_COMMIT_BEFORE_SHA}` if [ ! -n $br ]; then - pnpx commitlint --from=HEAD^ + pnpm exec commitlint --from=HEAD^ else - pnpx commitlint --from="${CI_COMMIT_BEFORE_SHA}" + pnpm exec commitlint --from="${CI_COMMIT_BEFORE_SHA}" fi fi From b794d3433c79b98c31fdf8319b35128a86574f0a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 22 Feb 2023 17:58:46 +0000 Subject: [PATCH 068/477] ci: use sed instead of perl to rewrite castopod's composer version --- scripts/bundle.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/bundle.sh b/scripts/bundle.sh index 31e5bb80..8e1d2ece 100644 --- a/scripts/bundle.sh +++ b/scripts/bundle.sh @@ -2,7 +2,7 @@ set -e VERSION=$1 -COMPOSER_VERSION=$(echo "$VERSION" | perl -pe 's/(?<=[alpha|beta])\.//g') +COMPOSER_VERSION=$(echo "$VERSION" | sed -r 's/(alpha|beta)./\1/g') # replace composer.json version using jq echo "$( jq '.version = "'$COMPOSER_VERSION'"' composer.json )" > composer.json From 1111177eb7fea4eba6d119b17acdf3bf416492ef Mon Sep 17 00:00:00 2001 From: Aonrud Date: Fri, 24 Feb 2023 15:28:17 +0000 Subject: [PATCH 069/477] fix(analytics): check the x_forwarded_for client header --- .../Analytics/Helpers/analytics_helper.php | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php index cdd5c698..363fa5b8 100644 --- a/modules/Analytics/Helpers/analytics_helper.php +++ b/modules/Analytics/Helpers/analytics_helper.php @@ -34,6 +34,20 @@ if (! function_exists('base64_url_decode')) { } } +if (! function_exists('client_ip')) { + /** + * Get the client IP, depending on available headers + */ + function client_ip(): string + { + if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + return $_SERVER['HTTP_X_FORWARDED_FOR']; + } + + return $_SERVER['REMOTE_ADDR']; + } +} + if (! function_exists('set_user_session_deny_list_ip')) { /** * Set user country in session variable, for analytic purposes @@ -44,7 +58,7 @@ if (! function_exists('set_user_session_deny_list_ip')) { $session->start(); if (! $session->has('denyListIp')) { - $session->set('denyListIp', IpDb::find($_SERVER['REMOTE_ADDR']) !== null); + $session->set('denyListIp', IpDb::find(client_ip()) !== null); } } } @@ -69,7 +83,7 @@ if (! function_exists('set_user_session_location')) { if (! $session->has('location')) { try { $cityReader = new Reader(WRITEPATH . 'uploads/GeoLite2-City/GeoLite2-City.mmdb'); - $city = $cityReader->city($_SERVER['REMOTE_ADDR']); + $city = $cityReader->city(client_ip()); $location = [ 'countryCode' => $city->country->isoCode === null @@ -232,6 +246,8 @@ if (! function_exists('podcast_hit')) { $session = Services::session(); $session->start(); + $clientIp = client_ip(); + // We try to count (but if things went wrong the show should go on and the user should be able to download the file): try { // If the user IP is denied it's probably a bot: @@ -252,7 +268,7 @@ if (! function_exists('podcast_hit')) { sha1( $salt . '_' . date( 'Y-m-d' - ) . '_' . $_SERVER['REMOTE_ADDR'] . '_' . $_SERVER['HTTP_USER_AGENT'] . '_' . $episodeId + ) . '_' . $clientIp . '_' . $_SERVER['HTTP_USER_AGENT'] . '_' . $episodeId ); // The cache expires at midnight: $secondsToMidnight = strtotime('tomorrow') - time(); @@ -299,7 +315,7 @@ if (! function_exists('podcast_hit')) { sha1( $salt . '_' . date( 'Y-m-d' - ) . '_' . $_SERVER['REMOTE_ADDR'] . '_' . $_SERVER['HTTP_USER_AGENT'] . '_' . $podcastId + ) . '_' . $clientIp . '_' . $_SERVER['HTTP_USER_AGENT'] . '_' . $podcastId ); $newListener = 1; // Has this listener already downloaded an episode today: From ab275e978c895e345e7ac3a690bb1d1d5162d398 Mon Sep 17 00:00:00 2001 From: Romain de Laage Date: Sat, 25 Feb 2023 15:10:19 +0000 Subject: [PATCH 070/477] build(docker): add alternative Nginx Unit image --- docker/production/.gitlab-ci.yml | 3 + docker/production/unit/Dockerfile | 61 +++++++++ docker/production/unit/config.json | 43 ++++++ docker/production/unit/crontab.txt | 3 + docker/production/unit/entrypoint.sh | 197 +++++++++++++++++++++++++++ 5 files changed, 307 insertions(+) create mode 100644 docker/production/unit/Dockerfile create mode 100644 docker/production/unit/config.json create mode 100644 docker/production/unit/crontab.txt create mode 100644 docker/production/unit/entrypoint.sh diff --git a/docker/production/.gitlab-ci.yml b/docker/production/.gitlab-ci.yml index 67b26ccc..f55b96fa 100644 --- a/docker/production/.gitlab-ci.yml +++ b/docker/production/.gitlab-ci.yml @@ -13,6 +13,7 @@ docker-build-rolling: - /kaniko/executor --cleanup --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${TAG} - /kaniko/executor --cleanup --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${TAG} - /kaniko/executor --cleanup --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${TAG} + - /kaniko/executor --cleanup --context . --dockerfile docker/production/unit/Dockerfile --destination ${DOCKER_IMAGE_UNIT}:${TAG} needs: - pipeline: $PARENT_PIPELINE_ID job: bundle @@ -31,6 +32,7 @@ docker-build-main-release: - /kaniko/executor --cleanup --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${CP_VERSION} --destination ${DOCKER_IMAGE_WEB_SERVER}:latest - /kaniko/executor --cleanup --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${CP_VERSION} --destination ${DOCKER_IMAGE_APP}:latest - /kaniko/executor --cleanup --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${CP_VERSION} --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:latest + - /kaniko/executor --cleanup --context . --dockerfile docker/production/unit/Dockerfile --destination ${DOCKER_IMAGE_UNIT}:${CP_VERSION} --destination ${DOCKER_IMAGE_UNIT}:latest needs: - pipeline: $PARENT_PIPELINE_ID job: release @@ -51,6 +53,7 @@ docker-build-alpha-beta-release: - /kaniko/executor --cleanup --context . --dockerfile docker/production/web-server/Dockerfile --destination ${DOCKER_IMAGE_WEB_SERVER}:${CP_VERSION} --destination ${DOCKER_IMAGE_WEB_SERVER}:${TAG} - /kaniko/executor --cleanup --context . --dockerfile docker/production/app/Dockerfile --destination ${DOCKER_IMAGE_APP}:${CP_VERSION} --destination ${DOCKER_IMAGE_APP}:${TAG} - /kaniko/executor --cleanup --context . --dockerfile docker/production/video-clipper/Dockerfile --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${CP_VERSION} --destination ${DOCKER_IMAGE_VIDEO_CLIPPER}:${TAG} + - /kaniko/executor --cleanup --context . --dockerfile docker/production/unit/Dockerfile --destination ${DOCKER_IMAGE_UNIT}:${CP_VERSION} --destination ${DOCKER_IMAGE_UNIT}:${TAG} needs: - pipeline: $PARENT_PIPELINE_ID job: release diff --git a/docker/production/unit/Dockerfile b/docker/production/unit/Dockerfile new file mode 100644 index 00000000..ab2cad76 --- /dev/null +++ b/docker/production/unit/Dockerfile @@ -0,0 +1,61 @@ +FROM docker.io/golang:1.20-bullseye AS CRON_BUILDER + +ARG SUPERCRONIC_VERSION=v0.2.1 + +RUN apt-get update && \ + apt-get install -y git && \ + git clone https://github.com/aptible/supercronic.git && \ + cd supercronic && \ + git checkout $SUPERCRONIC_VERSION && \ + go build && \ + mv supercronic /usr/local/bin + + +FROM docker.io/php:8.1-cli AS UNIT_BUILDER + +ARG UNIT_VERSION=1.29.0 + +RUN apt-get update && \ + apt-get install -y libpcre2-dev git && \ + mkdir -p /usr/lib/unit/modules && \ + git clone https://github.com/nginx/unit.git && \ + cd unit && \ + git checkout $UNIT_VERSION && \ + ./configure --prefix=/usr --state=/var/lib/unit --control=unix:/var/run/control.unit.sock --log=/var/log/unit.log --user=www-data --group=www-data --tmp=/tmp --modules=/usr/lib/unit/modules && \ + ./configure php && \ + make && \ + make install + + +FROM docker.io/php:8.1-cli + +COPY --from=UNIT_BUILDER /usr/sbin/unitd /usr/sbin/unitd +COPY --from=UNIT_BUILDER /usr/lib/unit/ /usr/lib/unit/ +COPY --from=CRON_BUILDER /usr/local/bin/supercronic /usr/local/bin/supercronic + +COPY docker/production/unit/entrypoint.sh /entrypoint.sh +COPY castopod /var/www/castopod +COPY docker/production/unit/config.json /config.json +COPY docker/production/unit/crontab.txt /crontab.txt + +RUN apt-get update && \ + apt-get install -y ffmpeg curl libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev libpcre2-8-0 libicu-dev && \ + rm -rf /var/lib/apt/lists/* && \ + pecl install -o -f redis && \ + rm -rf /tmp/pear && \ + docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-xpm && \ + docker-php-ext-install mysqli gd intl exif && \ + docker-php-ext-enable mysqli gd intl exif redis && \ + ln -s /dev/stdout /var/log/unit.log && \ + mkdir -p /var/lib/unit && \ + chmod 544 /entrypoint.sh && \ + chmod -R 750 /var/www/castopod && \ + chown -R root:www-data /var/www/castopod && \ + chown -R www-data:www-data /var/www/castopod/writable /var/www/castopod/public/media + +WORKDIR /var/www/castopod +VOLUME /var/www/castopod/public/media +EXPOSE 8000 + +ENTRYPOINT [ "sh", "-c" ] +CMD [ "/entrypoint.sh" ] diff --git a/docker/production/unit/config.json b/docker/production/unit/config.json new file mode 100644 index 00000000..d8d8d76f --- /dev/null +++ b/docker/production/unit/config.json @@ -0,0 +1,43 @@ +{ + "listeners": { + "*:8000": { + "pass": "routes" + } + }, + "routes": [ + { + "action": { + "share": "/var/www/castopod/public$uri", + "fallback": { + "pass": "applications/castopod" + } + } + } + ], + "applications": { + "castopod": { + "type": "php", + "root": "/var/www/castopod/public/", + "script": "index.php", + "options": { + "admin": { + "file_uploads": "On", + "memory_limit": "512M", + "upload_max_filesize": "500M", + "post_max_size": "512M", + "max_execution_time": "300", + "max_input_time": "300" + } + } + } + }, + "access_log": { + "path": "/dev/stdout" + }, + "settings": { + "http": { + "body_read_timeout": 300, + "max_body_size": 536870912 + } + } +} diff --git a/docker/production/unit/crontab.txt b/docker/production/unit/crontab.txt new file mode 100644 index 00000000..b1f18a1e --- /dev/null +++ b/docker/production/unit/crontab.txt @@ -0,0 +1,3 @@ +* * * * * /usr/local/bin/php /var/www/castopod/public/index.php scheduled-activities +* * * * * /usr/local/bin/php /var/www/castopod/public/index.php scheduled-websub-publish +* * * * * /usr/local/bin/php /var/www/castopod/public/index.php scheduled-video-clips diff --git a/docker/production/unit/entrypoint.sh b/docker/production/unit/entrypoint.sh new file mode 100644 index 00000000..62a1036e --- /dev/null +++ b/docker/production/unit/entrypoint.sh @@ -0,0 +1,197 @@ +#!/bin/sh + +if [ -z "${CP_BASEURL}" ] +then + echo "CP_BASEURL must be set" + exit 1 +fi + +if [ -z "${CP_MEDIA_BASEURL}" ] +then + echo "CP_MEDIA_BASEURL is empty, leaving empty by default" +fi + +if [ -z "${CP_ADMIN_GATEWAY}" ] +then + echo "CP_ADMIN_GATEWAY is empty, using default" + CP_ADMIN_GATEWAY="cp-admin" +fi + +if [ -z "${CP_AUTH_GATEWAY}" ] +then + echo "CP_AUTH_GATEWAY is empty, using default" + CP_AUTH_GATEWAY="cp-auth" +fi + +if [ -z "${CP_ANALYTICS_SALT}" ] +then + echo "CP_ANALYTICS_SALT is empty, this is mandatory, generate a new one with tr -dc \\!\\#-\\&\\(-\\[\\]-\\_a-\\~ /var/www/castopod/.env +app.baseURL="${CP_BASEURL}" +app.mediaBaseURL="${CP_MEDIA_BASEURL}" +EOF + +if [ "${CP_DISABLE_HTTPS}" = "1" ] +then + echo "HTTPS redirection is disabled for testing purposes, please enable it in production mode" + echo "app.forceGlobalSecureRequests=false" >> /var/www/castopod/.env +else + echo "HTTPS redirection is enabled by default (mandatory to federate with the fediverse), use CP_DISABLE_HTTPS=1 to disable it for testing purposes" +fi + +cat << EOF >> /var/www/castopod/.env +admin.gateway="${CP_ADMIN_GATEWAY}" +auth.gateway="${CP_AUTH_GATEWAY}" + +analytics.salt="${CP_ANALYTICS_SALT}" + +database.default.hostname="${CP_DATABASE_HOSTNAME}" +database.default.database="${CP_DATABASE_NAME}" +database.default.username="${CP_DATABASE_USERNAME}" +database.default.password="${CP_DATABASE_PASSWORD}" +database.default.DBPrefix="${CP_DATABASE_PREFIX}" + +cache.handler="${CP_CACHE_HANDLER}" +EOF + +if [ "${CP_CACHE_HANDLER}" = "redis" ] +then + cat << EOF >> /var/www/castopod/.env +cache.redis.host="${CP_REDIS_HOST}" +cache.redis.password=${CP_REDIS_PASSWORD} +cache.redis.port=${CP_REDIS_PORT} +cache.redis.database=${CP_REDIS_DATABASE} +EOF +fi + +if [ ! -z "${CP_EMAIL_SMTP_HOST}" ] +then + if [ -z "${CP_EMAIL_SMTP_USERNAME}" ] + then + echo "When CP_EMAIL_SMTP_HOST is provided, CP_EMAIL_SMTP_USERNAME must be set" + exit 1 + fi + + if [ -z "${CP_EMAIL_SMTP_PASSWORD}" ] + then + echo "When CP_EMAIL_SMTP_HOST is provided, CP_EMAIL_SMTP_PASSWORD must be set" + exit 1 + fi + + if [ -z "${CP_EMAIL_FROM}" ] + then + echo "When CP_EMAIL_SMTP_HOST is provided, CP_EMAIL_FROM must be set" + exit 1 + fi + + cat << EOF >> /var/www/castopod/.env +email.protocol="smtp" +email.SMTPHost="${CP_EMAIL_SMTP_HOST}" +email.SMTPUser=${CP_EMAIL_SMTP_USERNAME} +email.SMTPPass=${CP_EMAIL_SMTP_PASSWORD} +email.fromEmail=${CP_EMAIL_FROM} +EOF + + if [ ! -z "${CP_EMAIL_SMTP_PORT}" ] + then + cat << EOF >> /var/www/castopod/.env +email.SMTPPort=${CP_EMAIL_SMTP_PORT} +EOF + fi + + if [ ! -z "${CP_EMAIL_SMTP_CRYPTO}" ] + then + if [ "${CP_EMAIL_SMTP_CRYPTO}" != "ssl" ] && [ "${CP_EMAIL_SMTP_CRYPTO}" != "tls" ] + then + echo "CP_EMAIL_SMTP_CRYPTO must be ssl or tls" + exit 1 + fi + cat << EOF >> /var/www/castopod/.env +email.SMTPCrypto=${CP_EMAIL_SMTP_CRYPTO} +EOF + fi +fi + +unitd --no-daemon & +php spark castopod:database-update +sleep 2 && curl -X PUT --data-binary @/config.json --unix-socket /var/run/control.unit.sock http://localhost/config/ +supercronic /crontab.txt From fc009f3d0058028bbbb6418603cf820c0f7cea80 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 28 Feb 2023 14:26:27 +0000 Subject: [PATCH 071/477] revert(install): reset condition to look for instance owner before continuing install --- modules/Install/Controllers/InstallController.php | 4 +++- rector.php | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index b9b88922..a6270afe 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -115,8 +115,10 @@ class InstallController extends Controller } try { + $db = db_connect(); + // Check if instance owner has been created, meaning install was completed - if ((new UserModel())->where('is_owner', true) + if ($db->tableExists('users') && (new UserModel())->where('is_owner', true) ->first() !== null ) { // if so, show a 404 page diff --git a/rector.php b/rector.php index e68f37ac..afb6f1bb 100644 --- a/rector.php +++ b/rector.php @@ -11,6 +11,7 @@ use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector; use Rector\Config\RectorConfig; use Rector\Core\ValueObject\PhpVersion; use Rector\DeadCode\Rector\If_\UnwrapFutureCompatibleIfPhpVersionRector; +use Rector\EarlyReturn\Rector\If_\ChangeAndIfToEarlyReturnRector; use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector; use Rector\EarlyReturn\Rector\If_\ChangeOrIfReturnToEarlyReturnRector; use Rector\Php55\Rector\String_\StringClassNameToClassConstantRector; @@ -64,6 +65,8 @@ return static function (RectorConfig $rectorConfig): void { SymplifyQuoteEscapeRector::class => [__DIR__ . '/app/Language/*', __DIR__ . '/modules/*/Language/*'], NewlineAfterStatementRector::class => [__DIR__ . '/app/Views'], + + ChangeAndIfToEarlyReturnRector::class => [__DIR__ . '/modules/Install/Controllers/InstallController.php'], ]); // Path to phpstan with extensions, that PHPStan in Rector uses to determine types From b63c1dc9b1ed41626b99ba852a9a00ed417059ba Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 28 Feb 2023 16:47:13 +0000 Subject: [PATCH 072/477] feat: add downloads count to episode list --- app/Entities/Episode.php | 3 ++ app/Helpers/components_helper.php | 33 +++++++++++++++++++ .../Admin/Controllers/EpisodeController.php | 17 +++++++--- modules/Admin/Language/en/Episode.php | 1 + themes/cp_admin/episode/list.php | 7 ++++ 5 files changed, 57 insertions(+), 4 deletions(-) diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index cf1fd027..4850b801 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -72,6 +72,7 @@ use RuntimeException; * @property bool $is_published_on_hubs * @property int $posts_count * @property int $comments_count + * @property int $downloads * @property EpisodeComment[]|null $comments * @property bool $is_premium * @property int $created_by @@ -109,6 +110,8 @@ class Episode extends Entity protected ?Chapters $chapters = null; + protected int $downloads = 0; + /** * @var Person[]|null */ diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php index d831684a..6099eb94 100644 --- a/app/Helpers/components_helper.php +++ b/app/Helpers/components_helper.php @@ -447,3 +447,36 @@ if (! function_exists('category_label')) { } // ------------------------------------------------------------------------ + +if (! function_exists('downloads_abbr')) { + function downloads_abbr(int $downloads): string + { + if ($downloads < 1000) { + return (string) $downloads; + } + + $option = match (true) { + $downloads < 1_000_000 => [ + 'divider' => 1_000, + 'suffix' => 'K', + ], + $downloads < 1_000_000_000 => [ + 'divider' => 1_000_000, + 'suffix' => 'M', + ], + default => [ + 'divider' => 1_000_000_000, + 'suffix' => 'B', + ], + }; + $formatter = new NumberFormatter(service('request')->getLocale(), NumberFormatter::DECIMAL); + + $formatter->setPattern('#,##0.##'); + + $abbr = $formatter->format($downloads / $option['divider']) . $option['suffix']; + + return <<{$abbr} + HTML; + } +} diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 903cab0d..73b382d4 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -71,19 +71,28 @@ class EpisodeController extends BaseController // Use LIKE operator as a fallback. if (strlen($query) < 4) { $episodes = (new EpisodeModel()) - ->where('podcast_id', $this->podcast->id) + ->select('episodes.*, IFNULL(SUM(ape.hits),0) as downloads') + ->join('analytics_podcasts_by_episode ape', 'episodes.id=ape.episode_id', 'left') + ->where('episodes.podcast_id', $this->podcast->id) ->like('title', $query) ->orLike('description_markdown', $query) + ->groupBy('episodes.id') ->orderBy('-`published_at`', '', false) ->orderBy('created_at', 'desc'); } else { $episodes = (new EpisodeModel()) - ->where('podcast_id', $this->podcast->id) - ->where("MATCH (title, description_markdown) AGAINST ('{$query}')"); + ->select('episodes.*, IFNULL(SUM(ape.hits),0) as downloads') + ->join('analytics_podcasts_by_episode ape', 'episodes.id=ape.episode_id', 'left') + ->where('episodes.podcast_id', $this->podcast->id) + ->where("MATCH (title, description_markdown) AGAINST ('{$query}')") + ->groupBy('episodes.id'); } } else { $episodes = (new EpisodeModel()) - ->where('podcast_id', $this->podcast->id) + ->select('episodes.*, IFNULL(SUM(ape.hits),0) as downloads') + ->join('analytics_podcasts_by_episode ape', 'episodes.id=ape.episode_id', 'left') + ->where('episodes.podcast_id', $this->podcast->id) + ->groupBy('episodes.id') ->orderBy('-`published_at`', '', false) ->orderBy('created_at', 'desc'); } diff --git a/modules/Admin/Language/en/Episode.php b/modules/Admin/Language/en/Episode.php index 91313a7c..98498bee 100644 --- a/modules/Admin/Language/en/Episode.php +++ b/modules/Admin/Language/en/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/themes/cp_admin/episode/list.php b/themes/cp_admin/episode/list.php index ff82cdfe..7154b049 100644 --- a/themes/cp_admin/episode/list.php +++ b/themes/cp_admin/episode/list.php @@ -82,9 +82,16 @@ data_table( return publication_pill( $episode->published_at, $episode->publication_status, + 'text-sm' ); }, ], + [ + 'header' => lang('Episode.list.downloads'), + 'cell' => function ($episode): string { + return downloads_abbr($episode->downloads); + }, + ], [ 'header' => lang('Episode.list.comments'), 'cell' => function ($episode): int { From a9b630884bc318499ea7f03862d5752dd5f178e1 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 7 Mar 2023 14:55:49 +0000 Subject: [PATCH 073/477] fix(auth): update podcast editors' permissions `episodes.manage-notifications` should be `manage-notifications` --- docs/src/ar/getting-started/auth.md | 12 ++-- docs/src/br/getting-started/auth.md | 12 ++-- docs/src/ca/getting-started/auth.md | 12 ++-- docs/src/de/getting-started/auth.md | 80 +++++++++++----------- docs/src/el/getting-started/auth.md | 36 +++++----- docs/src/es/getting-started/auth.md | 60 ++++++++--------- docs/src/fa/getting-started/auth.md | 12 ++-- docs/src/fr/getting-started/auth.md | 12 ++-- docs/src/gd/getting-started/auth.md | 12 ++-- docs/src/getting-started/auth.md | 12 ++-- docs/src/gl/getting-started/auth.md | 86 ++++++++++++------------ docs/src/id/getting-started/auth.md | 12 ++-- docs/src/it/getting-started/auth.md | 12 ++-- docs/src/ko/getting-started/auth.md | 12 ++-- docs/src/nl/getting-started/auth.md | 64 +++++++++--------- docs/src/nn-NO/getting-started/auth.md | 12 ++-- docs/src/oc/getting-started/auth.md | 12 ++-- docs/src/pl/getting-started/auth.md | 12 ++-- docs/src/pt-BR/getting-started/auth.md | 12 ++-- docs/src/pt/getting-started/auth.md | 12 ++-- docs/src/ro/getting-started/auth.md | 86 ++++++++++++------------ docs/src/ru/getting-started/auth.md | 12 ++-- docs/src/sk/getting-started/auth.md | 12 ++-- docs/src/sr_Latn/getting-started/auth.md | 12 ++-- docs/src/sv/getting-started/auth.md | 86 ++++++++++++------------ docs/src/zh-Hans/getting-started/auth.md | 20 +++--- modules/Auth/Config/AuthGroups.php | 2 +- 27 files changed, 368 insertions(+), 368 deletions(-) diff --git a/docs/src/ar/getting-started/auth.md b/docs/src/ar/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/ar/getting-started/auth.md +++ b/docs/src/ar/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/br/getting-started/auth.md b/docs/src/br/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/br/getting-started/auth.md +++ b/docs/src/br/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/ca/getting-started/auth.md b/docs/src/ca/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/ca/getting-started/auth.md +++ b/docs/src/ca/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/de/getting-started/auth.md b/docs/src/de/getting-started/auth.md index 6c0ccd75..49657587 100644 --- a/docs/src/de/getting-started/auth.md +++ b/docs/src/de/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super-Administrator | Hat die vollständige Kontrolle über Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Verwaltet Castopods Inhalte. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Allgemeine Benutzer von Castopod. | admin.access | @@ -31,14 +31,14 @@ coupled with custom rules. Roles and permissions are defined at two levels: | permission | description | | ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | +| admin.access | Kann auf den Admin-Bereich von Castopod zugreifen. | +| admin.settings | Kann auf die Einstellungen von Castopod zugreifen. | +| users.manage | Kann Castopod-Benutzer verwalten. | +| persons.manage | Kann Mitwirkende verwalten. | +| pages.manage | Kann Seiten verwalten. | +| podcasts.view | Kann alle Podcasts einsehen. | +| podcasts.create | Kann neue Podcasts erstellen. | +| podcasts.import | Kann Podcasts importieren. | | fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrator | Hat die vollständige Kontrolle über Podcast #{id}. | \* | +| Editor | Verwaltet Inhalte und Veröffentlichungen von Podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Verwaltet Inhalte von Podcast #{id}, kann diese aber nicht veröffentlichen. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gast | Allgemeiner Mitwirkender des Podcasts #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------------ | +| view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. | +| edit | Kann Podcast #{id} bearbeiten. | +| delete | Kann Podcast #{id} löschen. | +| manage-import | Kann den importierten Podcast #{id} synchronisieren. | +| manage-persons | Kann Abonnements des Podcasts #{id} verwalten. | +| manage-subscriptions | Kann Abonnements des Podcasts #{id} verwalten. | +| manage-contributors | Kann Mitwirkende des Podcasts #{id} verwalten. | +| manage-platforms | Kann Plattform-Links des Podcasts #{id} verwalten. | +| manage-publications | Kann Podcast #{id} veröffentlichen. | +| manage-notifications | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. | +| episodes.create | Kann Folgen für Podcast #{id} erstellen. | +| episodes.edit | Kann Podcast #{id} bearbeiten. | +| episodes.delete | Kann Podcast #{id} löschen. | +| episodes.manage-persons | Kann Abonnements des Podcasts #{id} verwalten. | +| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #{id} verwalten. | +| episodes.manage-publications | Kann Podcast #{id} veröffentlichen. | +| episodes.manage-comments | Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen. | diff --git a/docs/src/el/getting-started/auth.md b/docs/src/el/getting-started/auth.md index b517b107..a9f7df64 100644 --- a/docs/src/el/getting-started/auth.md +++ b/docs/src/el/getting-started/auth.md @@ -18,7 +18,7 @@ sidebarDepth: 3 -| ρόλος | περιγραφή | δικαιώματα | +| role | description | permissions | | ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | | Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | @@ -30,17 +30,17 @@ sidebarDepth: 3 -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | -------------------------------------------------------------------------------------- | +| admin.access | Μπορεί να έχει πρόσβαση στην περιοχή διαχείρισης Castopod. | +| admin.settings | Μπορεί να έχει πρόσβαση στις ρυθμίσεις Castopod. | +| users.manage | Μπορεί να διαχειριστεί τους χρήστες Castopod. | +| persons.manage | Μπορεί να διαχειριστεί τα άτομα. | +| pages.manage | Μπορεί να διαχειριστεί τις σελίδες. | +| podcasts.view | Μπορεί να δει όλα τα podcasts. | +| podcasts.create | Μπορεί να δημιουργήσει νέα podcasts. | +| podcasts.import | Μπορεί να εισάγει podcasts. | +| fediverse.manage-blocks | Μπορεί να εμποδίσει τους ψευτογενείς ηθοποιούς/τομείς να αλληλεπιδρούν με το Castopod. | @@ -50,12 +50,12 @@ sidebarDepth: 3 -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------------ | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Διαχειριστής | Έχει πλήρη έλεγχο του podcast #{id}. | \* | +| Εκδότης | Διαχειρίζεται περιεχόμενο και δημοσιεύσεις του podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Συντάκτης | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Επισκέπτης | Γενικός συντελεστής του podcast #{id}. | view, episodes.view | diff --git a/docs/src/es/getting-started/auth.md b/docs/src/es/getting-started/auth.md index b8276b2e..5a049c42 100644 --- a/docs/src/es/getting-started/auth.md +++ b/docs/src/es/getting-started/auth.md @@ -18,10 +18,10 @@ niveles: -| roles | descripción | permisos | +| role | description | permissions | | ------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------ | | Super administrador | Tiene control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Administrador | Gestiona el contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Administrador | Administrar contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | | Podcaster | Usuarios generales de Castopod. | admin.access | @@ -30,7 +30,7 @@ niveles: -| permisos | descripción | +| permission | description | | ----------------------- | ------------------------------------------------------------------------------ | | admin.access | Puedes acceder al área de administración de Castopod. | | admin.settings | Puede acceder a la configuración de Castopod. | @@ -50,12 +50,12 @@ niveles: -| roles | descripción | permisos | -| ------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrador | Tiene el control completo del podcast #{id}. | \* | -| Editor | Gestiona el contenido y las publicaciones del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Autor | Gestiona el contenido del podcast #{id} pero no puede publicarlo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Invitado | Colaborador general del podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrador | Tiene el control completo del podcast #{id}. | \* | +| Editor | Gestiona el contenido y las publicaciones del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Gestiona el contenido del podcast #{id} pero no puede publicarlo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Invitado | Colaborador general del podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ niveles: -| permisos | descripción | -| ---------------------------- | -------------------------------------------------------------------------------------------------- | -| view | Puede ver el panel de control y análisis del podcast #{id}. | -| edit | Puede editar podcast #{id}. | -| delete | Puede borrar el podcast #{id}. | -| manage-import | Puede sincronizar el podcast importado #{id}. | -| manage-persons | Puede administrar las suscripciones del podcast #{id}. | -| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. | -| manage-contributors | Puede administrar colaboradores del podcast #{id}. | -| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. | -| manage-publications | Puede publicar el podcast #{id}. | -| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. | -| interact-as | Puede interactuar como el podcast #{id} para favoritar, compartir o responder a las publicaciones. | -| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. | -| episodes.create | Puede crear episodios para el podcast #{id}. | -| episodes.edit | Puede editar episodios #{id}. | -| episodes.delete | Puede borrar el podcast #{id}. | -| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. | -| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. | -| episodes.manage-publications | Puede publicar el podcast #{id}. | -| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------- | +| view | Puede ver el panel de control y analíticas del episodio #{id}. | +| edit | Puede editar el podcast #{id}. | +| delete | Puede borrar el podcast #{id}. | +| manage-import | Puede sincronizar el podcast importado #{id}. | +| manage-persons | Puede administrar las suscripciones del podcast #{id}. | +| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. | +| manage-contributors | Puede administrar colaboradores del podcast #{id}. | +| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. | +| manage-publications | Puede publicar el podcast #{id}. | +| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. | +| interact-as | Puede interactuar como el podcast #{id} para marcar como favarito, compartir o responder a las publicaciones. | +| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. | +| episodes.create | Puede crear episodios para el podcast #{id}. | +| episodes.edit | Puede editar el podcast #{id}. | +| episodes.delete | Puede borrar el podcast #{id}. | +| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. | +| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. | +| episodes.manage-publications | Puede publicar el podcast #{id}. | +| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. | diff --git a/docs/src/fa/getting-started/auth.md b/docs/src/fa/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/fa/getting-started/auth.md +++ b/docs/src/fa/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/fr/getting-started/auth.md b/docs/src/fr/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/fr/getting-started/auth.md +++ b/docs/src/fr/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/gd/getting-started/auth.md b/docs/src/gd/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/gd/getting-started/auth.md +++ b/docs/src/gd/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/getting-started/auth.md b/docs/src/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/getting-started/auth.md +++ b/docs/src/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/gl/getting-started/auth.md b/docs/src/gl/getting-started/auth.md index 6c0ccd75..0faec1c6 100644 --- a/docs/src/gl/getting-started/auth.md +++ b/docs/src/gl/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| ----------- | ------------------------------------ | ------------------------------------------------------------------------------------------ | +| Super Admin | Ten control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Xestora | Quen xestiona o contido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Usuaria común de Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------------------ | +| admin.access | Pode acceder á área de administración. | +| admin.settings | Pode acceder aos axustes de Castopod. | +| users.manage | Pode xestionar as usuarias de Castopod. | +| persons.manage | Pode xestionar persoas. | +| pages.manage | Pode xestionar páxinas. | +| podcasts.view | Pode ver tódolos podcast. | +| podcasts.create | Pode crear novos podcast. | +| podcasts.import | Pode importar podcasts. | +| fediverse.manage-blocks | Pode bloquear actores/dominios do fediverso evitando interactuar con Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| --------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Ten control total sobre o podcast #{id}. | \* | +| Editora | Persoa que xestiona o contido e publicacións do podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autora | Persoa que xestiona o contido do podcast #{id} pero non pode publicalo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Convidada | Contribuínte básico ao podcast #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permission | description | +| ---------------------------- | --------------------------------------------------------------------------------------- | +| view | Pode ver o taboleiro e estatísticas do podcast #{id}. | +| edit | Pode editar o podcast #{id}. | +| delete | Pode eliminar o podcast #{id}. | +| manage-import | Pode sincronizar o podcast importado #{id}. | +| manage-persons | Pode xestionar as subscricións do podcast #{id}. | +| manage-subscriptions | Pode xestionar as subscricións do podcast #{id}. | +| manage-contributors | Pode xestionar as contribucións ao podcast #{id}. | +| manage-platforms | Pode establecer/eliminar ligazóns a plataformas do podcast #{id}. | +| manage-publications | Pode publicar o podcast #{id}. | +| manage-notifications | Pode ver e marcar as notificacións como lidas no podcast #{id}. | +| interact-as | Pode actuar como o podcast #{id} para compartir, favorecer ou responder a publicacións. | +| episodes.view | Pode ver o taboleiro e estatísticas do podcast #{id}. | +| episodes.create | Pode crear episodios para o podcast #{id}. | +| episodes.edit | Pode editar o podcast #{id}. | +| episodes.delete | Pode eliminar o podcast #{id}. | +| episodes.manage-persons | Pode xestionar as subscricións do podcast #{id}. | +| episodes.manage-clips | Pode xestionar os clips de vídeo e extractos de audio do podcast #{id}. | +| episodes.manage-publications | Pode publicar o podcast #{id}. | +| episodes.manage-comments | Pode crear/eliminar comentarios dos episodios do podcast #{id}. | diff --git a/docs/src/id/getting-started/auth.md b/docs/src/id/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/id/getting-started/auth.md +++ b/docs/src/id/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/it/getting-started/auth.md b/docs/src/it/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/it/getting-started/auth.md +++ b/docs/src/it/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/ko/getting-started/auth.md b/docs/src/ko/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/ko/getting-started/auth.md +++ b/docs/src/ko/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/nl/getting-started/auth.md b/docs/src/nl/getting-started/auth.md index 6c0ccd75..821d2585 100644 --- a/docs/src/nl/getting-started/auth.md +++ b/docs/src/nl/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| --------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | +| Super beheerder | Heeft de volledige controle over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Beheerder | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Algemene gebruikers van Castopod. | admin.access | @@ -31,14 +31,14 @@ coupled with custom rules. Roles and permissions are defined at two levels: | permission | description | | ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | +| admin.access | Kan toegang krijgen tot de beheeromgeving van Castopod. | +| admin.settings | Kan toegang krijgen tot de instellingen van Castopod. | +| users.manage | Kan Castopod-gebruikers beheren. | | persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | +| pages.manage | Kan pagina's beheren. | +| podcasts.view | Kan alle podcasts bekijken. | +| podcasts.create | Kan nieuwe podcast aanmaken. | +| podcasts.import | Kan podcasts importeren. | | fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| --------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Beheerder | Heeft de volledige controle over podcast #{id}. | \* | +| Redacteur | Beheert inhoud en publicaties van podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Auteur | Beheert de inhoud van podcast #{id} maar kan deze niet publiceren. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gast | Algemene bijdrager van podcast #{id}. | view, episodes.view | @@ -64,24 +64,24 @@ coupled with custom rules. Roles and permissions are defined at two levels: | permission | description | | ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | +| view | Kan dashboard en analyses van podcast #{id} zien. | +| edit | Kan podcast #{id} wijzigen. | +| delete | Kan podcast #{id} verwijderen. | +| manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. | | manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-subscriptions | Kan abonnementen van podcast #{id} beheren. | +| manage-contributors | Kan bijdragers van podcast #{id} beheren. | | manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| manage-publications | Kan podcast #{id} publiceren. | +| manage-notifications | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}. | | interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | +| episodes.view | Kan dashboard en analyses van podcast #{id} zien. | +| episodes.create | Kan afleveringen voor podcast #{id} aanmaken. | +| episodes.edit | Kan podcast #{id} wijzigen. | +| episodes.delete | Kan podcast #{id} verwijderen. | | episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-clips | Kan videoclips of soundbites van podcast #{id} beheren. | +| episodes.manage-publications | Kan podcast #{id} publiceren. | | episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/nn-NO/getting-started/auth.md b/docs/src/nn-NO/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/nn-NO/getting-started/auth.md +++ b/docs/src/nn-NO/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/oc/getting-started/auth.md b/docs/src/oc/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/oc/getting-started/auth.md +++ b/docs/src/oc/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/pl/getting-started/auth.md b/docs/src/pl/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/pl/getting-started/auth.md +++ b/docs/src/pl/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/pt-BR/getting-started/auth.md b/docs/src/pt-BR/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/pt-BR/getting-started/auth.md +++ b/docs/src/pt-BR/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/pt/getting-started/auth.md b/docs/src/pt/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/pt/getting-started/auth.md +++ b/docs/src/pt/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/ro/getting-started/auth.md b/docs/src/ro/getting-started/auth.md index 7688ee1d..093969f2 100644 --- a/docs/src/ro/getting-started/auth.md +++ b/docs/src/ro/getting-started/auth.md @@ -18,11 +18,11 @@ niveluri: -| rol | descriere | permisiuni | -| ----------- | ----------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Deține controlul complet asupra Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Gestionează conținutul Castopodului. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Utilizatorii generali ai Castopod. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -30,17 +30,17 @@ niveluri: -| permisiune | descriere | -| ----------------------- | -------------------------------------------------------------------------- | -| admin.access | Poate accesa zona de administrare Castopod. | -| admin.settings | Poate accesa setările Castopod. | -| users.manage | Poate gestiona utilizatorii Castopod. | -| persons.manage | Poate gestiona persoane. | -| pages.manage | Poate gestiona pagini. | -| podcasts.view | Poate vedea toate podcast-urile. | -| podcasts.create | Poate crea noi podcast-uri. | -| podcasts.import | Poate importa podcast-uri. | -| fediverse.manage-blocks | Poate bloca actorilor/domenii din fediverse să interacționeze cu Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -50,12 +50,12 @@ niveluri: -| rol | descriere | permisiuni | -| ------ | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Deține controlul complet asupra podcastului #{id}. | \* | -| Editor | Gestionează conținutul și publicațiile podcastului #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Gestionează conținutul podcastului #{id} dar nu poate publica. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | Contribuitor al podcastului #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ niveluri: -| permisiune | descriere | -| ---------------------------- | ------------------------------------------------------------------------------------------------------- | -| view | Poate vedea panoul de control și analiticele podcastului #{id}. | -| edit | Poate edita podcastul #{id}. | -| delete | Poate șterge podcastul #{id}. | -| manage-import | Poate sincroniza podcastul importat #{id}. | -| manage-persons | Poate administra abonamentele podcastului #{id}. | -| manage-subscriptions | Poate administra abonamentele podcastului #{id}. | -| manage-contributors | Poate administra colaboratorii podcastului #{id}. | -| manage-platforms | Poate seta/elimina link-urile podcastului #{id}. | -| manage-publications | Poate publica podcastul #{id}. | -| manage-notifications | Poate vizualiza și marca notificările ca fiind citite pentru podcastul #{id}. | -| interact-as | Poate interacționa ca podcastul #{id} pentru adăuga la favorite, a distribui sau a răspunde la postări. | -| episodes.view | Poate vizualiza panoul de control și analiticile podcastului #{id}. | -| episodes.create | Poate crea episoade pentru podcastul #{id}. | -| episodes.edit | Poate edita podcastul #{id}. | -| episodes.delete | Poate șterge podcastul #{id}. | -| episodes.manage-persons | Poate administra abonamentele podcastului #{id}. | -| episodes.manage-clips | Poate administra clipuri video sau biții de sunet ai podcastului #{id}. | -| episodes.manage-publications | Poate publica podcastul #{id}. | -| episodes.manage-comments | Poate crea/elimina comentariile episodului podcastului #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/ru/getting-started/auth.md b/docs/src/ru/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/ru/getting-started/auth.md +++ b/docs/src/ru/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/sk/getting-started/auth.md b/docs/src/sk/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/sk/getting-started/auth.md +++ b/docs/src/sk/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/sr_Latn/getting-started/auth.md b/docs/src/sr_Latn/getting-started/auth.md index 6c0ccd75..ff5d59c0 100644 --- a/docs/src/sr_Latn/getting-started/auth.md +++ b/docs/src/sr_Latn/getting-started/auth.md @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/sv/getting-started/auth.md b/docs/src/sv/getting-started/auth.md index 6c0ccd75..d9b869ea 100644 --- a/docs/src/sv/getting-started/auth.md +++ b/docs/src/sv/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| ------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administratör | Har fullständig kontroll över Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Hanterare | Hanterar Castopods innehåll. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Generella användare av Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | ----------------------------------------------------------------------------- | +| admin.access | Kan komma åt Castopod admin-området. | +| admin.settings | Kan komma åt Castopod-inställningarna. | +| users.manage | Kan hantera Castopod-användare. | +| persons.manage | Kan hantera personer. | +| pages.manage | Kan hantera sidor. | +| podcasts.view | Kan se alla podcasts. | +| podcasts.create | Kan skapa nya podcasts. | +| podcasts.import | Kan importera podcasts. | +| fediverse.manage-blocks | Kan blockera fediverse skådespelare/domäner från att interagera med Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ---------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Har fullständig kontroll över podcast #{id}. | \* | +| Redigerare | Hanterar innehåll och publikationer i podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Författare | Hanterar innehåll i podcast #{id} men kan inte publicera dem. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gäst | Generell bidragsgivare till podcasten #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permission | description | +| ---------------------------- | -------------------------------------------------------------------------------- | +| view | Kan visa instrumentpanelen och analysen av podcast #{id}. | +| edit | Kan redigera podcast #{id}. | +| delete | Kan ta bort podcast #{id}. | +| manage-import | Kan synkronisera importerad podcast #{id}. | +| manage-persons | Kan hantera prenumerationer på podcast #{id}. | +| manage-subscriptions | Kan hantera prenumerationer på podcast #{id}. | +| manage-contributors | Kan hantera bidragsgivare för podcast #{id}. | +| manage-platforms | Kan sätta/ta bort plattformslänkar för podcast #{id}. | +| manage-publications | Kan publicera podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Kan interagera som podcasten #{id} för att favorita, dela eller svara på inlägg. | +| episodes.view | Kan visa instrumentpanelen och analysen av podcast #{id}. | +| episodes.create | Kan skapa avsnitt för podcast #{id}. | +| episodes.edit | Kan redigera podcast #{id}. | +| episodes.delete | Kan ta bort podcast #{id}. | +| episodes.manage-persons | Kan hantera prenumerationer på podcast #{id}. | +| episodes.manage-clips | Kan hantera videoklipp eller ljudklipp från podcasten #{id}. | +| episodes.manage-publications | Kan publicera podcast #{id}. | +| episodes.manage-comments | Kan skapa/ta bort avsnitt kommentarer från podcasten #{id}. | diff --git a/docs/src/zh-Hans/getting-started/auth.md b/docs/src/zh-Hans/getting-started/auth.md index 09dceb0c..5c3109d0 100644 --- a/docs/src/zh-Hans/getting-started/auth.md +++ b/docs/src/zh-Hans/getting-started/auth.md @@ -17,7 +17,7 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| 角色 | 描述 | 权限 | +| role | description | permissions | | ---------- | ---------------------------- | ------------------------------------------------------------------------------------------ | | 超级管理员 | 拥有对 Castopod 的完全控制。 | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | 管理 | 管理 Castopod 的内容。 | podcasts.create, podcasts.import, persons.manage, pages.manage | @@ -29,7 +29,7 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| 权限 | 描述 | +| permission | description | | ----------------------- | ------------------------------------------- | | admin.access | 可以访问 Castopod 管理区域。 | | admin.settings | 可以访问 Castopod 设置。 | @@ -49,12 +49,12 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| 角色 | 描述 | 权限 | -| ------ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 管理员 | 完全控制播客 #{id}。 | \* | -| 编辑 | 管理播客 #{id} 的内容和出版物。 | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications | -| 作者 | 管理播客 #{id} 的内容,但不能发布。 | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| 访客 | 播客 #{id} 的普通贡献者。 | view, episodes.view | +| role | description | permissions | +| ------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 管理员 | 完全控制播客 #{id}。 | \* | +| 编辑 | 管理播客 #{id} 的内容和出版物。 | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 作者 | 管理播客 #{id} 的内容,但不能发布。 | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| 访客 | 播客 #{id} 的普通贡献者。 | view, episodes.view | @@ -62,11 +62,11 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| 权限 | 描述 | +| permission | description | | ---------------------------- | --------------------------------------------------- | | view | 可以查看播客 #{id} 的仪表板和分析。 | | edit | 可以编辑播客 #{id}。 | -| 删除 | 可以删除播客 #{id}。 | +| delete | 可以删除播客 #{id}。 | | manage-import | 可以同步导入的播客 #{id}。 | | manage-persons | 可以管理播客 #{id} 的订阅。 | | manage-subscriptions | 可以管理播客 #{id} 的订阅。 | diff --git a/modules/Auth/Config/AuthGroups.php b/modules/Auth/Config/AuthGroups.php index 0852afb9..fb96698e 100644 --- a/modules/Auth/Config/AuthGroups.php +++ b/modules/Auth/Config/AuthGroups.php @@ -174,6 +174,7 @@ class AuthGroups extends ShieldAuthGroups 'manage-persons', 'manage-platforms', 'manage-publications', + 'manage-notifications', 'interact-as', 'episodes.view', 'episodes.create', @@ -183,7 +184,6 @@ class AuthGroups extends ShieldAuthGroups 'episodes.manage-clips', 'episodes.manage-publications', 'episodes.manage-comments', - 'episodes.manage-notifications', ], 'author' => [ 'view', From 9fc49a7430406f50e68318c5fd7c577ae1ebd9df Mon Sep 17 00:00:00 2001 From: Aonrud Date: Fri, 10 Mar 2023 16:13:02 +0000 Subject: [PATCH 074/477] fix(platforms): update 'submit_url' for Antennapod --- app/Database/Seeds/PlatformSeeder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index a008a4b6..cacd81fb 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -31,7 +31,7 @@ class PlatformSeeder extends Seeder 'type' => 'podcasting', 'label' => 'AntennaPod', 'home_url' => 'https://antennapod.org/', - 'submit_url' => 'https://podcastindex.org/add', + 'submit_url' => 'https://antennapod.org/documentation/podcasters-hosters/add-on-antennapod', ], [ 'slug' => 'apple', From d93fc98469ffe93913b65e539dec396891708c70 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 16 Mar 2023 13:00:05 +0000 Subject: [PATCH 075/477] feat(media): add s3 to manage media files Users may choose between filesystem (FS) or S3 to store and manage their media files --- .gitignore | 1 + app/Config/App.php | 20 - app/Config/Autoload.php | 1 + app/Config/Mimes.php | 2 +- .../Seeds/FakeSinglePodcastApiSeeder.php | 8 +- app/Entities/Clip/BaseClip.php | 18 +- app/Entities/Clip/VideoClip.php | 19 +- app/Entities/Episode.php | 31 +- app/Entities/Media/Image.php | 106 -- app/Entities/Media/Transcript.php | 78 -- app/Entities/Person.php | 13 +- app/Entities/Podcast.php | 22 +- app/Helpers/id3_helper.php | 8 +- app/Libraries/MediaClipper/VideoClipper.php | 35 +- .../ViewComponents/ComponentRenderer.php | 20 +- app/Models/PodcastModel.php | 8 +- app/Views/errors/cli/error_exception.php | 4 +- composer.json | 15 +- composer.lock | 1010 ++++++++++++++--- docker-compose.yml | 31 +- docs/src/contributing/setup-development.md | 15 +- .../Admin/Controllers/DashboardController.php | 2 +- .../Admin/Controllers/EpisodeController.php | 4 +- .../Admin/Controllers/PodcastController.php | 2 +- .../Controllers/PodcastImportController.php | 1 + .../Admin/Controllers/SchedulerController.php | 3 +- .../Admin/Controllers/SettingsController.php | 147 +-- .../Admin/Controllers/SoundbiteController.php | 2 +- .../Controllers/VideoClipsController.php | 2 +- modules/Admin/Language/ar/Episode.php | 2 +- modules/Admin/Language/br/Episode.php | 2 +- modules/Admin/Language/ca/Episode.php | 2 +- modules/Admin/Language/de/Episode.php | 2 +- modules/Admin/Language/el/Episode.php | 2 +- modules/Admin/Language/en/Episode.php | 2 +- modules/Admin/Language/es/Episode.php | 2 +- modules/Admin/Language/fa/Episode.php | 2 +- modules/Admin/Language/fr/Episode.php | 2 +- modules/Admin/Language/gd/Episode.php | 2 +- modules/Admin/Language/gl/Episode.php | 2 +- modules/Admin/Language/id/Episode.php | 2 +- modules/Admin/Language/it/Episode.php | 2 +- modules/Admin/Language/ko/Episode.php | 2 +- modules/Admin/Language/nl/Episode.php | 2 +- modules/Admin/Language/nn-NO/Episode.php | 2 +- modules/Admin/Language/oc/Episode.php | 2 +- modules/Admin/Language/pl/Episode.php | 2 +- modules/Admin/Language/pt-BR/Episode.php | 2 +- modules/Admin/Language/pt/Episode.php | 2 +- modules/Admin/Language/ro/Episode.php | 2 +- modules/Admin/Language/ru/Episode.php | 2 +- modules/Admin/Language/sk/Episode.php | 2 +- modules/Admin/Language/sr_Latn/Episode.php | 2 +- modules/Admin/Language/sv/Episode.php | 2 +- modules/Admin/Language/zh-Hans/Episode.php | 2 +- modules/Analytics/Config/Analytics.php | 4 +- .../Models/AnalyticsPodcastModel.php | 2 +- modules/Auth/Commands/RolesDoc.php | 4 +- .../Fediverse/Helpers/fediverse_helper.php | 4 +- modules/Media/Config/Media.php | 64 ++ modules/Media/Config/Services.php | 42 + .../2021-05-29-120000_add_media.php | 6 +- ...22-30-12-180000_rename_media_file_path.php | 40 + .../Media/Entities}/Audio.php | 4 +- .../Media/Entities}/BaseMedia.php | 73 +- .../Media/Entities}/Chapters.php | 2 +- .../Media/Entities}/Document.php | 2 +- modules/Media/Entities/Image.php | 169 +++ modules/Media/Entities/Transcript.php | 104 ++ .../Media/Entities}/Video.php | 2 +- modules/Media/FileManagers/FS.php | 135 +++ .../FileManagers/FileManagerInterface.php | 26 + modules/Media/FileManagers/S3.php | 174 +++ modules/Media/Helpers/filesystem_helper.php | 27 + .../Media}/Helpers/media_helper.php | 63 +- {app => modules/Media}/Models/MediaModel.php | 65 +- .../Media}/TranscriptParser.php | 2 +- package.json | 26 +- phpstan.neon | 3 +- pnpm-lock.yaml | 413 ++++--- public/media/podcasts/index.html | 0 public/media/site/index.html | 0 rector.php | 5 + themes/cp_admin/episode/video_clips_new.php | 2 +- themes/cp_admin/settings/general.php | 1 - 85 files changed, 2168 insertions(+), 976 deletions(-) delete mode 100644 app/Entities/Media/Image.php delete mode 100644 app/Entities/Media/Transcript.php create mode 100644 modules/Media/Config/Media.php create mode 100644 modules/Media/Config/Services.php rename {app => modules/Media}/Database/Migrations/2021-05-29-120000_add_media.php (95%) create mode 100644 modules/Media/Database/Migrations/2022-30-12-180000_rename_media_file_path.php rename {app/Entities/Media => modules/Media/Entities}/Audio.php (93%) rename {app/Entities/Media => modules/Media/Entities}/BaseMedia.php (60%) rename {app/Entities/Media => modules/Media/Entities}/Chapters.php (88%) rename {app/Entities/Media => modules/Media/Entities}/Document.php (88%) create mode 100644 modules/Media/Entities/Image.php create mode 100644 modules/Media/Entities/Transcript.php rename {app/Entities/Media => modules/Media/Entities}/Video.php (87%) create mode 100644 modules/Media/FileManagers/FS.php create mode 100644 modules/Media/FileManagers/FileManagerInterface.php create mode 100644 modules/Media/FileManagers/S3.php create mode 100644 modules/Media/Helpers/filesystem_helper.php rename {app => modules/Media}/Helpers/media_helper.php (55%) rename {app => modules/Media}/Models/MediaModel.php (77%) rename {app/Libraries => modules/Media}/TranscriptParser.php (99%) create mode 100644 public/media/podcasts/index.html create mode 100644 public/media/site/index.html diff --git a/.gitignore b/.gitignore index 370e1c2c..45fa5204 100644 --- a/.gitignore +++ b/.gitignore @@ -177,6 +177,7 @@ modules/Admin/Language/*/PersonsTaxonomy.php mariadb phpmyadmin sessions +data # Castopod bundle & packages castopod/ diff --git a/app/Config/App.php b/app/Config/App.php index d574e3b6..50dafa80 100644 --- a/app/Config/App.php +++ b/app/Config/App.php @@ -26,18 +26,6 @@ class App extends BaseConfig */ public string $baseURL = 'http://localhost:8080/'; - /** - * -------------------------------------------------------------------------- - * Media Base URL - * -------------------------------------------------------------------------- - * - * URL to your media root. Typically this will be your base URL, - * WITH a trailing slash: - * - * http://cdn.example.com/ - */ - public string $mediaBaseURL = 'http://localhost:8080/'; - /** * -------------------------------------------------------------------------- * Index File @@ -420,14 +408,6 @@ class App extends BaseConfig */ public bool $CSPEnabled = false; - /** - * -------------------------------------------------------------------------- - * Media root folder - * -------------------------------------------------------------------------- - * Defines the root folder for media files storage - */ - public string $mediaRoot = 'media'; - /** * -------------------------------------------------------------------------- * Instance / Site Config diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index 1b4bab55..dd769704 100644 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -50,6 +50,7 @@ class Autoload extends AutoloadConfig 'Modules\Install' => ROOTPATH . 'modules/Install/', 'Modules\Update' => ROOTPATH . 'modules/Update/', 'Modules\Fediverse' => ROOTPATH . 'modules/Fediverse/', + 'Modules\Media' => ROOTPATH . 'modules/Media/', 'Modules\WebSub' => ROOTPATH . 'modules/WebSub/', 'Modules\Api\Rest\V1' => ROOTPATH . 'modules/Api/Rest/V1', 'Modules\PremiumPodcasts' => ROOTPATH . 'modules/PremiumPodcasts/', diff --git a/app/Config/Mimes.php b/app/Config/Mimes.php index d2374aa7..017792fb 100644 --- a/app/Config/Mimes.php +++ b/app/Config/Mimes.php @@ -211,7 +211,7 @@ class Mimes 'word' => ['application/msword', 'application/octet-stream'], 'xl' => 'application/excel', 'eml' => 'message/rfc822', - 'json' => ['application/json', 'text/json'], + 'json' => ['application/json', 'text/json', 'text/plain'], 'pem' => ['application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'], 'p10' => ['application/x-pkcs10', 'application/pkcs10'], 'p12' => 'application/x-pkcs12', diff --git a/app/Database/Seeds/FakeSinglePodcastApiSeeder.php b/app/Database/Seeds/FakeSinglePodcastApiSeeder.php index c3cebb79..0d28ecc2 100644 --- a/app/Database/Seeds/FakeSinglePodcastApiSeeder.php +++ b/app/Database/Seeds/FakeSinglePodcastApiSeeder.php @@ -9,13 +9,13 @@ use CodeIgniter\Database\Seeder; class FakeSinglePodcastApiSeeder extends Seeder { /** - * @return array{id: int, file_path: string, file_size: int, file_mimetype: string, file_metadata: string, type: string, description: null, language_code: null, uploaded_by: int, updated_by: int, uploaded_at: string, updated_at: string} + * @return array{id: int, file_key: string, file_size: int, file_mimetype: string, file_metadata: string, type: string, description: null, language_code: null, uploaded_by: int, updated_by: int, uploaded_at: string, updated_at: string} */ public static function cover(): array { return [ 'id' => 1, - 'file_path' => 'podcasts/Handle/cover.jpg', + 'file_key' => 'podcasts/Handle/cover.jpg', 'file_size' => 400000, 'file_mimetype' => 'image/jpeg', 'file_metadata' => '{"FILE":{"FileName":"cover.jpg","FileDateTime":1654861723,"FileSize":468541,"FileType":2,"MimeType":"image\/jpeg","SectionsFound":"COMMENT"},"COMPUTED":{"html":"width=\"1400\" height=\"1400\"","Height":1400,"Width":1400,"IsColor":1},"COMMENT":["CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90\n"],"sizes":{"tiny":{"width":40,"height":40,"mimetype":"image\/webp","extension":"webp"},"thumbnail":{"width":150,"height":150,"mimetype":"image\/webp","extension":"webp"},"medium":{"width":320,"height":320,"mimetype":"image\/webp","extension":"webp"},"large":{"width":1024,"height":1024,"mimetype":"image\/webp","extension":"webp"},"feed":{"width":1400,"height":1400},"id3":{"width":500,"height":500},"og":{"width":1200,"height":1200},"federation":{"width":400,"height":400},"webmanifest192":{"width":192,"height":192,"mimetype":"image\/png","extension":"png"},"webmanifest512":{"width":512,"height":512,"mimetype":"image\/png","extension":"png"}}}', @@ -30,13 +30,13 @@ class FakeSinglePodcastApiSeeder extends Seeder } /** - * @return array{id: int, file_path: string, file_size: int, file_mimetype: string, file_metadata: string, type: string, description: null, language_code: null, uploaded_by: int, updated_by: int, uploaded_at: string, updated_at: string} + * @return array{id: int, file_key: string, file_size: int, file_mimetype: string, file_metadata: string, type: string, description: null, language_code: null, uploaded_by: int, updated_by: int, uploaded_at: string, updated_at: string} */ public static function banner(): array { return [ 'id' => 2, - 'file_path' => 'podcasts/Handle/banner.jpg', + 'file_key' => 'podcasts/Handle/banner.jpg', 'file_size' => 400000, 'file_mimetype' => 'image/jpeg', 'file_metadata' => '{"FILE":{"FileName":"banner.jpg","FileDateTime":1654861724,"FileSize":98209,"FileType":2,"MimeType":"image\/jpeg","SectionsFound":""},"COMPUTED":{"html":"width=\"1500\" height=\"500\"","Height":500,"Width":1500,"IsColor":1},"sizes":{"small":{"width":320,"height":128,"mimetype":"image\/webp","extension":"webp"},"medium":{"width":960,"height":320,"mimetype":"image\/webp","extension":"webp"},"federation":{"width":1500,"height":500}}}', diff --git a/app/Entities/Clip/BaseClip.php b/app/Entities/Clip/BaseClip.php index 51ccc0a5..5cb7eda5 100644 --- a/app/Entities/Clip/BaseClip.php +++ b/app/Entities/Clip/BaseClip.php @@ -11,17 +11,17 @@ declare(strict_types=1); namespace App\Entities\Clip; use App\Entities\Episode; -use App\Entities\Media\Audio; -use App\Entities\Media\Video; use App\Entities\Podcast; use App\Models\EpisodeModel; -use App\Models\MediaModel; use App\Models\PodcastModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\I18n\Time; use CodeIgniter\Shield\Entities\User; use Modules\Auth\Models\UserModel; +use Modules\Media\Entities\Audio; +use Modules\Media\Entities\Video; +use Modules\Media\Models\MediaModel; /** * @property int $id @@ -122,14 +122,8 @@ class BaseClip extends Entity return (new UserModel())->find($this->created_by); } - public function setMedia(string $filePath = null): static + public function setMedia(File $file, string $fileKey): static { - if ($filePath === null) { - return $this; - } - - $file = new File($filePath); - if ($this->media_id !== null) { $this->getMedia() ->setFile($file); @@ -138,9 +132,9 @@ class BaseClip extends Entity (new MediaModel('audio'))->updateMedia($this->getMedia()); } else { $media = new Audio([ - 'file_path' => $filePath, + 'file_key' => $fileKey, 'language_code' => $this->getPodcast() - ->language_code, +->language_code, 'uploaded_by' => $this->attributes['created_by'], 'updated_by' => $this->attributes['created_by'], ]); diff --git a/app/Entities/Clip/VideoClip.php b/app/Entities/Clip/VideoClip.php index 960296f9..86af79b2 100644 --- a/app/Entities/Clip/VideoClip.php +++ b/app/Entities/Clip/VideoClip.php @@ -10,9 +10,9 @@ declare(strict_types=1); namespace App\Entities\Clip; -use App\Entities\Media\Video; -use App\Models\MediaModel; use CodeIgniter\Files\File; +use Modules\Media\Entities\Video; +use Modules\Media\Models\MediaModel; /** * @property array $theme @@ -63,30 +63,23 @@ class VideoClip extends BaseClip return $this; } - public function setMedia(string $filePath = null): static + public function setMedia(File $file, string $fileKey): static { - if ($filePath === null) { - return $this; - } - if ($this->attributes['media_id'] !== null) { // media is already set, do nothing return $this; } - helper('media'); - $file = new File(media_path($filePath)); - $video = new Video([ - 'file_path' => $filePath, + 'file_key' => $fileKey, 'language_code' => $this->getPodcast() - ->language_code, +->language_code, 'uploaded_by' => $this->attributes['created_by'], 'updated_by' => $this->attributes['created_by'], ]); $video->setFile($file); - $this->attributes['media_id'] = (new MediaModel())->saveMedia($video); + $this->attributes['media_id'] = (new MediaModel('video'))->saveMedia($video); return $this; } diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 4850b801..55934260 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -11,14 +11,9 @@ declare(strict_types=1); namespace App\Entities; use App\Entities\Clip\Soundbite; -use App\Entities\Media\Audio; -use App\Entities\Media\Chapters; -use App\Entities\Media\Image; -use App\Entities\Media\Transcript; use App\Libraries\SimpleRSSElement; use App\Models\ClipModel; use App\Models\EpisodeCommentModel; -use App\Models\MediaModel; use App\Models\PersonModel; use App\Models\PodcastModel; use App\Models\PostModel; @@ -32,6 +27,11 @@ use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; use League\CommonMark\Extension\DisallowedRawHtml\DisallowedRawHtmlExtension; use League\CommonMark\Extension\SmartPunct\SmartPunctExtension; use League\CommonMark\MarkdownConverter; +use Modules\Media\Entities\Audio; +use Modules\Media\Entities\Chapters; +use Modules\Media\Entities\Image; +use Modules\Media\Entities\Transcript; +use Modules\Media\Models\MediaModel; use RuntimeException; /** @@ -191,10 +191,9 @@ class Episode extends Entity (new MediaModel('image'))->updateMedia($this->getCover()); } else { $cover = new Image([ - 'file_name' => $this->attributes['slug'], - 'file_directory' => 'podcasts/' . $this->getPodcast()->handle, + 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(), 'sizes' => config('Images') - ->podcastCoverSizes, +->podcastCoverSizes, 'uploaded_by' => user_id(), 'updated_by' => user_id(), ]); @@ -238,8 +237,10 @@ class Episode extends Entity (new MediaModel('audio'))->updateMedia($this->getAudio()); } else { $audio = new Audio([ - 'file_name' => pathinfo($file->getRandomName(), PATHINFO_FILENAME), - 'file_directory' => 'podcasts/' . $this->getPodcast()->handle, + 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . pathinfo( + $file->getRandomName(), + PATHINFO_FILENAME + ) . '.' . $file->getExtension(), 'language_code' => $this->getPodcast() ->language_code, 'uploaded_by' => user_id(), @@ -276,10 +277,9 @@ class Episode extends Entity (new MediaModel('transcript'))->updateMedia($this->getTranscript()); } else { $transcript = new Transcript([ - 'file_name' => $this->attributes['slug'] . '-transcript', - 'file_directory' => 'podcasts/' . $this->getPodcast()->handle, + 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-transcript.' . $file->getExtension(), 'language_code' => $this->getPodcast() - ->language_code, +->language_code, 'uploaded_by' => user_id(), 'updated_by' => user_id(), ]); @@ -314,10 +314,9 @@ class Episode extends Entity (new MediaModel('chapters'))->updateMedia($this->getChapters()); } else { $chapters = new Chapters([ - 'file_name' => $this->attributes['slug'] . '-chapters', - 'file_directory' => 'podcasts/' . $this->getPodcast()->handle, + 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-chapters' . '.' . $file->getExtension(), 'language_code' => $this->getPodcast() - ->language_code, +->language_code, 'uploaded_by' => user_id(), 'updated_by' => user_id(), ]); diff --git a/app/Entities/Media/Image.php b/app/Entities/Media/Image.php deleted file mode 100644 index c1524806..00000000 --- a/app/Entities/Media/Image.php +++ /dev/null @@ -1,106 +0,0 @@ -file_path && $this->file_metadata) { - $this->sizes = $this->file_metadata['sizes']; - $this->initSizeProperties(); - } - } - - public function initSizeProperties(): bool - { - helper('media'); - - foreach ($this->sizes as $name => $size) { - $extension = array_key_exists('extension', $size) ? $size['extension'] : $this->file_extension; - $mimetype = array_key_exists('mimetype', $size) ? $size['mimetype'] : $this->file_mimetype; - $this->{$name . '_path'} = $this->file_directory . '/' . $this->file_name . '_' . $name . '.' . $extension; - $this->{$name . '_url'} = media_base_url($this->{$name . '_path'}); - $this->{$name . '_mimetype'} = $mimetype; - } - - return true; - } - - public function setFile(File $file): self - { - parent::setFile($file); - - if ($this->file_mimetype === 'image/jpeg' && $metadata = @exif_read_data( - media_path($this->file_path), - null, - true - )) { - $metadata['sizes'] = $this->sizes; - $this->attributes['file_size'] = $metadata['FILE']['FileSize']; - } else { - $metadata = [ - 'sizes' => $this->sizes, - ]; - } - - $this->attributes['file_metadata'] = json_encode($metadata, JSON_INVALID_UTF8_IGNORE); - - $this->initFileProperties(); - $this->saveSizes(); - - return $this; - } - - public function deleteFile(): bool - { - if (parent::deleteFile()) { - return $this->deleteSizes(); - } - - return false; - } - - public function saveSizes(): void - { - // save derived sizes - $imageService = service('image'); - foreach ($this->sizes as $name => $size) { - $pathProperty = $name . '_path'; - $imageService - ->withFile(media_path($this->file_path)) - ->resize($size['width'], $size['height']); - $imageService->save(media_path($this->{$pathProperty})); - } - } - - private function deleteSizes(): bool - { - // delete all derived sizes - foreach (array_keys($this->sizes) as $name) { - $pathProperty = $name . '_path'; - if (! unlink(media_path($this->{$pathProperty}))) { - return false; - } - } - - return true; - } -} diff --git a/app/Entities/Media/Transcript.php b/app/Entities/Media/Transcript.php deleted file mode 100644 index 988e2488..00000000 --- a/app/Entities/Media/Transcript.php +++ /dev/null @@ -1,78 +0,0 @@ -file_path && $this->file_metadata && array_key_exists('json_path', $this->file_metadata)) { - helper('media'); - - $this->json_path = media_path($this->file_metadata['json_path']); - $this->json_url = media_base_url($this->file_metadata['json_path']); - } - } - - public function setFile(File $file): self - { - parent::setFile($file); - - $content = file_get_contents(media_path($this->attributes['file_path'])); - - if ($content === false) { - return $this; - } - - $metadata = []; - if ($fileMetadata = lstat((string) $file)) { - $metadata = $fileMetadata; - } - - $transcriptParser = new TranscriptParser(); - $jsonFilePath = $this->attributes['file_directory'] . '/' . $this->attributes['file_name'] . '.json'; - if (($transcriptJson = $transcriptParser->loadString($content)->parseSrt()) && file_put_contents( - media_path($jsonFilePath), - $transcriptJson - )) { - // set metadata (generated json file path) - $metadata['json_path'] = $jsonFilePath; - } - - $this->attributes['file_metadata'] = json_encode($metadata, JSON_INVALID_UTF8_IGNORE); - - return $this; - } - - public function deleteFile(): bool - { - if (! parent::deleteFile()) { - return false; - } - - if ($this->json_path) { - return unlink($this->json_path); - } - - return true; - } -} diff --git a/app/Entities/Person.php b/app/Entities/Person.php index 75e3edbf..f0f27721 100644 --- a/app/Entities/Person.php +++ b/app/Entities/Person.php @@ -10,12 +10,12 @@ declare(strict_types=1); namespace App\Entities; -use App\Entities\Media\Image; -use App\Models\MediaModel; use App\Models\PersonModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; +use Modules\Media\Entities\Image; +use Modules\Media\Models\MediaModel; use RuntimeException; /** @@ -70,10 +70,9 @@ class Person extends Entity (new MediaModel('image'))->updateMedia($this->getAvatar()); } else { $avatar = new Image([ - 'file_name' => $this->attributes['unique_name'], - 'file_directory' => 'persons', + 'file_key' => 'persons/' . $this->attributes['unique_name'] . '.' . $file->getExtension(), 'sizes' => config('Images') - ->personAvatarSizes, +->personAvatarSizes, 'uploaded_by' => user_id(), 'updated_by' => user_id(), ]); @@ -90,7 +89,7 @@ class Person extends Entity if ($this->attributes['avatar_id'] === null) { helper('media'); return new Image([ - 'file_path' => config('Images') + 'file_key' => config('Images') ->avatarDefaultPath, 'file_mimetype' => config('Images') ->avatarDefaultMimeType, @@ -99,7 +98,7 @@ class Person extends Entity 'sizes' => config('Images') ->personAvatarSizes, ], - ]); + ], 'fs'); } if ($this->avatar === null) { diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index 47c62e4d..313fa085 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -10,12 +10,10 @@ declare(strict_types=1); namespace App\Entities; -use App\Entities\Media\Image; use App\Libraries\SimpleRSSElement; use App\Models\ActorModel; use App\Models\CategoryModel; use App\Models\EpisodeModel; -use App\Models\MediaModel; use App\Models\PersonModel; use App\Models\PlatformModel; use CodeIgniter\Entity\Entity; @@ -30,6 +28,8 @@ use League\CommonMark\Extension\DisallowedRawHtml\DisallowedRawHtmlExtension; use League\CommonMark\Extension\SmartPunct\SmartPunctExtension; use League\CommonMark\MarkdownConverter; use Modules\Auth\Models\UserModel; +use Modules\Media\Entities\Image; +use Modules\Media\Models\MediaModel; use Modules\PremiumPodcasts\Entities\Subscription; use Modules\PremiumPodcasts\Models\SubscriptionModel; use RuntimeException; @@ -49,7 +49,7 @@ use RuntimeException; * @property int $cover_id * @property Image $cover * @property int|null $banner_id - * @property Image|null $banner + * @property Image $banner * @property string $language_code * @property int $category_id * @property Category|null $category @@ -243,10 +243,9 @@ class Podcast extends Entity (new MediaModel('image'))->updateMedia($this->getCover()); } else { $cover = new Image([ - 'file_name' => 'cover', - 'file_directory' => 'podcasts/' . $this->attributes['handle'], + 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(), 'sizes' => config('Images') - ->podcastCoverSizes, +->podcastCoverSizes, 'uploaded_by' => user_id(), 'updated_by' => user_id(), ]); @@ -281,10 +280,9 @@ class Podcast extends Entity (new MediaModel('image'))->updateMedia($this->getBanner()); } else { $banner = new Image([ - 'file_name' => 'banner', - 'file_directory' => 'podcasts/' . $this->attributes['handle'], + 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(), 'sizes' => config('Images') - ->podcastBannerSizes, +->podcastBannerSizes, 'uploaded_by' => user_id(), 'updated_by' => user_id(), ]); @@ -304,14 +302,14 @@ class Podcast extends Entity 'Images' )->podcastBannerDefaultPaths['default']; return new Image([ - 'file_path' => $defaultBanner['path'], + 'file_key' => $defaultBanner['path'], 'file_mimetype' => $defaultBanner['mimetype'], 'file_size' => 0, 'file_metadata' => [ 'sizes' => config('Images') - ->podcastBannerSizes, +->podcastBannerSizes, ], - ]); + ], 'fs'); } if (! $this->banner instanceof Image) { diff --git a/app/Helpers/id3_helper.php b/app/Helpers/id3_helper.php index e8051c9b..584a07d5 100644 --- a/app/Helpers/id3_helper.php +++ b/app/Helpers/id3_helper.php @@ -10,6 +10,7 @@ declare(strict_types=1); use App\Entities\Episode; use JamesHeinrich\GetID3\WriteTags; +use Modules\Media\FileManagers\FileManagerInterface; if (! function_exists('write_audio_file_tags')) { /** @@ -23,13 +24,16 @@ if (! function_exists('write_audio_file_tags')) { // Initialize getID3 tag-writing module $tagwriter = new WriteTags(); - $tagwriter->filename = media_path($episode->audio->file_path); + $tagwriter->filename = $episode->audio->file_name; // set various options (optional) $tagwriter->tagformats = ['id3v2.4']; $tagwriter->tag_encoding = $TextEncoding; - $APICdata = file_get_contents(media_path($episode->cover->id3_path)); + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); + + $APICdata = $fileManager->getFileContents($episode->cover->id3_key); // TODO: variables used for podcast specific tags // $podcastUrl = $episode->podcast->link; diff --git a/app/Libraries/MediaClipper/VideoClipper.php b/app/Libraries/MediaClipper/VideoClipper.php index c057415d..86ebb758 100644 --- a/app/Libraries/MediaClipper/VideoClipper.php +++ b/app/Libraries/MediaClipper/VideoClipper.php @@ -13,6 +13,7 @@ namespace MediaClipper; use App\Entities\Episode; use Exception; use GdImage; +use Modules\Media\FileManagers\FileManagerInterface; /** * TODO: refactor this by splitting process modules into different classes (image generation, subtitles clip, video @@ -35,9 +36,9 @@ class VideoClipper public bool $error = false; - public string $videoClipFilePath; + public string $videoClipFileKey; - protected string $videoClipOutput; + public string $videoClipOutput; protected float $duration; @@ -83,15 +84,11 @@ class VideoClipper $this->colors = config('MediaClipper') ->themes[$theme]; - helper(['media']); + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); - $this->audioInput = media_path($this->episode->audio->file_path); - $this->episodeCoverPath = media_path($this->episode->cover->file_path); - - $podcastFolder = media_path("podcasts/{$this->episode->podcast->handle}"); - - $this->videoClipOutput = $podcastFolder . "/{$this->episode->slug}-clip-{$this->start}-to-{$this->end}-{$this->format}-{$this->theme}.mp4"; - $this->videoClipFilePath = "podcasts/{$this->episode->podcast->handle}/{$this->episode->slug}-clip-{$this->start}-to-{$this->end}-{$this->format}-{$this->theme}.mp4"; + $this->audioInput = $fileManager->getFileInput($this->episode->audio->file_key); + $this->episodeCoverPath = $fileManager->getFileInput($this->episode->cover->file_key); // Temporary files to generate clip $tempFile = tempnam(WRITEPATH . 'temp', "{$this->episode->slug}-{$this->start}-{$this->end}"); @@ -102,7 +99,10 @@ class VideoClipper ); } + $this->videoClipFileKey = "podcasts/{$this->episode->podcast->handle}/{$this->episode->slug}-clip-{$this->start}-to-{$this->end}-{$this->format}-{$this->theme}.mp4"; + $this->tempFileOutput = $tempFile; + $this->videoClipOutput = $tempFile . '-video-clip.mp4'; $this->soundbiteOutput = $tempFile . '-soundbite.mp3'; $this->subtitlesClipOutput = $tempFile . '-subtitle.srt'; $this->videoClipBgOutput = $tempFile . '-bg.png'; @@ -120,19 +120,22 @@ class VideoClipper throw new Exception('Episode does not have a transcript!'); } - if ($this->episode->transcript->json_path) { - $this->generateSubtitlesClipFromJson($this->episode->transcript->json_path); + if ($this->episode->transcript->json_url) { + $this->generateSubtitlesClipFromJson($this->episode->transcript->json_key); } else { - $subtitlesInput = media_path($this->episode->transcript->file_path); + $subtitlesInput = $this->episode->transcript->file_url; $subtitleClipCmd = "ffmpeg -y -i {$subtitlesInput} -ss {$this->start} -t {$this->duration} {$this->subtitlesClipOutput}"; exec($subtitleClipCmd); } } - public function generateSubtitlesClipFromJson(string $jsonFileInput): void + public function generateSubtitlesClipFromJson(string $jsonFileKey): void { - $jsonTranscriptString = file_get_contents($jsonFileInput); - if ($jsonTranscriptString === false) { + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); + + $jsonTranscriptString = $fileManager->getFileContents($jsonFileKey); + if ($jsonTranscriptString === '') { throw new Exception('Cannot get transcript json contents.'); } diff --git a/app/Libraries/ViewComponents/ComponentRenderer.php b/app/Libraries/ViewComponents/ComponentRenderer.php index 09712615..76495398 100644 --- a/app/Libraries/ViewComponents/ComponentRenderer.php +++ b/app/Libraries/ViewComponents/ComponentRenderer.php @@ -134,17 +134,17 @@ class ComponentRenderer foreach ($pathsToDiscover as $basePath) { // Look for a class component first - $filePath = $basePath . $this->config->componentsDirectory . '/' . $namePath . '.php'; + $fileKey = $basePath . $this->config->componentsDirectory . '/' . $namePath . '.php'; - if (is_file($filePath)) { - return $filePath; + if (is_file($fileKey)) { + return $fileKey; } $snakeCaseName = strtolower(preg_replace('~(?config->componentsDirectory . '/' . $snakeCaseName . '.php'; + $fileKey = $basePath . $this->config->componentsDirectory . '/' . $snakeCaseName . '.php'; - if (is_file($filePath)) { - return $filePath; + if (is_file($fileKey)) { + return $fileKey; } } @@ -204,18 +204,18 @@ class ComponentRenderer { // Locate the class in the same folder as the view $class = $name . '.php'; - $filePath = str_replace($name . '.php', $class, $view); + $fileKey = str_replace($name . '.php', $class, $view); - if ($filePath === '') { + if ($fileKey === '') { return null; } - if (! file_exists($filePath)) { + if (! file_exists($fileKey)) { return null; } $className = service('locator') - ->getClassname($filePath); + ->getClassname($fileKey); if (! class_exists($className)) { return null; diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 300ffdf3..0590b434 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -440,8 +440,8 @@ class PodcastModel extends Model $podcastActor = (new ActorModel())->find($podcast->actor_id); if ($podcastActor) { - $podcastActor->avatar_image_url = $podcast->cover->thumbnail_url; - $podcastActor->avatar_image_mimetype = $podcast->cover->thumbnail_mimetype; + $podcastActor->avatar_image_url = $podcast->cover->federation_url; + $podcastActor->avatar_image_mimetype = $podcast->cover->federation_mimetype; (new ActorModel())->update($podcast->actor_id, $podcastActor); } @@ -468,9 +468,9 @@ class PodcastModel extends Model $actor->display_name = $podcast->title; $actor->summary = $podcast->description_html; $actor->avatar_image_url = $podcast->cover->federation_url; - $actor->avatar_image_mimetype = $podcast->cover->file_mimetype; + $actor->avatar_image_mimetype = $podcast->cover->federation_mimetype; $actor->cover_image_url = $podcast->banner->federation_url; - $actor->cover_image_mimetype = $podcast->banner->file_mimetype; + $actor->cover_image_mimetype = $podcast->banner->federation_mimetype; if ($actor->hasChanged()) { $actorModel->update($actor->id, $actor); diff --git a/app/Views/errors/cli/error_exception.php b/app/Views/errors/cli/error_exception.php index b9c4941c..aa946812 100644 --- a/app/Views/errors/cli/error_exception.php +++ b/app/Views/errors/cli/error_exception.php @@ -27,9 +27,9 @@ if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE) { $c = str_pad((string) ($i + 1), 3, ' ', STR_PAD_LEFT); if (isset($error['file'])) { - $filepath = clean_path($error['file']) . ':' . $error['line']; + $fileKey = clean_path($error['file']) . ':' . $error['line']; - CLI::write($c . $padFile . CLI::color($filepath, 'yellow')); + CLI::write($c . $padFile . CLI::color($fileKey, 'yellow')); } else { CLI::write($c . $padFile . CLI::color('[internal function]', 'yellow')); } diff --git a/composer.json b/composer.json index d9a61018..a04b3e3d 100644 --- a/composer.json +++ b/composer.json @@ -17,21 +17,22 @@ "opawg/user-agents-php": "^v1.0", "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.0", - "phpseclib/phpseclib": "~2.0.41", + "phpseclib/phpseclib": "~2.0.42", "michalsn/codeigniter4-uuid": "dev-develop", "essence/essence": "^3.5.4", "codeigniter4/settings": "^v2.1.0", "chrisjean/php-ico": "^1.0.4", "melbahja/seo": "^v2.1.1", - "codeigniter4/shield": "v1.0.0-beta.3" + "codeigniter4/shield": "v1.0.0-beta.3", + "aws/aws-sdk-php": "^3.261.10" }, "require-dev": { "mikey179/vfsstream": "^v1.6.11", - "phpunit/phpunit": "^10.0.11", - "captainhook/captainhook": "^5.14.4", - "symplify/easy-coding-standard": "^11.2.9", - "phpstan/phpstan": "^1.10.0", - "rector/rector": "^0.15.17", + "phpunit/phpunit": "^10.0.16", + "captainhook/captainhook": "^5.15.2", + "symplify/easy-coding-standard": "^11.2.10", + "phpstan/phpstan": "^1.10.6", + "rector/rector": "^0.15.21", "symplify/coding-standard": "^11.3.0" }, "autoload": { diff --git a/composer.lock b/composer.lock index fdc011b5..21ca5638 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "86928335baed20f4228d148b0b4f77e0", + "content-hash": "84568da2a8ddda6d9bcd8eb63ee83682", "packages": [ { "name": "adaures/ipcat-php", @@ -73,6 +73,137 @@ "homepage": "https://code.castopod.org/adaures/podcast-persons-taxonomy", "time": "2022-02-20T14:09:25+00:00" }, + { + "name": "aws/aws-crt-php", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "f5c64ee7c5fce196e2519b3d9b7138649efe032d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/f5c64ee7c5fce196e2519b3d9b7138649efe032d", + "reference": "f5c64ee7c5fce196e2519b3d9b7138649efe032d", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.6.3" + }, + "type": "library", + "autoload": { + "classmap": ["src/"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["Apache-2.0"], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": ["amazon", "aws", "crt", "sdk"], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.0.4" + }, + "time": "2023-01-31T23:08:25+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.261.10", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "4889eff2b3fe35e878fbcaf8374d73f043609170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4889eff2b3fe35e878fbcaf8374d73f043609170", + "reference": "4889eff2b3fe35e878fbcaf8374d73f043609170", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.0.4", + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/psr7": "^1.8.5 || ^2.3", + "mtdowling/jmespath.php": "^2.6", + "php": ">=5.5" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "composer/composer": "^1.10.22", + "dms/phpunit-arraysubset-asserts": "^0.4.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^4.8.35 || ^5.6.3 || ^9.5", + "psr/cache": "^1.0", + "psr/simple-cache": "^1.0", + "sebastian/comparator": "^1.2.3 || ^4.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": ["src/functions.php"], + "psr-4": { + "Aws\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["Apache-2.0"], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "support": { + "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.261.10" + }, + "time": "2023-03-13T18:19:14+00:00" + }, { "name": "brick/math", "version": "0.10.2", @@ -707,24 +838,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8" + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8", - "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9" + "phpoption/phpoption": "^1.9.1" }, "require-dev": { - "phpunit/phpunit": "^8.5.28 || ^9.5.21" + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" }, "type": "library", "autoload": { @@ -751,7 +882,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1" }, "funding": [ { @@ -763,7 +894,326 @@ "type": "tidelift" } ], - "time": "2022-07-30T15:56:11+00:00" + "time": "2023-02-25T20:23:15+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "files": ["src/functions_include.php"], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + }, + "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": "2022-08-28T15:39:27+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": ["src/functions_include.php"], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": ["promise"], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "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": "2022-08-28T14:55:35+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf", + "reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.4" + }, + "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": "2023-03-09T13:19:02+00:00" }, { "name": "james-heinrich/getid3", @@ -1430,6 +1880,58 @@ }, "time": "2021-05-10T16:28:01+00:00" }, + { + "name": "mtdowling/jmespath.php", + "version": "2.6.1", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" + }, + "bin": ["bin/jp.php"], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "files": ["src/JmesPath.php"], + "psr-4": { + "JmesPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": ["json", "jsonpath"], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1" + }, + "time": "2021-06-14T00:11:39+00:00" + }, { "name": "nette/schema", "version": "v1.2.3", @@ -1601,24 +2103,24 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab" + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", - "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8", - "phpunit/phpunit": "^8.5.28 || ^9.5.21" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" }, "type": "library", "extra": { @@ -1653,7 +2155,7 @@ "keywords": ["language", "option", "php", "type"], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.0" + "source": "https://github.com/schmittjoh/php-option/tree/1.9.1" }, "funding": [ { @@ -1665,20 +2167,20 @@ "type": "tidelift" } ], - "time": "2022-07-30T15:51:26+00:00" + "time": "2023-02-25T19:38:58+00:00" }, { "name": "phpseclib/phpseclib", - "version": "2.0.41", + "version": "2.0.42", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "7e763c6f97ec1fcb37c46aa8ecfc20a2c71d9c1b" + "reference": "665d289f59e646a259ebf13f29be7f6f54cab24b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7e763c6f97ec1fcb37c46aa8ecfc20a2c71d9c1b", - "reference": "7e763c6f97ec1fcb37c46aa8ecfc20a2c71d9c1b", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/665d289f59e646a259ebf13f29be7f6f54cab24b", + "reference": "665d289f59e646a259ebf13f29be7f6f54cab24b", "shasum": "" }, "require": { @@ -1755,7 +2257,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.41" + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.42" }, "funding": [ { @@ -1771,7 +2273,7 @@ "type": "tidelift" } ], - "time": "2022-12-23T16:44:18+00:00" + "time": "2023-03-06T12:45:53+00:00" }, { "name": "psr/cache", @@ -1860,6 +2362,155 @@ }, "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": ["http", "http-client", "psr", "psr-18"], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, { "name": "psr/log", "version": "1.1.4", @@ -1904,6 +2555,46 @@ }, "time": "2021-05-03T11:20:27+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": ["src/getallheaders.php"] + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, { "name": "ramsey/collection", "version": "2.0.0", @@ -2070,16 +2761,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" + "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", - "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", "shasum": "" }, "require": { @@ -2113,7 +2804,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" }, "funding": [ { @@ -2129,7 +2820,7 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-03-01T10:25:55+00:00" }, { "name": "symfony/polyfill-ctype", @@ -2485,26 +3176,26 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.14.4", + "version": "5.15.2", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "8309f6e16097754469c485e604900c573bf2c5d8" + "reference": "728fe3847c57f2d9cd4c53a8c26bc5522b42a1d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/8309f6e16097754469c485e604900c573bf2c5d8", - "reference": "8309f6e16097754469c485e604900c573bf2c5d8", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/728fe3847c57f2d9cd4c53a8c26bc5522b42a1d0", + "reference": "728fe3847c57f2d9cd4c53a8c26bc5522b42a1d0", "shasum": "" }, "require": { "ext-json": "*", "ext-spl": "*", "ext-xml": "*", - "php": ">=7.2", + "php": ">=7.4", "sebastianfeldmann/camino": "^0.9.2", "sebastianfeldmann/cli": "^3.3", - "sebastianfeldmann/git": "^3.8.5", + "sebastianfeldmann/git": "^3.8.6", "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" @@ -2552,7 +3243,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.14.4" + "source": "https://github.com/captainhookphp/captainhook/tree/5.15.2" }, "funding": [ { @@ -2560,7 +3251,7 @@ "type": "github" } ], - "time": "2023-02-05T15:14:48+00:00" + "time": "2023-03-03T11:11:58+00:00" }, { "name": "composer/pcre", @@ -2902,16 +3593,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.14.4", + "version": "v3.15.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b" + "reference": "d48755372a113bddb99f749e34805d83f3acfe04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/1b3d9dba63d93b8a202c31e824748218781eae6b", - "reference": "1b3d9dba63d93b8a202c31e824748218781eae6b", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d48755372a113bddb99f749e34805d83f3acfe04", + "reference": "d48755372a113bddb99f749e34805d83f3acfe04", "shasum": "" }, "require": { @@ -2974,9 +3665,15 @@ } ], "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.14.4" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.15.1" }, "funding": [ { @@ -2984,7 +3681,7 @@ "type": "github" } ], - "time": "2023-02-09T21:49:13+00:00" + "time": "2023-03-13T23:26:30+00:00" }, { "name": "mikey179/vfsstream", @@ -3037,16 +3734,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { @@ -3074,7 +3771,7 @@ "keywords": ["clone", "copy", "duplicate", "object", "object graph"], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { @@ -3082,20 +3779,20 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", - "version": "v4.15.3", + "version": "v4.15.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039" + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039", - "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", "shasum": "" }, "require": { @@ -3129,9 +3826,9 @@ "keywords": ["parser", "php"], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" }, - "time": "2023-01-16T22:05:37+00:00" + "time": "2023-03-05T19:49:14+00:00" }, { "name": "phar-io/manifest", @@ -3238,16 +3935,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.0", + "version": "1.10.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "71b28a67f01ac231f9a8f1ce242270bf4ec1f99c" + "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/71b28a67f01ac231f9a8f1ce242270bf4ec1f99c", - "reference": "71b28a67f01ac231f9a8f1ce242270bf4ec1f99c", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", + "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", "shasum": "" }, "require": { @@ -3267,7 +3964,7 @@ "keywords": ["dev", "static analysis"], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.0" + "source": "https://github.com/phpstan/phpstan/tree/1.10.6" }, "funding": [ { @@ -3283,27 +3980,27 @@ "type": "tidelift" } ], - "time": "2023-02-21T13:50:49+00:00" + "time": "2023-03-09T16:55:12+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.0.0", + "version": "10.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "bf4fbc9c13af7da12b3ea807574fb460f255daba" + "reference": "20800e84296ea4732f9a125e08ce86b4004ae3e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bf4fbc9c13af7da12b3ea807574fb460f255daba", - "reference": "bf4fbc9c13af7da12b3ea807574fb460f255daba", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/20800e84296ea4732f9a125e08ce86b4004ae3e4", + "reference": "20800e84296ea4732f9a125e08ce86b4004ae3e4", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.14", + "nikic/php-parser": "^4.15", "php": ">=8.1", "phpunit/php-file-iterator": "^4.0", "phpunit/php-text-template": "^3.0", @@ -3318,8 +4015,8 @@ "phpunit/phpunit": "^10.0" }, "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { @@ -3344,7 +4041,7 @@ "keywords": ["coverage", "testing", "xunit"], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.0.0" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.0.2" }, "funding": [ { @@ -3352,7 +4049,7 @@ "type": "github" } ], - "time": "2023-02-03T07:14:34+00:00" + "time": "2023-03-06T13:00:19+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3572,16 +4269,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.0.11", + "version": "10.0.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d18a18b07e7a9ad52d994b1785f9e301fc84b616" + "reference": "07d386a11ac7094032900f07cada1c8975d16607" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d18a18b07e7a9ad52d994b1785f9e301fc84b616", - "reference": "d18a18b07e7a9ad52d994b1785f9e301fc84b616", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/07d386a11ac7094032900f07cada1c8975d16607", + "reference": "07d386a11ac7094032900f07cada1c8975d16607", "shasum": "" }, "require": { @@ -3613,7 +4310,7 @@ "sebastian/version": "^4.0" }, "suggest": { - "ext-soap": "*" + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": ["phpunit"], "type": "library", @@ -3640,7 +4337,7 @@ "keywords": ["phpunit", "testing", "xunit"], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.11" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.16" }, "funding": [ { @@ -3656,7 +4353,7 @@ "type": "tidelift" } ], - "time": "2023-02-20T16:39:36+00:00" + "time": "2023-03-13T09:02:40+00:00" }, { "name": "psr/container", @@ -3711,21 +4408,21 @@ }, { "name": "rector/rector", - "version": "0.15.17", + "version": "0.15.21", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "7f6ee7974175138864d3b50c28ea73a7b0fd4e2d" + "reference": "1cee8cc5d6d836e1bf9a3006d7b062adde3a6022" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/7f6ee7974175138864d3b50c28ea73a7b0fd4e2d", - "reference": "7f6ee7974175138864d3b50c28ea73a7b0fd4e2d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/1cee8cc5d6d836e1bf9a3006d7b062adde3a6022", + "reference": "1cee8cc5d6d836e1bf9a3006d7b062adde3a6022", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.9.14" + "phpstan/phpstan": "^1.10.1" }, "conflict": { "rector/rector-doctrine": "*", @@ -3746,9 +4443,10 @@ "notification-url": "https://packagist.org/downloads/", "license": ["MIT"], "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": ["automation", "dev", "migration", "refactoring"], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.15.17" + "source": "https://github.com/rectorphp/rector/tree/0.15.21" }, "funding": [ { @@ -3756,7 +4454,7 @@ "type": "github" } ], - "time": "2023-02-17T20:34:07+00:00" + "time": "2023-03-06T11:44:29+00:00" }, { "name": "sebastian/cli-parser", @@ -4695,16 +5393,16 @@ }, { "name": "sebastianfeldmann/git", - "version": "3.8.5", + "version": "3.8.6", "source": { "type": "git", "url": "https://github.com/sebastianfeldmann/git.git", - "reference": "14de823cba82e30a3759e9eab1ebbd0d6f5d542c" + "reference": "d4ce674cf5104a162f8401033d88ea7f47134c5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/14de823cba82e30a3759e9eab1ebbd0d6f5d542c", - "reference": "14de823cba82e30a3759e9eab1ebbd0d6f5d542c", + "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/d4ce674cf5104a162f8401033d88ea7f47134c5d", + "reference": "d4ce674cf5104a162f8401033d88ea7f47134c5d", "shasum": "" }, "require": { @@ -4740,7 +5438,7 @@ "keywords": ["git"], "support": { "issues": "https://github.com/sebastianfeldmann/git/issues", - "source": "https://github.com/sebastianfeldmann/git/tree/3.8.5" + "source": "https://github.com/sebastianfeldmann/git/tree/3.8.6" }, "funding": [ { @@ -4748,20 +5446,20 @@ "type": "github" } ], - "time": "2022-10-23T11:29:41+00:00" + "time": "2023-02-24T21:21:52+00:00" }, { "name": "symfony/console", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3e294254f2191762c1d137aed4b94e966965e985" + "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3e294254f2191762c1d137aed4b94e966965e985", - "reference": "3e294254f2191762c1d137aed4b94e966965e985", + "url": "https://api.github.com/repos/symfony/console/zipball/cbad09eb8925b6ad4fb721c7a179344dc4a19d45", + "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45", "shasum": "" }, "require": { @@ -4819,7 +5517,7 @@ "homepage": "https://symfony.com", "keywords": ["cli", "command line", "console", "terminal"], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.5" + "source": "https://github.com/symfony/console/tree/v6.2.7" }, "funding": [ { @@ -4835,20 +5533,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2023-02-25T17:00:03+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68" + "reference": "404b307de426c1c488e5afad64403e5f145e82a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", - "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/404b307de426c1c488e5afad64403e5f145e82a5", + "reference": "404b307de426c1c488e5afad64403e5f145e82a5", "shasum": "" }, "require": { @@ -4898,7 +5596,7 @@ "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/v6.2.5" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.7" }, "funding": [ { @@ -4914,20 +5612,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.2.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0782b0b52a737a05b4383d0df35a474303cabdae" + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", - "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", + "reference": "0ad3b6f1e4e2da5690fefe075cd53a238646d8dd", "shasum": "" }, "require": { @@ -4975,7 +5673,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.1" }, "funding": [ { @@ -4991,20 +5689,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-03-01T10:32:47+00:00" }, { "name": "symfony/filesystem", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593" + "reference": "82b6c62b959f642d000456f08c6d219d749215b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e59e8a4006afd7f5654786a83b4fcb8da98f4593", - "reference": "e59e8a4006afd7f5654786a83b4fcb8da98f4593", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3", + "reference": "82b6c62b959f642d000456f08c6d219d749215b3", "shasum": "" }, "require": { @@ -5034,7 +5732,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.5" + "source": "https://github.com/symfony/filesystem/tree/v6.2.7" }, "funding": [ { @@ -5050,20 +5748,20 @@ "type": "tidelift" } ], - "time": "2023-01-20T17:45:48+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/finder", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c" + "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/c90dc446976a612e3312a97a6ec0069ab0c2099c", - "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c", + "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb", + "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb", "shasum": "" }, "require": { @@ -5094,7 +5792,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.2.5" + "source": "https://github.com/symfony/finder/tree/v6.2.7" }, "funding": [ { @@ -5110,20 +5808,20 @@ "type": "tidelift" } ], - "time": "2023-01-20T17:45:48+00:00" + "time": "2023-02-16T09:57:23+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "e8324d44f5af99ec2ccec849934a242f64458f86" + "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/e8324d44f5af99ec2ccec849934a242f64458f86", - "reference": "e8324d44f5af99ec2ccec849934a242f64458f86", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/aa0e85b53bbb2b4951960efd61d295907eacd629", + "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629", "shasum": "" }, "require": { @@ -5153,7 +5851,7 @@ "homepage": "https://symfony.com", "keywords": ["config", "configuration", "options"], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.2.5" + "source": "https://github.com/symfony/options-resolver/tree/v6.2.7" }, "funding": [ { @@ -5169,7 +5867,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -5396,16 +6094,16 @@ }, { "name": "symfony/process", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7" + "reference": "680e8a2ea6b3f87aecc07a6a65a203ae573d1902" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/9ead139f63dfa38c4e4a9049cc64a8b2748c83b7", - "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7", + "url": "https://api.github.com/repos/symfony/process/zipball/680e8a2ea6b3f87aecc07a6a65a203ae573d1902", + "reference": "680e8a2ea6b3f87aecc07a6a65a203ae573d1902", "shasum": "" }, "require": { @@ -5433,7 +6131,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.2.5" + "source": "https://github.com/symfony/process/tree/v6.2.7" }, "funding": [ { @@ -5449,20 +6147,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2023-02-24T10:42:00+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.0", + "version": "v3.2.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" + "reference": "a8c9cedf55f314f3a186041d19537303766df09a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", - "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", + "reference": "a8c9cedf55f314f3a186041d19537303766df09a", "shasum": "" }, "require": { @@ -5514,7 +6212,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" }, "funding": [ { @@ -5530,20 +6228,20 @@ "type": "tidelift" } ], - "time": "2022-11-25T10:21:52+00:00" + "time": "2023-03-01T10:32:47+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6" + "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/00b6ac156aacffc53487c930e0ab14587a6607f6", - "reference": "00b6ac156aacffc53487c930e0ab14587a6607f6", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", + "reference": "f3adc98c1061875dd2edcd45e5b04e63d0e29f8f", "shasum": "" }, "require": { @@ -5572,7 +6270,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.2.5" + "source": "https://github.com/symfony/stopwatch/tree/v6.2.7" }, "funding": [ { @@ -5588,20 +6286,20 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:36:55+00:00" + "time": "2023-02-14T08:44:56+00:00" }, { "name": "symfony/string", - "version": "v6.2.5", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0" + "reference": "67b8c1eec78296b85dc1c7d9743830160218993d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", - "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0", + "url": "https://api.github.com/repos/symfony/string/zipball/67b8c1eec78296b85dc1c7d9743830160218993d", + "reference": "67b8c1eec78296b85dc1c7d9743830160218993d", "shasum": "" }, "require": { @@ -5645,7 +6343,7 @@ "homepage": "https://symfony.com", "keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.5" + "source": "https://github.com/symfony/string/tree/v6.2.7" }, "funding": [ { @@ -5661,7 +6359,7 @@ "type": "tidelift" } ], - "time": "2023-01-01T08:38:09+00:00" + "time": "2023-02-24T10:42:00+00:00" }, { "name": "symplify/coding-standard", @@ -5732,16 +6430,16 @@ }, { "name": "symplify/easy-coding-standard", - "version": "11.2.9", + "version": "11.2.10", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "947267668efb055bf78c7b68416cb206285f21d4" + "reference": "5fc343df9b86e154516ddf506f7fe0b421d7d5ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/947267668efb055bf78c7b68416cb206285f21d4", - "reference": "947267668efb055bf78c7b68416cb206285f21d4", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/5fc343df9b86e154516ddf506f7fe0b421d7d5ef", + "reference": "5fc343df9b86e154516ddf506f7fe0b421d7d5ef", "shasum": "" }, "require": { @@ -5761,7 +6459,7 @@ "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer", "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/11.2.9" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/11.2.10" }, "funding": [ { @@ -5773,7 +6471,7 @@ "type": "github" } ], - "time": "2023-02-21T11:31:15+00:00" + "time": "2023-02-27T10:00:30+00:00" }, { "name": "symplify/rule-doc-generator-contracts", diff --git a/docker-compose.yml b/docker-compose.yml index 8b735730..a1f5f79c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,10 @@ -version: "3" +version: "3.8" networks: castopod: + ipam: + config: + - subnet: 172.20.0.0/24 services: app: @@ -18,7 +21,8 @@ services: - redis - mariadb networks: - - castopod + castopod: + ipv4_address: 172.20.0.2 redis: image: redis:alpine @@ -28,7 +32,8 @@ services: volumes: - redis:/data networks: - - castopod + castopod: + ipv4_address: 172.20.0.3 mariadb: image: mariadb:10.2 @@ -44,7 +49,8 @@ services: MYSQL_USER: castopod MYSQL_PASSWORD: castopod networks: - - castopod + castopod: + ipv4_address: 172.20.0.4 phpmyadmin: image: phpmyadmin/phpmyadmin:latest @@ -59,7 +65,22 @@ services: depends_on: - mariadb networks: - - castopod + castopod: + ipv4_address: 172.20.0.5 + + s3: + image: adobe/s3mock:latest + container_name: castopod_s3 + environment: + - debug=true + - root=/data + ports: + - 9090:9090 + volumes: + - ./data/s3:/data:cached + networks: + castopod: + ipv4_address: 172.20.0.6 volumes: redis: diff --git a/docs/src/contributing/setup-development.md b/docs/src/contributing/setup-development.md index 5cbecd1c..7de2e408 100644 --- a/docs/src/contributing/setup-development.md +++ b/docs/src/contributing/setup-development.md @@ -43,7 +43,6 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" @@ -62,7 +61,21 @@ to help you kickstart your contribution. # You may not want to use redis as your cache handler # Comment/remove the two lines above and uncomment # the next line for file caching. + # ----------------------- #cache.handler="file" + + ###################################### + # Media config + ###################################### + media.baseURL="http://localhost:8080/" + + # S3 + # Uncomment to store s3 objects using adobe/s3mock service + # ----------------------- + #media.fileManager="s3" + #media.s3.bucket="castopod" + #media.s3.endpoint="http://172.20.0.6:9090/" + #media.s3.path_style_endpoint=true ``` > _NB._ You can tweak your environment by setting more environment variables diff --git a/modules/Admin/Controllers/DashboardController.php b/modules/Admin/Controllers/DashboardController.php index ffef90d9..4d71fc20 100644 --- a/modules/Admin/Controllers/DashboardController.php +++ b/modules/Admin/Controllers/DashboardController.php @@ -11,9 +11,9 @@ declare(strict_types=1); namespace Modules\Admin\Controllers; use App\Models\EpisodeModel; -use App\Models\MediaModel; use App\Models\PodcastModel; use CodeIgniter\I18n\Time; +use Modules\Media\Models\MediaModel; class DashboardController extends BaseController { diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 73b382d4..3e861715 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -17,12 +17,12 @@ use App\Entities\Podcast; use App\Entities\Post; use App\Models\EpisodeCommentModel; use App\Models\EpisodeModel; -use App\Models\MediaModel; use App\Models\PodcastModel; use App\Models\PostModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\I18n\Time; +use Modules\Media\Models\MediaModel; class EpisodeController extends BaseController { @@ -933,7 +933,7 @@ class EpisodeController extends BaseController if ($episodeMedia !== null && ! $episodeMedia->deleteFile()) { $warnings[] = lang('Episode.messages.deleteFileError', [ 'type' => $episodeMedia->type, - 'file_path' => $episodeMedia->file_path, + 'file_key' => $episodeMedia->file_key, ]); } } diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index e8bcf742..2f57a233 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -17,7 +17,6 @@ use App\Models\ActorModel; use App\Models\CategoryModel; use App\Models\EpisodeModel; use App\Models\LanguageModel; -use App\Models\MediaModel; use App\Models\PodcastModel; use App\Models\PostModel; use CodeIgniter\Exceptions\PageNotFoundException; @@ -32,6 +31,7 @@ use Modules\Analytics\Models\AnalyticsPodcastModel; use Modules\Analytics\Models\AnalyticsWebsiteByBrowserModel; use Modules\Analytics\Models\AnalyticsWebsiteByEntryPageModel; use Modules\Analytics\Models\AnalyticsWebsiteByRefererModel; +use Modules\Media\Models\MediaModel; class PodcastController extends BaseController { diff --git a/modules/Admin/Controllers/PodcastImportController.php b/modules/Admin/Controllers/PodcastImportController.php index 08ccd067..e0df6ed7 100644 --- a/modules/Admin/Controllers/PodcastImportController.php +++ b/modules/Admin/Controllers/PodcastImportController.php @@ -306,6 +306,7 @@ class PodcastImportController extends BaseController $slugs = []; for ($itemNumber = 1; $itemNumber <= $lastItem; ++$itemNumber) { $item = $feed->channel[0]->item[$itemsCount - $itemNumber]; + log_message('critical', (string) $item->title); $nsItunes = $item->children('http://www.itunes.com/dtds/podcast-1.0.dtd'); $nsPodcast = $item->children( diff --git a/modules/Admin/Controllers/SchedulerController.php b/modules/Admin/Controllers/SchedulerController.php index 9246557b..d5e60235 100644 --- a/modules/Admin/Controllers/SchedulerController.php +++ b/modules/Admin/Controllers/SchedulerController.php @@ -12,6 +12,7 @@ namespace Modules\Admin\Controllers; use App\Models\ClipModel; use CodeIgniter\Controller; +use CodeIgniter\Files\File; use CodeIgniter\I18n\Time; use Exception; use MediaClipper\VideoClipper; @@ -65,7 +66,7 @@ class SchedulerController extends Controller $clipModel = new ClipModel(); if ($exitCode === 0) { // success, video was generated - $scheduledClip->setMedia($clipper->videoClipFilePath); + $scheduledClip->setMedia(new File($clipper->videoClipOutput), $clipper->videoClipFileKey); $clipModel->update($scheduledClip->id, [ 'media_id' => $scheduledClip->media_id, 'status' => 'passed', diff --git a/modules/Admin/Controllers/SettingsController.php b/modules/Admin/Controllers/SettingsController.php index abd4413a..f089a4d2 100644 --- a/modules/Admin/Controllers/SettingsController.php +++ b/modules/Admin/Controllers/SettingsController.php @@ -10,15 +10,18 @@ declare(strict_types=1); namespace Modules\Admin\Controllers; +use App\Entities\Podcast; use App\Models\ActorModel; use App\Models\EpisodeCommentModel; use App\Models\EpisodeModel; -use App\Models\MediaModel; use App\Models\PersonModel; use App\Models\PodcastModel; use App\Models\PostModel; -use CodeIgniter\Files\File; use CodeIgniter\HTTP\RedirectResponse; +use Modules\Media\Entities\Audio; +use Modules\Media\FileManagers\FileManagerInterface; +use Modules\Media\FileManagers\FS; +use Modules\Media\Models\MediaModel; use PHP_ICO; class SettingsController extends BaseController @@ -61,7 +64,10 @@ class SettingsController extends BaseController delete_files(media_path('/site')); // save original in disk - $originalFilename = save_media($siteIconFile, 'site', 'icon'); + $originalFilename = (new FS(config('Media')))->save( + $siteIconFile, + 'site/icon.' . $siteIconFile->getExtension() + ); // convert jpeg image to png if not if ($siteIconFile->getClientMimeType() !== 'image/png') { @@ -113,23 +119,14 @@ class SettingsController extends BaseController public function regenerateImages(): RedirectResponse { - helper('media'); - + /** @var Podcast[] $allPodcasts */ $allPodcasts = (new PodcastModel())->findAll(); - $imageExt = ['jpg', 'png', 'webp']; + + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); foreach ($allPodcasts as $podcast) { - foreach ($imageExt as $ext) { - $podcastImages = glob(media_path("/podcasts/{$podcast->handle}/*_*{$ext}")); - - if ($podcastImages) { - foreach ($podcastImages as $podcastImage) { - if (is_file($podcastImage)) { - unlink($podcastImage); - } - } - } - } + $fileManager->deletePodcastImageSizes($podcast->handle); $podcast->cover->saveSizes(); if ($podcast->banner_id !== null) { @@ -143,16 +140,7 @@ class SettingsController extends BaseController } } - foreach ($imageExt as $ext) { - $personsImages = glob(media_path("/persons/*_*{$ext}")); - if ($personsImages) { - foreach ($personsImages as $personsImage) { - if (is_file($personsImage)) { - unlink($personsImage); - } - } - } - } + $fileManager->deletePersonImagesSizes(); $persons = (new PersonModel())->findAll(); foreach ($persons as $person) { @@ -180,115 +168,12 @@ class SettingsController extends BaseController (new EpisodeCommentModel())->resetRepliesCount(); } - helper('media'); - - if ($this->request->getPost('rewrite_media') === 'yes') { - $imageExt = ['jpg', 'png', 'webp']; - // Delete all podcast image sizes to recreate them - $allPodcasts = (new PodcastModel())->findAll(); - foreach ($allPodcasts as $podcast) { - foreach ($imageExt as $ext) { - $podcastImages = glob(media_path("/podcasts/{$podcast->handle}/*_*{$ext}")); - - if ($podcastImages) { - foreach ($podcastImages as $podcastImage) { - if (is_file($podcastImage)) { - unlink($podcastImage); - } - } - } - } - } - - // Delete all person image sizes to recreate them - foreach ($imageExt as $ext) { - $personsImages = glob(media_path("/persons/*_*{$ext}")); - if ($personsImages) { - foreach ($personsImages as $personsImage) { - if (is_file($personsImage)) { - unlink($personsImage); - } - } - } - } - - $allImages = (new MediaModel('image'))->getAllOfType(); - foreach ($allImages as $image) { - if (str_starts_with((string) $image->file_path, 'podcasts')) { - if (str_ends_with((string) $image->file_path, 'banner.jpg') || str_ends_with( - (string) $image->file_path, - 'banner.png' - ) || str_ends_with((string) $image->file_path, 'banner.jpeg')) { - $image->sizes = config('Images') - ->podcastBannerSizes; - } else { - $image->sizes = config('Images') - ->podcastCoverSizes; - } - } elseif (str_starts_with((string) $image->file_path, 'persons')) { - $image->sizes = config('Images') - ->personAvatarSizes; - } else { - $image->sizes = []; - } - - $image->setFile(new File(media_path($image->file_path))); - - (new MediaModel('image'))->updateMedia($image); - } - - $allAudio = (new MediaModel('audio'))->getAllOfType(); - foreach ($allAudio as $audio) { - $audio->setFile(new File(media_path($audio->file_path))); - - (new MediaModel('audio'))->updateMedia($audio); - } - - $allTranscripts = (new MediaModel('transcript'))->getAllOfType(); - foreach ($allTranscripts as $transcript) { - $transcript->setFile(new File(media_path($transcript->file_path))); - - (new MediaModel('transcript'))->updateMedia($transcript); - } - - $allChapters = (new MediaModel('chapters'))->getAllOfType(); - foreach ($allChapters as $chapters) { - $chapters->setFile(new File(media_path($chapters->file_path))); - - (new MediaModel('chapters'))->updateMedia($chapters); - } - - $allVideos = (new MediaModel('video'))->getAllOfType(); - foreach ($allVideos as $video) { - $video->setFile(new File(media_path($video->file_path))); - - (new MediaModel('video'))->updateMedia($video); - } - - // reset avatar and banner image urls for each podcast actor - foreach ($allPodcasts as $podcast) { - $actorModel = new ActorModel(); - $actor = $actorModel->getActorById($podcast->actor_id); - - if ($actor !== null) { - // update values - $actor->avatar_image_url = $podcast->cover->federation_url; - $actor->avatar_image_mimetype = $podcast->cover->file_mimetype; - $actor->cover_image_url = $podcast->banner->federation_url; - $actor->cover_image_mimetype = $podcast->banner->file_mimetype; - - if ($actor->hasChanged()) { - $actorModel->update($actor->id, $actor); - } - } - } - } - if ($this->request->getPost('clear_cache') === 'yes') { cache()->clean(); } if ($this->request->getPost('rename_episodes_files') === 'yes') { + /** @var Audio[] $allAudio */ $allAudio = (new MediaModel('audio'))->getAllOfType(); foreach ($allAudio as $audio) { diff --git a/modules/Admin/Controllers/SoundbiteController.php b/modules/Admin/Controllers/SoundbiteController.php index 020785b7..fe049e1c 100644 --- a/modules/Admin/Controllers/SoundbiteController.php +++ b/modules/Admin/Controllers/SoundbiteController.php @@ -15,10 +15,10 @@ use App\Entities\Episode; use App\Entities\Podcast; use App\Models\ClipModel; use App\Models\EpisodeModel; -use App\Models\MediaModel; use App\Models\PodcastModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; +use Modules\Media\Models\MediaModel; class SoundbiteController extends BaseController { diff --git a/modules/Admin/Controllers/VideoClipsController.php b/modules/Admin/Controllers/VideoClipsController.php index cac087e5..074221eb 100644 --- a/modules/Admin/Controllers/VideoClipsController.php +++ b/modules/Admin/Controllers/VideoClipsController.php @@ -15,10 +15,10 @@ use App\Entities\Episode; use App\Entities\Podcast; use App\Models\ClipModel; use App\Models\EpisodeModel; -use App\Models\MediaModel; use App\Models\PodcastModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; +use Modules\Media\Models\MediaModel; class VideoClipsController extends BaseController { diff --git a/modules/Admin/Language/ar/Episode.php b/modules/Admin/Language/ar/Episode.php index 99eed5ba..088c1355 100644 --- a/modules/Admin/Language/ar/Episode.php +++ b/modules/Admin/Language/ar/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php index 56e1c93d..8558fc6f 100644 --- a/modules/Admin/Language/br/Episode.php +++ b/modules/Admin/Language/br/Episode.php @@ -87,7 +87,7 @@ return [ image {ar golo} audio {an aodio} other {ar media} - } ({file_path}). Gallout a rit lemel kuit ar restr-mañ diouzh ar gantenn dre zorn.', + } ({file_key}). Gallout a rit lemel kuit ar restr-mañ diouzh ar gantenn dre zorn.', 'sameSlugError' => 'Bez ez eus eus ur rann gant ar berradur-mañ (slug) dija.', ], 'form' => [ diff --git a/modules/Admin/Language/ca/Episode.php b/modules/Admin/Language/ca/Episode.php index ed05a8d7..f8cde303 100644 --- a/modules/Admin/Language/ca/Episode.php +++ b/modules/Admin/Language/ca/Episode.php @@ -79,7 +79,7 @@ return [ audio {l\'àudio} other {el material} } de l\'episodi.', - 'deleteFileError' => 'No s\'ha pogut esborrar el fitxer {file_path} {type, select, + 'deleteFileError' => 'No s\'ha pogut esborrar el fitxer {file_key} {type, select, transcript {de la transcripció} chapters {dels episodis} image {de la portada} diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php index dde86cdb..d98870ab 100644 --- a/modules/Admin/Language/de/Episode.php +++ b/modules/Admin/Language/de/Episode.php @@ -85,7 +85,7 @@ return [ image {Cover} audio {Audio} other {Medien} - }-Datei {file_path}. Sie können es manuell von der Festplatte entfernen.', + }-Datei {file_key}. Sie können es manuell von der Festplatte entfernen.', 'sameSlugError' => 'Eine Folge mit dem ausgewählten Slug existiert bereits.', ], 'form' => [ diff --git a/modules/Admin/Language/el/Episode.php b/modules/Admin/Language/el/Episode.php index 6bd5c6a1..b7e2bbc6 100644 --- a/modules/Admin/Language/el/Episode.php +++ b/modules/Admin/Language/el/Episode.php @@ -85,7 +85,7 @@ return [ image {καλύψτε} audio {ήχος} other {πολυμέσα} - } αρχείο {file_path}. Μπορείτε να το αφαιρέσετε χειροκίνητα από το δίσκο σας.', + } αρχείο {file_key}. Μπορείτε να το αφαιρέσετε χειροκίνητα από το δίσκο σας.', 'sameSlugError' => 'Ένα επεισόδιο με το επιλεγμένο slug υπάρχει ήδη.', ], 'form' => [ diff --git a/modules/Admin/Language/en/Episode.php b/modules/Admin/Language/en/Episode.php index 98498bee..5ed5e3ac 100644 --- a/modules/Admin/Language/en/Episode.php +++ b/modules/Admin/Language/en/Episode.php @@ -86,7 +86,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/es/Episode.php b/modules/Admin/Language/es/Episode.php index 574759e9..d586f420 100644 --- a/modules/Admin/Language/es/Episode.php +++ b/modules/Admin/Language/es/Episode.php @@ -79,7 +79,7 @@ return [ audio {audio} other {media} }.', - 'deleteFileError' => 'Hubo un problema al tratar de eliminar el archivo {file_path} {type, select, + 'deleteFileError' => 'Hubo un problema al tratar de eliminar el archivo {file_key} {type, select, transcript {de la transcripción} chapters {de los episodios} image {de la portada} diff --git a/modules/Admin/Language/fa/Episode.php b/modules/Admin/Language/fa/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/fa/Episode.php +++ b/modules/Admin/Language/fa/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/fr/Episode.php b/modules/Admin/Language/fr/Episode.php index 51b8d4d7..5cf925c0 100644 --- a/modules/Admin/Language/fr/Episode.php +++ b/modules/Admin/Language/fr/Episode.php @@ -85,7 +85,7 @@ return [ image {couverture} audio {audio} other {média} - } fichier {file_path}. Vous pouvez le supprimer manuellement de votre disque.', + } fichier {file_key}. Vous pouvez le supprimer manuellement de votre disque.', 'sameSlugError' => 'Il existe déjà un épisode avec le slug choisi.', ], 'form' => [ diff --git a/modules/Admin/Language/gd/Episode.php b/modules/Admin/Language/gd/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/gd/Episode.php +++ b/modules/Admin/Language/gd/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/gl/Episode.php b/modules/Admin/Language/gl/Episode.php index aa6e2a88..7e28539c 100644 --- a/modules/Admin/Language/gl/Episode.php +++ b/modules/Admin/Language/gl/Episode.php @@ -85,7 +85,7 @@ return [ image {da imaxe} audio {do audio} other {do multimedia} - } {file_path}. Deberías eliminala manualmente do disco.', + } {file_key}. Deberías eliminala manualmente do disco.', 'sameSlugError' => 'Xa existe un episodio co id de url elexido.', ], 'form' => [ diff --git a/modules/Admin/Language/id/Episode.php b/modules/Admin/Language/id/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/id/Episode.php +++ b/modules/Admin/Language/id/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/it/Episode.php b/modules/Admin/Language/it/Episode.php index 6cb572a3..2e5a2673 100644 --- a/modules/Admin/Language/it/Episode.php +++ b/modules/Admin/Language/it/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/ko/Episode.php b/modules/Admin/Language/ko/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/ko/Episode.php +++ b/modules/Admin/Language/ko/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/nl/Episode.php b/modules/Admin/Language/nl/Episode.php index 60845744..7b3f428c 100644 --- a/modules/Admin/Language/nl/Episode.php +++ b/modules/Admin/Language/nl/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/nn-NO/Episode.php b/modules/Admin/Language/nn-NO/Episode.php index 12a3672a..ab6ebe91 100644 --- a/modules/Admin/Language/nn-NO/Episode.php +++ b/modules/Admin/Language/nn-NO/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/oc/Episode.php b/modules/Admin/Language/oc/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/oc/Episode.php +++ b/modules/Admin/Language/oc/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/pl/Episode.php b/modules/Admin/Language/pl/Episode.php index ee45c805..4cb167b3 100644 --- a/modules/Admin/Language/pl/Episode.php +++ b/modules/Admin/Language/pl/Episode.php @@ -86,7 +86,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-BR/Episode.php index 0f54fe01..fbd6d601 100644 --- a/modules/Admin/Language/pt-BR/Episode.php +++ b/modules/Admin/Language/pt-BR/Episode.php @@ -85,7 +85,7 @@ return [ image {capa} audio {áudio} other {mídia} - } {file_path}. Você pode removê-lo manualmente do seu disco.', + } {file_key}. Você pode removê-lo manualmente do seu disco.', 'sameSlugError' => 'Um episódio com o slug escolhido já existe.', ], 'form' => [ diff --git a/modules/Admin/Language/pt/Episode.php b/modules/Admin/Language/pt/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/pt/Episode.php +++ b/modules/Admin/Language/pt/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/ro/Episode.php b/modules/Admin/Language/ro/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/ro/Episode.php +++ b/modules/Admin/Language/ro/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/ru/Episode.php b/modules/Admin/Language/ru/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/ru/Episode.php +++ b/modules/Admin/Language/ru/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php index 69edd601..f44c663a 100644 --- a/modules/Admin/Language/sk/Episode.php +++ b/modules/Admin/Language/sk/Episode.php @@ -89,7 +89,7 @@ return [ image {obrázok} audio {zvuk} other {médiá} - } súbor {file_path}. Môžete ho z disku odstrániť ručne.', + } súbor {file_key}. Môžete ho z disku odstrániť ručne.', 'sameSlugError' => 'Epizóda s takýmto trvalým odkazom už existuje.', ], 'form' => [ diff --git a/modules/Admin/Language/sr_Latn/Episode.php b/modules/Admin/Language/sr_Latn/Episode.php index 91313a7c..713b517b 100644 --- a/modules/Admin/Language/sr_Latn/Episode.php +++ b/modules/Admin/Language/sr_Latn/Episode.php @@ -85,7 +85,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ diff --git a/modules/Admin/Language/sv/Episode.php b/modules/Admin/Language/sv/Episode.php index 4daf1a0b..98280f8d 100644 --- a/modules/Admin/Language/sv/Episode.php +++ b/modules/Admin/Language/sv/Episode.php @@ -85,7 +85,7 @@ return [ image {omslag} audio {ljud} other {media} - } fil {file_path}. Du kan manuellt ta bort den från disken.', + } fil {file_key}. Du kan manuellt ta bort den från disken.', 'sameSlugError' => 'Ett avsnitt med den valda slug finns redan.', ], 'form' => [ diff --git a/modules/Admin/Language/zh-Hans/Episode.php b/modules/Admin/Language/zh-Hans/Episode.php index 736faa96..6495f1a3 100644 --- a/modules/Admin/Language/zh-Hans/Episode.php +++ b/modules/Admin/Language/zh-Hans/Episode.php @@ -85,7 +85,7 @@ return [ image {封面} audio {音频} other {媒体} - } 文件 {file_path}。您可以手动将其从磁盘删除。', + } 文件 {file_key}。您可以手动将其从磁盘删除。', 'sameSlugError' => '选中的剧集已存在。', ], 'form' => [ diff --git a/modules/Analytics/Config/Analytics.php b/modules/Analytics/Config/Analytics.php index 2d08ad04..c4f5ca59 100644 --- a/modules/Analytics/Config/Analytics.php +++ b/modules/Analytics/Config/Analytics.php @@ -59,9 +59,7 @@ class Analytics extends BaseConfig */ public function getAudioUrl(Episode $episode, array $params): string { - helper(['media', 'setting']); - - $audioFileURI = new URI(media_base_url($episode->audio->file_path)); + $audioFileURI = new URI(service('file_manager')->getUrl($episode->audio->file_key)); $audioFileURI->setQueryArray($params); // Wrap episode url with OP3 if episode is public and OP3 is enabled on this podcast diff --git a/modules/Analytics/Models/AnalyticsPodcastModel.php b/modules/Analytics/Models/AnalyticsPodcastModel.php index fee1ae44..f433bdb5 100644 --- a/modules/Analytics/Models/AnalyticsPodcastModel.php +++ b/modules/Analytics/Models/AnalyticsPodcastModel.php @@ -13,9 +13,9 @@ declare(strict_types=1); namespace Modules\Analytics\Models; use App\Entities\Media\BaseMedia; -use App\Models\MediaModel; use CodeIgniter\Model; use Modules\Analytics\Entities\AnalyticsPodcasts; +use Modules\Media\Models\MediaModel; class AnalyticsPodcastModel extends Model { diff --git a/modules/Auth/Commands/RolesDoc.php b/modules/Auth/Commands/RolesDoc.php index fdd8833e..35475783 100644 --- a/modules/Auth/Commands/RolesDoc.php +++ b/modules/Auth/Commands/RolesDoc.php @@ -171,11 +171,11 @@ class RolesDoc extends BaseCommand return $newFileContents; } - private function detectLocaleFromPath($filePath): string + private function detectLocaleFromPath($fileKey): string { preg_match( '~docs\/src\/(?:([a-z]{2}(?:-[A-Za-z]{2,})?)\/)getting-started\/auth\.md~', - (string) $filePath, + (string) $fileKey, $match ); diff --git a/modules/Fediverse/Helpers/fediverse_helper.php b/modules/Fediverse/Helpers/fediverse_helper.php index f4500585..8a86486d 100644 --- a/modules/Fediverse/Helpers/fediverse_helper.php +++ b/modules/Fediverse/Helpers/fediverse_helper.php @@ -362,7 +362,7 @@ if (! function_exists('linkify')) { $text = match ($protocol) { 'http', 'https' => preg_replace_callback( '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(? + */ + public array $fileManagers = [ + 'fs' => FS::class, + 's3' => S3::class, + ]; + + /** + * @var array + */ + public array $s3 = [ + 'bucket' => 'castopod', + 'key' => '', + 'secret' => '', + 'region' => '', + 'protocol' => '', + 'endpoint' => '', + 'debug' => false, + 'path_style_endpoint' => false, + ]; + + /** + * -------------------------------------------------------------------------- + * Media Base URL + * -------------------------------------------------------------------------- + * + * URL to your media root. Typically this will be your base URL, + * WITH a trailing slash: + * + * http://cdn.example.com/ + */ + public string $baseURL = 'http://localhost:8080/'; + + /** + * -------------------------------------------------------------------------- + * Media root folder + * -------------------------------------------------------------------------- + * Defines the root folder for media files storage + */ + public string $root = 'media'; + + /** + * @var array + */ + public array $folders = [ + 'podcasts' => 'podcasts', + 'persons' => 'persons', + ]; +} diff --git a/modules/Media/Config/Services.php b/modules/Media/Config/Services.php new file mode 100644 index 00000000..bb66d217 --- /dev/null +++ b/modules/Media/Config/Services.php @@ -0,0 +1,42 @@ +fileManagers[$config->fileManager]; + + $fileManager = new $fileManagerClass($config); + + if ($fileManager instanceof FileManagerInterface) { + return $fileManager; + } + + throw new Exception('File Manager service must extend FileManagerInterface'); + } +} diff --git a/app/Database/Migrations/2021-05-29-120000_add_media.php b/modules/Media/Database/Migrations/2021-05-29-120000_add_media.php similarity index 95% rename from app/Database/Migrations/2021-05-29-120000_add_media.php rename to modules/Media/Database/Migrations/2021-05-29-120000_add_media.php index 732f51e2..9ddef693 100644 --- a/app/Database/Migrations/2021-05-29-120000_add_media.php +++ b/modules/Media/Database/Migrations/2021-05-29-120000_add_media.php @@ -8,7 +8,7 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Database\Migrations; +namespace Media\Database\Migrations; use CodeIgniter\Database\Migration; @@ -22,7 +22,7 @@ class AddMedia extends Migration 'unsigned' => true, 'auto_increment' => true, ], - 'file_path' => [ + 'file_key' => [ 'type' => 'VARCHAR', 'constraint' => 255, ], @@ -72,7 +72,7 @@ class AddMedia extends Migration ]); $this->forge->addKey('id', true); - $this->forge->addUniqueKey('file_path'); + $this->forge->addUniqueKey('file_key'); $this->forge->addForeignKey('uploaded_by', 'users', 'id'); $this->forge->addForeignKey('updated_by', 'users', 'id'); $this->forge->createTable('media'); diff --git a/modules/Media/Database/Migrations/2022-30-12-180000_rename_media_file_path.php b/modules/Media/Database/Migrations/2022-30-12-180000_rename_media_file_path.php new file mode 100644 index 00000000..840b851f --- /dev/null +++ b/modules/Media/Database/Migrations/2022-30-12-180000_rename_media_file_path.php @@ -0,0 +1,40 @@ + [ + 'name' => 'file_key', + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + ]; + $this->forge->modifyColumn('media', $fields); + } + + public function down(): void + { + $fields = [ + 'file_key' => [ + 'name' => 'file_key', + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + ]; + $this->forge->modifyColumn('media', $fields); + } +} diff --git a/app/Entities/Media/Audio.php b/modules/Media/Entities/Audio.php similarity index 93% rename from app/Entities/Media/Audio.php rename to modules/Media/Entities/Audio.php index 29b304b3..3f494e69 100644 --- a/app/Entities/Media/Audio.php +++ b/modules/Media/Entities/Audio.php @@ -8,7 +8,7 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Entities\Media; +namespace Modules\Media\Entities; use CodeIgniter\Files\File; use JamesHeinrich\GetID3\GetID3; @@ -39,7 +39,7 @@ class Audio extends BaseMedia parent::setFile($file); $getID3 = new GetID3(); - $audioMetadata = $getID3->analyze(media_path($this->file_path)); + $audioMetadata = $getID3->analyze($file->getRealPath()); // remove heavy image data from metadata unset($audioMetadata['comments']['picture']); diff --git a/app/Entities/Media/BaseMedia.php b/modules/Media/Entities/BaseMedia.php similarity index 60% rename from app/Entities/Media/BaseMedia.php rename to modules/Media/Entities/BaseMedia.php index 4bb9b0a1..d293ef6b 100644 --- a/app/Entities/Media/BaseMedia.php +++ b/modules/Media/Entities/BaseMedia.php @@ -8,20 +8,22 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Entities\Media; +namespace Modules\Media\Entities; -use App\Models\MediaModel; -use CodeIgniter\Database\BaseResult; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; +use Modules\Media\FileManagers\FileManagerInterface; +use Modules\Media\FileManagers\FS; +use Modules\Media\FileManagers\S3; +use Modules\Media\Models\MediaModel; /** * @property int $id - * @property string $file_path + * @property string $file_key * @property string $file_url + * @property string $file_name * @property string $file_directory * @property string $file_extension - * @property string $file_name * @property int $file_size * @property string $file_mimetype * @property array|null $file_metadata @@ -45,8 +47,7 @@ class BaseMedia extends Entity */ protected $casts = [ 'id' => 'integer', - 'file_extension' => 'string', - 'file_path' => 'string', + 'file_key' => 'string', 'file_size' => 'int', 'file_mimetype' => 'string', 'file_metadata' => '?json-array', @@ -57,27 +58,41 @@ class BaseMedia extends Entity 'updated_by' => 'integer', ]; + protected FileManagerInterface $fileManager; + /** * @param array|null $data + * @param 'fs'|'s3'|null $fileManager */ - public function __construct(array $data = null) + public function __construct(array $data = null, string $fileManager = null) { parent::__construct($data); + if ($fileManager !== null) { + $this->fileManager = match ($fileManager) { + 'fs' => new FS(config('Media')), + 's3' => new S3(config('Media')) + }; + } else { + /** @var FileManagerInterface $fileManagerService */ + $fileManagerService = service('file_manager'); + + $this->fileManager = $fileManagerService; + } + $this->initFileProperties(); } public function initFileProperties(): void { - if ($this->file_path !== '') { - helper('media'); + if ($this->file_key !== '') { [ 'filename' => $filename, 'dirname' => $dirname, 'extension' => $extension, - ] = pathinfo($this->file_path); + ] = pathinfo($this->file_key); - $this->attributes['file_url'] = media_base_url($this->file_path); + $this->attributes['file_url'] = $this->fileManager->getUrl($this->file_key); $this->attributes['file_name'] = $filename; $this->attributes['file_directory'] = $dirname; $this->attributes['file_extension'] = $extension; @@ -86,49 +101,49 @@ class BaseMedia extends Entity public function setFile(File $file): self { - helper('media'); - $this->attributes['type'] = $this->type; $this->attributes['file_mimetype'] = $file->getMimeType(); $this->attributes['file_metadata'] = json_encode(lstat((string) $file), JSON_INVALID_UTF8_IGNORE); - $this->attributes['file_path'] = save_media( - $file, - $this->attributes['file_directory'], - $this->attributes['file_name'] - ); - if ($filesize = filesize(media_path($this->file_path))) { + + if ($filesize = $file->getSize()) { $this->attributes['file_size'] = $filesize; } + $this->attributes['file'] = $file; + return $this; } - public function deleteFile(): bool + public function saveFile(): bool { - helper('media'); - return unlink(media_path($this->file_path)); + if (! $this->attributes['file'] || ! $this->file_key) { + return false; + } + + $this->attributes['file_key'] = $this->fileManager->save($this->attributes['file'], $this->file_key); + + return true; } - public function delete(): bool|BaseResult + public function deleteFile(): bool { - $mediaModel = new MediaModel(); - return $mediaModel->delete($this->id); + return $this->fileManager->delete($this->file_key); } public function rename(): bool { - $newFilePath = $this->file_directory . '/' . (new File(''))->getRandomName() . '.' . $this->file_extension; + $newFileKey = $this->file_directory . '/' . (new File(''))->getRandomName() . '.' . $this->file_extension; $db = db_connect(); $db->transStart(); if (! (new MediaModel())->update($this->id, [ - 'file_path' => $newFilePath, + 'file_key' => $newFileKey, ])) { return false; } - if (! rename(media_path($this->file_path), media_path($newFilePath))) { + if (! $this->fileManager->rename($this->file_key, $newFileKey)) { $db->transRollback(); return false; } diff --git a/app/Entities/Media/Chapters.php b/modules/Media/Entities/Chapters.php similarity index 88% rename from app/Entities/Media/Chapters.php rename to modules/Media/Entities/Chapters.php index 227cb5af..fe66c59e 100644 --- a/app/Entities/Media/Chapters.php +++ b/modules/Media/Entities/Chapters.php @@ -8,7 +8,7 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Entities\Media; +namespace Modules\Media\Entities; class Chapters extends BaseMedia { diff --git a/app/Entities/Media/Document.php b/modules/Media/Entities/Document.php similarity index 88% rename from app/Entities/Media/Document.php rename to modules/Media/Entities/Document.php index 705f2a3a..7a540862 100644 --- a/app/Entities/Media/Document.php +++ b/modules/Media/Entities/Document.php @@ -8,7 +8,7 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Entities\Media; +namespace Modules\Media\Entities; class Document extends BaseMedia { diff --git a/modules/Media/Entities/Image.php b/modules/Media/Entities/Image.php new file mode 100644 index 00000000..9f45bacc --- /dev/null +++ b/modules/Media/Entities/Image.php @@ -0,0 +1,169 @@ +> + */ + protected array $sizes = []; + + public function initFileProperties(): void + { + parent::initFileProperties(); + + if ($this->file_key !== '' && $this->file_metadata !== null && array_key_exists( + 'sizes', + $this->file_metadata + )) { + $this->sizes = $this->file_metadata['sizes']; + $this->initSizeProperties(); + } + } + + public function initSizeProperties(): bool + { + helper('filesystem'); + + $fileKeyWithoutExt = path_without_ext($this->file_key); + + foreach ($this->sizes as $name => $size) { + $extension = array_key_exists('extension', $size) ? $size['extension'] : $this->file_extension; + $mimetype = array_key_exists('mimetype', $size) ? $size['mimetype'] : $this->file_mimetype; + + $this->{$name . '_key'} = $fileKeyWithoutExt . '_' . $name . '.' . $extension; + $this->{$name . '_url'} = $this->fileManager->getUrl($this->{$name . '_key'}); + $this->{$name . '_mimetype'} = $mimetype; + } + + return true; + } + + /** + * @param array $data + */ + public function setAttributes(array $data): self + { + parent::setAttributes($data); + + if ($this->attributes === []) { + return $this; + } + + if ($this->file_metadata !== [] && array_key_exists('sizes', $this->file_metadata)) { + $this->sizes = $this->file_metadata['sizes']; + $this->attributes['sizes'] = $this->file_metadata['sizes']; + $this->initFileProperties(); + $this->initSizeProperties(); + } + + return $this; + } + + public function setFile(File $file): self + { + parent::setFile($file); + + if ($this->file_mimetype === 'image/jpeg' && $metadata = @exif_read_data( + $file->getRealPath(), + null, + true + )) { + $metadata['sizes'] = $this->attributes['sizes']; + $this->attributes['file_size'] = $metadata['FILE']['FileSize']; + } else { + $metadata = [ + 'sizes' => $this->attributes['sizes'], + ]; + } + + $this->attributes['file_metadata'] = json_encode($metadata, JSON_INVALID_UTF8_IGNORE); + + return $this; + } + + public function saveFile(): bool + { + if ($this->attributes['sizes'] !== []) { + $this->initFileProperties(); + $this->saveSizes(); + } + + return parent::saveFile(); + } + + public function deleteFile(): bool + { + if (parent::deleteFile()) { + return $this->deleteSizes(); + } + + return false; + } + + public function saveSizes(): void + { + $tempImagePath = ''; + if (! array_key_exists('file', $this->attributes) && $this->file_key) { + // no original file instance set to save sizes from + + // download image temporarily to generate sizes from + $tempImagePath = (string) tempnam(WRITEPATH . 'temp', 'img_'); + $imageContent = $this->fileManager->getFileContents($this->file_key); + file_put_contents($tempImagePath, $imageContent); + + $this->attributes['file'] = new File($tempImagePath, true); + } + + // save derived sizes + $imageService = Services::image(); + + foreach ($this->sizes as $name => $size) { + $tempFilePath = tempnam(WRITEPATH . 'temp', 'img_'); + $imageService + ->withFile($this->attributes['file']->getRealPath()) + ->resize($size['width'], $size['height']) + ->save($tempFilePath); + + $newImage = new File($tempFilePath, true); + + $this->fileManager + ->save($newImage, $this->{$name . '_key'}); + } + + if ($tempImagePath !== '') { + unlink($tempImagePath); + } + } + + private function deleteSizes(): bool + { + // delete all derived sizes + foreach (array_keys($this->sizes) as $name) { + $pathProperty = $name . '_key'; + + if (! $this->fileManager->delete($this->{$pathProperty})) { + return false; + } + } + + return true; + } +} diff --git a/modules/Media/Entities/Transcript.php b/modules/Media/Entities/Transcript.php new file mode 100644 index 00000000..4ad7cdcb --- /dev/null +++ b/modules/Media/Entities/Transcript.php @@ -0,0 +1,104 @@ +file_key && $this->file_metadata && array_key_exists('json_key', $this->file_metadata)) { + helper('media'); + + $this->json_key = $this->file_metadata['json_key']; + $this->json_url = $this->fileManager + ->getUrl($this->json_key); + } + } + + public function setFile(File $file): self + { + parent::setFile($file); + + $metadata = lstat((string) $file) ?? []; + + helper('filesystem'); + + $fileKeyWithoutExt = path_without_ext($this->file_key); + + $jsonfileKey = $fileKeyWithoutExt . '.json'; + + // set metadata (generated json file path) + $this->json_key = $jsonfileKey; + $metadata['json_key'] = $this->json_key; + + $this->attributes['file_metadata'] = json_encode($metadata, JSON_INVALID_UTF8_IGNORE); + + $this->file = $file; + + return $this; + } + + public function saveFile(): bool + { + $this->saveJsonTranscript(); + + return parent::saveFile(); + } + + public function deleteFile(): bool + { + if (! parent::deleteFile()) { + return false; + } + + if ($this->json_key) { + return $this->fileManager->delete($this->json_key); + } + + return true; + } + + private function saveJsonTranscript(): bool + { + $srtContent = file_get_contents($this->file->getRealPath()); + + $transcriptParser = new TranscriptParser(); + + if ($srtContent === false) { + return false; + } + + if (! $transcriptJson = $transcriptParser->loadString($srtContent)->parseSrt()) { + return false; + } + + $tempFilePath = WRITEPATH . 'uploads/' . $this->file->getRandomName(); + file_put_contents($tempFilePath, $transcriptJson); + + $newTranscriptJson = new File($tempFilePath, true); + + $this->fileManager + ->save($newTranscriptJson, $this->json_key); + + return true; + } +} diff --git a/app/Entities/Media/Video.php b/modules/Media/Entities/Video.php similarity index 87% rename from app/Entities/Media/Video.php rename to modules/Media/Entities/Video.php index dd7f8658..5c2d692b 100644 --- a/app/Entities/Media/Video.php +++ b/modules/Media/Entities/Video.php @@ -8,7 +8,7 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Entities\Media; +namespace Modules\Media\Entities; class Video extends BaseMedia { diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php new file mode 100644 index 00000000..80c03547 --- /dev/null +++ b/modules/Media/FileManagers/FS.php @@ -0,0 +1,135 @@ +config = $config; + } + + /** + * Saves a file to the corresponding folder in `public/media` + */ + public function save(File $file, string $path): string | false + { + if ((pathinfo($path, PATHINFO_EXTENSION) === '') && (($extension = $file->getExtension()) !== '')) { + $path = $path . '.' . $extension; + } + + $mediaRoot = $this->config->root; + + if (! file_exists(dirname($mediaRoot . '/' . $path))) { + mkdir(dirname($mediaRoot . '/' . $path), 0777, true); + } + + if (! file_exists(dirname($mediaRoot . '/' . $path) . '/index.html')) { + touch(dirname($mediaRoot . '/' . $path) . '/index.html'); + } + + try { + // move to media folder, overwrite file if already existing + $file->move($mediaRoot . '/', $path, true); + } catch (Exception) { + return false; + } + + return $path; + } + + public function delete(string $key): bool + { + helper('media'); + + return unlink(media_path($key)); + } + + public function getUrl(string $key): string + { + $appConfig = config('App'); + $mediaBaseUrl = $this->config->baseURL === '' ? $appConfig->baseURL : $this->config->baseURL; + + return rtrim((string) $mediaBaseUrl, '/') . + '/' . + $this->config->root . + '/' . + $key; + } + + public function rename(string $oldKey, string $newKey): bool + { + helper('media'); + + return rename(media_path($oldKey), media_path($newKey)); + } + + public function getFileContents(string $key): string + { + helper('media'); + + return (string) file_get_contents(media_path($key)); + } + + public function getFileInput(string $key): string + { + helper('media'); + + return media_path($key); + } + + public function deletePodcastImageSizes(string $podcastHandle): bool + { + helper('media'); + + $allPodcastImagesPaths = []; + foreach (['jpg', 'png', 'webp'] as $ext) { + $images = glob(media_path("/podcasts/{$podcastHandle}/*_*{$ext}")); + + if (! $images) { + return false; + } + + array_push($allPodcastImagesPaths, ...$images); + } + + foreach ($allPodcastImagesPaths as $podcastImagePath) { + if (is_file($podcastImagePath)) { + unlink($podcastImagePath); + } + } + + return true; + } + + public function deletePersonImagesSizes(): bool + { + helper('media'); + + $allPersonsImagesPaths = []; + foreach (['jpg', 'png', 'webp'] as $ext) { + $images = glob(media_path("/persons/*_*{$ext}")); + + if (! $images) { + return false; + } + + array_push($allPersonsImagesPaths, ...$images); + } + + foreach ($allPersonsImagesPaths as $personImagePath) { + if (is_file($personImagePath)) { + unlink($personImagePath); + } + } + + return true; + } +} diff --git a/modules/Media/FileManagers/FileManagerInterface.php b/modules/Media/FileManagers/FileManagerInterface.php new file mode 100644 index 00000000..3b53afa7 --- /dev/null +++ b/modules/Media/FileManagers/FileManagerInterface.php @@ -0,0 +1,26 @@ +s3 = new S3Client([ + 'version' => 'latest', + 'region' => $config->s3['region'], + 'endpoint' => $config->s3['endpoint'], + 'credentials' => new Credentials((string) $config->s3['key'], (string) $config->s3['secret']), + 'debug' => $config->s3['debug'], + 'use_path_style_endpoint' => $config->s3['path_style_endpoint'], + ]); + + // create bucket if it does not already exist + if (! $this->s3->doesBucketExist((string) $this->config->s3['bucket'])) { + try { + $this->s3->createBucket([ + 'Bucket' => $this->config->s3['bucket'], + ]); + } catch (Exception $exception) { + log_message('critical', $exception->getMessage()); + } + } + } + + public function save(File $file, string $key): string|false + { + try { + $this->s3->putObject([ + 'Bucket' => $this->config->s3['bucket'], + 'Key' => $key, + 'SourceFile' => $file, + ]); + } catch (Exception) { + return false; + } + + // delete file after storage in s3 + unlink($file->getRealPath()); + + return $key; + } + + public function delete(string $key): bool + { + try { + $this->s3->deleteObject([ + 'Bucket' => $this->config->s3['bucket'], + 'Key' => $key, + ]); + } catch (Exception) { + return false; + } + + return true; + } + + public function getUrl(string $key): string + { + $url = new URI((string) $this->config->s3['endpoint']); + + if ($this->config->s3['path_style_endpoint'] === true) { + $url->setPath($this->config->s3['bucket'] . '/' . $key); + return (string) $url; + } + + $url->setHost($this->config->s3['bucket'] . '.' . $url->getHost()); + $url->setPath($key); + return (string) $url; + } + + public function rename(string $oldKey, string $newKey): bool + { + try { + // copy old object with new key + $this->s3->copyObject([ + 'Bucket' => $this->config->s3['bucket'], + 'CopySource' => $this->config->s3['bucket'] . '/' . $oldKey, + 'Key' => $newKey, + ]); + } catch (Exception) { + return false; + } + + // delete old object + return $this->delete($oldKey); + } + + public function getFileContents(string $key): string + { + $result = $this->s3->getObject([ + 'Bucket' => $this->config->s3['bucket'], + 'Key' => $key, + ]); + + return (string) $result->get('Body'); + } + + public function getFileInput(string $key): string + { + return $this->getUrl($key); + } + + public function deletePodcastImageSizes(string $podcastHandle): bool + { + $results = $this->s3->getPaginator('ListObjectsV2', [ + 'Bucket' => $this->config->s3['bucket'], + 'Prefix' => 'podcasts/' . $podcastHandle . '/', + ]); + + $keys = []; + foreach ($results as $result) { + $key = array_map(static function ($object) { + return $object['Key']; + }, $result['Contents']); + + array_push($keys, ...preg_grep("~^podcasts\/{$podcastHandle}\/.*_.*.\.(jpg|png|webp)$~", $key)); + } + + $objectsToDelete = array_map(static function ($key): array { + return [ + 'Key' => $key, + ]; + }, $keys); + + if ($objectsToDelete === []) { + return true; + } + + try { + $this->s3->deleteObjects([ + 'Bucket' => $this->config->s3['bucket'], + 'Delete' => [ + 'Objects' => $objectsToDelete, + ], + ]); + } catch (Exception) { + return false; + } + + return true; + } + + public function deletePersonImagesSizes(): bool + { + $objects = $this->s3->getIterator('ListObjectsV2', [ + 'Bucket' => $this->config->s3['bucket'], + 'prefix' => 'persons/', + ]); + + $objectsKeys = array_map(static function ($object) { + return $object['Key']; + }, iterator_to_array($objects)); + + $podcastImageKeys = preg_grep("~^persons\/.*_.*.\.(jpg|png|webp)$~", $objectsKeys); + return (bool) $podcastImageKeys; + } +} diff --git a/modules/Media/Helpers/filesystem_helper.php b/modules/Media/Helpers/filesystem_helper.php new file mode 100644 index 00000000..0cff140c --- /dev/null +++ b/modules/Media/Helpers/filesystem_helper.php @@ -0,0 +1,27 @@ +getExtension()) !== '') { - $filename = $filename . '.' . $extension; - } - - $mediaRoot = config('App') - ->mediaRoot . '/' . $folder; - - if (! file_exists($mediaRoot)) { - mkdir($mediaRoot, 0777, true); - } - - if (! file_exists($mediaRoot . '/index.html')) { - touch($mediaRoot . '/index.html'); - } - - // move to media folder, overwrite file if already existing - $file->move($mediaRoot . '/', $filename, true); - - return $folder . '/' . $filename; - } -} - if (! function_exists('download_file')) { function download_file(string $fileUrl, string $mimetype = ''): File { @@ -86,10 +57,10 @@ if (! function_exists('download_file')) { bin2hex(random_bytes(10)) . '.' . $extension; - $tmpFilePath = WRITEPATH . 'uploads/' . $tmpFilename; - file_put_contents($tmpFilePath, $response->getBody()); + $tmpfileKey = WRITEPATH . 'uploads/' . $tmpFilename; + file_put_contents($tmpfileKey, $response->getBody()); - return new File($tmpFilePath); + return new File($tmpfileKey); } } @@ -108,32 +79,6 @@ if (! function_exists('media_path')) { $uri = trim($uri, '/'); - return config('App')->mediaRoot . '/' . $uri; - } -} - -if (! function_exists('media_base_url')) { - /** - * Return the media base URL to use in views - * - * @param string|string[] $uri URI string or array of URI segments - */ - function media_base_url(string | array $uri = ''): string - { - // convert segment array to string - if (is_array($uri)) { - $uri = implode('/', $uri); - } - - $uri = trim($uri, '/'); - - $appConfig = config('App'); - $mediaBaseUrl = $appConfig->mediaBaseURL === '' ? $appConfig->baseURL : $appConfig->mediaBaseURL; - - return rtrim((string) $mediaBaseUrl, '/') . - '/' . - $appConfig->mediaRoot . - '/' . - $uri; + return config('Media')->root . '/' . $uri; } } diff --git a/app/Models/MediaModel.php b/modules/Media/Models/MediaModel.php similarity index 77% rename from app/Models/MediaModel.php rename to modules/Media/Models/MediaModel.php index c35263ba..38bdb1f4 100644 --- a/app/Models/MediaModel.php +++ b/modules/Media/Models/MediaModel.php @@ -8,18 +8,18 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Models; +namespace Modules\Media\Models; -use App\Entities\Media\Audio; -use App\Entities\Media\Chapters; -use App\Entities\Media\Document; -use App\Entities\Media\Image; -use App\Entities\Media\Transcript; -use App\Entities\Media\Video; use CodeIgniter\Database\BaseResult; use CodeIgniter\Database\ConnectionInterface; use CodeIgniter\Model; use CodeIgniter\Validation\ValidationInterface; +use Modules\Media\Entities\Audio; +use Modules\Media\Entities\Chapters; +use Modules\Media\Entities\Document; +use Modules\Media\Entities\Image; +use Modules\Media\Entities\Transcript; +use Modules\Media\Entities\Video; class MediaModel extends Model { @@ -52,7 +52,7 @@ class MediaModel extends Model */ protected $allowedFields = [ 'id', - 'file_path', + 'file_key', 'file_size', 'file_mimetype', 'file_metadata', @@ -86,26 +86,14 @@ class MediaModel extends Model ConnectionInterface &$db = null, ValidationInterface $validation = null ) { - switch ($fileType) { - case 'audio': - $this->returnType = Audio::class; - break; - case 'video': - $this->returnType = Video::class; - break; - case 'image': - $this->returnType = Image::class; - break; - case 'transcript': - $this->returnType = Transcript::class; - break; - case 'chapters': - $this->returnType = Chapters::class; - break; - default: - // do nothing, keep Document class as default - break; - } + $this->returnType = match ($fileType) { + 'audio' => Audio::class, + 'video' => Video::class, + 'image' => Image::class, + 'transcript' => Transcript::class, + 'chapters' => Chapters::class, + default => Document::class + }; parent::__construct($db, $validation); } @@ -135,8 +123,15 @@ class MediaModel extends Model */ public function saveMedia(object $media): int | false { + // save file first + if (! $media->saveFile()) { + return false; + } + // insert record in database if (! $mediaId = $this->insert($media, true)) { + $this->db->transRollback(); + return false; } @@ -148,6 +143,11 @@ class MediaModel extends Model */ public function updateMedia(object $media): bool { + // save file first + if (! $media->saveFile()) { + return false; + } + return $this->update($media->id, $media); } @@ -166,9 +166,14 @@ class MediaModel extends Model return $result; } - public function deleteMedia(object $media): bool|BaseResult + /** + * @param Document|Audio|Video|Image|Transcript|Chapters $media + */ + public function deleteMedia($media): bool|BaseResult { - $media->deleteFile(); + if (! $media->deleteFile()) { + return false; + } return $this->delete($media->id); } diff --git a/app/Libraries/TranscriptParser.php b/modules/Media/TranscriptParser.php similarity index 99% rename from app/Libraries/TranscriptParser.php rename to modules/Media/TranscriptParser.php index b0f7f364..3034e388 100644 --- a/app/Libraries/TranscriptParser.php +++ b/modules/Media/TranscriptParser.php @@ -10,7 +10,7 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Libraries; +namespace Modules\Media; use stdClass; diff --git a/package.json b/package.json index 1b8cdff8..5490d8c4 100644 --- a/package.json +++ b/package.json @@ -29,12 +29,12 @@ "dependencies": { "@amcharts/amcharts4": "^4.10.34", "@amcharts/amcharts4-geodata": "^4.1.26", - "@codemirror/commands": "^6.2.1", + "@codemirror/commands": "^6.2.2", "@codemirror/lang-xml": "^6.0.2", "@codemirror/language": "^6.6.0", "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.9.1", - "@floating-ui/dom": "^1.2.1", + "@codemirror/view": "^6.9.2", + "@floating-ui/dom": "^1.2.4", "@github/clipboard-copy-element": "^1.1.2", "@github/hotkey": "^2.0.1", "@github/markdown-toolbar-element": "^2.1.1", @@ -48,8 +48,8 @@ "leaflet.markercluster": "^1.5.3", "lit": "^2.6.1", "marked": "^4.2.12", - "wavesurfer.js": "^6.4.0", - "xml-formatter": "^3.2.0" + "wavesurfer.js": "^6.5.2", + "xml-formatter": "^3.3.2" }, "devDependencies": { "@commitlint/cli": "^17.4.4", @@ -61,22 +61,22 @@ "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.2", "@tailwindcss/typography": "^0.5.9", - "@types/leaflet": "^1.9.1", + "@types/leaflet": "^1.9.2", "@types/marked": "^4.0.8", "@types/wavesurfer.js": "^6.0.3", - "@typescript-eslint/eslint-plugin": "^5.53.0", - "@typescript-eslint/parser": "^5.53.0", + "@typescript-eslint/eslint-plugin": "^5.55.0", + "@typescript-eslint/parser": "^5.55.0", "all-contributors-cli": "^6.24.0", "commitizen": "^4.3.0", "cross-env": "^7.0.3", "cssnano": "^5.1.15", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.34.0", - "eslint-config-prettier": "^8.6.0", + "eslint": "^8.36.0", + "eslint-config-prettier": "^8.7.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.3", "is-ci": "^3.0.1", - "lint-staged": "^13.1.2", + "lint-staged": "^13.2.0", "postcss": "^8.4.21", "postcss-import": "^15.1.0", "postcss-nesting": "^11.2.1", @@ -84,13 +84,13 @@ "postcss-reporter": "^7.0.5", "prettier": "2.8.4", "prettier-plugin-organize-imports": "^3.2.2", - "semantic-release": "^20.1.0", + "semantic-release": "^20.1.1", "stylelint": "^15.2.0", "stylelint-config-standard": "^30.0.1", "svgo": "^3.0.2", "tailwindcss": "^3.2.7", "typescript": "^4.9.5", - "vite": "4.1.3", + "vite": "^4.1.4", "vite-plugin-pwa": "^0.14.4", "workbox-build": "^6.5.4", "workbox-core": "^6.5.4", diff --git a/phpstan.neon b/phpstan.neon index 4c46c3fa..8b88ce7b 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -11,6 +11,7 @@ parameters: - modules/Analytics/Helpers - modules/Auth/Helpers - modules/Fediverse/Helpers + - modules/Media/Helpers - modules/PremiumPodcasts/Helpers - vendor/codeigniter4/framework/system/Helpers - vendor/codeigniter4/settings/src/Helpers @@ -28,5 +29,5 @@ parameters: ignoreErrors: - '#Cannot access property [\$a-z_]+ on ((array\|)?object)#' - '#^Call to an undefined method CodeIgniter\\Database\\ConnectionInterface#' - - '#^Access to an undefined property App\\Entities\\Media\\Image#' + - '#^Access to an undefined property Modules\\Media\\Entities\\Image#' - '#^Call to an undefined method CodeIgniter\\HTTP\\RequestInterface#' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad6a2cca..abd13945 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,14 +3,14 @@ lockfileVersion: 5.4 specifiers: "@amcharts/amcharts4": ^4.10.34 "@amcharts/amcharts4-geodata": ^4.1.26 - "@codemirror/commands": ^6.2.1 + "@codemirror/commands": ^6.2.2 "@codemirror/lang-xml": ^6.0.2 "@codemirror/language": ^6.6.0 "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.9.1 + "@codemirror/view": ^6.9.2 "@commitlint/cli": ^17.4.4 "@commitlint/config-conventional": ^17.4.4 - "@floating-ui/dom": ^1.2.1 + "@floating-ui/dom": ^1.2.4 "@github/clipboard-copy-element": ^1.1.2 "@github/hotkey": ^2.0.1 "@github/markdown-toolbar-element": ^2.1.1 @@ -23,11 +23,11 @@ specifiers: "@tailwindcss/line-clamp": ^0.4.2 "@tailwindcss/nesting": 0.0.0-insiders.565cd3e "@tailwindcss/typography": ^0.5.9 - "@types/leaflet": ^1.9.1 + "@types/leaflet": ^1.9.2 "@types/marked": ^4.0.8 "@types/wavesurfer.js": ^6.0.3 - "@typescript-eslint/eslint-plugin": ^5.53.0 - "@typescript-eslint/parser": ^5.53.0 + "@typescript-eslint/eslint-plugin": ^5.55.0 + "@typescript-eslint/parser": ^5.55.0 "@vime/core": ^5.4.0 all-contributors-cli: ^6.24.0 choices.js: ^10.2.0 @@ -36,15 +36,15 @@ specifiers: cross-env: ^7.0.3 cssnano: ^5.1.15 cz-conventional-changelog: ^3.3.0 - eslint: ^8.34.0 - eslint-config-prettier: ^8.6.0 + eslint: ^8.36.0 + eslint-config-prettier: ^8.7.0 eslint-plugin-prettier: ^4.2.1 flatpickr: ^4.6.13 husky: ^8.0.3 is-ci: ^3.0.1 leaflet: ^1.9.3 leaflet.markercluster: ^1.5.3 - lint-staged: ^13.1.2 + lint-staged: ^13.2.0 lit: ^2.6.1 marked: ^4.2.12 postcss: ^8.4.21 @@ -54,30 +54,30 @@ specifiers: postcss-reporter: ^7.0.5 prettier: 2.8.4 prettier-plugin-organize-imports: ^3.2.2 - semantic-release: ^20.1.0 + semantic-release: ^20.1.1 stylelint: ^15.2.0 stylelint-config-standard: ^30.0.1 svgo: ^3.0.2 tailwindcss: ^3.2.7 typescript: ^4.9.5 - vite: 4.1.3 + vite: ^4.1.4 vite-plugin-pwa: ^0.14.4 - wavesurfer.js: ^6.4.0 + wavesurfer.js: ^6.5.2 workbox-build: ^6.5.4 workbox-core: ^6.5.4 workbox-routing: ^6.5.4 workbox-strategies: ^6.5.4 - xml-formatter: ^3.2.0 + xml-formatter: ^3.3.2 dependencies: "@amcharts/amcharts4": 4.10.34 "@amcharts/amcharts4-geodata": 4.1.26 - "@codemirror/commands": 6.2.1 - "@codemirror/lang-xml": 6.0.2_@codemirror+view@6.9.1 + "@codemirror/commands": 6.2.2 + "@codemirror/lang-xml": 6.0.2_@codemirror+view@6.9.2 "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.1 - "@floating-ui/dom": 1.2.1 + "@codemirror/view": 6.9.2 + "@floating-ui/dom": 1.2.4 "@github/clipboard-copy-element": 1.1.2 "@github/hotkey": 2.0.1 "@github/markdown-toolbar-element": 2.1.1 @@ -91,35 +91,35 @@ dependencies: leaflet.markercluster: 1.5.3_leaflet@1.9.3 lit: 2.6.1 marked: 4.2.12 - wavesurfer.js: 6.4.0 - xml-formatter: 3.2.0 + wavesurfer.js: 6.5.2 + xml-formatter: 3.3.2 devDependencies: "@commitlint/cli": 17.4.4 "@commitlint/config-conventional": 17.4.4 - "@semantic-release/changelog": 6.0.2_semantic-release@20.1.0 - "@semantic-release/exec": 6.0.3_semantic-release@20.1.0 - "@semantic-release/git": 10.0.1_semantic-release@20.1.0 - "@semantic-release/gitlab": 11.0.1_semantic-release@20.1.0 + "@semantic-release/changelog": 6.0.2_semantic-release@20.1.1 + "@semantic-release/exec": 6.0.3_semantic-release@20.1.1 + "@semantic-release/git": 10.0.1_semantic-release@20.1.1 + "@semantic-release/gitlab": 11.0.1_semantic-release@20.1.1 "@tailwindcss/forms": 0.5.3_tailwindcss@3.2.7 "@tailwindcss/line-clamp": 0.4.2_tailwindcss@3.2.7 "@tailwindcss/typography": 0.5.9_tailwindcss@3.2.7 - "@types/leaflet": 1.9.1 + "@types/leaflet": 1.9.2 "@types/marked": 4.0.8 "@types/wavesurfer.js": 6.0.3 - "@typescript-eslint/eslint-plugin": 5.53.0_ny4s7qc6yg74faf3d6xty2ofzy - "@typescript-eslint/parser": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm + "@typescript-eslint/eslint-plugin": 5.55.0_342y7v4tc7ytrrysmit6jo4wri + "@typescript-eslint/parser": 5.55.0_vgl77cfdswitgr47lm5swmv43m all-contributors-cli: 6.24.0 commitizen: 4.3.0 cross-env: 7.0.3 cssnano: 5.1.15_postcss@8.4.21 cz-conventional-changelog: 3.3.0 - eslint: 8.34.0 - eslint-config-prettier: 8.6.0_eslint@8.34.0 - eslint-plugin-prettier: 4.2.1_u5wnrdwibbfomslmnramz52buy + eslint: 8.36.0 + eslint-config-prettier: 8.7.0_eslint@8.36.0 + eslint-plugin-prettier: 4.2.1_eqzx3hpkgx5nnvxls3azrcc7dm husky: 8.0.3 is-ci: 3.0.1 - lint-staged: 13.1.2 + lint-staged: 13.2.0 postcss: 8.4.21 postcss-import: 15.1.0_postcss@8.4.21 postcss-nesting: 11.2.1_postcss@8.4.21 @@ -127,14 +127,14 @@ devDependencies: postcss-reporter: 7.0.5_postcss@8.4.21 prettier: 2.8.4 prettier-plugin-organize-imports: 3.2.2_silln3pw57har7jydmecgzoypa - semantic-release: 20.1.0 + semantic-release: 20.1.1 stylelint: 15.2.0 stylelint-config-standard: 30.0.1_stylelint@15.2.0 svgo: 3.0.2 tailwindcss: 3.2.7_postcss@8.4.21 typescript: 4.9.5 - vite: 4.1.3 - vite-plugin-pwa: 0.14.4_rcpzravakhu7gk56p6427hsr2y + vite: 4.1.4 + vite-plugin-pwa: 0.14.4_vizhyq4kcdharmiplw7eejneda workbox-build: 6.5.4 workbox-core: 6.5.4 workbox-routing: 6.5.4 @@ -1648,7 +1648,7 @@ packages: to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete/6.4.2_dtwlkgx6567fllxi7sgvnep6hy: + /@codemirror/autocomplete/6.4.2_m2g2fjrvetqbsl7zxwctz5ljh4: resolution: { integrity: sha512-8WE2xp+D0MpWEv5lZ6zPW1/tf4AGb358T5GWYiKEuCP8MvFfT3tH2mIF9Y2yr2e3KbHuSvsVhosiEyqCpiJhZQ==, @@ -1660,29 +1660,29 @@ packages: dependencies: "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.1 + "@codemirror/view": 6.9.2 "@lezer/common": 1.0.2 dev: false - /@codemirror/commands/6.2.1: + /@codemirror/commands/6.2.2: resolution: { - integrity: sha512-FFiNKGuHA5O8uC6IJE5apI5rT9gyjlw4whqy4vlcX0wE/myxL6P1s0upwDhY4HtMWLOwzwsp0ap3bjdQhvfDOA==, + integrity: sha512-s9lPVW7TxXrI/7voZ+HmD/yiAlwAYn9PH5SUVSUhsxXHhv4yl5eZ3KLntSoTynfdgVYM0oIpccQEWRBQgmNZyw==, } dependencies: "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.1 + "@codemirror/view": 6.9.2 "@lezer/common": 1.0.2 dev: false - /@codemirror/lang-xml/6.0.2_@codemirror+view@6.9.1: + /@codemirror/lang-xml/6.0.2_@codemirror+view@6.9.2: resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.4.2_dtwlkgx6567fllxi7sgvnep6hy + "@codemirror/autocomplete": 6.4.2_m2g2fjrvetqbsl7zxwctz5ljh4 "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 "@lezer/common": 1.0.2 @@ -1698,7 +1698,7 @@ packages: } dependencies: "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.1 + "@codemirror/view": 6.9.2 "@lezer/common": 1.0.2 "@lezer/highlight": 1.1.3 "@lezer/lr": 1.3.3 @@ -1712,7 +1712,7 @@ packages: } dependencies: "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.1 + "@codemirror/view": 6.9.2 crelt: 1.0.5 dev: false @@ -1723,7 +1723,7 @@ packages: } dependencies: "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.1 + "@codemirror/view": 6.9.2 crelt: 1.0.5 dev: false @@ -1734,10 +1734,10 @@ packages: } dev: false - /@codemirror/view/6.9.1: + /@codemirror/view/6.9.2: resolution: { - integrity: sha512-bzfSjJn9dAADVpabLKWKNmMG4ibyTV2e3eOGowjElNPTdTkSbi6ixPYHm2u0ADcETfKsi2/R84Rkmi91dH9yEg==, + integrity: sha512-ci0r/v6aKOSlzOs7/STMTYP3jX/+YMq2dAfAJcLIB6uom4ThtrUlzeuS7GTRGNqJJ+qAJR1vGWfXgu4CO/0myQ==, } dependencies: "@codemirror/state": 6.2.0 @@ -2574,16 +2574,37 @@ packages: dev: true optional: true - /@eslint/eslintrc/1.4.1: + /@eslint-community/eslint-utils/4.2.0_eslint@8.36.0: resolution: { - integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==, + integrity: sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.36.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@eslint-community/regexpp/4.4.0: + resolution: + { + integrity: sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + dev: true + + /@eslint/eslintrc/2.0.1: + resolution: + { + integrity: sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.4.1 + espree: 9.5.0 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -2594,20 +2615,28 @@ packages: - supports-color dev: true - /@floating-ui/core/1.2.1: + /@eslint/js/8.36.0: resolution: { - integrity: sha512-LSqwPZkK3rYfD7GKoIeExXOyYx6Q1O4iqZWwIehDNuv3Dv425FIAE8PRwtAx1imEolFTHgBEcoFHm9MDnYgPCg==, + integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: true + + /@floating-ui/core/1.2.4: + resolution: + { + integrity: sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==, } dev: false - /@floating-ui/dom/1.2.1: + /@floating-ui/dom/1.2.4: resolution: { - integrity: sha512-Rt45SmRiV8eU+xXSB9t0uMYiQ/ZWGE/jumse2o3i5RGlyvcbqOF4q+1qBnzLE2kZ5JGhq0iMkcGXUKbFe7MpTA==, + integrity: sha512-4+k+BLhtWj+peCU60gp0+rHeR8+Ohqx6kjJf/lHMnJ8JD5Qj6jytcq1+SZzRwD7rvHKRhR7TDiWWddrNrfwQLg==, } dependencies: - "@floating-ui/core": 1.2.1 + "@floating-ui/core": 1.2.4 dev: false /@foliojs-fork/fontkit/1.9.1: @@ -3147,7 +3176,7 @@ packages: rollup: 3.17.2 dev: true - /@semantic-release/changelog/6.0.2_semantic-release@20.1.0: + /@semantic-release/changelog/6.0.2_semantic-release@20.1.1: resolution: { integrity: sha512-jHqfTkoPbDEOAgAP18mGP53IxeMwxTISN+GwTRy9uLu58UjARoZU8ScCgWGeO2WPkEsm57H8AkyY02W2ntIlIw==, @@ -3160,10 +3189,10 @@ packages: aggregate-error: 3.1.0 fs-extra: 11.1.0 lodash: 4.17.21 - semantic-release: 20.1.0 + semantic-release: 20.1.1 dev: true - /@semantic-release/commit-analyzer/9.0.2_semantic-release@20.1.0: + /@semantic-release/commit-analyzer/9.0.2_semantic-release@20.1.1: resolution: { integrity: sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==, @@ -3179,7 +3208,7 @@ packages: import-from: 4.0.0 lodash: 4.17.21 micromatch: 4.0.5 - semantic-release: 20.1.0 + semantic-release: 20.1.1 transitivePeerDependencies: - supports-color dev: true @@ -3192,7 +3221,7 @@ packages: engines: { node: ">=14.17" } dev: true - /@semantic-release/exec/6.0.3_semantic-release@20.1.0: + /@semantic-release/exec/6.0.3_semantic-release@20.1.1: resolution: { integrity: sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==, @@ -3207,12 +3236,12 @@ packages: execa: 5.1.1 lodash: 4.17.21 parse-json: 5.2.0 - semantic-release: 20.1.0 + semantic-release: 20.1.1 transitivePeerDependencies: - supports-color dev: true - /@semantic-release/git/10.0.1_semantic-release@20.1.0: + /@semantic-release/git/10.0.1_semantic-release@20.1.1: resolution: { integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==, @@ -3229,12 +3258,12 @@ packages: lodash: 4.17.21 micromatch: 4.0.5 p-reduce: 2.1.0 - semantic-release: 20.1.0 + semantic-release: 20.1.1 transitivePeerDependencies: - supports-color dev: true - /@semantic-release/github/8.0.7_semantic-release@20.1.0: + /@semantic-release/github/8.0.7_semantic-release@20.1.1: resolution: { integrity: sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==, @@ -3258,14 +3287,14 @@ packages: mime: 3.0.0 p-filter: 2.1.0 p-retry: 4.6.2 - semantic-release: 20.1.0 + semantic-release: 20.1.1 url-join: 4.0.1 transitivePeerDependencies: - encoding - supports-color dev: true - /@semantic-release/gitlab/11.0.1_semantic-release@20.1.0: + /@semantic-release/gitlab/11.0.1_semantic-release@20.1.1: resolution: { integrity: sha512-CWXHlLZonwrUR2pbYaoERVu1cDVsi5W4H0WXDDCcDwicMmizsTkKJlpP9CQowoluqHKIJYrLkr2b+lYXCnBJZw==, @@ -3286,13 +3315,13 @@ packages: hpagent: 1.2.0 lodash-es: 4.17.21 parse-url: 8.1.0 - semantic-release: 20.1.0 + semantic-release: 20.1.1 url-join: 4.0.1 transitivePeerDependencies: - supports-color dev: true - /@semantic-release/npm/9.0.2_semantic-release@20.1.0: + /@semantic-release/npm/9.0.2_semantic-release@20.1.1: resolution: { integrity: sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==, @@ -3312,12 +3341,12 @@ packages: rc: 1.2.8 read-pkg: 5.2.0 registry-auth-token: 5.0.1 - semantic-release: 20.1.0 + semantic-release: 20.1.1 semver: 7.3.8 tempy: 1.0.1 dev: true - /@semantic-release/release-notes-generator/10.0.3_semantic-release@20.1.0: + /@semantic-release/release-notes-generator/10.0.3_semantic-release@20.1.1: resolution: { integrity: sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==, @@ -3336,7 +3365,7 @@ packages: into-stream: 6.0.0 lodash: 4.17.21 read-pkg-up: 7.0.1 - semantic-release: 20.1.0 + semantic-release: 20.1.1 transitivePeerDependencies: - supports-color dev: true @@ -3523,10 +3552,10 @@ packages: } dev: true - /@types/leaflet/1.9.1: + /@types/leaflet/1.9.2: resolution: { - integrity: sha512-lYawM3I3lLO6rmBASaqdGgY6zUL4YHr3H79/axx7FNYyPXuj0P1DZHbkNo8Itbv0i7Y9EryLWtDXXROMygXhRA==, + integrity: sha512-vrokGIGVO8RSNXQBcWdEJ4Xy6E9kLQHZfpxIkFjSD1OhqTKOjYLFJDG6JCoAWYm/n755fdNCyrpna6/00kVajw==, } dependencies: "@types/geojson": 7946.0.10 @@ -3598,10 +3627,10 @@ packages: "@types/debounce": 1.2.1 dev: true - /@typescript-eslint/eslint-plugin/5.53.0_ny4s7qc6yg74faf3d6xty2ofzy: + /@typescript-eslint/eslint-plugin/5.55.0_342y7v4tc7ytrrysmit6jo4wri: resolution: { - integrity: sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==, + integrity: sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3612,16 +3641,16 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/parser": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm - "@typescript-eslint/scope-manager": 5.53.0 - "@typescript-eslint/type-utils": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm - "@typescript-eslint/utils": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm + "@eslint-community/regexpp": 4.4.0 + "@typescript-eslint/parser": 5.55.0_vgl77cfdswitgr47lm5swmv43m + "@typescript-eslint/scope-manager": 5.55.0 + "@typescript-eslint/type-utils": 5.55.0_vgl77cfdswitgr47lm5swmv43m + "@typescript-eslint/utils": 5.55.0_vgl77cfdswitgr47lm5swmv43m debug: 4.3.4 - eslint: 8.34.0 + eslint: 8.36.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 - regexpp: 3.2.0 semver: 7.3.8 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 @@ -3629,10 +3658,10 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.53.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/parser/5.55.0_vgl77cfdswitgr47lm5swmv43m: resolution: { - integrity: sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==, + integrity: sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3642,31 +3671,31 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 5.53.0 - "@typescript-eslint/types": 5.53.0 - "@typescript-eslint/typescript-estree": 5.53.0_typescript@4.9.5 + "@typescript-eslint/scope-manager": 5.55.0 + "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/typescript-estree": 5.55.0_typescript@4.9.5 debug: 4.3.4 - eslint: 8.34.0 + eslint: 8.36.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.53.0: + /@typescript-eslint/scope-manager/5.55.0: resolution: { - integrity: sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==, + integrity: sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - "@typescript-eslint/types": 5.53.0 - "@typescript-eslint/visitor-keys": 5.53.0 + "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/visitor-keys": 5.55.0 dev: true - /@typescript-eslint/type-utils/5.53.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/type-utils/5.55.0_vgl77cfdswitgr47lm5swmv43m: resolution: { - integrity: sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==, + integrity: sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3676,28 +3705,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 5.53.0_typescript@4.9.5 - "@typescript-eslint/utils": 5.53.0_7kw3g6rralp5ps6mg3uyzz6azm + "@typescript-eslint/typescript-estree": 5.55.0_typescript@4.9.5 + "@typescript-eslint/utils": 5.55.0_vgl77cfdswitgr47lm5swmv43m debug: 4.3.4 - eslint: 8.34.0 + eslint: 8.36.0 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.53.0: + /@typescript-eslint/types/5.55.0: resolution: { - integrity: sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==, + integrity: sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /@typescript-eslint/typescript-estree/5.53.0_typescript@4.9.5: + /@typescript-eslint/typescript-estree/5.55.0_typescript@4.9.5: resolution: { - integrity: sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==, + integrity: sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3706,8 +3735,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 5.53.0 - "@typescript-eslint/visitor-keys": 5.53.0 + "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/visitor-keys": 5.55.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -3718,37 +3747,37 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.53.0_7kw3g6rralp5ps6mg3uyzz6azm: + /@typescript-eslint/utils/5.55.0_vgl77cfdswitgr47lm5swmv43m: resolution: { - integrity: sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==, + integrity: sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: + "@eslint-community/eslint-utils": 4.2.0_eslint@8.36.0 "@types/json-schema": 7.0.11 "@types/semver": 7.3.13 - "@typescript-eslint/scope-manager": 5.53.0 - "@typescript-eslint/types": 5.53.0 - "@typescript-eslint/typescript-estree": 5.53.0_typescript@4.9.5 - eslint: 8.34.0 + "@typescript-eslint/scope-manager": 5.55.0 + "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/typescript-estree": 5.55.0_typescript@4.9.5 + eslint: 8.36.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.34.0 semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.53.0: + /@typescript-eslint/visitor-keys/5.55.0: resolution: { - integrity: sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==, + integrity: sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/types": 5.55.0 eslint-visitor-keys: 3.3.0 dev: true @@ -4678,13 +4707,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.4.2_dtwlkgx6567fllxi7sgvnep6hy - "@codemirror/commands": 6.2.1 + "@codemirror/autocomplete": 6.4.2_m2g2fjrvetqbsl7zxwctz5ljh4 + "@codemirror/commands": 6.2.2 "@codemirror/language": 6.6.0 "@codemirror/lint": 6.1.1 "@codemirror/search": 6.2.3 "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.1 + "@codemirror/view": 6.9.2 dev: false /codepage/1.15.0: @@ -4752,6 +4781,14 @@ packages: delayed-stream: 1.0.0 dev: true + /commander/10.0.0: + resolution: + { + integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==, + } + engines: { node: ">=14" } + dev: true + /commander/2.20.3: resolution: { @@ -4766,14 +4803,6 @@ packages: } engines: { node: ">= 10" } - /commander/9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - /commitizen/4.3.0: resolution: { @@ -6066,19 +6095,19 @@ packages: source-map: 0.1.43 dev: false - /eslint-config-prettier/8.6.0_eslint@8.34.0: + /eslint-config-prettier/8.7.0_eslint@8.36.0: resolution: { - integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==, + integrity: sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==, } hasBin: true peerDependencies: eslint: ">=7.0.0" dependencies: - eslint: 8.34.0 + eslint: 8.36.0 dev: true - /eslint-plugin-prettier/4.2.1_u5wnrdwibbfomslmnramz52buy: + /eslint-plugin-prettier/4.2.1_eqzx3hpkgx5nnvxls3azrcc7dm: resolution: { integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, @@ -6092,8 +6121,8 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.34.0 - eslint-config-prettier: 8.6.0_eslint@8.34.0 + eslint: 8.36.0 + eslint-config-prettier: 8.7.0_eslint@8.36.0 prettier: 2.8.4 prettier-linter-helpers: 1.0.0 dev: true @@ -6120,27 +6149,6 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.34.0: - resolution: - { - integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==, - } - engines: { node: ^10.0.0 || ^12.0.0 || >= 14.0.0 } - peerDependencies: - eslint: ">=5" - dependencies: - eslint: 8.34.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys/2.1.0: - resolution: - { - integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, - } - engines: { node: ">=10" } - dev: true - /eslint-visitor-keys/3.3.0: resolution: { @@ -6149,15 +6157,18 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /eslint/8.34.0: + /eslint/8.36.0: resolution: { - integrity: sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==, + integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint/eslintrc": 1.4.1 + "@eslint-community/eslint-utils": 4.2.0_eslint@8.36.0 + "@eslint-community/regexpp": 4.4.0 + "@eslint/eslintrc": 2.0.1 + "@eslint/js": 8.36.0 "@humanwhocodes/config-array": 0.11.8 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -6168,9 +6179,8 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.34.0 eslint-visitor-keys: 3.3.0 - espree: 9.4.1 + espree: 9.5.0 esquery: 1.4.2 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -6192,7 +6202,6 @@ packages: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.1 - regexpp: 3.2.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 @@ -6200,10 +6209,10 @@ packages: - supports-color dev: true - /espree/9.4.1: + /espree/9.5.0: resolution: { - integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==, + integrity: sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: @@ -6354,6 +6363,24 @@ packages: strip-final-newline: 3.0.0 dev: true + /execa/7.1.0: + resolution: + { + integrity: sha512-T6nIJO3LHxUZ6ahVRaxXz9WLEruXLqdcluA+UuTptXmLM7nDAn9lx9IfkxPyzEL21583qSt4RmL44pO71EHaJQ==, + } + engines: { node: ^14.18.0 || ^16.14.0 || >=18.0.0 } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + /expand-tilde/2.0.2: resolution: { @@ -7231,6 +7258,14 @@ packages: engines: { node: ">=12.20.0" } dev: true + /human-signals/4.3.0: + resolution: + { + integrity: sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==, + } + engines: { node: ">=14.18.0" } + dev: true + /husky/8.0.3: resolution: { @@ -8063,6 +8098,14 @@ packages: engines: { node: ">=10" } dev: true + /lilconfig/2.1.0: + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: ">=10" } + dev: true + /lines-and-columns/1.2.4: resolution: { @@ -8070,20 +8113,20 @@ packages: } dev: true - /lint-staged/13.1.2: + /lint-staged/13.2.0: resolution: { - integrity: sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==, + integrity: sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==, } engines: { node: ^14.13.1 || >=16.0.0 } hasBin: true dependencies: + chalk: 5.2.0 cli-truncate: 3.1.0 - colorette: 2.0.19 - commander: 9.5.0 + commander: 10.0.0 debug: 4.3.4 - execa: 6.1.0 - lilconfig: 2.0.6 + execa: 7.1.0 + lilconfig: 2.1.0 listr2: 5.0.7 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -9923,7 +9966,7 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.0.6 + lilconfig: 2.1.0 postcss: 8.4.21 yaml: 1.10.2 dev: true @@ -10835,14 +10878,6 @@ packages: define-properties: 1.2.0 functions-have-names: 1.2.3 - /regexpp/3.2.0: - resolution: - { - integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==, - } - engines: { node: ">=8" } - dev: true - /regexpu-core/5.3.1: resolution: { @@ -11158,24 +11193,24 @@ packages: get-assigned-identifiers: 1.2.0 dev: false - /semantic-release/20.1.0: + /semantic-release/20.1.1: resolution: { - integrity: sha512-+9+n6RIr0Fz0F53cXrjpawxWlUg3O7/qr1jF9lrE+/v6WqwBrSWnavVHTPaf2WLerET2EngoqI0M4pahkKl6XQ==, + integrity: sha512-jXDr8y7ozo42N4+G9m/P5Qyx5oQO4aOS66a+Up8XECzEOFIpEoo3ngnr4R5lSix/sVJW69/fgNkOUZhsGFiQ5g==, } engines: { node: ">=18" } hasBin: true dependencies: - "@semantic-release/commit-analyzer": 9.0.2_semantic-release@20.1.0 + "@semantic-release/commit-analyzer": 9.0.2_semantic-release@20.1.1 "@semantic-release/error": 3.0.0 - "@semantic-release/github": 8.0.7_semantic-release@20.1.0 - "@semantic-release/npm": 9.0.2_semantic-release@20.1.0 - "@semantic-release/release-notes-generator": 10.0.3_semantic-release@20.1.0 + "@semantic-release/github": 8.0.7_semantic-release@20.1.1 + "@semantic-release/npm": 9.0.2_semantic-release@20.1.1 + "@semantic-release/release-notes-generator": 10.0.3_semantic-release@20.1.1 aggregate-error: 4.0.1 cosmiconfig: 8.0.0 debug: 4.3.4 env-ci: 8.0.0 - execa: 6.1.0 + execa: 7.1.0 figures: 5.0.0 find-versions: 5.1.0 get-stream: 6.0.1 @@ -12504,7 +12539,7 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-plugin-pwa/0.14.4_rcpzravakhu7gk56p6427hsr2y: + /vite-plugin-pwa/0.14.4_vizhyq4kcdharmiplw7eejneda: resolution: { integrity: sha512-M7Ct0so8OlouMkTWgXnl8W1xU95glITSKIe7qswZf1tniAstO2idElGCnsrTJ5NPNSx1XqfTCOUj8j94S6FD7Q==, @@ -12518,17 +12553,17 @@ packages: fast-glob: 3.2.12 pretty-bytes: 6.1.0 rollup: 3.17.2 - vite: 4.1.3 + vite: 4.1.4 workbox-build: 6.5.4 workbox-window: 6.5.4 transitivePeerDependencies: - supports-color dev: true - /vite/4.1.3: + /vite/4.1.4: resolution: { - integrity: sha512-0Zqo4/Fr/swSOBmbl+HAAhOjrqNwju+yTtoe4hQX9UsARdcuc9njyOdr6xU0DDnV7YP0RT6mgTTOiRtZgxfCxA==, + integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==, } engines: { node: ^14.18.0 || >=16.0.0 } hasBin: true @@ -12568,10 +12603,10 @@ packages: } dev: false - /wavesurfer.js/6.4.0: + /wavesurfer.js/6.5.2: resolution: { - integrity: sha512-+i9GkYdMTm998goOWvycWqCgxfbolnuGTPgrdGss7ZbQDuu+n6AHdnJwYnqxW8RZo5A2ck6ztzXbrXGuCi0m5g==, + integrity: sha512-1GfjeFlaaYnlOcwZ3M0MjYgmAVzL4dKARfJIlM9L/NVECFRwMsV7wtOWA1ZBukjFABt+DL+JiZOEIAtomqSMJg==, } dev: false @@ -12958,20 +12993,20 @@ packages: word: 0.3.0 dev: false - /xml-formatter/3.2.0: + /xml-formatter/3.3.2: resolution: { - integrity: sha512-PYROODIUDHz1SDFePg2VThajPOuSmvo/PrYRKARcSc9xxKKs62EN9uar60IIxxknzmOSNDAxlylpw34bQp0g/Q==, + integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==, } engines: { node: ">= 14" } dependencies: - xml-parser-xo: 4.0.2 + xml-parser-xo: 4.0.5 dev: false - /xml-parser-xo/4.0.2: + /xml-parser-xo/4.0.5: resolution: { - integrity: sha512-tM9LyyGumFAf7VD3GLlcN7eIbpvgzmt7PAseAMO6thgEq6VIEHPxlcWVIzMmn6pqGD1NTZS8mSPfhePo6AETVw==, + integrity: sha512-UWXOHMQ4ySxpUiU3S/9KzPOhninlL8SN1xFfWgX9WjgoZWoLKtEeJIEz4jhKtdFsoZBCYjg9rDEP3qfnpiHagQ==, } engines: { node: ">= 14" } dev: false diff --git a/public/media/podcasts/index.html b/public/media/podcasts/index.html new file mode 100644 index 00000000..e69de29b diff --git a/public/media/site/index.html b/public/media/site/index.html new file mode 100644 index 00000000..e69de29b diff --git a/rector.php b/rector.php index afb6f1bb..bd0125b9 100644 --- a/rector.php +++ b/rector.php @@ -11,6 +11,7 @@ use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector; use Rector\Config\RectorConfig; use Rector\Core\ValueObject\PhpVersion; use Rector\DeadCode\Rector\If_\UnwrapFutureCompatibleIfPhpVersionRector; +use Rector\DeadCode\Rector\Stmt\RemoveUnreachableStatementRector; use Rector\EarlyReturn\Rector\If_\ChangeAndIfToEarlyReturnRector; use Rector\EarlyReturn\Rector\If_\ChangeOrIfContinueToMultiContinueRector; use Rector\EarlyReturn\Rector\If_\ChangeOrIfReturnToEarlyReturnRector; @@ -66,6 +67,10 @@ return static function (RectorConfig $rectorConfig): void { NewlineAfterStatementRector::class => [__DIR__ . '/app/Views'], + RemoveUnreachableStatementRector::class => [ + __DIR__ . '/modules/Install/Controllers/InstallController.php', + ], + ChangeAndIfToEarlyReturnRector::class => [__DIR__ . '/modules/Install/Controllers/InstallController.php'], ]); diff --git a/themes/cp_admin/episode/video_clips_new.php b/themes/cp_admin/episode/video_clips_new.php index a2b60bd6..3f3ca52a 100644 --- a/themes/cp_admin/episode/video_clips_new.php +++ b/themes/cp_admin/episode/video_clips_new.php @@ -18,7 +18,7 @@ <?= $episode->cover->description ?> -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔
    Bastien Luneteau
    Bastien Luneteau

    💻 🐛
    Cécile Ricordeau
    Cécile Ricordeau

    🎨
    Patryk Miś
    Patryk Miś

    🌍
    Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔
    Sebastian Janik
    Sebastian Janik

    💻
    Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻
    denis d
    denis d

    🐛 🤔
    Douglas Kastle
    Douglas Kastle

    🐛 🤔
    cExplorer
    cExplorer

    🐛 🌍
    ImaCrea
    ImaCrea

    🐛 🤔
    Jonas S
    Jonas S

    💻
    LEFEBVRE Yann
    LEFEBVRE Yann

    🐛
    Sebastian Späth
    Sebastian Späth

    🐛 🤔
    rocky III
    rocky III

    🐛
    Hermann Josef Eckl
    Hermann Josef Eckl

    🐛
    Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔
    João Leandro
    João Leandro

    🌍 🤔
    Angelos Chouvardas
    Angelos Chouvardas

    🌍
    Eivind
    Eivind

    🌍
    Ewen
    Ewen

    🌍 🤔
    forght
    forght

    🌍
    glottis0q
    glottis0q

    🌍
    ButterflyOfFire
    ButterflyOfFire

    🌍
    Lucian I. Last
    Lucian I. Last

    🌍
    LuuzViir
    LuuzViir

    🌍
    CTHTC
    CTHTC

    🌍
    Russian Retro
    Russian Retro

    🌍
    Marek L'ach
    Marek L'ach

    🌍
    GunChleoc
    GunChleoc

    🌍
    GabiSnow
    GabiSnow

    🌍
    bendaha
    bendaha

    🌍
    Samuel Roland
    Samuel Roland

    🌍
    Dimitri Regnier
    Dimitri Regnier

    🤔
    irithys
    irithys

    🌍
    Sergi
    Sergi

    🌍
    ghose (XoseM)
    ghose (XoseM)

    🌍
    Andreas Olsson
    Andreas Olsson

    🌍
    leonfrom
    leonfrom

    🌍
    agentcobra
    agentcobra

    🌍
    Alessandro
    Alessandro

    🌍
    liimee
    liimee

    🌍
    Ahmed Sabouni
    Ahmed Sabouni

    🌍
    + + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
    + Ad Aures Logo + NLnet Logo +
    + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/fr_trad/getting-started/auth.md b/docs/src/fr_trad/getting-started/auth.md new file mode 100644 index 00000000..ff5d59c0 --- /dev/null +++ b/docs/src/fr_trad/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/fr_trad/getting-started/docker.md b/docs/src/fr_trad/getting-started/docker.md new file mode 100644 index 00000000..c6e6cb7e --- /dev/null +++ b/docs/src/fr_trad/getting-started/docker.md @@ -0,0 +1,177 @@ +--- +title: Official Docker images +sidebarDepth: 3 +--- + +# Official Docker images + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle + with all of Castopod dependencies +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an + Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +1. Install [docker](https://docs.docker.com/get-docker/) and + [docker-compose](https://docs.docker.com/compose/install/) +2. Create a `docker-compose.yml` file with the following: + + ```yml + version: "3.7" + + services: + app: + image: castopod/app:latest + container_name: "castopod-app" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "http://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + networks: + - castopod-app + - castopod-db + restart: unless-stopped + + web-server: + image: castopod/web-server:latest + container_name: "castopod-web-server" + volumes: + - castopod-media:/var/www/html/media + networks: + - castopod-app + ports: + - 8080:80 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + volumes: + - castopod-cache:/data + networks: + - castopod-app + + # this container is optional + # add this if you want to use the videoclips feature + video-clipper: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for TLS (SSL/HTTPS) + + TLS is mandatory for ActivityPub to work. This job can easily be handled by + a reverse proxy, for example with [Caddy](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8080 + } + ``` + +4. Run `docker-compose up -d`, wait for it to initialize and head on to + `https://castopod.example.com/cp-install` to finish setting up Castopod! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + +- **castopod/app** + + | Variable name | Type (`default`) | Default | + | ---------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | --------------------- | ------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/fr_trad/getting-started/install.md b/docs/src/fr_trad/getting-started/install.md new file mode 100644 index 00000000..c68be846 --- /dev/null +++ b/docs/src/fr_trad/getting-started/install.md @@ -0,0 +1,185 @@ +--- +title: Installation +sidebarDepth: 3 +--- + +# How to install Castopod? + +Castopod was thought-out to be easy to install. Whether using dedicated or +shared hosting, you can install it on most PHP-MySQL compatible web servers. + +::: tip Note + +We've released official Docker images for Castopod! + +If you prefer using Docker, you may skip this and go straight to the +[docker documentation](./docker.md) for Castopod. + +::: + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support + +### PHP v8.1 or higher + +PHP version 8.1 or higher is required, with the following extensions installed: + +- [intl](https://php.net/manual/en/intl.requirements.php) +- [libcurl](https://php.net/manual/en/curl.requirements.php) +- [mbstring](https://php.net/manual/en/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, + **PNG** and **WEBP** libraries. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +::: warning Warning + +Castopod only works with supported MySQL 5.7 or higher compatible databases. It +will break with the previous MySQL v5.6 for example as its end of life was on +February 5, 2021. + +::: + +You will need the server hostname, database name, username and password to +complete the installation process. If you do not have these, please contact your +server administrator. + +#### Privileges + +User must have at least these privileges on the database for Castopod to work: +`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, +`REFERENCES`, `CREATE VIEW`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you +want to generate Video Clips. The following extensions must be installed: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +0. Get a Web Server with [requirements](#requirements) installed +1. Create a MySQL database for Castopod with a user having access and + modification privileges (for more info, see + [MySQL compatible database](#mysql-compatible-database)). +2. Activate HTTPS on your domain with an _SSL certificate_. +3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto + the web server if you haven’t already. + - ⚠️ Set the web server document root to the `public/` sub-folder within the + `castopod` folder. +4. Add **cron tasks** on your web server for various background processes + (replace the paths accordingly): + + - For social features to work properly, this task is used to broadcast social + activities to your followers on the fediverse: + + ```bash + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities + ``` + + - For having your episodes be broadcasted on open hubs upon publication using + [WebSub](https://en.wikipedia.org/wiki/WebSub): + + ```bash + * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish + ``` + + - For Video Clips to be created (see + [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)): + + ```bash + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips + ``` + + > These tasks run **every minute**. You may set the frequency depending on + > your needs: every 5, 10 minutes or more. + +### (recommended) Install Wizard + +1. Run the Castopod install script by going to the install wizard page + (`https://your_domain_name.com/cp-install`) in your favorite web browser. +2. Follow the instructions on your screen. +3. Start podcasting! + +::: info Note + +The install script writes a `.env` file in the package root. If you cannot go +through the install wizard, you can create and edit the `.env` file manually +based on the `.env.example` file. + +::: + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +You may add your email configuration in your instance's `.env` like so: + +```ini +# […] + +email.fromEmail="your_email_address" +email.SMTPHost="your_smtp_host" +email.SMTPUser="your_smtp_user" +email.SMTPPass="your_smtp_password" +``` + +#### Email config options + +| Variable name | Type | Default | +| ---------------- | -------------------- | ------------ | +| **`fromEmail`** | string | `undefined` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `undefined` | +| **`SMTPUser`** | string | `undefined` | +| **`SMTPPass`** | string | `undefined` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | + +## Community packages + +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. + +### Install with YunoHost + +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you. + +
    + + + Install Castopod with YunoHost + + +Github +Repo + +
    diff --git a/docs/src/fr_trad/getting-started/security.md b/docs/src/fr_trad/getting-started/security.md new file mode 100644 index 00000000..e205698d --- /dev/null +++ b/docs/src/fr_trad/getting-started/security.md @@ -0,0 +1,26 @@ +--- +title: Security +--- + +# Security concerns + +Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP +framework that encourages +[good security practices](https://codeigniter.com/user_guide/concepts/security.html). + +To maximize your instance's safety and prevent any malicious attack, we +recommend you update all your Castopod files permissions after installation or +updates (to avoid any prior permission error): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/fr_trad/getting-started/update.md b/docs/src/fr_trad/getting-started/update.md new file mode 100644 index 00000000..98e019fb --- /dev/null +++ b/docs/src/fr_trad/getting-started/update.md @@ -0,0 +1,109 @@ +--- +title: Update +sidebarDepth: 3 +--- + +# How to update Castopod? + +After installing Castopod, you may want to update your instance to the latest +version in order to enjoy the latest features ✨, bug fixes 🐛 and performance +improvements ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version + + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives + + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). + + ::: + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```bash + php spark castopod:database-update + ``` + +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `public/media`. + +2. Go through each release update instructions sequentially (from oldest to + newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +We advise you do, so you don't lose everything if anything goes wrong! + +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/fr_trad/index.md b/docs/src/fr_trad/index.md new file mode 100644 index 00000000..6e04835b --- /dev/null +++ b/docs/src/fr_trad/index.md @@ -0,0 +1,303 @@ +--- +sidebarDepth: 2 +--- + +# Welcome 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + +::: info Status + +Castopod is currently in **beta** but already quite stable and used by +podcasters around the world! + +::: + +
    + Install +
    + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivation + +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. + +It is in fact one of the only media to have stayed this way for a long time. + +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. + +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. + +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. + +## Comparison with other solutions + +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. + +### Castopod vs Wordpress + +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. + +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. + +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. + +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. + +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwhale + +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. + +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod can be self-hosted and is the only solution that allows you to keep + full control over what you produce. Also, as it is open-source, you can even + customize it as you wish. + +- Castopod is the only solution that currently integrates both a decentralized + social network with ActivityPub as well as many of the podcasting 2.0 + features, hoping to bridge the gap between the two. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. + +### Contributing guide + +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔
    Bastien Luneteau
    Bastien Luneteau

    💻 🐛
    Cécile Ricordeau
    Cécile Ricordeau

    🎨
    Patryk Miś
    Patryk Miś

    🌍
    Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔
    Sebastian Janik
    Sebastian Janik

    💻
    Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻
    denis d
    denis d

    🐛 🤔
    Douglas Kastle
    Douglas Kastle

    🐛 🤔
    cExplorer
    cExplorer

    🐛 🌍
    ImaCrea
    ImaCrea

    🐛 🤔
    Jonas S
    Jonas S

    💻
    LEFEBVRE Yann
    LEFEBVRE Yann

    🐛
    Sebastian Späth
    Sebastian Späth

    🐛 🤔
    rocky III
    rocky III

    🐛
    Hermann Josef Eckl
    Hermann Josef Eckl

    🐛
    Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔
    João Leandro
    João Leandro

    🌍 🤔
    Angelos Chouvardas
    Angelos Chouvardas

    🌍
    Eivind
    Eivind

    🌍
    Ewen
    Ewen

    🌍 🤔
    forght
    forght

    🌍
    glottis0q
    glottis0q

    🌍
    ButterflyOfFire
    ButterflyOfFire

    🌍
    Lucian I. Last
    Lucian I. Last

    🌍
    LuuzViir
    LuuzViir

    🌍
    CTHTC
    CTHTC

    🌍
    Russian Retro
    Russian Retro

    🌍
    Marek L'ach
    Marek L'ach

    🌍
    GunChleoc
    GunChleoc

    🌍
    GabiSnow
    GabiSnow

    🌍
    bendaha
    bendaha

    🌍
    Samuel Roland
    Samuel Roland

    🌍
    Dimitri Regnier
    Dimitri Regnier

    🤔
    irithys
    irithys

    🌍
    Sergi
    Sergi

    🌍
    ghose (XoseM)
    ghose (XoseM)

    🌍
    Andreas Olsson
    Andreas Olsson

    🌍
    leonfrom
    leonfrom

    🌍
    agentcobra
    agentcobra

    🌍
    Alessandro
    Alessandro

    🌍
    liimee
    liimee

    🌍
    Ahmed Sabouni
    Ahmed Sabouni

    🌍
    + + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
    + Ad Aures Logo + NLnet Logo +
    + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/gd/getting-started/install.md b/docs/src/gd/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/gd/getting-started/install.md +++ b/docs/src/gd/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/gl/getting-started/install.md b/docs/src/gl/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/gl/getting-started/install.md +++ b/docs/src/gl/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/id/getting-started/install.md b/docs/src/id/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/id/getting-started/install.md +++ b/docs/src/id/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/it/getting-started/install.md b/docs/src/it/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/it/getting-started/install.md +++ b/docs/src/it/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/ko/getting-started/install.md b/docs/src/ko/getting-started/install.md index 3d73187d..4cad016e 100644 --- a/docs/src/ko/getting-started/install.md +++ b/docs/src/ko/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.0 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.0 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/nl/getting-started/auth.md b/docs/src/nl/getting-started/auth.md index 821d2585..5041973c 100644 --- a/docs/src/nl/getting-started/auth.md +++ b/docs/src/nl/getting-started/auth.md @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Kan toegang krijgen tot de beheeromgeving van Castopod. | -| admin.settings | Kan toegang krijgen tot de instellingen van Castopod. | -| users.manage | Kan Castopod-gebruikers beheren. | -| persons.manage | Can manage persons. | -| pages.manage | Kan pagina's beheren. | -| podcasts.view | Kan alle podcasts bekijken. | -| podcasts.create | Kan nieuwe podcast aanmaken. | -| podcasts.import | Kan podcasts importeren. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | -------------------------------------------------------------------- | +| admin.access | Kan toegang krijgen tot de beheeromgeving van Castopod. | +| admin.settings | Kan toegang krijgen tot de instellingen van Castopod. | +| users.manage | Kan Castopod-gebruikers beheren. | +| persons.manage | Kan personen beheren. | +| pages.manage | Kan pagina's beheren. | +| podcasts.view | Kan alle podcasts bekijken. | +| podcasts.create | Kan nieuwe podcast aanmaken. | +| podcasts.import | Kan podcasts importeren. | +| fediverse.manage-blocks | Kan fediverse actors/domains blokkeren voor interactie met Castopod. | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Kan dashboard en analyses van podcast #{id} zien. | -| edit | Kan podcast #{id} wijzigen. | -| delete | Kan podcast #{id} verwijderen. | -| manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Kan abonnementen van podcast #{id} beheren. | -| manage-contributors | Kan bijdragers van podcast #{id} beheren. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Kan podcast #{id} publiceren. | -| manage-notifications | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Kan dashboard en analyses van podcast #{id} zien. | -| episodes.create | Kan afleveringen voor podcast #{id} aanmaken. | -| episodes.edit | Kan podcast #{id} wijzigen. | -| episodes.delete | Kan podcast #{id} verwijderen. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Kan videoclips of soundbites van podcast #{id} beheren. | -| episodes.manage-publications | Kan podcast #{id} publiceren. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permission | description | +| ---------------------------- | -------------------------------------------------------------------------------------- | +| view | Kan dashboard en analyses van podcast #{id} zien. | +| edit | Kan podcast #{id} wijzigen. | +| delete | Kan podcast #{id} verwijderen. | +| manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. | +| manage-persons | Kan abonnementen van podcast #{id} beheren. | +| manage-subscriptions | Kan abonnementen van podcast #{id} beheren. | +| manage-contributors | Kan bijdragers van podcast #{id} beheren. | +| manage-platforms | Kan platform links van podcast #{id} instellen of verwijderen. | +| manage-publications | Kan podcast #{id} publiceren. | +| manage-notifications | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}. | +| interact-as | Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten. | +| episodes.view | Kan dashboard en analyses van podcast #{id} zien. | +| episodes.create | Kan afleveringen voor podcast #{id} aanmaken. | +| episodes.edit | Kan podcast #{id} wijzigen. | +| episodes.delete | Kan podcast #{id} verwijderen. | +| episodes.manage-persons | Kan abonnementen van podcast #{id} beheren. | +| episodes.manage-clips | Kan videoclips of soundbites van podcast #{id} beheren. | +| episodes.manage-publications | Kan podcast #{id} publiceren. | +| episodes.manage-comments | Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen. | diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/nl/getting-started/install.md +++ b/docs/src/nl/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md index fdd2a817..4425c486 100644 --- a/docs/src/nn-NO/getting-started/install.md +++ b/docs/src/nn-NO/getting-started/install.md @@ -23,6 +23,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 eller nyare - MySQL versjon 5.7 eller nyare, eller MariaDB versjon 10.2 eller nyare - Støtte for HTTPS +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 eller nyare @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Pakker frå brukarsamfunnet If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/oc/getting-started/install.md +++ b/docs/src/oc/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/pl/getting-started/auth.md b/docs/src/pl/getting-started/auth.md index ff5d59c0..a953d785 100644 --- a/docs/src/pl/getting-started/auth.md +++ b/docs/src/pl/getting-started/auth.md @@ -3,7 +3,7 @@ title: Authentication & Authorization sidebarDepth: 3 --- -# Authentication & Authorization +# Uwierzytelnianie & Autoryzacja Castopod handles authentication and authorization using `codeigniter/shield` coupled with custom rules. Roles and permissions are defined at two levels: diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/pl/getting-started/install.md +++ b/docs/src/pl/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md index 760a0a6a..9f96b150 100644 --- a/docs/src/pt-BR/getting-started/install.md +++ b/docs/src/pt-BR/getting-started/install.md @@ -11,10 +11,10 @@ com PHP-MySQL. ::: dica Nota -We've released official Docker images for Castopod! +Nós lançamos imagens Docker oficiais para Castopod! -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. +Se você prefere usar o Docker, você pode pular isso e ir direto para a +[documentação docker](./docker.md) de Castopod. ::: @@ -23,10 +23,12 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 ou superior - MySQL versão 5.7 ou superior ou MariaDB versão 10.2 ou superior - Suporte a HTTPS +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 ou superior -PHP version 8.1 or higher is required, with the following extensions installed: +É necessário PHP versão 8.1 ou superior, com as seguintes extensões instaladas: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -35,7 +37,8 @@ PHP version 8.1 or higher is required, with the following extensions installed: **PNG** e bibliotecas **WEBP**. - [exif](https://www.php.net/manual/en/exif.installation.php) -Additionally, make sure that the following extensions are enabled in your PHP: +Além disso, certifique-se de que as seguintes extensões estejam habilitadas em +seu PHP: - json (habilitado por padrão - não desativar) - xml (habilitado por padrão - não desativar) @@ -45,17 +48,17 @@ Additionally, make sure that the following extensions are enabled in your PHP: > Recomendamos usar o [MariaDB](https://mariadb.org). -::: warning Warning +::: warning Aviso -Castopod only works with supported MySQL 5.7 or higher compatible databases. It +Castopod só funciona com bancos de dados MySQL 5.7 ou superior compatíveis. It will break with the previous MySQL v5.6 for example as its end of life was on February 5, 2021. ::: -You will need the server hostname, database name, username and password to -complete the installation process. If you do not have these, please contact your -server administrator. +Você vai precisar do hostname do servidor, nome do banco de dados, nome do +usuário e senha para concluir o processo de instalação. Se você não os tem, +entre em contato com o administrador do servidor. #### Privilégios @@ -66,7 +69,7 @@ User must have at least these privileges on the database for Castopod to work: ### (Opcional) FFmpeg v4.1.8 ou superior para Clipes de Vídeo [FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you -want to generate Video Clips. The following extensions must be installed: +want to generate Video Clips. As seguintes extensões devem ser instaladas: - Biblioteca **FreeType 2** para [gd](https://www.php.net/manual/en/image.installation.php). @@ -125,10 +128,10 @@ want to generate Video Clips. The following extensions must be installed: 2. Siga as instruções na sua tela. 3. Comece o podcast! -::: info Note +::: Nota de Informação -The install script writes a `.env` file in the package root. If you cannot go -through the install wizard, you can create and edit the `.env` file manually +O script de instalação grava um arquivo `.env` na raiz do pacote. If you cannot +go through the install wizard, you can create and edit the `.env` file manually based on the `.env.example` file. ::: @@ -152,11 +155,11 @@ email.SMTPUser="your_smtp_user" email.SMTPPass="your_smtp_password" ``` -#### Email config options +#### Configurar opções de e-mail -| Variable name | Type | Default | +| Nome da variável | Tipo | Padrão | | ---------------- | -------------------- | ------------ | -| **`fromEmail`** | string | `undefined` | +| **`fromEmail`** | string | `indefinido` | | **`fromName`** | string | `"Castopod"` | | **`SMTPHost`** | string | `undefined` | | **`SMTPUser`** | string | `undefined` | @@ -164,6 +167,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Pacotes comunitários If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md index 3c99e225..d85df8c0 100644 --- a/docs/src/pt/getting-started/install.md +++ b/docs/src/pt/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -162,6 +164,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/ro/getting-started/install.md b/docs/src/ro/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/ro/getting-started/install.md +++ b/docs/src/ro/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md index 3c99e225..d85df8c0 100644 --- a/docs/src/ru/getting-started/install.md +++ b/docs/src/ru/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -162,6 +164,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/sk/getting-started/install.md +++ b/docs/src/sk/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/sr_Latn/getting-started/install.md b/docs/src/sr_Latn/getting-started/install.md index c68be846..41b5153c 100644 --- a/docs/src/sr_Latn/getting-started/install.md +++ b/docs/src/sr_Latn/getting-started/install.md @@ -22,6 +22,8 @@ If you prefer using Docker, you may skip this and go straight to the - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -160,6 +162,35 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Community packages If you don't want to bother with installing Castopod manually, you may use one diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md index 703b01bb..d326defd 100644 --- a/docs/src/sv/getting-started/install.md +++ b/docs/src/sv/getting-started/install.md @@ -23,6 +23,8 @@ Om du föredrar att använda Docker, kan du hoppa över detta och gå direkt til - PHP v8.1 or higher - MySQL version 5.7 eller högre eller MariaDB version 10.2 eller högre - Stöd för HTTPS +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP v8.1 or higher @@ -161,16 +163,45 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | nummer | `25` | | **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## Gemenskapspaket -Om du inte vill bry dig om att installera Castopod manuellt, kan du använda ett -av de paket som skapats och underhålls av open source-miljön. +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. -### Installera med YunoHost +### Install with YunoHost -[YunoHost](https://yunohost.org/) är en distribution baserad på Debian GNU/Linux -som består av mjukvarupaket med fri och öppen källkod. Det hanterar -svårigheterna med self-hosting för dig. +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you.
    diff --git a/docs/src/uk/getting-started/auth.md b/docs/src/uk/getting-started/auth.md new file mode 100644 index 00000000..0c330f06 --- /dev/null +++ b/docs/src/uk/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Аутентифікація & Авторизація + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/uk/getting-started/docker.md b/docs/src/uk/getting-started/docker.md new file mode 100644 index 00000000..c6e6cb7e --- /dev/null +++ b/docs/src/uk/getting-started/docker.md @@ -0,0 +1,177 @@ +--- +title: Official Docker images +sidebarDepth: 3 +--- + +# Official Docker images + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle + with all of Castopod dependencies +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an + Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +1. Install [docker](https://docs.docker.com/get-docker/) and + [docker-compose](https://docs.docker.com/compose/install/) +2. Create a `docker-compose.yml` file with the following: + + ```yml + version: "3.7" + + services: + app: + image: castopod/app:latest + container_name: "castopod-app" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "http://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + networks: + - castopod-app + - castopod-db + restart: unless-stopped + + web-server: + image: castopod/web-server:latest + container_name: "castopod-web-server" + volumes: + - castopod-media:/var/www/html/media + networks: + - castopod-app + ports: + - 8080:80 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + volumes: + - castopod-cache:/data + networks: + - castopod-app + + # this container is optional + # add this if you want to use the videoclips feature + video-clipper: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for TLS (SSL/HTTPS) + + TLS is mandatory for ActivityPub to work. This job can easily be handled by + a reverse proxy, for example with [Caddy](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8080 + } + ``` + +4. Run `docker-compose up -d`, wait for it to initialize and head on to + `https://castopod.example.com/cp-install` to finish setting up Castopod! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + +- **castopod/app** + + | Variable name | Type (`default`) | Default | + | ---------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | --------------------- | ------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/uk/getting-started/install.md b/docs/src/uk/getting-started/install.md new file mode 100644 index 00000000..41b5153c --- /dev/null +++ b/docs/src/uk/getting-started/install.md @@ -0,0 +1,216 @@ +--- +title: Installation +sidebarDepth: 3 +--- + +# How to install Castopod? + +Castopod was thought-out to be easy to install. Whether using dedicated or +shared hosting, you can install it on most PHP-MySQL compatible web servers. + +::: tip Note + +We've released official Docker images for Castopod! + +If you prefer using Docker, you may skip this and go straight to the +[docker documentation](./docker.md) for Castopod. + +::: + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +PHP version 8.1 or higher is required, with the following extensions installed: + +- [intl](https://php.net/manual/en/intl.requirements.php) +- [libcurl](https://php.net/manual/en/curl.requirements.php) +- [mbstring](https://php.net/manual/en/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, + **PNG** and **WEBP** libraries. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +::: warning Warning + +Castopod only works with supported MySQL 5.7 or higher compatible databases. It +will break with the previous MySQL v5.6 for example as its end of life was on +February 5, 2021. + +::: + +You will need the server hostname, database name, username and password to +complete the installation process. If you do not have these, please contact your +server administrator. + +#### Privileges + +User must have at least these privileges on the database for Castopod to work: +`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, +`REFERENCES`, `CREATE VIEW`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you +want to generate Video Clips. The following extensions must be installed: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +0. Get a Web Server with [requirements](#requirements) installed +1. Create a MySQL database for Castopod with a user having access and + modification privileges (for more info, see + [MySQL compatible database](#mysql-compatible-database)). +2. Activate HTTPS on your domain with an _SSL certificate_. +3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto + the web server if you haven’t already. + - ⚠️ Set the web server document root to the `public/` sub-folder within the + `castopod` folder. +4. Add **cron tasks** on your web server for various background processes + (replace the paths accordingly): + + - For social features to work properly, this task is used to broadcast social + activities to your followers on the fediverse: + + ```bash + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities + ``` + + - For having your episodes be broadcasted on open hubs upon publication using + [WebSub](https://en.wikipedia.org/wiki/WebSub): + + ```bash + * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish + ``` + + - For Video Clips to be created (see + [FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)): + + ```bash + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips + ``` + + > These tasks run **every minute**. You may set the frequency depending on + > your needs: every 5, 10 minutes or more. + +### (recommended) Install Wizard + +1. Run the Castopod install script by going to the install wizard page + (`https://your_domain_name.com/cp-install`) in your favorite web browser. +2. Follow the instructions on your screen. +3. Start podcasting! + +::: info Note + +The install script writes a `.env` file in the package root. If you cannot go +through the install wizard, you can create and edit the `.env` file manually +based on the `.env.example` file. + +::: + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +You may add your email configuration in your instance's `.env` like so: + +```ini +# […] + +email.fromEmail="your_email_address" +email.SMTPHost="your_smtp_host" +email.SMTPUser="your_smtp_user" +email.SMTPPass="your_smtp_password" +``` + +#### Email config options + +| Variable name | Type | Default | +| ---------------- | -------------------- | ------------ | +| **`fromEmail`** | string | `undefined` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `undefined` | +| **`SMTPUser`** | string | `undefined` | +| **`SMTPPass`** | string | `undefined` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | + +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + +## Community packages + +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. + +### Install with YunoHost + +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you. + +
    + + + Install Castopod with YunoHost + + +Github +Repo + +
    diff --git a/docs/src/uk/getting-started/security.md b/docs/src/uk/getting-started/security.md new file mode 100644 index 00000000..e205698d --- /dev/null +++ b/docs/src/uk/getting-started/security.md @@ -0,0 +1,26 @@ +--- +title: Security +--- + +# Security concerns + +Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP +framework that encourages +[good security practices](https://codeigniter.com/user_guide/concepts/security.html). + +To maximize your instance's safety and prevent any malicious attack, we +recommend you update all your Castopod files permissions after installation or +updates (to avoid any prior permission error): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/uk/getting-started/update.md b/docs/src/uk/getting-started/update.md new file mode 100644 index 00000000..98e019fb --- /dev/null +++ b/docs/src/uk/getting-started/update.md @@ -0,0 +1,109 @@ +--- +title: Update +sidebarDepth: 3 +--- + +# How to update Castopod? + +After installing Castopod, you may want to update your instance to the latest +version in order to enjoy the latest features ✨, bug fixes 🐛 and performance +improvements ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version + + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives + + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). + + ::: + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```bash + php spark castopod:database-update + ``` + +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `public/media`. + +2. Go through each release update instructions sequentially (from oldest to + newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +We advise you do, so you don't lose everything if anything goes wrong! + +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/uk/index.md b/docs/src/uk/index.md new file mode 100644 index 00000000..6e04835b --- /dev/null +++ b/docs/src/uk/index.md @@ -0,0 +1,303 @@ +--- +sidebarDepth: 2 +--- + +# Welcome 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + +::: info Status + +Castopod is currently in **beta** but already quite stable and used by +podcasters around the world! + +::: + +
    + Install +
    + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivation + +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. + +It is in fact one of the only media to have stayed this way for a long time. + +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. + +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. + +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. + +## Comparison with other solutions + +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. + +### Castopod vs Wordpress + +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. + +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. + +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. + +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. + +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwhale + +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. + +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod can be self-hosted and is the only solution that allows you to keep + full control over what you produce. Also, as it is open-source, you can even + customize it as you wish. + +- Castopod is the only solution that currently integrates both a decentralized + social network with ActivityPub as well as many of the podcasting 2.0 + features, hoping to bridge the gap between the two. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. + +### Contributing guide + +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔
    Bastien Luneteau
    Bastien Luneteau

    💻 🐛
    Cécile Ricordeau
    Cécile Ricordeau

    🎨
    Patryk Miś
    Patryk Miś

    🌍
    Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔
    Sebastian Janik
    Sebastian Janik

    💻
    Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻
    denis d
    denis d

    🐛 🤔
    Douglas Kastle
    Douglas Kastle

    🐛 🤔
    cExplorer
    cExplorer

    🐛 🌍
    ImaCrea
    ImaCrea

    🐛 🤔
    Jonas S
    Jonas S

    💻
    LEFEBVRE Yann
    LEFEBVRE Yann

    🐛
    Sebastian Späth
    Sebastian Späth

    🐛 🤔
    rocky III
    rocky III

    🐛
    Hermann Josef Eckl
    Hermann Josef Eckl

    🐛
    Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔
    João Leandro
    João Leandro

    🌍 🤔
    Angelos Chouvardas
    Angelos Chouvardas

    🌍
    Eivind
    Eivind

    🌍
    Ewen
    Ewen

    🌍 🤔
    forght
    forght

    🌍
    glottis0q
    glottis0q

    🌍
    ButterflyOfFire
    ButterflyOfFire

    🌍
    Lucian I. Last
    Lucian I. Last

    🌍
    LuuzViir
    LuuzViir

    🌍
    CTHTC
    CTHTC

    🌍
    Russian Retro
    Russian Retro

    🌍
    Marek L'ach
    Marek L'ach

    🌍
    GunChleoc
    GunChleoc

    🌍
    GabiSnow
    GabiSnow

    🌍
    bendaha
    bendaha

    🌍
    Samuel Roland
    Samuel Roland

    🌍
    Dimitri Regnier
    Dimitri Regnier

    🤔
    irithys
    irithys

    🌍
    Sergi
    Sergi

    🌍
    ghose (XoseM)
    ghose (XoseM)

    🌍
    Andreas Olsson
    Andreas Olsson

    🌍
    leonfrom
    leonfrom

    🌍
    agentcobra
    agentcobra

    🌍
    Alessandro
    Alessandro

    🌍
    liimee
    liimee

    🌍
    Ahmed Sabouni
    Ahmed Sabouni

    🌍
    + + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
    + Ad Aures Logo + NLnet Logo +
    + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md index 57a4e6f7..8e445b75 100644 --- a/docs/src/zh-Hans/getting-started/install.md +++ b/docs/src/zh-Hans/getting-started/install.md @@ -22,6 +22,8 @@ Castopod 的安装非常简单。 你能在大多数兼容的 PHP-MySQL 的服 - PHP 8.1 或更高版本 - MySQL 5.7 或更高版本与 MariaDB 10.2 或更高版本 - HTTPS 支持 +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests ### PHP 8.1 或更高版本 @@ -152,14 +154,45 @@ email.SMTPPass="你的邮件密码" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +### S3 + +By default, files are stored in the `public/media` folder using the filesystem. + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ------------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`path_style_endpoint`** | boolean | `false` | + ## 社区套餐 -如果你不想手动安装 Castopod,可以使用一个 由开源社区创建和维护的软件包。 +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. -### 使用 YunoHost 安装 +### Install with YunoHost -[YunoHost](https://yunohost.org/) 是一个基于 Debian GNU/Linux 的发行版,由免费和 -开源软件包组成。 它可以为你解决自托管的困难。 +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you.
    diff --git a/modules/Admin/Language/ar/Charts.php b/modules/Admin/Language/ar/Charts.php index 58bf1189..525085f0 100644 --- a/modules/Admin/Language/ar/Charts.php +++ b/modules/Admin/Language/ar/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'التخزين الشهري (بالميغابايت)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/ar/Episode.php b/modules/Admin/Language/ar/Episode.php index 088c1355..2c4319f8 100644 --- a/modules/Admin/Language/ar/Episode.php +++ b/modules/Admin/Language/ar/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'الحلقة', 'visibility' => 'الظهور', + 'downloads' => 'Downloads', 'comments' => 'التعليقات', 'actions' => 'الإجراءات', ], diff --git a/modules/Admin/Language/br/Charts.php b/modules/Admin/Language/br/Charts.php index 7de3c6ac..e7b7b9f9 100644 --- a/modules/Admin/Language/br/Charts.php +++ b/modules/Admin/Language/br/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Lec\'hed bann implijet bemdez (e MB)', 'total_storage_by_month' => 'Kadaviñ bep miz (e MB)', 'total_bandwidth_by_month' => 'Lec\'hed bann implijet bep miz (e MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php index 8558fc6f..6c793ec9 100644 --- a/modules/Admin/Language/br/Episode.php +++ b/modules/Admin/Language/br/Episode.php @@ -57,6 +57,7 @@ return [ }', 'episode' => 'Rann', 'visibility' => 'Gwelusted', + 'downloads' => 'Downloads', 'comments' => 'Evezhiadennoù', 'actions' => 'Obererezhioù', ], diff --git a/modules/Admin/Language/ca/AboutCastopod.php b/modules/Admin/Language/ca/AboutCastopod.php index 3fb62aff..c8598e13 100644 --- a/modules/Admin/Language/ca/AboutCastopod.php +++ b/modules/Admin/Language/ca/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'Sobre Castopod', + 'host_name' => 'Nom del servidor', + 'version' => 'Versió de Castopod', + 'php_version' => 'Versió de PHP', + 'os' => 'Sistema operatiu', + 'languages' => 'Idiomes', + 'update_database' => 'Actualitza la base de dades', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'La base de dades està actualitzada!', ], ]; diff --git a/modules/Admin/Language/ca/Breadcrumb.php b/modules/Admin/Language/ca/Breadcrumb.php index 18056225..1861a680 100644 --- a/modules/Admin/Language/ca/Breadcrumb.php +++ b/modules/Admin/Language/ca/Breadcrumb.php @@ -14,25 +14,25 @@ return [ ->gateway => 'Inici', 'podcasts' => 'podcasts', 'episodes' => 'episodis', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'subscripcions', 'contributors' => 'col·laboradors', 'pages' => 'pàgines', 'settings' => 'preferències', 'theme' => 'tema', - 'about' => 'about', + 'about' => 'quant a', 'add' => 'afegir', 'new' => 'nova', 'edit' => 'editar', 'persons' => 'persones', 'publish' => 'publicar', 'publish-edit' => 'editar la publicació', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'edita la data de publicació', 'unpublish' => 'desfer la publicació', 'delete' => 'eliminar', - 'remove' => 'remove', + 'remove' => 'suprimeix', 'fediverse' => 'Fediverse', - 'blocked-actors' => 'blocked actors', - 'blocked-domains' => 'blocked domains', + 'blocked-actors' => 'comptes bloquejats', + 'blocked-domains' => 'dominis bloquejats', 'users' => 'usuaris', 'my-account' => 'el meu compte', 'change-password' => 'canviar la contrasenya', @@ -51,5 +51,5 @@ return [ 'video-clips' => 'vídeoclips', 'embed' => 'reproductor incrustable', 'notifications' => 'notificacions', - 'suspend' => 'suspend', + 'suspend' => 'suspèn', ]; diff --git a/modules/Admin/Language/ca/Charts.php b/modules/Admin/Language/ca/Charts.php index 4873a6ee..b1085117 100644 --- a/modules/Admin/Language/ca/Charts.php +++ b/modules/Admin/Language/ca/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Ample de banda emprat diàriament (en MB)', 'total_storage_by_month' => 'Emmagatzematge mensual (en MB)', 'total_bandwidth_by_month' => 'Ample de banda emprat mensualment (en MB)', + 'total_bandwidth_by_month_limit' => 'Limitat a {totalBandwidth} al mes', ]; diff --git a/modules/Admin/Language/ca/Episode.php b/modules/Admin/Language/ca/Episode.php index f8cde303..c20eb8e8 100644 --- a/modules/Admin/Language/ca/Episode.php +++ b/modules/Admin/Language/ca/Episode.php @@ -24,14 +24,14 @@ return [ 'edit' => 'Editar', 'publish' => 'Publicar', 'publish_edit' => 'Editar la publicació', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Edita la data de publicació', 'unpublish' => 'Desfer la publicació', 'publish_error' => 'L\'episodi ja està publicat.', 'publish_edit_error' => 'L\'episodi ja està publicat.', 'publish_cancel_error' => 'L\'episodi ja està publicat.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'L\'episodi encara no s\'ha publicat, no podeu editar-ne la data de publicació.', + 'publish_date_edit_future_error' => 'La data de publicació de l\'episodi només es pot establir en una data passada! Si voleu reprogramar-lo, cancel·leu-lo primer.', + 'publish_date_edit_success' => 'La data de publicació de l\'episodi ha estat actualitzada correctament!', 'unpublish_error' => 'L\'episodi no està publicat.', 'delete' => 'Eliminar', 'go_to_page' => 'Anar a la pàgina ', @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episodi', 'visibility' => 'Visibilitat', + 'downloads' => 'Downloads', 'comments' => 'Comentaris', 'actions' => 'Accions', ], @@ -113,8 +114,8 @@ return [ 'bonus' => 'Bonificació', 'bonus_hint' => 'Contingut addicional per al programa (per exemple, informació entre bastidors o entrevistes amb el repartiment) o contingut promocional creuat per a un altre programa', ], - 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium_title' => 'Prèmium', + 'premium' => 'L\'episodi ha de ser accessible només per a subscriptors prèmium', 'parental_advisory' => [ 'label' => 'Avís parental', 'hint' => 'L\'episodi conté contingut explícit?', @@ -183,9 +184,9 @@ return [ 'message_warning_submit' => 'Publicar de totes maneres', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Nova data de publicació', + 'new_publication_date_hint' => 'Has de posar una data passada.', + 'submit' => 'Edita la data de publicació', ], 'unpublish_form' => [ 'disclaimer' => diff --git a/modules/Admin/Language/ca/Notifications.php b/modules/Admin/Language/ca/Notifications.php index bd1849f5..35032ab1 100644 --- a/modules/Admin/Language/ca/Notifications.php +++ b/modules/Admin/Language/ca/Notifications.php @@ -13,7 +13,7 @@ return [ 'reply' => '{actor_username} ha respost a la vostra publicació', 'favourite' => '{actor_username} ha marcat com a preferit la vostra publicació', 'reblog' => '{actor_username} ha compartit la vostra publicació', - 'follow' => '{actor_username} started following you', + 'follow' => '{actor_username} t\'ha començat a seguir', 'no_notifications' => 'Cap notificació', 'mark_all_as_read' => 'Marca tot com a llegit', ]; diff --git a/modules/Admin/Language/ca/Podcast.php b/modules/Admin/Language/ca/Podcast.php index 7676d509..2e0adad7 100644 --- a/modules/Admin/Language/ca/Podcast.php +++ b/modules/Admin/Language/ca/Podcast.php @@ -107,13 +107,13 @@ return [ 'monetization_section_title' => 'Monetització', 'monetization_section_subtitle' => 'Guanyeu diners gràcies al vostre públic.', - 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', - 'op3' => 'Open Podcast Prefix Project (OP3)', - 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', - 'op3_enable' => 'Enable OP3 analytics service', - 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'premium' => 'Prèmium', + 'premium_by_default' => 'Els episodis s\'han d\'establir com a prèmium de manera predeterminada', + 'premium_by_default_hint' => 'Els episodis de pòdcast es marcaran com a prèmium de manera predeterminada. Encara podreu escollir configurar alguns episodis, tràilers o bonificacions com a públics.', + 'op3' => 'Projecte obert de prefix de pòdcast (OP3)', + 'op3_hint' => 'Valoreu les vostres dades estadístiques amb OP3, un servei d\'anàlisi de tercers de codi obert i de confiança. Compartiu, valideu i compareu les vostres dades d\'anàlisi amb l\'ecosistema de podcasting obert.', + 'op3_enable' => 'Habilita el servei d\'estadístiques OP3', + 'op3_enable_hint' => 'Per motius de seguretat, les dades d\'anàlisi dels episodis prèmium no es compartiran amb OP3.', 'payment_pointer' => '`Payment Pointer` per a `Web Monetization`', 'payment_pointer_hint' => 'Aquí és on rebreu diners gràcies al servei `Web Monetization`', diff --git a/modules/Admin/Language/ca/PodcastNavigation.php b/modules/Admin/Language/ca/PodcastNavigation.php index e2e57dfb..b6996282 100644 --- a/modules/Admin/Language/ca/PodcastNavigation.php +++ b/modules/Admin/Language/ca/PodcastNavigation.php @@ -25,9 +25,9 @@ return [ 'podcast-analytics-players' => 'Reproductors', 'podcast-analytics-listening-time' => 'Temps d\'escolta', 'podcast-analytics-time-periods' => 'Períodes de temps', - 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'premium' => 'Prèmium', + 'subscription-list' => 'Totes les subscripcions', + 'subscription-add' => 'Afegiu una subscripció', 'contributors' => 'Col·laboradors', 'contributor-list' => 'Tots els col·laboradors', 'contributor-add' => 'Afegir un col·laborador', diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php index 49841f37..c5f02651 100644 --- a/modules/Admin/Language/de/Breadcrumb.php +++ b/modules/Admin/Language/de/Breadcrumb.php @@ -15,7 +15,7 @@ return [ 'podcasts' => 'Podcasts', 'episodes' => 'Folgen', 'subscriptions' => 'Abonnements', - 'contributors' => 'Administratoren', + 'contributors' => 'Mitwirkende', 'pages' => 'Seiten', 'settings' => 'Einstellungen', 'theme' => 'Erscheinungsbild', @@ -27,11 +27,11 @@ return [ 'publish' => 'veröffentlichen', 'publish-edit' => 'Veröffentlichung bearbeiten', 'publish-date-edit' => 'Veröffentlichungsdatum bearbeiten', - 'unpublish' => 'Veröffentlichung aufheben', + 'unpublish' => 'zurückziehen', 'delete' => 'löschen', 'remove' => 'Entfernen', 'fediverse' => 'Fediversum', - 'blocked-actors' => 'blockierte Akteure', + 'blocked-actors' => 'blockierte Konten', 'blocked-domains' => 'Blockierte Domains', 'users' => 'Benutzer', 'my-account' => 'Mein Konto', @@ -40,10 +40,10 @@ return [ 'platforms' => 'Plattformen', 'social' => 'soziale Netzwerke', 'funding' => 'Finanzierung', - 'analytics' => 'Analysen', + 'analytics' => 'Statistiken', 'locations' => 'Orte', 'webpages' => 'Webseiten', - 'unique-listeners' => 'einzigartige Zuhörer', + 'unique-listeners' => 'eindeutige Zuhörer', 'players' => 'Podcast-Player', 'listening-time' => 'Hörzeit', 'time-periods' => 'Zeiträume', diff --git a/modules/Admin/Language/de/Charts.php b/modules/Admin/Language/de/Charts.php index efbf2ee4..89cea21b 100644 --- a/modules/Admin/Language/de/Charts.php +++ b/modules/Admin/Language/de/Charts.php @@ -15,8 +15,8 @@ return [ 'by_device_weekly' => 'Downloads von Folgen nach Gerät (für die vergangene Woche)', 'by_os_weekly' => 'Downloads von Folgen nach Betriebssystem (für die vergangene Woche)', 'podcast_by_region' => 'Downloads von Folgen nach Region (für die vergangene Woche)', - 'unique_daily_listeners' => 'Tägliche einzigartige Zuhörer', - 'unique_monthly_listeners' => 'Monatliche einzigartige Zuhörer', + 'unique_daily_listeners' => 'Tägliche eindeutige Zuhörer', + 'unique_monthly_listeners' => 'Monatliche eindeutige Zuhörer', 'by_browser' => 'Nutzung der Webseiten nach Browser (für die vergangene Woche)', 'podcast_by_day' => 'Tägliche Downloads von Folgen', 'podcast_by_month' => 'Monatliche Downloads von Folgen', @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Täglich genutzte Bandbreite (in MB)', 'total_storage_by_month' => 'Monatlicher Speicher (in MB)', 'total_bandwidth_by_month' => 'Monatlich genutzte Bandbreite (in MB)', + 'total_bandwidth_by_month_limit' => 'Begrenzt auf {totalBandwidth} pro Monat', ]; diff --git a/modules/Admin/Language/de/Common.php b/modules/Admin/Language/de/Common.php index edb576a4..0cc58599 100644 --- a/modules/Admin/Language/de/Common.php +++ b/modules/Admin/Language/de/Common.php @@ -21,7 +21,7 @@ return [ 'copied' => 'Kopiert!', 'home' => 'Startseite', 'explicit' => 'Anstößig', - 'powered_by' => 'Betrieben durch {castopod}', + 'powered_by' => 'Betrieben mit {castopod}', 'actions' => 'Aktionen', 'pageInfo' => 'Seite {currentPage} von {pageCount}', 'go_back' => 'Zurück', diff --git a/modules/Admin/Language/de/Dashboard.php b/modules/Admin/Language/de/Dashboard.php index 48170243..2b539a71 100644 --- a/modules/Admin/Language/de/Dashboard.php +++ b/modules/Admin/Language/de/Dashboard.php @@ -17,7 +17,7 @@ return [ 'last_published' => 'Zuletzt veröffentlicht am {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episoden', + 'title' => 'Folgen', 'not_found' => 'Keine veröffentlichte Episode', 'last_published' => 'Zuletzt veröffentlicht am {lastPublicationDate}', ], diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php index d98870ab..7b286fb8 100644 --- a/modules/Admin/Language/de/Episode.php +++ b/modules/Admin/Language/de/Episode.php @@ -13,7 +13,7 @@ return [ 'season_abbr' => 'S{seasonNumber}', 'number' => 'Folge {episodeNumber}', 'number_abbr' => 'F. {episodeNumber}', - 'season_episode' => 'Staffel {seasonNumber} episode {episodeNumber}', + 'season_episode' => 'Staffel {seasonNumber} Folge {episodeNumber}', 'season_episode_abbr' => 'S{seasonNumber}F{episodeNumber}', 'number_of_comments' => '{numberOfComments, plural, one {# Kommentar} @@ -54,8 +54,9 @@ return [ other {# Folgen} }', 'episode' => 'Folge', - 'visibility' => 'Sichtweite', - 'comments' => 'Komemntar', + 'visibility' => 'Sichtbarkeit', + 'downloads' => 'Downloads', + 'comments' => 'Kommentar', 'actions' => 'Aktionen', ], 'messages' => [ @@ -67,7 +68,7 @@ return [ with_podcast {Diese Folge wird zeitgleich mit dem Podcast veröffentlicht.} other {Diese Folge ist nicht veröffentlicht.} }', - 'publishCancelSuccess' => 'Veröffentlichung der Episode erfolgreich abgebrochen!', + 'publishCancelSuccess' => 'Veröffentlichung der Episode abgebrochen!', 'unpublishBeforeDeleteTip' => 'Du musst die Episode zurückziehen, bevor du sie löschst.', 'scheduleDateError' => 'Veröffentlichungsdatum muss gesetzt sein!', 'deletePublishedEpisodeError' => 'Bitte ziehe die Episode zurück, bevor du sie löschst.', diff --git a/modules/Admin/Language/de/Fediverse.php b/modules/Admin/Language/de/Fediverse.php index 5a22c8dc..1c2a060d 100644 --- a/modules/Admin/Language/de/Fediverse.php +++ b/modules/Admin/Language/de/Fediverse.php @@ -12,7 +12,7 @@ return [ 'messages' => [ 'actorNotFound' => 'Das Konto konnte nicht gefunden werden!', 'blockActorSuccess' => '{actor} wurde blockiert!', - 'unblockActorSuccess' => 'Darsteller wurde freigegeben!', + 'unblockActorSuccess' => 'Benutzer wurde entsperrt!', 'blockDomainSuccess' => '{domain} wurde blockiert!', 'unblockDomainSuccess' => '{domain} wurde freigegeben!', ], diff --git a/modules/Admin/Language/de/Install.php b/modules/Admin/Language/de/Install.php index d901d1c5..89a8b267 100644 --- a/modules/Admin/Language/de/Install.php +++ b/modules/Admin/Language/de/Install.php @@ -20,10 +20,10 @@ return [ 'Um optional CDN und/oder einen externen Analysedienst verwenden zu können, müssen die Daten eingegeben werden.', 'admin_gateway' => 'Admin-Gateway', 'admin_gateway_hint' => - 'Die Route zum Zugriff auf den Admin-Bereich (z.B. https://example.com/cp-admin). Standardmäßig als cp-admin festgelegt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.', + 'Der Pfad zum Zugriff auf den Admin-Bereich (z.B. https://example.com/cp-admin). Standardmäßig als cp-admin festgelegt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.', 'auth_gateway' => 'Auth-Gateway', 'auth_gateway_hint' => - 'Die Route zum Zugriff auf die Authentifizierungsseiten (z. B. https://example.com/cp-auth). Standardmäßig als cp-auth gesetzt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.', + 'Der Pfad zum Zugriff auf die Authentifizierungsseiten (z. B. https://example.com/cp-auth). Standardmäßig als cp-auth gesetzt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.', 'database_config' => 'Datenbankkonfiguration', 'database_config_hint' => 'Castopod muss sich mit der MySQL-Datenbank (oder MariaDB) verbinden. Wenn diese erforderlichen Informationen nicht verfügbar sind, wenden Sie sich bitte an Ihren Serveradministrator.', @@ -31,12 +31,12 @@ return [ 'db_name' => 'Datenbankname', 'db_username' => 'Datenbankbenutzername', 'db_password' => 'Datenbankpasswort', - 'db_prefix' => 'Datenbankpräfix', + 'db_prefix' => 'Tabellenpräfix', 'db_prefix_hint' => - "Das Präfix der Castopod-Tabellennamen. Nicht anpassen, wenn nicht gewiss, was damit gemeint ist.", + "Das Präfix der Castopod-Tabellennamen. Nicht anpassen, wenn du nicht weißt, was damit gemeint ist.", 'cache_config' => 'Cachekonfiguration', 'cache_config_hint' => - 'Wählen Sie Ihren bevorzugten Cache-Handler. Standardwert verwenden, wenn nicht gewiss, was damit gemeint ist.', + 'Wählen Sie Ihren bevorzugten Cache-Handler. Standardwert verwenden, wenn Sie nicht wissen, was damit gemeint ist.', 'cache_handler' => 'Cache-Handler', 'cacheHandlerOptions' => [ 'file' => 'Datei', diff --git a/modules/Admin/Language/de/Page.php b/modules/Admin/Language/de/Page.php index e5e5febb..801ff2e7 100644 --- a/modules/Admin/Language/de/Page.php +++ b/modules/Admin/Language/de/Page.php @@ -18,7 +18,7 @@ return [ 'delete' => 'Seite löschen', 'form' => [ 'title' => 'Titel', - 'permalink' => 'Permanenter Link', + 'permalink' => 'Permalink', 'content' => 'Inhalt', 'submit_create' => 'Seite erstellen', 'submit_edit' => 'Speichern', diff --git a/modules/Admin/Language/de/Pager.php b/modules/Admin/Language/de/Pager.php index d2bddfb6..54c96cbe 100644 --- a/modules/Admin/Language/de/Pager.php +++ b/modules/Admin/Language/de/Pager.php @@ -10,10 +10,10 @@ declare(strict_types=1); return [ 'pageNavigation' => 'Seiten-Navigation', - 'first' => 'Erste', - 'previous' => 'Zurück', - 'next' => 'Weiter', - 'last' => 'Letzte', + 'first' => 'Erste Seite', + 'previous' => 'Vorherige', + 'next' => 'Nächste', + 'last' => 'Letzte Seite', 'older' => 'Älter', 'newer' => 'Neuer', 'invalidTemplate' => '{0} ist kein gültiges Pager Template.', diff --git a/modules/Admin/Language/de/Person.php b/modules/Admin/Language/de/Person.php index d0c8de9c..a9287867 100644 --- a/modules/Admin/Language/de/Person.php +++ b/modules/Admin/Language/de/Person.php @@ -44,7 +44,7 @@ return [ 'Es können eine oder mehrere Personen mit der gleichen Rolle ausgewählt werden. Die Personen müssen zuerst erstellt werden.', 'roles' => 'Rollen', 'roles_hint' => - 'Es können sowhol keine, eine als auch mehrere Rollen für eine Person ausgewählt werden.', + 'Es können sowohl keine, eine als auch mehrere Rollen für eine Person ausgewählt werden.', 'submit_add' => 'Person:en hinzufügen', 'remove' => 'Entfernen', ], @@ -57,9 +57,9 @@ return [ 'Es können eine oder mehrere Personen mit der gleichen Rolle ausgewählt werden. Die Personen müssen zuerst erstellt werden.', 'roles' => 'Rollen', 'roles_hint' => - 'Es können sowhol keine, eine als auch mehrere Rollen für eine Person ausgewählt werden.', + 'Es können sowohl keine, eine als auch mehrere Rollen für eine Person ausgewählt werden.', 'submit_add' => 'Person:en hinzufügen', 'remove' => 'Entfernen', ], - 'credits' => 'Danksagungen', + 'credits' => 'Credits', ]; diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php index 6cbd82ed..62b5e330 100644 --- a/modules/Admin/Language/de/Podcast.php +++ b/modules/Admin/Language/de/Podcast.php @@ -20,7 +20,7 @@ return [ 'publish_edit' => 'Veröffentlichung bearbeiten', 'delete' => 'Podcast löschen', 'see_episodes' => 'Episoden ansehen', - 'see_contributors' => 'Administratoren anzeigen', + 'see_contributors' => 'Mitwirkende anzeigen', 'go_to_page' => 'Gehe zur Seite', 'latest_episodes' => 'Neueste Folgen', 'see_all_episodes' => 'Alle Folgen anzeigen', @@ -65,7 +65,7 @@ return [ 'title' => 'Titel', 'handle' => 'Identifikator', 'handle_hint' => - 'Verwendet um den Podcast zu identifizieren. Großbuchstaben, Kleinbuchstaben, Zahlen und Unterstriche sind erlaubt.', + 'Wird genutzt, um den Podcast zu identifizieren. Großbuchstaben, Kleinbuchstaben, Zahlen und Unterstriche sind erlaubt.', 'type' => [ 'label' => 'Typ', 'episodic' => 'Episodisch', @@ -85,7 +85,7 @@ return [ 'label' => 'Hinweis an Eltern', 'hint' => 'Enthält die Folge anstößige Inhalte?', 'undefined' => 'nicht definiert', - 'clean' => 'Zurücksetzen', + 'clean' => 'Sauber', 'explicit' => 'Anstößig', ], 'author_section_title' => 'Autor', @@ -101,12 +101,12 @@ return [ 'Die Gruppe, die für die Erstellung des Podcasts verantwortlich ist. Oft bezogen auf die Muttergesellschaft oder das Netzwerk eines Podcasts. Dieses Feld wird manchmal als \'Autor\' bezeichnet.', 'copyright' => 'Urheberrecht', 'location_section_title' => 'Standort', - 'location_section_subtitle' => 'Über welchen Ort handelt dieser Podcast?', + 'location_section_subtitle' => 'Um welchen Ort geht es in diesem Podcast?', 'location_name' => 'Standortname oder Adresse', - 'location_name_hint' => 'Dies kann ein echter Ort oder fiktiv sein', + 'location_name_hint' => 'Dies kann ein echter oder ein fiktiver Ort sein', 'monetization_section_title' => 'Monetarisierung', 'monetization_section_subtitle' => - 'Geld dank der Zuhöhrer verdienen.', + 'Geld dank der Zuhörer verdienen.', 'premium' => 'Premium', 'premium_by_default' => 'Episoden müssen standardmäßig als Premium festgelegt werden', 'premium_by_default_hint' => 'Podcast-Episoden werden standardmäßig als Premium markiert. Sie können dennoch einzelne Episoden, Trailer oder Boni als öffentlich festlegen.', @@ -119,7 +119,7 @@ return [ 'Hier erhalten Sie dank Monetarisierung Geld', 'advanced_section_title' => 'Erweiterte Einstellungen', 'advanced_section_subtitle' => - 'Wenn RSS-Tags benötigt werden, die Castopod nicht verwendet, können diese hier gesetz werden.', + 'Wenn RSS-Tags benötigt werden, die Castopod nicht verwendet, können diese hier gesetzt werden.', 'custom_rss' => 'Eigene RSS-Tags für den Podcast', 'custom_rss_hint' => 'Dies wird innerhalb des ❬channel❭ Tags eingefügt.', 'new_feed_url' => 'Neue Feed-URL', @@ -133,11 +133,11 @@ return [ 'partner_image_url' => 'Bildadresse', 'partner_id_hint' => 'Ihre eigene Partner-ID', 'partner_link_url_hint' => 'Die generische Partnerlink-Adresse', - 'partner_image_url_hint' => 'Die generische Partnerbild-adresse', + 'partner_image_url_hint' => 'Die generische Partnerbild-Adresse', 'status_section_title' => 'Status', 'block' => 'Podcast soll vor öffentlichen Katalogen versteckt werden', 'block_hint' => - 'Der Podcast zeigt oder versteckt den Status: Beim Einschalten dieser Option wird verhindert, dass der Podcast in Apple Podcasts, Google Podcasts und alle Apps von Drittanbietern, die Inhalte aus diesen Verzeichnissen ziehen, erscheint. (Nicht garantiert)', + 'Der Podcast zeigt oder versteckt den Status: Beim Einschalten dieser Option wird verhindert, dass der Podcast in Apple Podcasts, Google Podcasts und alle Apps von Drittanbietern, die Inhalte aus diesen Verzeichnissen ziehen, erscheint. (Ohne Garantie!)', 'complete' => 'Der Podcast wird keine neuen Folgen erhalten', 'lock' => 'Schütze den Podcast davor kopiert zu werden', 'lock_hint' => @@ -148,8 +148,8 @@ return [ 'category_options' => [ 'uncategorized' => 'unkategorisiert', 'arts' => 'Kunst', - 'business' => 'Geschäftlich', - 'comedy' => 'Komödie', + 'business' => 'Geschäftliches', + 'comedy' => 'Comedy', 'education' => 'Bildung', 'fiction' => 'Fiktion', 'government' => 'Regierung', @@ -172,12 +172,12 @@ return [ 'food' => 'Essen', 'performing_arts' => 'Darstellende Kunst', 'visual_arts' => 'Visuelle Kunst', - 'careers' => 'Karrieren', - 'entrepreneurship' => 'Entrepreneurship', + 'careers' => 'Karriere', + 'entrepreneurship' => 'Unternehmertum', 'investing' => 'Investment', 'management' => 'Management', 'marketing' => 'Marketing', - 'non_profit' => 'Gemeinnützig', + 'non_profit' => 'Gemeinnützigkeit', 'comedy_interviews' => 'Comedy-Interviews', 'improv' => 'Improvisation', 'stand_up' => 'Stand-Up', diff --git a/modules/Admin/Language/de/PodcastImport.php b/modules/Admin/Language/de/PodcastImport.php index 7eb3d60a..2592625d 100644 --- a/modules/Admin/Language/de/PodcastImport.php +++ b/modules/Admin/Language/de/PodcastImport.php @@ -20,9 +20,9 @@ return [ 'advanced_params_section_title' => 'Erweiterte Parameter', 'advanced_params_section_subtitle' => 'Behalten Sie die Standardwerte, wenn Sie keine Ahnung haben, wofür die Felder sind.', - 'slug_field' => 'Feld zum Berechnen der Episoden-URL (epiode slug)', + 'slug_field' => 'Feld zum Berechnen der Episoden-URL (episode slug)', 'description_field' => - 'Quellfeld für Episodenbeschreibung verwendet / Notizen anzeigen', + 'Dieses Feld wird für die Episodenbeschreibung und Shownotes verwendet', 'force_renumber' => 'Erzwinge Neu-Nummerierung der Folgen', 'force_renumber_hint' => 'Verwende dies, wenn dein Podcast keine Episodennummern hat, aber du diese während des Imports setzen möchtest.', @@ -30,7 +30,7 @@ return [ 'season_number_hint' => 'Benutze dies, wenn dein Podcast keine Staffelnummer hat, aber du eine beim Import setzen möchtest. Lasse es andernfalls leer.', 'max_episodes' => 'Maximale Anzahl der zu importierenden Episoden', - 'max_episodes_hint' => 'Leer lassen um alle Episoden zu importieren', + 'max_episodes_hint' => 'Leer lassen, um alle Episoden zu importieren', 'lock_import' => 'Dieser Feed ist geschützt. Du kannst ihn nicht importieren. Wenn du der Besitzer bist, entferne den Schutz auf der Ursprungsplattform.', 'submit' => 'Podcast importieren', diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php index 4feafcfb..0ca281f0 100644 --- a/modules/Admin/Language/de/PodcastNavigation.php +++ b/modules/Admin/Language/de/PodcastNavigation.php @@ -17,7 +17,7 @@ return [ 'episodes' => 'Folgen', 'episode-list' => 'Alle Episoden', 'episode-create' => 'Neue Episoden', - 'analytics' => 'Analysen', + 'analytics' => 'Statistiken', 'podcast-analytics' => 'Zuhörer-Übersicht', 'podcast-analytics-webpages' => 'Webseiten-Besuche', 'podcast-analytics-locations' => 'Standorte', @@ -28,9 +28,9 @@ return [ 'premium' => 'Premium', 'subscription-list' => 'Alle Abonnements', 'subscription-add' => 'Abonnement hinzufügen', - 'contributors' => 'Administratoren', + 'contributors' => 'Mitwirkende', 'contributor-list' => 'Alle Unterstützer', - 'contributor-add' => 'Administrator hinzufügen', + 'contributor-add' => 'Mitwirkenden hinzufügen', 'platforms' => 'Externe Plattformen', 'platforms-podcasting' => 'Podcasting', 'platforms-social' => 'Soziale Netzwerke', diff --git a/modules/Admin/Language/de/Settings.php b/modules/Admin/Language/de/Settings.php index 551f4070..d046a40e 100644 --- a/modules/Admin/Language/de/Settings.php +++ b/modules/Admin/Language/de/Settings.php @@ -14,7 +14,7 @@ return [ 'title' => 'Instanz', 'site_icon' => 'Webseiten-Icon', 'site_icon_delete' => 'Lösche Webseiten-Icon', - 'site_icon_hint' => 'Webseiten-Icons sind das, was Sie auf Ihrem Browser Tabs, Lesezeichenleiste und wenn Sie eine Website als Verknüpfung auf mobilen Geräten hinzufügen, sehen.', + 'site_icon_hint' => 'Webseiten-Icons sind das, was Sie in Ihren Browser-Tabs, der Lesezeichenleiste und als Verknüpfung auf mobilen Geräten sehen.', 'site_icon_helper' => 'Das Icon muss quadratisch und mindestens 512px breit und hoch sein.', 'site_name' => 'Seitenname', 'site_description' => 'Seitenbeschreibung', @@ -38,7 +38,7 @@ return [ 'rename_episodes_files' => 'Audiodateien der Episode umbenennen', 'rename_episodes_files_hint' => 'Diese Option wird alle Audiodateien der Episode mit einer zufälligen Zeichenkette umbenennen. Benutzen Sie diese Option, wenn einer Ihrer privaten Episoden-Links durchsickert, da diese dadurch versteckt werden.', 'clear_cache' => 'Alle Caches löschen', - 'clear_cache_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/cache-Dateien.', + 'clear_cache_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/Cache-Dateien.', 'run' => 'Systempflege starten', 'runSuccess' => 'Die Systempflege wurde erfolgreich durchgeführt!', ], diff --git a/modules/Admin/Language/de/Soundbite.php b/modules/Admin/Language/de/Soundbite.php index 75f0103d..e8d6782f 100644 --- a/modules/Admin/Language/de/Soundbite.php +++ b/modules/Admin/Language/de/Soundbite.php @@ -10,22 +10,22 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Tonschnipsel', - 'soundbite' => 'Tonschnipsel', + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', ], 'messages' => [ - 'createSuccess' => 'Tonschnipsel wurde erfolgreich erstellt!', - 'deleteSuccess' => 'Tonschnipsel wurde erfolgreich entfernt!', + 'createSuccess' => 'Soundbite wurde erfolgreich erstellt!', + 'deleteSuccess' => 'Soundbite wurde erfolgreich entfernt!', ], 'form' => [ - 'title' => 'Neuer Tonschnipsel', - 'soundbite_title' => 'Tonschnipsel-Titel', + 'title' => 'Neues Soundbite', + 'soundbite_title' => 'Soundbite-Titel', 'start_time' => 'Beginne bei', 'duration' => 'Länge', - 'submit' => 'Tonschnipsel erstellen', + 'submit' => 'Soundbite erstellen', ], - 'play' => 'Tonschnipsel abspielen', + 'play' => 'Soundbite abspielen', 'stop' => 'Tonschnipsel stoppen', - 'create' => 'Neuer Tonschnipsel', - 'delete' => 'Tonschnipsel löschen', + 'create' => 'Neues Soundbite', + 'delete' => 'Soundbite löschen', ]; diff --git a/modules/Admin/Language/de/VideoClip.php b/modules/Admin/Language/de/VideoClip.php index bffcd16c..ccf9841b 100644 --- a/modules/Admin/Language/de/VideoClip.php +++ b/modules/Admin/Language/de/VideoClip.php @@ -25,7 +25,7 @@ return [ 'passed_hint' => 'Clip wurde erfolgreich erstellt!', ], 'clip' => 'Clip', - 'duration' => 'Job Laufzeit', + 'duration' => 'Laufzeit', ], 'title' => 'Video-Clip: {videoClipLabel}', 'download_clip' => 'Clip herunterladen', @@ -33,7 +33,7 @@ return [ 'go_to_page' => 'Zur Clip-Seite gehen', 'retry' => 'Clip-Generierung wiederholen', 'delete' => 'Clip löschen', - 'logs' => 'Job-Logs', + 'logs' => 'Jobprotokoll', 'messages' => [ 'alreadyExistingError' => 'Der Videoclip, den Sie zu erstellen versuchen, existiert bereits!', 'addToQueueSuccess' => 'Videoclip wurde zur Warteschlange hinzugefügt und wartet darauf, erstellt zu werden!', @@ -57,9 +57,9 @@ return [ 'theme' => 'Wähle ein Design', 'start_time' => 'Beginne bei', 'duration' => 'Laufzeit', - 'trim_start' => 'Trimm-Start', - 'trim_end' => 'Trimm-Ende', - 'submit' => 'Erstelle Videoclip', + 'trim_start' => 'Startpunkt', + 'trim_end' => 'Ende trimmen', + 'submit' => 'Neuen Clip erstellen', ], 'requirements' => [ 'title' => 'Fehlende Anforderungen', diff --git a/modules/Admin/Language/el/Charts.php b/modules/Admin/Language/el/Charts.php index 4575d14d..247a77e7 100644 --- a/modules/Admin/Language/el/Charts.php +++ b/modules/Admin/Language/el/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Ημερήσιο χρησιμοποιούμενο bandwidth (σε MB)', 'total_storage_by_month' => 'Μηνιαία αποθήκευση (σε MB)', 'total_bandwidth_by_month' => 'Μηνιαίο χρησιμοποιούμενο εύρος ζώνης (σε MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/el/Episode.php b/modules/Admin/Language/el/Episode.php index b7e2bbc6..fc9c0e92 100644 --- a/modules/Admin/Language/el/Episode.php +++ b/modules/Admin/Language/el/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Επεισόδιο', 'visibility' => 'Ορατότητα', + 'downloads' => 'Downloads', 'comments' => 'Σχόλια', 'actions' => 'Ενέργειες', ], diff --git a/modules/Admin/Language/es/Charts.php b/modules/Admin/Language/es/Charts.php index fee7dda4..11c714f0 100644 --- a/modules/Admin/Language/es/Charts.php +++ b/modules/Admin/Language/es/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Ancho de banda diario usado (en MB)', 'total_storage_by_month' => 'Almacenamiento mensual (en MB)', 'total_bandwidth_by_month' => 'Ancho de banda mensual usado (en MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/es/Episode.php b/modules/Admin/Language/es/Episode.php index d586f420..84f32672 100644 --- a/modules/Admin/Language/es/Episode.php +++ b/modules/Admin/Language/es/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episodio', 'visibility' => 'Visibilidad', + 'downloads' => 'Downloads', 'comments' => 'Comentarios', 'actions' => 'Acciones', ], diff --git a/modules/Admin/Language/fa/Charts.php b/modules/Admin/Language/fa/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/fa/Charts.php +++ b/modules/Admin/Language/fa/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/fa/Episode.php b/modules/Admin/Language/fa/Episode.php index 713b517b..5ed5e3ac 100644 --- a/modules/Admin/Language/fa/Episode.php +++ b/modules/Admin/Language/fa/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/fr/AboutCastopod.php b/modules/Admin/Language/fr/AboutCastopod.php index 3fb62aff..7cd9412b 100644 --- a/modules/Admin/Language/fr/AboutCastopod.php +++ b/modules/Admin/Language/fr/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'À propos de Castopod', + 'host_name' => 'Nom d’hôte', + 'version' => 'Version de Castopod', + 'php_version' => 'Version de PHP', + 'os' => 'Système d\'exploitation', + 'languages' => 'Langues', + 'update_database' => 'Mettre à jour la base de données', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'La base de données est à jour!', ], ]; diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php index a72289fd..1ddcb23c 100644 --- a/modules/Admin/Language/fr/Breadcrumb.php +++ b/modules/Admin/Language/fr/Breadcrumb.php @@ -31,8 +31,8 @@ return [ 'delete' => 'supprimer', 'remove' => 'retirer', 'fediverse' => 'fédiverse', - 'blocked-actors' => 'blocked actors', - 'blocked-domains' => 'blocked domains', + 'blocked-actors' => 'acteurs bloqués', + 'blocked-domains' => 'domaines bloqués', 'users' => 'utilisateurs', 'my-account' => 'mon compte', 'change-password' => 'changer le mot de passe', diff --git a/modules/Admin/Language/fr/Charts.php b/modules/Admin/Language/fr/Charts.php index 43fb6717..ee7defd5 100644 --- a/modules/Admin/Language/fr/Charts.php +++ b/modules/Admin/Language/fr/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Bande passante quotidienne consommée (en Mo)', 'total_storage_by_month' => 'Stockage mensuel (en Mo)', 'total_bandwidth_by_month' => 'Bande passante mensuelle utilisée (en Mo)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/fr/Dashboard.php b/modules/Admin/Language/fr/Dashboard.php index 881073fd..010761fa 100644 --- a/modules/Admin/Language/fr/Dashboard.php +++ b/modules/Admin/Language/fr/Dashboard.php @@ -9,20 +9,20 @@ declare(strict_types=1); */ return [ - 'home' => 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', + 'home' => 'Tableau de bord', + 'welcome_message' => 'Bienvenue dans l\'espace d\'administration !', 'podcasts' => [ 'title' => 'Podcasts', - 'not_found' => 'No published podcast', - 'last_published' => 'Last published on {lastPublicationDate}', + 'not_found' => 'Pas de podcast publié', + 'last_published' => 'Dernière publication le {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episodes', - 'not_found' => 'No published episode', - 'last_published' => 'Last published on {lastPublicationDate}', + 'title' => 'Épisodes', + 'not_found' => 'Aucun épisode publié', + 'last_published' => 'Dernière publication le {lastPublicationDate}', ], 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', + 'title' => 'Espace de stockage', + 'subtitle' => '{totalUploaded} sur {totalStorage}', ], ]; diff --git a/modules/Admin/Language/fr/Episode.php b/modules/Admin/Language/fr/Episode.php index 5cf925c0..55579ee3 100644 --- a/modules/Admin/Language/fr/Episode.php +++ b/modules/Admin/Language/fr/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Épisode', 'visibility' => 'Visibilité', + 'downloads' => 'Downloads', 'comments' => 'Commentaires', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/fr/Notifications.php b/modules/Admin/Language/fr/Notifications.php index 42f1149b..003b2bbb 100644 --- a/modules/Admin/Language/fr/Notifications.php +++ b/modules/Admin/Language/fr/Notifications.php @@ -10,10 +10,10 @@ declare(strict_types=1); return [ 'title' => 'Notifications', - 'reply' => '{actor_username} replied to your post', - 'favourite' => '{actor_username} favourited your post', - 'reblog' => '{actor_username} shared your post', - 'follow' => '{actor_username} started following you', + 'reply' => '{actor_username} a répondu à votre message', + 'favourite' => '{actor_username} a mis en favori votre message', + 'reblog' => '{actor_username} à partagé votre message', + 'follow' => '{actor_username} commencé à te suivre', 'no_notifications' => 'Aucune notification', 'mark_all_as_read' => 'Tout marquer comme lu', ]; diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php index c9769727..ca69055f 100644 --- a/modules/Admin/Language/fr/Podcast.php +++ b/modules/Admin/Language/fr/Podcast.php @@ -111,9 +111,9 @@ return [ 'premium_by_default' => 'Les épisodes doivent être définis comme premium par défaut', 'premium_by_default_hint' => 'Les épisodes de Podcast seront marqués comme premium par défaut. Vous pouvez toujours choisir de définir certains épisodes, bandes-annonces ou bonus comme publics.', 'op3' => 'Open Podcast Prefix Project (OP3)', - 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', - 'op3_enable' => 'Enable OP3 analytics service', - 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'op3_hint' => 'Valorisez vos données d\'analyse avec OP3, un service d\'analyse tiers open source et de confiance. Partagez, validez et comparez vos données analytiques avec l\'écosystème de podcasting ouvert.', + 'op3_enable' => 'Activer le service d\'analyse OP3', + 'op3_enable_hint' => 'Pour des raisons de sécurité, les données d\'analyse des épisodes premium ne seront pas partagées avec OP3.', 'payment_pointer' => 'Adresse de paiement (Payment Pointer) pour Web Monetization', 'payment_pointer_hint' => 'L’adresse où vous recevrez de l’argent grâce à Web Monetization', @@ -137,7 +137,7 @@ return [ 'status_section_title' => 'Statut', 'block' => 'L\'épisode doit être masqué dans les catalogues publics', 'block_hint' => - 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'Le statut d\'affichage ou de masquage du podcast : activer cette option empêche l\'intégralité du podcast d\'apparaître dans les podcasts Apple, Google Podcasts et toutes les applications tierces qui extraient des émissions de ces répertoires. (Pas garantie)', 'complete' => 'Le podcast n’aura plus de nouveaux épisodes.', 'lock' => 'Empêcher la copie du podcast', 'lock_hint' => @@ -259,36 +259,36 @@ return [ 'tv_reviews' => 'Critiques TV', ], 'publish_form' => [ - 'back_to_podcast_dashboard' => 'Back to podcast dashboard', - 'post' => 'Your announcement post', + 'back_to_podcast_dashboard' => 'Retour au tableau de bord des podcasts', + 'post' => 'Votre message de publication', 'post_hint' => - "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'submit' => 'Publish', - 'publication_date' => 'Publication date', + "Écrivez un message pour annoncer la publication de votre podcast. Le message sera affiché sur la page d'accueil de votre podcast.", + 'message_placeholder' => 'Rédiger votre message…', + 'submit' => 'Publier', + 'publication_date' => 'Date de publication', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', + 'now' => 'Maintenant', + 'schedule' => 'Planifier', ], - 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date' => 'Date de publication programmée', 'scheduled_publication_date_hint' => - 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', - 'message_warning' => 'You did not write a message for your announcement post!', - 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', - 'message_warning_submit' => 'Publish anyway', + 'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication. Ce champ doit être au format YYYY-MM-DD HH:mm', + 'submit_edit' => 'Modifier la publication', + 'cancel_publication' => 'Annuler la publication', + 'message_warning' => 'Vous n’avez pas saisi de message pour l’annonce de votre épisode !', + 'message_warning_hint' => 'Avoir un message augmente l\'engagement social, résultant en une meilleure visibilité pour votre podcast.', + 'message_warning_submit' => 'Publier quand même', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', - 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + 'draft_mode' => 'Mode brouillon', + 'not_published' => 'Ce podcast n\'est pas encore publié.', + 'scheduled' => 'Ce podcast est programmé pour être publié le {publication_date}.', ], 'delete_form' => [ 'disclaimer' => - "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", - 'understand' => 'I understand, I want the podcast to be permanently deleted', - 'submit' => 'Delete', + "La suppression du podcast supprimera tous les épisodes, fichiers multimédia, messages et statistiques qui y sont associées. Cette action est irréversible, vous ne pourrez plus les récupérer par la suite.", + 'understand' => 'Je comprends, je souhaite que le podcast soit définitivement supprimé', + 'submit' => 'Supprimer', ], 'by' => 'Par {publisher}', 'season' => 'Saison {seasonNumber}', diff --git a/modules/Admin/Language/fr/PodcastNavigation.php b/modules/Admin/Language/fr/PodcastNavigation.php index 86a1bf52..d49055b2 100644 --- a/modules/Admin/Language/fr/PodcastNavigation.php +++ b/modules/Admin/Language/fr/PodcastNavigation.php @@ -26,8 +26,8 @@ return [ 'podcast-analytics-listening-time' => 'Durée d’écoute', 'podcast-analytics-time-periods' => 'Périodes', 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-list' => 'Tous les abonnements', + 'subscription-add' => 'Ajouter un abonnement', 'contributors' => 'Contributeurs', 'contributor-list' => 'Tous les contributeurs', 'contributor-add' => 'Ajouter un contributeur', diff --git a/modules/Admin/Language/fr/Settings.php b/modules/Admin/Language/fr/Settings.php index e6b0f547..f32fc3ec 100644 --- a/modules/Admin/Language/fr/Settings.php +++ b/modules/Admin/Language/fr/Settings.php @@ -35,8 +35,8 @@ return [ 'reset_counts_helper' => 'Cette option recalcule et réinitialise les compteurs de données (nombre d’abonné·e·s, de publications, de commentaires, …).', 'rewrite_media' => 'Réécrire les métadonnées des fichiers média', 'rewrite_media_helper' => 'Cette option supprimera tous les fichiers média superflus et les recréera (images, fichiers audio, transcripts, chapitrages, …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'rename_episodes_files' => 'Renommer les fichiers audio de l\'épisode', + 'rename_episodes_files_hint' => 'Cette option renommera tous les fichiers audio des épisodes en une chaîne de caractères aléatoire. Utilisez-le si l\'un de vos liens d\'épisodes privés a été divulgué, car cela le masquera efficacement.', 'clear_cache' => 'Supprimer tout le cache', 'clear_cache_helper' => 'Cette option supprimera l’intégralité du cache redis ou des fichiers cache du dossier writable/cache.', 'run' => 'Faire le ménage', diff --git a/modules/Admin/Language/fr2/Breadcrumb.php b/modules/Admin/Language/fr2/Breadcrumb.php new file mode 100644 index 00000000..c2e761ca --- /dev/null +++ b/modules/Admin/Language/fr2/Breadcrumb.php @@ -0,0 +1,55 @@ + 'fil d’Ariane', + config('Admin') + ->gateway => 'Accueil', + 'podcasts' => 'podcasts', + 'episodes' => 'épisodes', + 'subscriptions' => 'abonnements', + 'contributors' => 'contributeurs', + 'pages' => 'pages', + 'settings' => 'paramètres', + 'theme' => 'thème', + 'about' => 'à propos', + 'add' => 'ajouter', + 'new' => 'créer', + 'edit' => 'modifier', + 'persons' => 'intervenants', + 'publish' => 'publier', + 'publish-edit' => 'modifier la publication', + 'publish-date-edit' => 'modifier la date de publication', + 'unpublish' => 'dépublier', + 'delete' => 'supprimer', + 'remove' => 'retirer', + 'fediverse' => 'fédiverse', + 'blocked-actors' => 'utilisateurs bloqués', + 'blocked-domains' => 'domaines bloqués', + 'users' => 'utilisateurs', + 'my-account' => 'mon compte', + 'change-password' => 'changer le mot de passe', + 'import' => 'importer un flux', + 'platforms' => 'plateformes', + 'social' => 'réseaux sociaux', + 'funding' => 'financement', + 'analytics' => 'mesure d’audience', + 'locations' => 'localisation', + 'webpages' => 'pages web', + 'unique-listeners' => 'auditeurs uniques', + 'players' => 'lecteurs', + 'listening-time' => 'durée d’écoute', + 'time-periods' => 'périodes', + 'soundbites' => 'extraits sonores', + 'video-clips' => 'extraits vidéo', + 'embed' => 'lecteur intégré', + 'notifications' => 'notifications', + 'suspend' => 'suspendre', +]; diff --git a/modules/Admin/Language/fr2/Charts.php b/modules/Admin/Language/fr2/Charts.php new file mode 100644 index 00000000..22759389 --- /dev/null +++ b/modules/Admin/Language/fr2/Charts.php @@ -0,0 +1,41 @@ + 'Téléchargements d’épisodes par service (la semaine dernière)', + 'by_player_weekly' => 'Téléchargements d’épisodes par lecteur (la semaine dernière)', + 'by_player_yearly' => 'Téléchargements d’épisodes par lecteur (cette année)', + 'by_device_weekly' => 'Téléchargements d’épisodes par appareil (la semaine dernière)', + 'by_os_weekly' => 'Téléchargements d’épisodes par OS (la semaine dernière)', + 'podcast_by_region' => 'Téléchargements d’épisodes par région (la semaine dernière)', + 'unique_daily_listeners' => 'Auditeurs uniques quotidiens', + 'unique_monthly_listeners' => 'Auditeurs uniques mensuels', + 'by_browser' => 'Fréquentation des pages web par navigateur (la semaine dernière)', + 'podcast_by_day' => 'Téléchargements quotidiens d’épisodes', + 'podcast_by_month' => 'Téléchargements mensuels d’épisodes', + 'episode_by_day' => 'Téléchargements quotidiens de l’épisode (les 60 premiers jours)', + 'episode_by_month' => 'Téléchargements mensuels de l’épisode', + 'episodes_by_day' => + 'Téléchargements des 5 derniers épisodes (lors de leurs 60 premiers jours)', + 'by_country_weekly' => 'Téléchargements d’épisodes par pays (la dernière semaine)', + 'by_country_yearly' => 'Téléchargements d’épisodes par pays (l\'année dernière)', + 'by_domain_weekly' => 'Fréquentation des pages web par origine (la semaine dernière)', + 'by_domain_yearly' => 'Fréquentation des pages web par origine (la semaine dernière)', + 'by_entry_page' => 'Fréquentation des pages web par page d’entrée (la semaine dernière)', + 'podcast_bots' => 'Robots (bots)', + 'daily_listening_time' => 'Durée quotidienne d’écoute cumulée', + 'monthly_listening_time' => 'Durée mensuelle d’écoute cumulée', + 'by_weekday' => 'Par jour de la semaine (les 60 derniers jours)', + 'by_hour' => 'Par heure de la journée (les 60 derniers jours)', + 'podcast_by_bandwidth' => 'Bande passante quotidienne consommée (en Mo)', + 'total_storage_by_month' => 'Stockage mensuel (en Mo)', + 'total_bandwidth_by_month' => 'Bande passante mensuelle utilisée (en Mo)', + 'total_bandwidth_by_month_limit' => 'Limité à {totalBandwidth} par mois', +]; diff --git a/modules/Admin/Language/fr2/Common.php b/modules/Admin/Language/fr2/Common.php new file mode 100644 index 00000000..1d92e048 --- /dev/null +++ b/modules/Admin/Language/fr2/Common.php @@ -0,0 +1,51 @@ + 'Oui', + 'no' => 'Non', + 'cancel' => 'Annuler', + 'optional' => 'Optionnel', + 'more' => 'Plus', + 'no_data' => 'Aucune donnée trouvée  !', + 'close' => 'Fermer', + 'edit' => 'Modifier', + 'copy' => 'Copier', + 'copied' => 'Copié  !', + 'home' => 'Accueil', + 'explicit' => 'Explicite', + 'powered_by' => 'Propulsé par {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} sur {pageCount}', + 'go_back' => 'Retour en arrière', + 'forms' => [ + 'editor' => [ + 'write' => 'Écrire', + 'preview' => 'Aperçu', + 'help' => 'Propulsé par markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Cliquez pour selectionner', + 'loadingText' => 'Chargement…', + 'noResultsText' => 'Aucun résultat trouvé', + 'noChoicesText' => 'Aucune sélection possible', + 'maxItemText' => 'Impossible de rajouter un élément', + ], + 'upload_file' => 'Téléverser un fichier', + 'remote_url' => 'URL distante', + ], + 'play_episode_button' => [ + 'play' => 'Lire', + 'playing' => 'En cours', + ], + 'size_limit' => 'Taille maximale : {0}.', + 'choose_interact' => 'Choisissez le mode d\'interaction', + 'view' => 'Voir', +]; diff --git a/modules/Admin/Language/fr2/Countries.php b/modules/Admin/Language/fr2/Countries.php new file mode 100644 index 00000000..a0e70692 --- /dev/null +++ b/modules/Admin/Language/fr2/Countries.php @@ -0,0 +1,264 @@ + 'Andorre', + 'AE' => 'Émirats Arabes Unis', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua-Et-Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albanie', + 'AM' => 'Arménie', + 'AO' => 'Angola', + 'AQ' => 'Antarctique', + 'AR' => 'Argentine', + 'AS' => 'Samoa Américaines', + 'AT' => 'Autriche', + 'AU' => 'Australie', + 'AW' => 'Aruba', + 'AX' => 'Åland, Îles', + 'AZ' => 'Azerbaïdjan', + 'BA' => 'Bosnie-Herzégovine', + 'BB' => 'Barbade', + 'BD' => 'Bangladesh', + 'BE' => 'Belgique', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgarie', + 'BH' => 'Bahreïn', + 'BI' => 'Burundi', + 'BJ' => 'Bénin', + 'BL' => 'Saint-Barthélemy', + 'BM' => 'Bermudes', + 'BN' => 'Brunéi Darussalam', + 'BO' => 'Bolivie, État Plurinational De', + 'BQ' => 'Bonaire, Saint-Eustache Et Saba', + 'BR' => 'Brésil', + 'BS' => 'Bahamas', + 'BT' => 'Bhoutan', + 'BV' => 'Bouvet, Île', + 'BW' => 'Botswana', + 'BY' => 'Bélarus', + 'BZ' => 'Bélize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling), Îles', + 'CD' => 'Congo, La République Démocratique Du', + 'CF' => 'Centrafricaine, République', + 'CG' => 'Congo', + 'CH' => 'Suisse', + 'CI' => "Côte D’ivoire", + 'CK' => 'Cook, Îles', + 'CL' => 'Chili', + 'CM' => 'Cameroun', + 'CN' => 'Chine', + 'CO' => 'Colombie', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cap-Vert', + 'CW' => 'Curaçao', + 'CX' => 'Christmas, Île', + 'CY' => 'Chypre', + 'CZ' => 'Tchéquie', + 'DE' => 'Allemagne', + 'DJ' => 'Djibouti', + 'DK' => 'Danemark', + 'DM' => 'Dominique', + 'DO' => 'République Dominicaine', + 'DZ' => 'Algérie', + 'EC' => 'Équateur', + 'EE' => 'Estonie', + 'EG' => 'Égypte', + 'EH' => 'Sahara Occidental', + 'ER' => 'Érythrée', + 'ES' => 'Espagne', + 'ET' => 'Éthiopie', + 'FI' => 'Finlande', + 'FJ' => 'Fidji', + 'FK' => 'Falkland, Îles (Malvinas)', + 'FM' => 'Micronésie, États Fédérés De', + 'FO' => 'Féroé, Îles', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'Royaume-Uni', + 'GD' => 'Grenade', + 'GE' => 'Géorgie', + 'GF' => 'Guyane Française', + 'GG' => 'Guernesey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Groenland', + 'GM' => 'Gambie', + 'GN' => 'Guinée', + 'GP' => 'Guadeloupe', + 'GQ' => 'Guinée Équatoriale', + 'GR' => 'Grèce', + 'GS' => 'Géorgie Du Sud Et Les Îles Sandwich Du Sud', + 'GT' => 'Guatémala', + 'GU' => 'Guam', + 'GW' => 'Guinée-Bissau', + 'GY' => 'Guyane', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Et Macdonald, Îles', + 'HN' => 'Honduras', + 'HR' => 'Croatie', + 'HT' => 'Haïti', + 'HU' => 'Hongrie', + 'ID' => 'Indonésie', + 'IE' => 'Irlande', + 'IL' => 'Israël', + 'IM' => 'Île De Man', + 'IN' => 'Inde', + 'IO' => 'Océan Indien, Territoire Britannique De L’', + 'IQ' => 'Irak', + 'IR' => 'Iran, République Islamique D’', + 'IS' => 'Islande', + 'IT' => 'Italie', + 'JE' => 'Jersey', + 'JM' => 'Jamaïque', + 'JO' => 'Jordanie', + 'JP' => 'Japon', + 'KE' => 'Kenya', + 'KG' => 'Kirghizistan', + 'KH' => 'Cambodge', + 'KI' => 'Kiribati', + 'KM' => 'Comores', + 'KN' => 'Saint-Kitts-Et-Nevis', + 'KP' => "Corée, République Populaire Démocratique De", + 'KR' => 'Corée, République De', + 'KW' => 'Koweït', + 'KY' => 'Caïmanes, Îles', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao, République Démocratique Populaire", + 'LB' => 'Liban', + 'LC' => 'Sainte-Lucie', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Libéria', + 'LS' => 'Lesotho', + 'LT' => 'Lituanie', + 'LU' => 'Luxembourg', + 'LV' => 'Lettonie', + 'LY' => 'Libye', + 'MA' => 'Maroc', + 'MC' => 'Monaco', + 'MD' => 'Moldavie', + 'ME' => 'Monténégro', + 'MF' => 'Saint-Martin (Partie Française)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall, Îles', + 'MK' => 'République De Macédoine', + 'ML' => 'Mali', + 'MM' => 'Birmanie', + 'MN' => 'Mongolie', + 'MO' => 'Macao', + 'MP' => 'Mariannes Du Nord, Îles', + 'MQ' => 'Martinique', + 'MR' => 'Mauritanie', + 'MS' => 'Montserrat', + 'MT' => 'Malte', + 'MU' => 'Maurice', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexique', + 'MY' => 'Malaisie', + 'MZ' => 'Mozambique', + 'N/A' => 'Non Applicable (IP locale…)', + 'NA' => 'Namibie', + 'NC' => 'Nouvelle-Calédonie', + 'NE' => 'Niger', + 'NF' => 'Norfolk, Île', + 'NG' => 'Nigéria', + 'NI' => 'Nicaragua', + 'NL' => 'Pays-Bas', + 'NO' => 'Norvège', + 'NP' => 'Népal', + 'NR' => 'Nauru', + 'NU' => 'Niué', + 'NZ' => 'Nouvelle-Zélande', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Pérou', + 'PF' => 'Polynésie Française', + 'PG' => 'Papouasie-Nouvelle-Guinée', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Pologne', + 'PM' => 'Saint-Pierre-Et-Miquelon', + 'PN' => 'Îles Pitcairn', + 'PR' => 'Porto Rico', + 'PS' => 'État De Palestine', + 'PT' => 'Portugal', + 'PW' => 'Palaos', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'La Réunion', + 'RO' => 'Roumanie', + 'RS' => 'Serbie', + 'RU' => 'Russie, Fédération De', + 'RW' => 'Rwanda', + 'SA' => 'Arabie Saoudite', + 'SB' => 'Salomon, Îles', + 'SC' => 'Seychelles', + 'SD' => 'Soudan', + 'SE' => 'Suède', + 'SG' => 'Singapour', + 'SH' => 'Sainte-Hélène, Ascension Et Tristan Da Cunha', + 'SI' => 'Slovénie', + 'SJ' => 'Svalbard Et Île Jan Mayen', + 'SK' => 'Slovaquie', + 'SL' => 'Sierra Leone', + 'SM' => 'Saint-Marin', + 'SN' => 'Sénégal', + 'SO' => 'Somalie', + 'SR' => 'Suriname', + 'SS' => 'Soudan Du Sud', + 'ST' => 'Sao Tomé-Et-Principe', + 'SV' => 'El Salvador', + 'SX' => 'Saint-Martin (Partie Néerlandaise)', + 'SY' => 'Syrienne, République Arabe', + 'SZ' => 'Eswatini', + 'TC' => 'Turks Et Caïques, Îles', + 'TD' => 'Tchad', + 'TF' => 'Terres Australes Françaises', + 'TG' => 'Togo', + 'TH' => 'Thaïlande', + 'TJ' => 'Tadjikistan', + 'TK' => 'Tokélaou', + 'TL' => 'Timor oriental', + 'TM' => 'Turkménistan', + 'TN' => 'Tunisie', + 'TO' => 'Tonga', + 'TR' => 'Turquie', + 'TT' => 'Trinité-Et-Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taïwan', + 'TZ' => 'Tanzanie, République Unie De', + 'UA' => 'Ukraine', + 'UG' => 'Ouganda', + 'UM' => 'Îles Mineures Éloignées Des États-Unis', + 'US' => 'États-Unis', + 'UY' => 'Uruguay', + 'UZ' => 'Ouzbékistan', + 'VA' => 'Saint-Siège (État de la Cité du Vatican)', + 'VC' => 'Saint-Vincent-Et-Les-Grenadines', + 'VE' => 'Venezuela, République Bolivarienne Du', + 'VG' => 'Îles Vierges Britanniques', + 'VI' => 'Îles Vierges des États-Unis', + 'VN' => 'Vietnam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis-Et-Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yémen', + 'YT' => 'Mayotte', + 'ZA' => 'Afrique Du Sud', + 'ZM' => 'Zambie', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/fr2/Episode.php b/modules/Admin/Language/fr2/Episode.php new file mode 100644 index 00000000..81a102fe --- /dev/null +++ b/modules/Admin/Language/fr2/Episode.php @@ -0,0 +1,214 @@ + 'Saison {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Épisode {episodeNumber}', + 'number_abbr' => 'Ép. {episodeNumber}', + 'season_episode' => 'Saison {seasonNumber} épisode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# commentaire} + other {# commentaires} + }', + 'all_podcast_episodes' => 'Tous les épisodes du podcast', + 'back_to_podcast' => 'Revenir au podcast', + 'edit' => 'Modifier', + 'publish' => 'Publier', + 'publish_edit' => 'Modifier la publication', + 'publish_date_edit' => 'Modifier la date de publication', + 'unpublish' => 'Dépublier', + 'publish_error' => 'L’épisode est déjà publié.', + 'publish_edit_error' => 'L’épisode est déjà publié.', + 'publish_cancel_error' => 'L’épisode est déjà publié.', + 'publish_date_edit_error' => 'L\'épisode n\'a pas encore été publié, vous ne pouvez pas modifier sa date de publication.', + 'publish_date_edit_future_error' => 'La date de publication de l\'épisode ne peut être définie qu\'à une date antérieure ! Si vous souhaitez la replanifier, dépubliez-le d\'abord.', + 'publish_date_edit_success' => 'La date de publication de l\'épisode a été mise à jour avec succès !', + 'unpublish_error' => 'L’épisode n’est pas publié.', + 'delete' => 'Supprimer', + 'go_to_page' => 'Voir', + 'create' => 'Ajouter un épisode', + 'publication_status' => [ + 'published' => 'Publié', + 'with_podcast' => 'Publié', + 'scheduled' => 'Planifié', + 'not_published' => 'Non publié', + ], + 'with_podcast_hint' => 'Publier en même temps que le podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Rechercher un épisode', + 'clear' => 'Effacer la recherche', + 'submit' => 'Recherche', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# épisode} + other {# épisodes} + }', + 'episode' => 'Épisode', + 'visibility' => 'Visibilité', + 'downloads' => 'Downloads', + 'comments' => 'Commentaires', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'L’épisode a été créé avec succès  !', + 'editSuccess' => 'L’épisode a bien été mis à jour  !', + 'publishSuccess' => '{publication_status, select, + published {Épisode publié avec succès !} + scheduled {La publication de l\'épisode est planifiée avec succès !} + with_podcast {Cet épisode sera publié en même temps que le podcast.} + other {Cet épisode n\'est pas publié.} + }', + 'publishCancelSuccess' => 'La publication de l’épisode a bien été annulée  !', + 'unpublishBeforeDeleteTip' => 'Vous devez dépublier l\'épisode avant de le supprimer.', + 'scheduleDateError' => 'La date de planification doit être définie !', + 'deletePublishedEpisodeError' => 'Vous devez dépublier l\'épisode avant de le supprimer.', + 'deleteSuccess' => 'L\'épisode a bien été supprimé !', + 'deleteError' => 'Impossible de supprimer {type, select, + transcript {la transcription} + chapters {les chapitres} + image {la couverture} + audio {l\'audio} + other {le média} + } de l\'épisode.', + 'deleteFileError' => 'Impossible de supprimer {type, select, + transcript {la transcription} + chapters {les chapitres} + image {la couverture} + audio {l\'audio} + other {le média} + } du fichier {file_path}. Vous pouvez le supprimer manuellement de votre disque.', + 'sameSlugError' => 'Il existe déjà un épisode avec le slug choisi.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapitrage', + 'chapters_hint' => 'Le fichier doit être en format “JSON Chapters”.', + 'chapters_download' => 'Télécharger le chapitrage', + 'chapters_file' => 'Fichier de chapitrage', + 'chapters_remote_url' => 'URL distante pour le fichier de chapitrage', + 'chapters_file_delete' => 'Supprimer le fichier de chapitrage', + 'advanced_section_title' => 'Paramètres avancés', + 'advanced_section_subtitle' => + 'Si vous avez besoin d’une balise RSS que Castopod ne couvre pas, définissez-la ici.', + 'custom_rss' => 'Balises RSS personnalisées pour l’épisode', + 'custom_rss_hint' => 'Ceci sera injecté dans la balise ❬item❭.', + 'block' => 'L\'épisode doit être masqué dans les catalogues publics', + 'block_hint' => + 'Statut caché ou visible de l\'épisode : activer ceci empêche l\'épisode d\'apparaître dans les Apple Podcasts, Google Podcasts, et toutes les applications tierces qui utilisent ces répertoires. (Sans garantie)', + 'submit_create' => 'Créer l’épisode', + 'submit_edit' => 'Enregistrer l’épisode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Retour au tableau de bord de l’épisode', + 'post' => 'Votre message de publication', + 'post_hint' => + "Écrivez un message pour annoncer la publication de votre épisode. Ce message sera diffusé à toutes les personnes qui vous suivent dans le fédiverse et mis en évidence sur la page d’accueil de votre podcast.", + 'message_placeholder' => 'Entrez votre message…', + 'publication_date' => 'Date de publication', + 'publication_method' => [ + 'now' => 'Maintenant', + 'schedule' => 'Planifier', + 'with_podcast' => 'Publier en même temps que le podcast', + ], + 'scheduled_publication_date' => 'Date de publication programmée', + 'scheduled_publication_date_clear' => 'Effacer la date de publication', + 'scheduled_publication_date_hint' => + 'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication future. Ce champ doit être au format YYYY-MM-DD HH:mm', + 'submit' => 'Publier', + 'submit_edit' => 'Modifier la publication', + 'cancel_publication' => 'Annuler la publication', + 'message_warning' => 'Vous n’avez pas saisi de message pour l’annonce de votre épisode  !', + 'message_warning_hint' => 'Ajouter un message augmente l’engagement sur les réseaux sociaux, donnant une meilleure visibilité à votre épisode.', + 'message_warning_submit' => 'Publier quand même', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'Nouvelle date de publication', + 'new_publication_date_hint' => 'Doit être défini à une date antérieure.', + 'submit' => 'Modifier la date de publication', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Dépublier l'épisode supprimera tous les commentaires et messages qui lui sont associés et le retirera du flux RSS du podcast.", + 'understand' => 'Je comprends, je veux dépublier l’épisode', + 'submit' => 'Dépublier', + ], + 'delete_form' => [ + 'disclaimer' => + "La suppression de l'épisode supprimera tous les fichiers multimédia, les commentaires, les clips vidéo et les parties sonores qui y sont associés.", + 'understand' => 'Je comprends, je veux supprimer l’épisode', + 'submit' => 'Supprimer', + ], + 'embed' => [ + 'title' => 'Lecteur intégré', + 'label' => + 'Sélectionnez une couleur de thème, copiez le code dans le presse-papier, puis collez-le sur votre site internet.', + 'clipboard_iframe' => 'Copier le code du lecteur intégré dans le presse papier', + 'clipboard_url' => 'Copier l’adresse dans le presse papier', + 'dark' => 'Sombre', + 'dark-transparent' => 'Sombre transparent', + 'light' => 'Clair', + 'light-transparent' => 'Clair transparent', + ], +]; diff --git a/modules/Admin/Language/fr2/EpisodeNavigation.php b/modules/Admin/Language/fr2/EpisodeNavigation.php new file mode 100644 index 00000000..2f7ff829 --- /dev/null +++ b/modules/Admin/Language/fr2/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'Aller à la page de l’épisode', + 'dashboard' => 'Tableau de bord de l’épisode', + 'episode-view' => 'Accueil', + 'episode-edit' => 'Modifier l’épisode', + 'episode-persons-manage' => 'Gérer les intervenants', + 'embed-add' => 'Lecteur intégré', + 'clips' => 'Extraits', + 'video-clips-list' => 'Extraits vidéo', + 'video-clips-create' => 'Nouvel extrait vidéo', + 'soundbites-list' => 'Extraits sonores', + 'soundbites-create' => 'Nouvel extrait sonore', +]; diff --git a/modules/Admin/Language/fr2/Fediverse.php b/modules/Admin/Language/fr2/Fediverse.php new file mode 100644 index 00000000..3e7a0b26 --- /dev/null +++ b/modules/Admin/Language/fr2/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'L’utilisateur n’a pu être trouvé  !', + 'blockActorSuccess' => '{actor} a été bloqué  !', + 'unblockActorSuccess' => 'L’utilisateur a été débloqué  !', + 'blockDomainSuccess' => '{domain} a été bloqué  !', + 'unblockDomainSuccess' => '{domain} a été débloqué  !', + ], + 'blocked_actors' => 'Utilisateurs bloqués', + 'blocked_domains' => 'Domaines bloqués', + 'block_lists_form' => [ + 'handle' => 'Identifiant', + 'handle_hint' => 'Saisissez l’utilisateur @nom@domaine.', + 'domain' => 'Nom de domaine', + 'submit' => 'Bloquer !', + ], + 'list' => [ + 'actor' => 'Utilisateur', + 'domain' => 'Nom de domaine', + 'unblock' => 'Débloquer', + ], +]; diff --git a/modules/Admin/Language/fr2/Home.php b/modules/Admin/Language/fr2/Home.php new file mode 100644 index 00000000..0ec83396 --- /dev/null +++ b/modules/Admin/Language/fr2/Home.php @@ -0,0 +1,14 @@ + 'Tous les podcasts', + 'no_podcast' => 'Aucun podcast trouvé', +]; diff --git a/modules/Admin/Language/fr2/Install.php b/modules/Admin/Language/fr2/Install.php new file mode 100644 index 00000000..b7d6ea1b --- /dev/null +++ b/modules/Admin/Language/fr2/Install.php @@ -0,0 +1,61 @@ + 'Configuration manuelle', + 'manual_config_subtitle' => + 'Créez un fichier `.env` qui contient tous vos paramètres puis rafraîchissez la page pour continuer l’installation.', + 'form' => [ + 'instance_config' => 'Paramètres de l’instance', + 'hostname' => 'Nom d’hôte', + 'media_base_url' => 'Adresse racine des médias', + 'media_base_url_hint' => + 'Si vous utilisez un CDN et/ou un service de mesure d’audience externe, vous pouvez les définir ici.', + 'admin_gateway' => 'Adresse d’administration', + 'admin_gateway_hint' => + 'Chemin pour accéder à l’administration (par exemple https://example.com/cp-admin). Il est défini par défaut à cp-admin, nous vous recommandons de le changer par mesure de sécurité.', + 'auth_gateway' => 'Adresse d’authentification', + 'auth_gateway_hint' => + 'Le chemin des pages d’authentication (par exemple https://example.fr/cp-auth). Il est défini par défaut à cp-auth, nous vous recommandons de le changer par mesure de sécurité.', + 'database_config' => 'Paramètres de la base de données', + 'database_config_hint' => + 'Castopod doit se connecter à votre base de données MySQL (ou MariaDB). Si vous ne disposez pas de ces informations, merci de contacter l’administrateur du serveur.', + 'db_hostname' => 'Nom d’hôte (ou IP) de la base de données', + 'db_name' => 'Nom de la base de données', + 'db_username' => 'Utilisateur de la base de données', + 'db_password' => 'Mot de passe de la base de données', + 'db_prefix' => 'Préfixe des tables', + 'db_prefix_hint' => + "Le préfixe des noms de tables de Castopod, laissez la valeur par défaut si vous ne savez pas de quoi il s’agit.", + 'cache_config' => 'Paramètres du cache', + 'cache_config_hint' => + 'Sélectionnez votre gestionnaire de cache préféré. Laissez la valeur par défaut si vous ne savez pas de quoi il s’agit.', + 'cache_handler' => 'Gestionnaire de cache', + 'cacheHandlerOptions' => [ + 'file' => 'Fichier', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Suivant', + 'submit' => 'Terminer l’installation', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Admin/Language/fr_CA/AboutCastopod.php b/modules/Admin/Language/fr_CA/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/fr_CA/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/fr_CA/Breadcrumb.php b/modules/Admin/Language/fr_CA/Breadcrumb.php new file mode 100644 index 00000000..558b90f7 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Breadcrumb.php @@ -0,0 +1,55 @@ + 'breadcrumb', + config('Admin') + ->gateway => 'Home', + 'podcasts' => 'podcasts', + 'episodes' => 'episodes', + 'subscriptions' => 'subscriptions', + 'contributors' => 'contributors', + 'pages' => 'pages', + 'settings' => 'settings', + 'theme' => 'theme', + 'about' => 'about', + 'add' => 'add', + 'new' => 'new', + 'edit' => 'edit', + 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'publish-date-edit' => 'edit publication date', + 'unpublish' => 'unpublish', + 'delete' => 'delete', + 'remove' => 'remove', + 'fediverse' => 'fediverse', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', + 'users' => 'users', + 'my-account' => 'my account', + 'change-password' => 'change password', + 'import' => 'feed import', + 'platforms' => 'platforms', + 'social' => 'social networks', + 'funding' => 'funding', + 'analytics' => 'analytics', + 'locations' => 'locations', + 'webpages' => 'web pages', + 'unique-listeners' => 'unique listeners', + 'players' => 'players', + 'listening-time' => 'listening time', + 'time-periods' => 'time periods', + 'soundbites' => 'soundbites', + 'video-clips' => 'video clips', + 'embed' => 'embeddable player', + 'notifications' => 'notifications', + 'suspend' => 'suspend', +]; diff --git a/modules/Admin/Language/fr_CA/Charts.php b/modules/Admin/Language/fr_CA/Charts.php new file mode 100644 index 00000000..6ede2510 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Charts.php @@ -0,0 +1,41 @@ + 'Episode downloads by service (for the past week)', + 'by_player_weekly' => 'Episode downloads by player (for the past week)', + 'by_player_yearly' => 'Episode downloads by player (for the past year)', + 'by_device_weekly' => 'Episode downloads by device (for the past week)', + 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', + 'podcast_by_region' => 'Episode downloads by region (for the past week)', + 'unique_daily_listeners' => 'Daily unique listeners', + 'unique_monthly_listeners' => 'Monthly unique listeners', + 'by_browser' => 'Web pages usage by browser (for the past week)', + 'podcast_by_day' => 'Episode daily downloads', + 'podcast_by_month' => 'Episode monthly downloads', + 'episode_by_day' => 'Episode daily downloads (first 60 days)', + 'episode_by_month' => 'Episode monthly downloads', + 'episodes_by_day' => + '5 latest episodes downloads (during their first 60 days)', + 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_yearly' => 'Episode downloads by country (for the past year)', + 'by_domain_weekly' => 'Web pages visits by source (for the past week)', + 'by_domain_yearly' => 'Web pages visits by source (for the past year)', + 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + 'podcast_bots' => 'Bots (crawlers)', + 'daily_listening_time' => 'Daily cumulative listening time', + 'monthly_listening_time' => 'Monthly cumulative listening time', + 'by_weekday' => 'By week day (for the past 60 days)', + 'by_hour' => 'By time of day (for the past 60 days)', + 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', + 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', +]; diff --git a/modules/Admin/Language/fr_CA/Common.php b/modules/Admin/Language/fr_CA/Common.php new file mode 100644 index 00000000..596c8bcd --- /dev/null +++ b/modules/Admin/Language/fr_CA/Common.php @@ -0,0 +1,51 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'more' => 'More', + 'no_data' => 'No data found!', + 'close' => 'Close', + 'edit' => 'Edit', + 'copy' => 'Copy', + 'copied' => 'Copied!', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', + 'forms' => [ + 'editor' => [ + 'write' => 'Write', + 'preview' => 'Preview', + 'help' => 'Powered by markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Press to select', + 'loadingText' => 'Loading…', + 'noResultsText' => 'No results found', + 'noChoicesText' => 'No choices to choose from', + 'maxItemText' => 'Cannot add more items', + ], + 'upload_file' => 'Upload a file', + 'remote_url' => 'Remote URL', + ], + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'size_limit' => 'Size limit: {0}.', + 'choose_interact' => 'Choose how to interact', + 'view' => 'View', +]; diff --git a/modules/Admin/Language/fr_CA/Countries.php b/modules/Admin/Language/fr_CA/Countries.php new file mode 100644 index 00000000..4cd5d9c8 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Countries.php @@ -0,0 +1,264 @@ + 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia, Plurinational State of', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, the Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => "Côte d'Ivoire", + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cape Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia, Federated States of', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran, Islamic Republic of', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao People's Democratic Republic", + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'N/A' => 'Not Applicable (local IP…)', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Swaziland', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See (Vatican City State)', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/fr_CA/Dashboard.php b/modules/Admin/Language/fr_CA/Dashboard.php new file mode 100644 index 00000000..881073fd --- /dev/null +++ b/modules/Admin/Language/fr_CA/Dashboard.php @@ -0,0 +1,28 @@ + 'Admin dashboard', + 'welcome_message' => 'Welcome to the admin area!', + 'podcasts' => [ + 'title' => 'Podcasts', + 'not_found' => 'No published podcast', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'episodes' => [ + 'title' => 'Episodes', + 'not_found' => 'No published episode', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'storage' => [ + 'title' => 'Storage', + 'subtitle' => '{totalUploaded} out of {totalStorage}', + ], +]; diff --git a/modules/Admin/Language/fr_CA/Episode.php b/modules/Admin/Language/fr_CA/Episode.php new file mode 100644 index 00000000..98498bee --- /dev/null +++ b/modules/Admin/Language/fr_CA/Episode.php @@ -0,0 +1,214 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'edit' => 'Edit', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'publish_date_edit' => 'Edit publication date', + 'unpublish' => 'Unpublish', + 'publish_error' => 'Episode is already published.', + 'publish_edit_error' => 'Episode is already published.', + 'publish_cancel_error' => 'Episode is already published.', + 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', + 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', + 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'unpublish_error' => 'Episode is not published.', + 'delete' => 'Delete', + 'go_to_page' => 'Go to page', + 'create' => 'Add an episode', + 'publication_status' => [ + 'published' => 'Published', + 'with_podcast' => 'Published', + 'scheduled' => 'Scheduled', + 'not_published' => 'Not published', + ], + 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Search for an episode', + 'clear' => 'Clear search', + 'submit' => 'Search', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# episode} + other {# episodes} + }', + 'episode' => 'Episode', + 'visibility' => 'Visibility', + 'downloads' => 'Downloads', + 'comments' => 'Comments', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'Episode has been successfully created!', + 'editSuccess' => 'Episode has been successfully updated!', + 'publishSuccess' => '{publication_status, select, + published {Episode successfully published!} + scheduled {Episode publication successfully scheduled!} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not published.} + }', + 'publishCancelSuccess' => 'Episode publication successfully cancelled!', + 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', + 'scheduleDateError' => 'Schedule date must be set!', + 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'deleteSuccess' => 'Episode successfully deleted!', + 'deleteError' => 'Failed to delete episode {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_path}. You may manually remove it from your disk.', + 'sameSlugError' => 'An episode with the chosen slug already exists.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapters', + 'chapters_hint' => 'File must be in JSON Chapters format.', + 'chapters_download' => 'Download chapters', + 'chapters_file' => 'Chapters file', + 'chapters_remote_url' => 'Remote url for chapters file', + 'chapters_file_delete' => 'Delete chapters file', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the episode', + 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', + 'block' => 'Episode should be hidden from public catalogues', + 'block_hint' => + 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'submit_create' => 'Create episode', + 'submit_edit' => 'Save episode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Back to episode dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + 'with_podcast' => 'Publish alongside podcast', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', + 'message_warning_submit' => 'Publish anyways', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'New publication date', + 'new_publication_date_hint' => 'Must be set to a past date.', + 'submit' => 'Edit publication date', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + 'understand' => 'I understand, I want to delete the episode', + 'submit' => 'Delete', + ], + 'embed' => [ + 'title' => 'Embeddable player', + 'label' => + 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', + 'clipboard_iframe' => 'Copy embeddable player to clipboard', + 'clipboard_url' => 'Copy address to clipboard', + 'dark' => 'Dark', + 'dark-transparent' => 'Dark transparent', + 'light' => 'Light', + 'light-transparent' => 'Light transparent', + ], +]; diff --git a/modules/Admin/Language/fr_CA/EpisodeNavigation.php b/modules/Admin/Language/fr_CA/EpisodeNavigation.php new file mode 100644 index 00000000..1406e301 --- /dev/null +++ b/modules/Admin/Language/fr_CA/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'View episode page', + 'dashboard' => 'Episode dashboard', + 'episode-view' => 'Home', + 'episode-edit' => 'Edit episode', + 'episode-persons-manage' => 'Manage persons', + 'embed-add' => 'Embeddable player', + 'clips' => 'Clips', + 'video-clips-list' => 'Video clips', + 'video-clips-create' => 'New video clip', + 'soundbites-list' => 'Soundbites', + 'soundbites-create' => 'New soundbite', +]; diff --git a/modules/Admin/Language/fr_CA/Fediverse.php b/modules/Admin/Language/fr_CA/Fediverse.php new file mode 100644 index 00000000..0e4ca66d --- /dev/null +++ b/modules/Admin/Language/fr_CA/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'The account could not be found!', + 'blockActorSuccess' => '{actor} has been blocked!', + 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockDomainSuccess' => '{domain} has been blocked!', + 'unblockDomainSuccess' => '{domain} has been unblocked!', + ], + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/modules/Admin/Language/fr_CA/Home.php b/modules/Admin/Language/fr_CA/Home.php new file mode 100644 index 00000000..3ff4c04d --- /dev/null +++ b/modules/Admin/Language/fr_CA/Home.php @@ -0,0 +1,14 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found', +]; diff --git a/modules/Admin/Language/fr_CA/Install.php b/modules/Admin/Language/fr_CA/Install.php new file mode 100644 index 00000000..36e373a2 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Install.php @@ -0,0 +1,61 @@ + 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Admin/Language/fr_CA/Navigation.php b/modules/Admin/Language/fr_CA/Navigation.php new file mode 100644 index 00000000..610f1434 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Navigation.php @@ -0,0 +1,42 @@ + 'Toggle sidebar', + 'go_to_website' => 'Go to website', + 'go_to_admin' => 'Go to admin', + 'dashboard' => 'Dashboard', + 'admin' => 'Home', + 'podcasts' => 'Podcasts', + 'podcast-list' => 'All podcasts', + 'podcast-create' => 'New podcast', + 'podcast-import' => 'Import a podcast', + 'persons' => 'Persons', + 'person-list' => 'All persons', + 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', + 'users' => 'Users', + 'user-list' => 'All users', + 'user-create' => 'New user', + 'pages' => 'Pages', + 'page-list' => 'All pages', + 'page-create' => 'New Page', + 'settings' => 'Settings', + 'settings-general' => 'General', + 'settings-theme' => 'Theme', + 'about' => 'About', + 'account' => [ + 'my-account' => 'My account', + 'change-password' => 'Change password', + 'logout' => 'Logout', + ], +]; diff --git a/modules/Admin/Language/fr_CA/Notifications.php b/modules/Admin/Language/fr_CA/Notifications.php new file mode 100644 index 00000000..2b139d51 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Notifications.php @@ -0,0 +1,19 @@ + 'Notifications', + 'reply' => '{actor_username} replied to your post', + 'favourite' => '{actor_username} favourited your post', + 'reblog' => '{actor_username} shared your post', + 'follow' => '{actor_username} started following you', + 'no_notifications' => 'No notifications', + 'mark_all_as_read' => 'Mark all as read', +]; diff --git a/modules/Admin/Language/fr_CA/Page.php b/modules/Admin/Language/fr_CA/Page.php new file mode 100644 index 00000000..b6f49de5 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Page.php @@ -0,0 +1,30 @@ + 'Back to home', + 'page' => 'Page', + 'all_pages' => 'All pages', + 'create' => 'New page', + 'go_to_page' => 'Go to page', + 'edit' => 'Edit page', + 'delete' => 'Delete page', + 'form' => [ + 'title' => 'Title', + 'permalink' => 'Permalink', + 'content' => 'Content', + 'submit_create' => 'Create page', + 'submit_edit' => 'Save', + ], + 'messages' => [ + 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'editSuccess' => 'The page was successfully updated!', + ], +]; diff --git a/modules/Admin/Language/fr_CA/Pager.php b/modules/Admin/Language/fr_CA/Pager.php new file mode 100644 index 00000000..e25ee638 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Pager.php @@ -0,0 +1,21 @@ + 'Page navigation', + 'first' => 'First', + 'previous' => 'Previous', + 'next' => 'Next', + 'last' => 'Last', + 'older' => 'Older', + 'newer' => 'Newer', + 'invalidTemplate' => '{0} is not a valid Pager template.', + 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', +]; diff --git a/modules/Admin/Language/fr_CA/Person.php b/modules/Admin/Language/fr_CA/Person.php new file mode 100644 index 00000000..a652be9f --- /dev/null +++ b/modules/Admin/Language/fr_CA/Person.php @@ -0,0 +1,65 @@ + 'Persons', + 'all_persons' => 'All persons', + 'no_person' => 'Nobody found!', + 'create' => 'Create a person', + 'view' => 'View person', + 'edit' => 'Edit person', + 'delete' => 'Delete person', + 'messages' => [ + 'createSuccess' => 'Person has been successfully created!', + 'editSuccess' => 'Person has been successfully updated!', + 'deleteSuccess' => 'Person has been removed!', + ], + 'form' => [ + 'avatar' => 'Avatar', + 'avatar_size_hint' => + 'Avatar must be squared and at least 400px wide and tall.', + 'full_name' => 'Full name', + 'full_name_hint' => 'This is the full name or alias of the person.', + 'unique_name' => 'Unique name', + 'unique_name_hint' => 'Used for URLs', + 'information_url' => 'Information URL', + 'information_url_hint' => + 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', + 'submit_create' => 'Create person', + 'submit_edit' => 'Save person', + ], + 'podcast_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this podcast', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'episode_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this episode', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'credits' => 'Credits', +]; diff --git a/modules/Admin/Language/fr_CA/Platforms.php b/modules/Admin/Language/fr_CA/Platforms.php new file mode 100644 index 00000000..ab17d599 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Platforms.php @@ -0,0 +1,30 @@ + 'Platforms', + 'home_url' => 'Go to {platformName} website', + 'submit_url' => 'Submit your podcast on {platformName}', + 'visible' => 'Display in podcast homepage?', + 'on_embed' => 'Display on embeddable player?', + 'remove' => 'Remove {platformName}', + 'submit' => 'Save', + 'messages' => [ + 'updateSuccess' => 'Platform links have been successfully updated!', + 'removeLinkSuccess' => 'The platform link has been removed.', + 'removeLinkError' => + 'The platform link could not be removed. Try again.', + ], + 'description' => [ + 'podcasting' => 'The podcast ID on this platform', + 'social' => 'The podcast account ID on this platform', + 'funding' => 'Call to action message', + ], +]; diff --git a/modules/Admin/Language/fr_CA/Podcast.php b/modules/Admin/Language/fr_CA/Podcast.php new file mode 100644 index 00000000..2d46aff5 --- /dev/null +++ b/modules/Admin/Language/fr_CA/Podcast.php @@ -0,0 +1,314 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found!', + 'create' => 'Create podcast', + 'import' => 'Import podcast', + 'new_episode' => 'New Episode', + 'view' => 'View podcast', + 'edit' => 'Edit podcast', + 'publish' => 'Publish podcast', + 'publish_edit' => 'Edit publication', + 'delete' => 'Delete podcast', + 'see_episodes' => 'See episodes', + 'see_contributors' => 'See contributors', + 'go_to_page' => 'Go to page', + 'latest_episodes' => 'Latest episodes', + 'see_all_episodes' => 'See all episodes', + 'draft' => 'Draft', + 'messages' => [ + 'createSuccess' => 'Podcast successfully created!', + 'editSuccess' => 'Podcast has been successfully updated!', + 'importSuccess' => 'Podcast has been successfully imported!', + 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, + cover {cover} + banner {banner} + other {media} + }.', + 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, + one {# episode was} + other {# episodes were} + } added to the podcast!', + 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', + 'publishError' => 'This podcast is either already published or scheduled for publication.', + 'publishEditError' => 'This podcast is not scheduled for publication.', + 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', + 'scheduleDateError' => 'Schedule date must be set!', + ], + 'form' => [ + 'identity_section_title' => 'Podcast identity', + 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'cover' => 'Podcast cover', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'banner' => 'Podcast banner', + 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_delete' => 'Delete podcast banner', + 'title' => 'Title', + 'handle' => 'Handle', + 'handle_hint' => + 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'type' => [ + 'label' => 'Type', + 'episodic' => 'Episodic', + 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', + 'serial' => 'Serial', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + ], + 'description' => 'Description', + 'classification_section_title' => 'Classification', + 'classification_section_subtitle' => + 'These fields will impact your audience and competition.', + 'language' => 'Language', + 'category' => 'Category', + 'category_placeholder' => 'Select a category…', + 'other_categories' => 'Other categories', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does it contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'author_section_title' => 'Author', + 'author_section_subtitle' => 'Who is managing the podcast?', + 'owner_name' => 'Owner name', + 'owner_name_hint' => + 'For administrative use only. Visible in the public RSS feed.', + 'owner_email' => 'Owner email', + 'owner_email_hint' => + 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'publisher' => 'Publisher', + 'publisher_hint' => + 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'copyright' => 'Copyright', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this podcast about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real place or fictional', + 'monetization_section_title' => 'Monetization', + 'monetization_section_subtitle' => + 'Earn money thanks to your audience.', + 'premium' => 'Premium', + 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_enable' => 'Enable OP3 analytics service', + 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'payment_pointer_hint' => + 'This is your where you will receive money thanks to Web Monetization', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the podcast', + 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'new_feed_url' => 'New feed URL', + 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', + 'old_feed_url' => 'Old feed URL', + 'update_feed' => 'Update feed', + 'update_feed_tip' => 'Import this podcast\'s latest episodes', + 'partnership' => 'Partnership', + 'partner_id' => 'ID', + 'partner_link_url' => 'Link URL', + 'partner_image_url' => 'Image URL', + 'partner_id_hint' => 'Your own partner ID', + 'partner_link_url_hint' => 'The generic partner link address', + 'partner_image_url_hint' => 'The generic partner image address', + 'status_section_title' => 'Status', + 'block' => 'Podcast should be hidden from public catalogues', + 'block_hint' => + 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'complete' => 'Podcast will not be having new episodes', + 'lock' => 'Prevent podcast from being copied', + 'lock_hint' => + 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', + 'submit_create' => 'Create podcast', + 'submit_edit' => 'Save podcast', + ], + 'category_options' => [ + 'uncategorized' => 'uncategorized', + 'arts' => 'Arts', + 'business' => 'Business', + 'comedy' => 'Comedy', + 'education' => 'Education', + 'fiction' => 'Fiction', + 'government' => 'Government', + 'health_and_fitness' => 'Health & Fitness', + 'history' => 'History', + 'kids_and_family' => 'Kids & Family', + 'leisure' => 'Leisure', + 'music' => 'Music', + 'news' => 'News', + 'religion_and_spirituality' => 'Religion & Spirituality', + 'science' => 'Science', + 'society_and_culture' => 'Society & Culture', + 'sports' => 'Sports', + 'technology' => 'Technology', + 'true_crime' => 'True Crime', + 'tv_and_film' => 'TV & Film', + 'books' => 'Books', + 'design' => 'Design', + 'fashion_and_beauty' => 'Fashion & Beauty', + 'food' => 'Food', + 'performing_arts' => 'Performing Arts', + 'visual_arts' => 'Visual Arts', + 'careers' => 'Careers', + 'entrepreneurship' => 'Entrepreneurship', + 'investing' => 'Investing', + 'management' => 'Management', + 'marketing' => 'Marketing', + 'non_profit' => 'Non-Profit', + 'comedy_interviews' => 'Comedy Interviews', + 'improv' => 'Improv', + 'stand_up' => 'Stand-Up', + 'courses' => 'Courses', + 'how_to' => 'How To', + 'language_learning' => 'Language Learning', + 'self_improvement' => 'Self-Improvement', + 'comedy_fiction' => 'Comedy Fiction', + 'drama' => 'Drama', + 'science_fiction' => 'Science Fiction', + 'alternative_health' => 'Alternative Health', + 'fitness' => 'Fitness', + 'medicine' => 'Medicine', + 'mental_health' => 'Mental Health', + 'nutrition' => 'Nutrition', + 'sexuality' => 'Sexuality', + 'education_for_kids' => 'Education for Kids', + 'parenting' => 'Parenting', + 'pets_and_animals' => 'Pets & Animals', + 'stories_for_kids' => 'Stories for Kids', + 'animation_and_manga' => 'Animation & Manga', + 'automotive' => 'Automotive', + 'aviation' => 'Aviation', + 'crafts' => 'Crafts', + 'games' => 'Games', + 'hobbies' => 'Hobbies', + 'home_and_garden' => 'Home & Garden', + 'video_games' => 'Video Games', + 'music_commentary' => 'Music Commentary', + 'music_history' => 'Music History', + 'music_interviews' => 'Music Interviews', + 'business_news' => 'Business News', + 'daily_news' => 'Daily News', + 'entertainment_news' => 'Entertainment News', + 'news_commentary' => 'News Commentary', + 'politics' => 'Politics', + 'sports_news' => 'Sports News', + 'tech_news' => 'Tech News', + 'buddhism' => 'Buddhism', + 'christianity' => 'Christianity', + 'hinduism' => 'Hinduism', + 'islam' => 'Islam', + 'judaism' => 'Judaism', + 'religion' => 'Religion', + 'spirituality' => 'Spirituality', + 'astronomy' => 'Astronomy', + 'chemistry' => 'Chemistry', + 'earth_sciences' => 'Earth Sciences', + 'life_sciences' => 'Life Sciences', + 'mathematics' => 'Mathematics', + 'natural_sciences' => 'Natural Sciences', + 'nature' => 'Nature', + 'physics' => 'Physics', + 'social_sciences' => 'Social Sciences', + 'documentary' => 'Documentary', + 'personal_journals' => 'Personal Journals', + 'philosophy' => 'Philosophy', + 'places_and_travel' => 'Places & Travel', + 'relationships' => 'Relationships', + 'baseball' => 'Baseball', + 'basketball' => 'Basketball', + 'cricket' => 'Cricket', + 'fantasy_sports' => 'Fantasy Sports', + 'football' => 'Football', + 'golf' => 'Golf', + 'hockey' => 'Hockey', + 'rugby' => 'Rugby', + 'running' => 'Running', + 'soccer' => 'Soccer', + 'swimming' => 'Swimming', + 'tennis' => 'Tennis', + 'volleyball' => 'Volleyball', + 'wilderness' => 'Wilderness', + 'wrestling' => 'Wrestling', + 'after_shows' => 'After Shows', + 'film_history' => 'Film History', + 'film_interviews' => 'Film Interviews', + 'film_reviews' => 'Film Reviews', + 'tv_reviews' => 'TV Reviews', + ], + 'publish_form' => [ + 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'submit' => 'Publish', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', + 'message_warning_submit' => 'Publish anyway', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'not_published' => 'This podcast is not yet published.', + 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", + 'understand' => 'I understand, I want the podcast to be permanently deleted', + 'submit' => 'Delete', + ], + 'by' => 'By {publisher}', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', +]; diff --git a/modules/Admin/Language/fr_CA/PodcastImport.php b/modules/Admin/Language/fr_CA/PodcastImport.php new file mode 100644 index 00000000..7c3ef67d --- /dev/null +++ b/modules/Admin/Language/fr_CA/PodcastImport.php @@ -0,0 +1,37 @@ + + 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', + 'old_podcast_section_title' => 'The podcast to import', + 'old_podcast_section_subtitle' => + 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', + 'imported_feed_url' => 'Feed URL', + 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', + 'new_podcast_section_title' => 'The new podcast', + 'advanced_params_section_title' => 'Advanced parameters', + 'advanced_params_section_subtitle' => + 'Keep the default values if you have no idea of what the fields are for.', + 'slug_field' => 'Field to be used to calculate episode slug', + 'description_field' => + 'Source field used for episode description / show notes', + 'force_renumber' => 'Force episodes renumbering', + 'force_renumber_hint' => + 'Use this if your podcast does not have episode numbers but wish to set them during import.', + 'season_number' => 'Season number', + 'season_number_hint' => + 'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.', + 'max_episodes' => 'Maximum number of episodes to import', + 'max_episodes_hint' => 'Leave blank to import all episodes', + 'lock_import' => + 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.', + 'submit' => 'Import podcast', +]; diff --git a/modules/Admin/Language/fr_CA/PodcastNavigation.php b/modules/Admin/Language/fr_CA/PodcastNavigation.php new file mode 100644 index 00000000..b4d7ddc0 --- /dev/null +++ b/modules/Admin/Language/fr_CA/PodcastNavigation.php @@ -0,0 +1,38 @@ + 'Go to podcast page', + 'dashboard' => 'Podcast dashboard', + 'podcast-view' => 'Home', + 'podcast-edit' => 'Edit podcast', + 'podcast-persons-manage' => 'Manage persons', + 'episodes' => 'Episodes', + 'episode-list' => 'All episodes', + 'episode-create' => 'New episode', + 'analytics' => 'Analytics', + 'podcast-analytics' => 'Audience overview', + 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-players' => 'Players', + 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-time-periods' => 'Time periods', + 'premium' => 'Premium', + 'subscription-list' => 'All subscriptions', + 'subscription-add' => 'Add subscription', + 'contributors' => 'Contributors', + 'contributor-list' => 'All contributors', + 'contributor-add' => 'Add contributor', + 'platforms' => 'External platforms', + 'platforms-podcasting' => 'Podcasting', + 'platforms-social' => 'Social networks', + 'platforms-funding' => 'Funding', +]; diff --git a/modules/Admin/Language/fr_CA/Settings.php b/modules/Admin/Language/fr_CA/Settings.php new file mode 100644 index 00000000..4a70dcba --- /dev/null +++ b/modules/Admin/Language/fr_CA/Settings.php @@ -0,0 +1,58 @@ + 'General settings', + 'instance' => [ + 'title' => 'Instance', + 'site_icon' => 'Site icon', + 'site_icon_delete' => 'Delete site icon', + 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_name' => 'Site name', + 'site_description' => 'Site description', + 'submit' => 'Save', + 'editSuccess' => 'Instance has been updated successfully!', + 'deleteIconSuccess' => 'Site icon has been remove successfully!', + ], + 'images' => [ + 'title' => 'Images', + 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'regenerate' => 'Regenerate images', + 'regenerationSuccess' => 'All images have been regenerated successfully!', + ], + 'housekeeping' => [ + 'title' => 'Housekeeping', + 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', + 'reset_counts' => 'Reset counts', + 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', + 'rewrite_media' => 'Rewrite media metadata', + 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', + 'rename_episodes_files' => 'Rename episode audio files', + 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'clear_cache' => 'Clear all cache', + 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'run' => 'Run housekeeping', + 'runSuccess' => 'Housekeeping has been run successfully!', + ], + 'theme' => [ + 'title' => 'Theme', + 'accent_section_title' => 'Accent color', + 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', + 'pine' => 'Pine', + 'crimson' => 'Crimson', + 'amber' => 'Amber', + 'lake' => 'Lake', + 'jacaranda' => 'Jacaranda', + 'onyx' => 'Onyx', + 'submit' => 'Save', + 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + ], +]; diff --git a/modules/Admin/Language/fr_CA/Soundbite.php b/modules/Admin/Language/fr_CA/Soundbite.php new file mode 100644 index 00000000..a3f828fe --- /dev/null +++ b/modules/Admin/Language/fr_CA/Soundbite.php @@ -0,0 +1,31 @@ + [ + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', + ], + 'messages' => [ + 'createSuccess' => 'Soundbite has been successfully created!', + 'deleteSuccess' => 'Soundbite has been successfully removed!', + ], + 'form' => [ + 'title' => 'New soundbite', + 'soundbite_title' => 'Soundbite title', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'submit' => 'Create soundbite', + ], + 'play' => 'Play soundbite', + 'stop' => 'Stop soundbite', + 'create' => 'New soundbite', + 'delete' => 'Delete soundbite', +]; diff --git a/modules/Admin/Language/fr_CA/Validation.php b/modules/Admin/Language/fr_CA/Validation.php new file mode 100644 index 00000000..3bc78cfe --- /dev/null +++ b/modules/Admin/Language/fr_CA/Validation.php @@ -0,0 +1,16 @@ + + '{field} is either not an image, or it is not wide or tall enough.', + 'is_image_ratio' => + '{field} is either not an image or not of the right ratio.', +]; diff --git a/modules/Admin/Language/fr_CA/VideoClip.php b/modules/Admin/Language/fr_CA/VideoClip.php new file mode 100644 index 00000000..638de697 --- /dev/null +++ b/modules/Admin/Language/fr_CA/VideoClip.php @@ -0,0 +1,72 @@ + [ + 'title' => 'Video clips', + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Clip is waiting to be processed.', + 'pending' => 'pending', + 'pending_hint' => 'Clip will be generated shortly.', + 'running' => 'running', + 'running_hint' => 'Clip is being generated.', + 'failed' => 'failed', + 'failed_hint' => 'Clip could not be generated: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Clip was generated successfully!', + ], + 'clip' => 'Clip', + 'duration' => 'Job duration', + ], + 'title' => 'Video clip: {videoClipLabel}', + 'download_clip' => 'Download clip', + 'create' => 'New video clip', + 'go_to_page' => 'Go to clip page', + 'retry' => 'Retry clip generation', + 'delete' => 'Delete clip', + 'logs' => 'Job logs', + 'messages' => [ + 'alreadyExistingError' => 'The video clip you are trying to create already exists!', + 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', + 'deleteSuccess' => 'Video clip has been successfully removed!', + ], + 'format' => [ + 'landscape' => 'Landscape', + 'portrait' => 'Portrait', + 'squared' => 'Squared', + ], + 'form' => [ + 'title' => 'New video clip', + 'params_section_title' => 'Video clip parameters', + 'clip_title' => 'Clip title', + 'format' => [ + 'label' => 'Choose a format', + 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', + 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', + 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + ], + 'theme' => 'Select a theme', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'trim_start' => 'Trim start', + 'trim_end' => 'Trim end', + 'submit' => 'Create video clip', + ], + 'requirements' => [ + 'title' => 'Missing requirements', + 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'ffmpeg' => 'FFmpeg', + 'gd' => 'Graphics Draw (GD)', + 'freetype' => 'Freetype library for GD', + 'transcript' => 'Transcript file (.srt)', + ], +]; diff --git a/modules/Admin/Language/fr_trad/AboutCastopod.php b/modules/Admin/Language/fr_trad/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/fr_trad/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/fr_trad/Breadcrumb.php b/modules/Admin/Language/fr_trad/Breadcrumb.php new file mode 100644 index 00000000..558b90f7 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Breadcrumb.php @@ -0,0 +1,55 @@ + 'breadcrumb', + config('Admin') + ->gateway => 'Home', + 'podcasts' => 'podcasts', + 'episodes' => 'episodes', + 'subscriptions' => 'subscriptions', + 'contributors' => 'contributors', + 'pages' => 'pages', + 'settings' => 'settings', + 'theme' => 'theme', + 'about' => 'about', + 'add' => 'add', + 'new' => 'new', + 'edit' => 'edit', + 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'publish-date-edit' => 'edit publication date', + 'unpublish' => 'unpublish', + 'delete' => 'delete', + 'remove' => 'remove', + 'fediverse' => 'fediverse', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', + 'users' => 'users', + 'my-account' => 'my account', + 'change-password' => 'change password', + 'import' => 'feed import', + 'platforms' => 'platforms', + 'social' => 'social networks', + 'funding' => 'funding', + 'analytics' => 'analytics', + 'locations' => 'locations', + 'webpages' => 'web pages', + 'unique-listeners' => 'unique listeners', + 'players' => 'players', + 'listening-time' => 'listening time', + 'time-periods' => 'time periods', + 'soundbites' => 'soundbites', + 'video-clips' => 'video clips', + 'embed' => 'embeddable player', + 'notifications' => 'notifications', + 'suspend' => 'suspend', +]; diff --git a/modules/Admin/Language/fr_trad/Charts.php b/modules/Admin/Language/fr_trad/Charts.php new file mode 100644 index 00000000..6ede2510 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Charts.php @@ -0,0 +1,41 @@ + 'Episode downloads by service (for the past week)', + 'by_player_weekly' => 'Episode downloads by player (for the past week)', + 'by_player_yearly' => 'Episode downloads by player (for the past year)', + 'by_device_weekly' => 'Episode downloads by device (for the past week)', + 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', + 'podcast_by_region' => 'Episode downloads by region (for the past week)', + 'unique_daily_listeners' => 'Daily unique listeners', + 'unique_monthly_listeners' => 'Monthly unique listeners', + 'by_browser' => 'Web pages usage by browser (for the past week)', + 'podcast_by_day' => 'Episode daily downloads', + 'podcast_by_month' => 'Episode monthly downloads', + 'episode_by_day' => 'Episode daily downloads (first 60 days)', + 'episode_by_month' => 'Episode monthly downloads', + 'episodes_by_day' => + '5 latest episodes downloads (during their first 60 days)', + 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_yearly' => 'Episode downloads by country (for the past year)', + 'by_domain_weekly' => 'Web pages visits by source (for the past week)', + 'by_domain_yearly' => 'Web pages visits by source (for the past year)', + 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + 'podcast_bots' => 'Bots (crawlers)', + 'daily_listening_time' => 'Daily cumulative listening time', + 'monthly_listening_time' => 'Monthly cumulative listening time', + 'by_weekday' => 'By week day (for the past 60 days)', + 'by_hour' => 'By time of day (for the past 60 days)', + 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', + 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', +]; diff --git a/modules/Admin/Language/fr_trad/Common.php b/modules/Admin/Language/fr_trad/Common.php new file mode 100644 index 00000000..596c8bcd --- /dev/null +++ b/modules/Admin/Language/fr_trad/Common.php @@ -0,0 +1,51 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'more' => 'More', + 'no_data' => 'No data found!', + 'close' => 'Close', + 'edit' => 'Edit', + 'copy' => 'Copy', + 'copied' => 'Copied!', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', + 'forms' => [ + 'editor' => [ + 'write' => 'Write', + 'preview' => 'Preview', + 'help' => 'Powered by markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Press to select', + 'loadingText' => 'Loading…', + 'noResultsText' => 'No results found', + 'noChoicesText' => 'No choices to choose from', + 'maxItemText' => 'Cannot add more items', + ], + 'upload_file' => 'Upload a file', + 'remote_url' => 'Remote URL', + ], + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'size_limit' => 'Size limit: {0}.', + 'choose_interact' => 'Choose how to interact', + 'view' => 'View', +]; diff --git a/modules/Admin/Language/fr_trad/Countries.php b/modules/Admin/Language/fr_trad/Countries.php new file mode 100644 index 00000000..4cd5d9c8 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Countries.php @@ -0,0 +1,264 @@ + 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia, Plurinational State of', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, the Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => "Côte d'Ivoire", + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cape Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia, Federated States of', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran, Islamic Republic of', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao People's Democratic Republic", + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'N/A' => 'Not Applicable (local IP…)', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Swaziland', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See (Vatican City State)', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/fr_trad/Dashboard.php b/modules/Admin/Language/fr_trad/Dashboard.php new file mode 100644 index 00000000..881073fd --- /dev/null +++ b/modules/Admin/Language/fr_trad/Dashboard.php @@ -0,0 +1,28 @@ + 'Admin dashboard', + 'welcome_message' => 'Welcome to the admin area!', + 'podcasts' => [ + 'title' => 'Podcasts', + 'not_found' => 'No published podcast', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'episodes' => [ + 'title' => 'Episodes', + 'not_found' => 'No published episode', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'storage' => [ + 'title' => 'Storage', + 'subtitle' => '{totalUploaded} out of {totalStorage}', + ], +]; diff --git a/modules/Admin/Language/fr_trad/Episode.php b/modules/Admin/Language/fr_trad/Episode.php new file mode 100644 index 00000000..91313a7c --- /dev/null +++ b/modules/Admin/Language/fr_trad/Episode.php @@ -0,0 +1,213 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'edit' => 'Edit', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'publish_date_edit' => 'Edit publication date', + 'unpublish' => 'Unpublish', + 'publish_error' => 'Episode is already published.', + 'publish_edit_error' => 'Episode is already published.', + 'publish_cancel_error' => 'Episode is already published.', + 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', + 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', + 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'unpublish_error' => 'Episode is not published.', + 'delete' => 'Delete', + 'go_to_page' => 'Go to page', + 'create' => 'Add an episode', + 'publication_status' => [ + 'published' => 'Published', + 'with_podcast' => 'Published', + 'scheduled' => 'Scheduled', + 'not_published' => 'Not published', + ], + 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Search for an episode', + 'clear' => 'Clear search', + 'submit' => 'Search', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# episode} + other {# episodes} + }', + 'episode' => 'Episode', + 'visibility' => 'Visibility', + 'comments' => 'Comments', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'Episode has been successfully created!', + 'editSuccess' => 'Episode has been successfully updated!', + 'publishSuccess' => '{publication_status, select, + published {Episode successfully published!} + scheduled {Episode publication successfully scheduled!} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not published.} + }', + 'publishCancelSuccess' => 'Episode publication successfully cancelled!', + 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', + 'scheduleDateError' => 'Schedule date must be set!', + 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'deleteSuccess' => 'Episode successfully deleted!', + 'deleteError' => 'Failed to delete episode {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_path}. You may manually remove it from your disk.', + 'sameSlugError' => 'An episode with the chosen slug already exists.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapters', + 'chapters_hint' => 'File must be in JSON Chapters format.', + 'chapters_download' => 'Download chapters', + 'chapters_file' => 'Chapters file', + 'chapters_remote_url' => 'Remote url for chapters file', + 'chapters_file_delete' => 'Delete chapters file', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the episode', + 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', + 'block' => 'Episode should be hidden from public catalogues', + 'block_hint' => + 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'submit_create' => 'Create episode', + 'submit_edit' => 'Save episode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Back to episode dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + 'with_podcast' => 'Publish alongside podcast', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', + 'message_warning_submit' => 'Publish anyways', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'New publication date', + 'new_publication_date_hint' => 'Must be set to a past date.', + 'submit' => 'Edit publication date', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + 'understand' => 'I understand, I want to delete the episode', + 'submit' => 'Delete', + ], + 'embed' => [ + 'title' => 'Embeddable player', + 'label' => + 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', + 'clipboard_iframe' => 'Copy embeddable player to clipboard', + 'clipboard_url' => 'Copy address to clipboard', + 'dark' => 'Dark', + 'dark-transparent' => 'Dark transparent', + 'light' => 'Light', + 'light-transparent' => 'Light transparent', + ], +]; diff --git a/modules/Admin/Language/fr_trad/EpisodeNavigation.php b/modules/Admin/Language/fr_trad/EpisodeNavigation.php new file mode 100644 index 00000000..1406e301 --- /dev/null +++ b/modules/Admin/Language/fr_trad/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'View episode page', + 'dashboard' => 'Episode dashboard', + 'episode-view' => 'Home', + 'episode-edit' => 'Edit episode', + 'episode-persons-manage' => 'Manage persons', + 'embed-add' => 'Embeddable player', + 'clips' => 'Clips', + 'video-clips-list' => 'Video clips', + 'video-clips-create' => 'New video clip', + 'soundbites-list' => 'Soundbites', + 'soundbites-create' => 'New soundbite', +]; diff --git a/modules/Admin/Language/fr_trad/Fediverse.php b/modules/Admin/Language/fr_trad/Fediverse.php new file mode 100644 index 00000000..0e4ca66d --- /dev/null +++ b/modules/Admin/Language/fr_trad/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'The account could not be found!', + 'blockActorSuccess' => '{actor} has been blocked!', + 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockDomainSuccess' => '{domain} has been blocked!', + 'unblockDomainSuccess' => '{domain} has been unblocked!', + ], + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/modules/Admin/Language/fr_trad/Home.php b/modules/Admin/Language/fr_trad/Home.php new file mode 100644 index 00000000..3ff4c04d --- /dev/null +++ b/modules/Admin/Language/fr_trad/Home.php @@ -0,0 +1,14 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found', +]; diff --git a/modules/Admin/Language/fr_trad/Install.php b/modules/Admin/Language/fr_trad/Install.php new file mode 100644 index 00000000..36e373a2 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Install.php @@ -0,0 +1,61 @@ + 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Admin/Language/fr_trad/Navigation.php b/modules/Admin/Language/fr_trad/Navigation.php new file mode 100644 index 00000000..610f1434 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Navigation.php @@ -0,0 +1,42 @@ + 'Toggle sidebar', + 'go_to_website' => 'Go to website', + 'go_to_admin' => 'Go to admin', + 'dashboard' => 'Dashboard', + 'admin' => 'Home', + 'podcasts' => 'Podcasts', + 'podcast-list' => 'All podcasts', + 'podcast-create' => 'New podcast', + 'podcast-import' => 'Import a podcast', + 'persons' => 'Persons', + 'person-list' => 'All persons', + 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', + 'users' => 'Users', + 'user-list' => 'All users', + 'user-create' => 'New user', + 'pages' => 'Pages', + 'page-list' => 'All pages', + 'page-create' => 'New Page', + 'settings' => 'Settings', + 'settings-general' => 'General', + 'settings-theme' => 'Theme', + 'about' => 'About', + 'account' => [ + 'my-account' => 'My account', + 'change-password' => 'Change password', + 'logout' => 'Logout', + ], +]; diff --git a/modules/Admin/Language/fr_trad/Notifications.php b/modules/Admin/Language/fr_trad/Notifications.php new file mode 100644 index 00000000..2b139d51 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Notifications.php @@ -0,0 +1,19 @@ + 'Notifications', + 'reply' => '{actor_username} replied to your post', + 'favourite' => '{actor_username} favourited your post', + 'reblog' => '{actor_username} shared your post', + 'follow' => '{actor_username} started following you', + 'no_notifications' => 'No notifications', + 'mark_all_as_read' => 'Mark all as read', +]; diff --git a/modules/Admin/Language/fr_trad/Page.php b/modules/Admin/Language/fr_trad/Page.php new file mode 100644 index 00000000..b6f49de5 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Page.php @@ -0,0 +1,30 @@ + 'Back to home', + 'page' => 'Page', + 'all_pages' => 'All pages', + 'create' => 'New page', + 'go_to_page' => 'Go to page', + 'edit' => 'Edit page', + 'delete' => 'Delete page', + 'form' => [ + 'title' => 'Title', + 'permalink' => 'Permalink', + 'content' => 'Content', + 'submit_create' => 'Create page', + 'submit_edit' => 'Save', + ], + 'messages' => [ + 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'editSuccess' => 'The page was successfully updated!', + ], +]; diff --git a/modules/Admin/Language/fr_trad/Pager.php b/modules/Admin/Language/fr_trad/Pager.php new file mode 100644 index 00000000..e25ee638 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Pager.php @@ -0,0 +1,21 @@ + 'Page navigation', + 'first' => 'First', + 'previous' => 'Previous', + 'next' => 'Next', + 'last' => 'Last', + 'older' => 'Older', + 'newer' => 'Newer', + 'invalidTemplate' => '{0} is not a valid Pager template.', + 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', +]; diff --git a/modules/Admin/Language/fr_trad/Person.php b/modules/Admin/Language/fr_trad/Person.php new file mode 100644 index 00000000..a652be9f --- /dev/null +++ b/modules/Admin/Language/fr_trad/Person.php @@ -0,0 +1,65 @@ + 'Persons', + 'all_persons' => 'All persons', + 'no_person' => 'Nobody found!', + 'create' => 'Create a person', + 'view' => 'View person', + 'edit' => 'Edit person', + 'delete' => 'Delete person', + 'messages' => [ + 'createSuccess' => 'Person has been successfully created!', + 'editSuccess' => 'Person has been successfully updated!', + 'deleteSuccess' => 'Person has been removed!', + ], + 'form' => [ + 'avatar' => 'Avatar', + 'avatar_size_hint' => + 'Avatar must be squared and at least 400px wide and tall.', + 'full_name' => 'Full name', + 'full_name_hint' => 'This is the full name or alias of the person.', + 'unique_name' => 'Unique name', + 'unique_name_hint' => 'Used for URLs', + 'information_url' => 'Information URL', + 'information_url_hint' => + 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', + 'submit_create' => 'Create person', + 'submit_edit' => 'Save person', + ], + 'podcast_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this podcast', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'episode_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this episode', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'credits' => 'Credits', +]; diff --git a/modules/Admin/Language/fr_trad/Platforms.php b/modules/Admin/Language/fr_trad/Platforms.php new file mode 100644 index 00000000..ab17d599 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Platforms.php @@ -0,0 +1,30 @@ + 'Platforms', + 'home_url' => 'Go to {platformName} website', + 'submit_url' => 'Submit your podcast on {platformName}', + 'visible' => 'Display in podcast homepage?', + 'on_embed' => 'Display on embeddable player?', + 'remove' => 'Remove {platformName}', + 'submit' => 'Save', + 'messages' => [ + 'updateSuccess' => 'Platform links have been successfully updated!', + 'removeLinkSuccess' => 'The platform link has been removed.', + 'removeLinkError' => + 'The platform link could not be removed. Try again.', + ], + 'description' => [ + 'podcasting' => 'The podcast ID on this platform', + 'social' => 'The podcast account ID on this platform', + 'funding' => 'Call to action message', + ], +]; diff --git a/modules/Admin/Language/fr_trad/Podcast.php b/modules/Admin/Language/fr_trad/Podcast.php new file mode 100644 index 00000000..2d46aff5 --- /dev/null +++ b/modules/Admin/Language/fr_trad/Podcast.php @@ -0,0 +1,314 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found!', + 'create' => 'Create podcast', + 'import' => 'Import podcast', + 'new_episode' => 'New Episode', + 'view' => 'View podcast', + 'edit' => 'Edit podcast', + 'publish' => 'Publish podcast', + 'publish_edit' => 'Edit publication', + 'delete' => 'Delete podcast', + 'see_episodes' => 'See episodes', + 'see_contributors' => 'See contributors', + 'go_to_page' => 'Go to page', + 'latest_episodes' => 'Latest episodes', + 'see_all_episodes' => 'See all episodes', + 'draft' => 'Draft', + 'messages' => [ + 'createSuccess' => 'Podcast successfully created!', + 'editSuccess' => 'Podcast has been successfully updated!', + 'importSuccess' => 'Podcast has been successfully imported!', + 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, + cover {cover} + banner {banner} + other {media} + }.', + 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, + one {# episode was} + other {# episodes were} + } added to the podcast!', + 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', + 'publishError' => 'This podcast is either already published or scheduled for publication.', + 'publishEditError' => 'This podcast is not scheduled for publication.', + 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', + 'scheduleDateError' => 'Schedule date must be set!', + ], + 'form' => [ + 'identity_section_title' => 'Podcast identity', + 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'cover' => 'Podcast cover', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'banner' => 'Podcast banner', + 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_delete' => 'Delete podcast banner', + 'title' => 'Title', + 'handle' => 'Handle', + 'handle_hint' => + 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'type' => [ + 'label' => 'Type', + 'episodic' => 'Episodic', + 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', + 'serial' => 'Serial', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + ], + 'description' => 'Description', + 'classification_section_title' => 'Classification', + 'classification_section_subtitle' => + 'These fields will impact your audience and competition.', + 'language' => 'Language', + 'category' => 'Category', + 'category_placeholder' => 'Select a category…', + 'other_categories' => 'Other categories', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does it contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'author_section_title' => 'Author', + 'author_section_subtitle' => 'Who is managing the podcast?', + 'owner_name' => 'Owner name', + 'owner_name_hint' => + 'For administrative use only. Visible in the public RSS feed.', + 'owner_email' => 'Owner email', + 'owner_email_hint' => + 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'publisher' => 'Publisher', + 'publisher_hint' => + 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'copyright' => 'Copyright', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this podcast about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real place or fictional', + 'monetization_section_title' => 'Monetization', + 'monetization_section_subtitle' => + 'Earn money thanks to your audience.', + 'premium' => 'Premium', + 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_enable' => 'Enable OP3 analytics service', + 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'payment_pointer_hint' => + 'This is your where you will receive money thanks to Web Monetization', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the podcast', + 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'new_feed_url' => 'New feed URL', + 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', + 'old_feed_url' => 'Old feed URL', + 'update_feed' => 'Update feed', + 'update_feed_tip' => 'Import this podcast\'s latest episodes', + 'partnership' => 'Partnership', + 'partner_id' => 'ID', + 'partner_link_url' => 'Link URL', + 'partner_image_url' => 'Image URL', + 'partner_id_hint' => 'Your own partner ID', + 'partner_link_url_hint' => 'The generic partner link address', + 'partner_image_url_hint' => 'The generic partner image address', + 'status_section_title' => 'Status', + 'block' => 'Podcast should be hidden from public catalogues', + 'block_hint' => + 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'complete' => 'Podcast will not be having new episodes', + 'lock' => 'Prevent podcast from being copied', + 'lock_hint' => + 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', + 'submit_create' => 'Create podcast', + 'submit_edit' => 'Save podcast', + ], + 'category_options' => [ + 'uncategorized' => 'uncategorized', + 'arts' => 'Arts', + 'business' => 'Business', + 'comedy' => 'Comedy', + 'education' => 'Education', + 'fiction' => 'Fiction', + 'government' => 'Government', + 'health_and_fitness' => 'Health & Fitness', + 'history' => 'History', + 'kids_and_family' => 'Kids & Family', + 'leisure' => 'Leisure', + 'music' => 'Music', + 'news' => 'News', + 'religion_and_spirituality' => 'Religion & Spirituality', + 'science' => 'Science', + 'society_and_culture' => 'Society & Culture', + 'sports' => 'Sports', + 'technology' => 'Technology', + 'true_crime' => 'True Crime', + 'tv_and_film' => 'TV & Film', + 'books' => 'Books', + 'design' => 'Design', + 'fashion_and_beauty' => 'Fashion & Beauty', + 'food' => 'Food', + 'performing_arts' => 'Performing Arts', + 'visual_arts' => 'Visual Arts', + 'careers' => 'Careers', + 'entrepreneurship' => 'Entrepreneurship', + 'investing' => 'Investing', + 'management' => 'Management', + 'marketing' => 'Marketing', + 'non_profit' => 'Non-Profit', + 'comedy_interviews' => 'Comedy Interviews', + 'improv' => 'Improv', + 'stand_up' => 'Stand-Up', + 'courses' => 'Courses', + 'how_to' => 'How To', + 'language_learning' => 'Language Learning', + 'self_improvement' => 'Self-Improvement', + 'comedy_fiction' => 'Comedy Fiction', + 'drama' => 'Drama', + 'science_fiction' => 'Science Fiction', + 'alternative_health' => 'Alternative Health', + 'fitness' => 'Fitness', + 'medicine' => 'Medicine', + 'mental_health' => 'Mental Health', + 'nutrition' => 'Nutrition', + 'sexuality' => 'Sexuality', + 'education_for_kids' => 'Education for Kids', + 'parenting' => 'Parenting', + 'pets_and_animals' => 'Pets & Animals', + 'stories_for_kids' => 'Stories for Kids', + 'animation_and_manga' => 'Animation & Manga', + 'automotive' => 'Automotive', + 'aviation' => 'Aviation', + 'crafts' => 'Crafts', + 'games' => 'Games', + 'hobbies' => 'Hobbies', + 'home_and_garden' => 'Home & Garden', + 'video_games' => 'Video Games', + 'music_commentary' => 'Music Commentary', + 'music_history' => 'Music History', + 'music_interviews' => 'Music Interviews', + 'business_news' => 'Business News', + 'daily_news' => 'Daily News', + 'entertainment_news' => 'Entertainment News', + 'news_commentary' => 'News Commentary', + 'politics' => 'Politics', + 'sports_news' => 'Sports News', + 'tech_news' => 'Tech News', + 'buddhism' => 'Buddhism', + 'christianity' => 'Christianity', + 'hinduism' => 'Hinduism', + 'islam' => 'Islam', + 'judaism' => 'Judaism', + 'religion' => 'Religion', + 'spirituality' => 'Spirituality', + 'astronomy' => 'Astronomy', + 'chemistry' => 'Chemistry', + 'earth_sciences' => 'Earth Sciences', + 'life_sciences' => 'Life Sciences', + 'mathematics' => 'Mathematics', + 'natural_sciences' => 'Natural Sciences', + 'nature' => 'Nature', + 'physics' => 'Physics', + 'social_sciences' => 'Social Sciences', + 'documentary' => 'Documentary', + 'personal_journals' => 'Personal Journals', + 'philosophy' => 'Philosophy', + 'places_and_travel' => 'Places & Travel', + 'relationships' => 'Relationships', + 'baseball' => 'Baseball', + 'basketball' => 'Basketball', + 'cricket' => 'Cricket', + 'fantasy_sports' => 'Fantasy Sports', + 'football' => 'Football', + 'golf' => 'Golf', + 'hockey' => 'Hockey', + 'rugby' => 'Rugby', + 'running' => 'Running', + 'soccer' => 'Soccer', + 'swimming' => 'Swimming', + 'tennis' => 'Tennis', + 'volleyball' => 'Volleyball', + 'wilderness' => 'Wilderness', + 'wrestling' => 'Wrestling', + 'after_shows' => 'After Shows', + 'film_history' => 'Film History', + 'film_interviews' => 'Film Interviews', + 'film_reviews' => 'Film Reviews', + 'tv_reviews' => 'TV Reviews', + ], + 'publish_form' => [ + 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'submit' => 'Publish', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', + 'message_warning_submit' => 'Publish anyway', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'not_published' => 'This podcast is not yet published.', + 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", + 'understand' => 'I understand, I want the podcast to be permanently deleted', + 'submit' => 'Delete', + ], + 'by' => 'By {publisher}', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', +]; diff --git a/modules/Admin/Language/fr_trad/PodcastImport.php b/modules/Admin/Language/fr_trad/PodcastImport.php new file mode 100644 index 00000000..7c3ef67d --- /dev/null +++ b/modules/Admin/Language/fr_trad/PodcastImport.php @@ -0,0 +1,37 @@ + + 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', + 'old_podcast_section_title' => 'The podcast to import', + 'old_podcast_section_subtitle' => + 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', + 'imported_feed_url' => 'Feed URL', + 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', + 'new_podcast_section_title' => 'The new podcast', + 'advanced_params_section_title' => 'Advanced parameters', + 'advanced_params_section_subtitle' => + 'Keep the default values if you have no idea of what the fields are for.', + 'slug_field' => 'Field to be used to calculate episode slug', + 'description_field' => + 'Source field used for episode description / show notes', + 'force_renumber' => 'Force episodes renumbering', + 'force_renumber_hint' => + 'Use this if your podcast does not have episode numbers but wish to set them during import.', + 'season_number' => 'Season number', + 'season_number_hint' => + 'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.', + 'max_episodes' => 'Maximum number of episodes to import', + 'max_episodes_hint' => 'Leave blank to import all episodes', + 'lock_import' => + 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.', + 'submit' => 'Import podcast', +]; diff --git a/modules/Admin/Language/fr_trad/PodcastNavigation.php b/modules/Admin/Language/fr_trad/PodcastNavigation.php new file mode 100644 index 00000000..b4d7ddc0 --- /dev/null +++ b/modules/Admin/Language/fr_trad/PodcastNavigation.php @@ -0,0 +1,38 @@ + 'Go to podcast page', + 'dashboard' => 'Podcast dashboard', + 'podcast-view' => 'Home', + 'podcast-edit' => 'Edit podcast', + 'podcast-persons-manage' => 'Manage persons', + 'episodes' => 'Episodes', + 'episode-list' => 'All episodes', + 'episode-create' => 'New episode', + 'analytics' => 'Analytics', + 'podcast-analytics' => 'Audience overview', + 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-players' => 'Players', + 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-time-periods' => 'Time periods', + 'premium' => 'Premium', + 'subscription-list' => 'All subscriptions', + 'subscription-add' => 'Add subscription', + 'contributors' => 'Contributors', + 'contributor-list' => 'All contributors', + 'contributor-add' => 'Add contributor', + 'platforms' => 'External platforms', + 'platforms-podcasting' => 'Podcasting', + 'platforms-social' => 'Social networks', + 'platforms-funding' => 'Funding', +]; diff --git a/modules/Admin/Language/fr_trad/Settings.php b/modules/Admin/Language/fr_trad/Settings.php new file mode 100644 index 00000000..4a70dcba --- /dev/null +++ b/modules/Admin/Language/fr_trad/Settings.php @@ -0,0 +1,58 @@ + 'General settings', + 'instance' => [ + 'title' => 'Instance', + 'site_icon' => 'Site icon', + 'site_icon_delete' => 'Delete site icon', + 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_name' => 'Site name', + 'site_description' => 'Site description', + 'submit' => 'Save', + 'editSuccess' => 'Instance has been updated successfully!', + 'deleteIconSuccess' => 'Site icon has been remove successfully!', + ], + 'images' => [ + 'title' => 'Images', + 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'regenerate' => 'Regenerate images', + 'regenerationSuccess' => 'All images have been regenerated successfully!', + ], + 'housekeeping' => [ + 'title' => 'Housekeeping', + 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', + 'reset_counts' => 'Reset counts', + 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', + 'rewrite_media' => 'Rewrite media metadata', + 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', + 'rename_episodes_files' => 'Rename episode audio files', + 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'clear_cache' => 'Clear all cache', + 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'run' => 'Run housekeeping', + 'runSuccess' => 'Housekeeping has been run successfully!', + ], + 'theme' => [ + 'title' => 'Theme', + 'accent_section_title' => 'Accent color', + 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', + 'pine' => 'Pine', + 'crimson' => 'Crimson', + 'amber' => 'Amber', + 'lake' => 'Lake', + 'jacaranda' => 'Jacaranda', + 'onyx' => 'Onyx', + 'submit' => 'Save', + 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + ], +]; diff --git a/modules/Admin/Language/fr_trad/Soundbite.php b/modules/Admin/Language/fr_trad/Soundbite.php new file mode 100644 index 00000000..a3f828fe --- /dev/null +++ b/modules/Admin/Language/fr_trad/Soundbite.php @@ -0,0 +1,31 @@ + [ + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', + ], + 'messages' => [ + 'createSuccess' => 'Soundbite has been successfully created!', + 'deleteSuccess' => 'Soundbite has been successfully removed!', + ], + 'form' => [ + 'title' => 'New soundbite', + 'soundbite_title' => 'Soundbite title', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'submit' => 'Create soundbite', + ], + 'play' => 'Play soundbite', + 'stop' => 'Stop soundbite', + 'create' => 'New soundbite', + 'delete' => 'Delete soundbite', +]; diff --git a/modules/Admin/Language/fr_trad/Validation.php b/modules/Admin/Language/fr_trad/Validation.php new file mode 100644 index 00000000..3bc78cfe --- /dev/null +++ b/modules/Admin/Language/fr_trad/Validation.php @@ -0,0 +1,16 @@ + + '{field} is either not an image, or it is not wide or tall enough.', + 'is_image_ratio' => + '{field} is either not an image or not of the right ratio.', +]; diff --git a/modules/Admin/Language/fr_trad/VideoClip.php b/modules/Admin/Language/fr_trad/VideoClip.php new file mode 100644 index 00000000..638de697 --- /dev/null +++ b/modules/Admin/Language/fr_trad/VideoClip.php @@ -0,0 +1,72 @@ + [ + 'title' => 'Video clips', + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Clip is waiting to be processed.', + 'pending' => 'pending', + 'pending_hint' => 'Clip will be generated shortly.', + 'running' => 'running', + 'running_hint' => 'Clip is being generated.', + 'failed' => 'failed', + 'failed_hint' => 'Clip could not be generated: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Clip was generated successfully!', + ], + 'clip' => 'Clip', + 'duration' => 'Job duration', + ], + 'title' => 'Video clip: {videoClipLabel}', + 'download_clip' => 'Download clip', + 'create' => 'New video clip', + 'go_to_page' => 'Go to clip page', + 'retry' => 'Retry clip generation', + 'delete' => 'Delete clip', + 'logs' => 'Job logs', + 'messages' => [ + 'alreadyExistingError' => 'The video clip you are trying to create already exists!', + 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', + 'deleteSuccess' => 'Video clip has been successfully removed!', + ], + 'format' => [ + 'landscape' => 'Landscape', + 'portrait' => 'Portrait', + 'squared' => 'Squared', + ], + 'form' => [ + 'title' => 'New video clip', + 'params_section_title' => 'Video clip parameters', + 'clip_title' => 'Clip title', + 'format' => [ + 'label' => 'Choose a format', + 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', + 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', + 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + ], + 'theme' => 'Select a theme', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'trim_start' => 'Trim start', + 'trim_end' => 'Trim end', + 'submit' => 'Create video clip', + ], + 'requirements' => [ + 'title' => 'Missing requirements', + 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'ffmpeg' => 'FFmpeg', + 'gd' => 'Graphics Draw (GD)', + 'freetype' => 'Freetype library for GD', + 'transcript' => 'Transcript file (.srt)', + ], +]; diff --git a/modules/Admin/Language/gd/Charts.php b/modules/Admin/Language/gd/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/gd/Charts.php +++ b/modules/Admin/Language/gd/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/gd/Episode.php b/modules/Admin/Language/gd/Episode.php index 713b517b..5ed5e3ac 100644 --- a/modules/Admin/Language/gd/Episode.php +++ b/modules/Admin/Language/gd/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/gl/Charts.php b/modules/Admin/Language/gl/Charts.php index edd2f8af..0e232ad4 100644 --- a/modules/Admin/Language/gl/Charts.php +++ b/modules/Admin/Language/gl/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Ancho de banda diario utilizado (en MB)', 'total_storage_by_month' => 'Almacenaxe mensual (en MB)', 'total_bandwidth_by_month' => 'Ancho de banda mensual utilizado (en MB)', + 'total_bandwidth_by_month_limit' => 'Limitado a {totalBandwidth} ao mes', ]; diff --git a/modules/Admin/Language/gl/Countries.php b/modules/Admin/Language/gl/Countries.php index 587c4d49..6731e923 100644 --- a/modules/Admin/Language/gl/Countries.php +++ b/modules/Admin/Language/gl/Countries.php @@ -15,22 +15,22 @@ return [ 'AE' => 'Emiratos Árabes Unidos', 'AF' => 'Afganistán', 'AG' => 'Antigua e Barbuda', - 'AI' => 'Anguilla', + 'AI' => 'Anguila', 'AL' => 'Albania', 'AM' => 'Armenia', 'AO' => 'Angola', - 'AQ' => 'Antarctica', - 'AR' => 'Argentina', - 'AS' => 'American Samoa', + 'AQ' => 'Antártida', + 'AR' => 'Arxentina', + 'AS' => 'Samoa Americana', 'AT' => 'Austria', 'AU' => 'Australia', 'AW' => 'Aruba', - 'AX' => 'Åland Islands', - 'AZ' => 'Azerbaijan', - 'BA' => 'Bosnia and Herzegovina', + 'AX' => 'Illas Åland', + 'AZ' => 'Acerbaixán', + 'BA' => 'Bosnia e Hercegovina', 'BB' => 'Barbados', 'BD' => 'Bangladesh', - 'BE' => 'Belgium', + 'BE' => 'Bélxica', 'BF' => 'Burkina Faso', 'BG' => 'Bulgaria', 'BH' => 'Bahrain', diff --git a/modules/Admin/Language/gl/Episode.php b/modules/Admin/Language/gl/Episode.php index 7e28539c..3d7c5c76 100644 --- a/modules/Admin/Language/gl/Episode.php +++ b/modules/Admin/Language/gl/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episodio', 'visibility' => 'Visibilidade', + 'downloads' => 'Downloads', 'comments' => 'Comentarios', 'actions' => 'Accións', ], diff --git a/modules/Admin/Language/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php index db7d7d07..821a8ec4 100644 --- a/modules/Admin/Language/gl/Podcast.php +++ b/modules/Admin/Language/gl/Podcast.php @@ -48,39 +48,39 @@ return [ other {# episodios foron engadidos} } ao podcast!', 'podcastFeedUpToDate' => 'O podcast xa está ao día.', - 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', - 'publishError' => 'This podcast is either already published or scheduled for publication.', - 'publishEditError' => 'This podcast is not scheduled for publication.', - 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', - 'scheduleDateError' => 'Schedule date must be set!', + 'podcastNotImported' => 'Non se actualizou o podcast porque non fora importado.', + 'publishError' => 'Este podcast ou ben xa foi publicado ou está programada a súa publicación.', + 'publishEditError' => 'Este podcast non ten a publicación programada.', + 'publishCancelSuccess' => 'Cancelouse correctamente a publicación do podcast!', + 'scheduleDateError' => 'Hai que establecer a data da publicación!', ], 'form' => [ - 'identity_section_title' => 'Podcast identity', - 'identity_section_subtitle' => 'These fields allow you to get noticed.', - 'cover' => 'Podcast cover', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', - 'banner' => 'Podcast banner', - 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', - 'banner_delete' => 'Delete podcast banner', - 'title' => 'Title', - 'handle' => 'Handle', + 'identity_section_title' => 'Identidade do podcast', + 'identity_section_subtitle' => 'Estes campos permítenche recibir notificacións.', + 'cover' => 'Portada do podcast', + 'cover_size_hint' => 'A portada ten que ser cadrada e como mínimo de 1400px de alto e ancho.', + 'banner' => 'Cabeceira do podcast', + 'banner_size_hint' => 'A imaxe de cabeceira debe ter proporción 3:1 e 1500px. como mínimo.', + 'banner_delete' => 'Eliminar cabeceira do podcast', + 'title' => 'Título', + 'handle' => 'Identificador', 'handle_hint' => - 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'Utilizado para identificar o podcast. Permítense maiúsculas, minúsculas, números e trazo baixo.', 'type' => [ - 'label' => 'Type', - 'episodic' => 'Episodic', - 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', - 'serial' => 'Serial', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + 'label' => 'Tipo', + 'episodic' => 'Recurrente', + 'episodic_hint' => 'Se os episodios non teñen unha orde predeterminada para ser escoitados. Os novos episodios serán mostrados antes.', + 'serial' => 'Serie', + 'serial_hint' => 'Se os episodios teñen unha orde secuencial establecida. Os episodios máis antigos aparecerán primeiro.', ], - 'description' => 'Description', - 'classification_section_title' => 'Classification', + 'description' => 'Descrición', + 'classification_section_title' => 'Clasificación', 'classification_section_subtitle' => - 'These fields will impact your audience and competition.', - 'language' => 'Language', - 'category' => 'Category', - 'category_placeholder' => 'Select a category…', - 'other_categories' => 'Other categories', + 'Estos campos terán impacto na túa audiencia e competencia.', + 'language' => 'Idioma', + 'category' => 'Categoría', + 'category_placeholder' => 'Elixe unha categoría…', + 'other_categories' => 'Outras categorías', 'parental_advisory' => [ 'label' => 'Parental advisory', 'hint' => 'Does it contain explicit content?', diff --git a/modules/Admin/Language/id/Charts.php b/modules/Admin/Language/id/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/id/Charts.php +++ b/modules/Admin/Language/id/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/id/Episode.php b/modules/Admin/Language/id/Episode.php index 713b517b..5ed5e3ac 100644 --- a/modules/Admin/Language/id/Episode.php +++ b/modules/Admin/Language/id/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/it/Charts.php b/modules/Admin/Language/it/Charts.php index 383d7bf8..88455fc2 100644 --- a/modules/Admin/Language/it/Charts.php +++ b/modules/Admin/Language/it/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/it/Episode.php b/modules/Admin/Language/it/Episode.php index 2e5a2673..a05f6147 100644 --- a/modules/Admin/Language/it/Episode.php +++ b/modules/Admin/Language/it/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/ko/Charts.php b/modules/Admin/Language/ko/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/ko/Charts.php +++ b/modules/Admin/Language/ko/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/ko/Episode.php b/modules/Admin/Language/ko/Episode.php index 713b517b..5ed5e3ac 100644 --- a/modules/Admin/Language/ko/Episode.php +++ b/modules/Admin/Language/ko/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/nl/Charts.php b/modules/Admin/Language/nl/Charts.php index 6f2b1ea5..0071e69f 100644 --- a/modules/Admin/Language/nl/Charts.php +++ b/modules/Admin/Language/nl/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Dagelijks gebruikte bandbreedte (in MB)', 'total_storage_by_month' => 'Maandelijkse opslagruimte (in MB)', 'total_bandwidth_by_month' => 'Maandelijkse gebruikte bandbreedte (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/nl/Episode.php b/modules/Admin/Language/nl/Episode.php index 7b3f428c..ffd05f72 100644 --- a/modules/Admin/Language/nl/Episode.php +++ b/modules/Admin/Language/nl/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Aflevering', 'visibility' => 'Zichtbaarheid', + 'downloads' => 'Downloads', 'comments' => 'Reacties', 'actions' => 'Acties', ], diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php index b7f9485f..3f1753d3 100644 --- a/modules/Admin/Language/nn-NO/Breadcrumb.php +++ b/modules/Admin/Language/nn-NO/Breadcrumb.php @@ -14,19 +14,19 @@ return [ ->gateway => 'Heim', 'podcasts' => 'podkastar', 'episodes' => 'episodar', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'tingingar', 'contributors' => 'bidragsytarar', 'pages' => 'sider', 'settings' => 'innstillingar', 'theme' => 'bunad', - 'about' => 'about', + 'about' => 'om', 'add' => 'legg til', 'new' => 'ny', 'edit' => 'rediger', 'persons' => 'personar', 'publish' => 'legg ut', 'publish-edit' => 'rediger publiseringa', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'rediger publiseringsdato', 'unpublish' => 'avpubliser', 'delete' => 'slett', 'remove' => 'remove', diff --git a/modules/Admin/Language/nn-NO/Charts.php b/modules/Admin/Language/nn-NO/Charts.php index c0880f32..0070600d 100644 --- a/modules/Admin/Language/nn-NO/Charts.php +++ b/modules/Admin/Language/nn-NO/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Dagleg bandbreidde (i MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/nn-NO/Episode.php b/modules/Admin/Language/nn-NO/Episode.php index ab6ebe91..cbd02055 100644 --- a/modules/Admin/Language/nn-NO/Episode.php +++ b/modules/Admin/Language/nn-NO/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Synlegheit', + 'downloads' => 'Downloads', 'comments' => 'Kommentarar', 'actions' => 'Handlingar', ], diff --git a/modules/Admin/Language/oc/Charts.php b/modules/Admin/Language/oc/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/oc/Charts.php +++ b/modules/Admin/Language/oc/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/oc/Episode.php b/modules/Admin/Language/oc/Episode.php index 713b517b..5ed5e3ac 100644 --- a/modules/Admin/Language/oc/Episode.php +++ b/modules/Admin/Language/oc/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/pl/AboutCastopod.php b/modules/Admin/Language/pl/AboutCastopod.php index 3fb62aff..5e53f389 100644 --- a/modules/Admin/Language/pl/AboutCastopod.php +++ b/modules/Admin/Language/pl/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'O CastoPod', + 'host_name' => 'Nazwa hosta', + 'version' => 'Wersja Castopod', + 'php_version' => 'Wersja PHP', + 'os' => 'System operacyjny', + 'languages' => 'Języki', + 'update_database' => 'Aktualizuj bazę danych', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'Baza danych jest aktualna!', ], ]; diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php index ba120541..78249d87 100644 --- a/modules/Admin/Language/pl/Breadcrumb.php +++ b/modules/Admin/Language/pl/Breadcrumb.php @@ -14,25 +14,25 @@ return [ ->gateway => 'Początek', 'podcasts' => 'podcasty', 'episodes' => 'odcinki', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'subskrypcja', 'contributors' => 'kontrybutorzy', 'pages' => 'strony', 'settings' => 'ustawienia', 'theme' => 'motyw', - 'about' => 'about', + 'about' => 'informacje', 'add' => 'dodaj', 'new' => 'nowy', 'edit' => 'edytuj', 'persons' => 'osoby', 'publish' => 'publikuj', 'publish-edit' => 'edytuj publikację', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'edytuj datę publikacji', 'unpublish' => 'cofnij publikację', 'delete' => 'usuń', - 'remove' => 'remove', + 'remove' => 'usuń', 'fediverse' => 'fediverse', - 'blocked-actors' => 'blocked actors', - 'blocked-domains' => 'blocked domains', + 'blocked-actors' => 'zablokowani aktorzy', + 'blocked-domains' => 'zablokowane domeny', 'users' => 'użytkownicy', 'my-account' => 'moje konto', 'change-password' => 'zmień hasło', @@ -50,6 +50,6 @@ return [ 'soundbites' => 'zajawki', 'video-clips' => 'klipy wideo', 'embed' => 'odtwarzacz do osadzenia', - 'notifications' => 'notifications', - 'suspend' => 'suspend', + 'notifications' => 'powiadomienia', + 'suspend' => 'wstrzymaj', ]; diff --git a/modules/Admin/Language/pl/Charts.php b/modules/Admin/Language/pl/Charts.php index 32eb4e20..28b8e92d 100644 --- a/modules/Admin/Language/pl/Charts.php +++ b/modules/Admin/Language/pl/Charts.php @@ -35,6 +35,7 @@ return [ 'by_weekday' => 'Według dnia tygodnia (dla minionych 60 dni)', 'by_hour' => 'Według pory dnia (dla minionych 60 dni)', 'podcast_by_bandwidth' => 'Dzienna przepustowość (w MB)', - 'total_storage_by_month' => 'Monthly storage (in MB)', - 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_storage_by_month' => 'Miesięczne przechowywanie (w MB)', + 'total_bandwidth_by_month' => 'Miesięczne zużycie transferu (w MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/pl/Common.php b/modules/Admin/Language/pl/Common.php index 183399ee..8fcbc322 100644 --- a/modules/Admin/Language/pl/Common.php +++ b/modules/Admin/Language/pl/Common.php @@ -46,6 +46,6 @@ return [ 'playing' => 'Odtwarzanie', ], 'size_limit' => 'Limit rozmiaru: {0}.', - 'choose_interact' => 'Choose how to interact', - 'view' => 'View', + 'choose_interact' => 'Wybierz sposób interakcji', + 'view' => 'Podgląd', ]; diff --git a/modules/Admin/Language/pl/Countries.php b/modules/Admin/Language/pl/Countries.php index 78a89f0b..53f104a8 100644 --- a/modules/Admin/Language/pl/Countries.php +++ b/modules/Admin/Language/pl/Countries.php @@ -11,7 +11,7 @@ declare(strict_types=1); */ return [ - 'AD' => 'Andorra', + 'AD' => 'Andora', 'AE' => 'Zjednoczone Emiraty Arabskie', 'AF' => 'Afganistan', 'AG' => 'Antigua i Barbuda', @@ -63,7 +63,7 @@ return [ 'CR' => 'Kostaryka', 'CU' => 'Kuba', 'CV' => 'Republika Zielonego Przylądka', - 'CW' => 'Curaçao', + 'CW' => 'Curacao', 'CX' => 'Wyspa Bożego Narodzenia', 'CY' => 'Cypr', 'CZ' => 'Czechy', @@ -121,7 +121,7 @@ return [ 'IR' => 'Iran', 'IS' => 'Islandia', 'IT' => 'Włochy', - 'JE' => 'Jersey', + 'JE' => 'Wyspa Jersey', 'JM' => 'Jamajka', 'JO' => 'Jordania', 'JP' => 'Japonia', @@ -146,12 +146,12 @@ return [ 'LT' => 'Litwa', 'LU' => 'Luksemburg', 'LV' => 'Łotwa', - 'LY' => 'Libya', + 'LY' => 'Libia', 'MA' => 'Maroko', 'MC' => 'Monako', 'MD' => 'Mołdawia', 'ME' => 'Czarnogóra', - 'MF' => 'Saint Martin (French part)', + 'MF' => 'Saint-Martin (Francja)', 'MG' => 'Madagaskar', 'MH' => 'Wyspy Marshalla', 'MK' => 'Macedonia Północna', @@ -224,7 +224,7 @@ return [ 'SV' => 'Salwador', 'SX' => 'Sint Maarten', 'SY' => 'Syria', - 'SZ' => 'Swaziland', + 'SZ' => 'Suazi', 'TC' => 'Turks i Caicos', 'TD' => 'Czad', 'TF' => 'Francuskie Terytoria Południowe i Antarktyczne', diff --git a/modules/Admin/Language/pl/Dashboard.php b/modules/Admin/Language/pl/Dashboard.php index 881073fd..b50d444d 100644 --- a/modules/Admin/Language/pl/Dashboard.php +++ b/modules/Admin/Language/pl/Dashboard.php @@ -9,20 +9,20 @@ declare(strict_types=1); */ return [ - 'home' => 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', + 'home' => 'Pulpit administratora', + 'welcome_message' => 'Witamy w panelu administracyjnym!', 'podcasts' => [ - 'title' => 'Podcasts', - 'not_found' => 'No published podcast', - 'last_published' => 'Last published on {lastPublicationDate}', + 'title' => 'Podcasty', + 'not_found' => 'Brak opublikowanych podcastów', + 'last_published' => 'Ostatnio opublikowane {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episodes', - 'not_found' => 'No published episode', - 'last_published' => 'Last published on {lastPublicationDate}', + 'title' => 'Odcinki', + 'not_found' => 'Brak opublikowanych odcinków', + 'last_published' => 'Ostatnio opublikowane {lastPublicationDate}', ], 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', + 'title' => 'Pamięć', + 'subtitle' => '{totalUploaded} z {totalStorage}', ], ]; diff --git a/modules/Admin/Language/pl/Episode.php b/modules/Admin/Language/pl/Episode.php index 4cb167b3..2527d37f 100644 --- a/modules/Admin/Language/pl/Episode.php +++ b/modules/Admin/Language/pl/Episode.php @@ -25,37 +25,39 @@ return [ 'edit' => 'Edytuj', 'publish' => 'Publikuj', 'publish_edit' => 'Edytuj publikację', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Edytuj datę publikacji', 'unpublish' => 'Cofnij publikację', 'publish_error' => 'Odcinek jest już opublikowany.', 'publish_edit_error' => 'Odcinek jest już opublikowany.', 'publish_cancel_error' => 'Odcinek jest już opublikowany.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'Odcinek nie został jeszcze opublikowany, nie możesz edytować daty jego publikacji.', + 'publish_date_edit_future_error' => 'Data publikacji odcinka może być ustawiona tylko na przeszłą datę! Jeśli chcesz ją ponownie zaplanować, należy najpierw ją odpublikować.', + 'publish_date_edit_success' => 'Data publikacji odcinka została pomyślnie zaktualizowana!', 'unpublish_error' => 'Odcinek nie jest opublikowany.', 'delete' => 'Usuń', 'go_to_page' => 'Przejdź do strony', 'create' => 'Dodaj odcinek', 'publication_status' => [ 'published' => 'Opublikowany', - 'with_podcast' => 'Published', + 'with_podcast' => 'Opublikowano', 'scheduled' => 'Zaplanowany', 'not_published' => 'Nieopublikowany', ], - 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'with_podcast_hint' => 'Opublikowany w tym samym czasie co podcast', 'list' => [ 'search' => [ - 'placeholder' => 'Search for an episode', - 'clear' => 'Clear search', - 'submit' => 'Search', + 'placeholder' => 'Szukaj odcinka', + 'clear' => 'Wyczyść wyszukiwanie', + 'submit' => 'Szukaj', ], 'number_of_episodes' => '{numberOfEpisodes, plural, - one {# episode} - other {# episodes} - }', + one {# osoba} + few {# osoby} + other {# osób} + }', 'episode' => 'Odcinek', 'visibility' => 'Widoczność', + 'downloads' => 'Downloads', 'comments' => 'Komentarze', 'actions' => 'Działania', ], @@ -63,31 +65,31 @@ return [ 'createSuccess' => 'Odcinek został pomyślnie utworzony!', 'editSuccess' => 'Odcinek został pomyślnie zaktualizowany!', 'publishSuccess' => '{publication_status, select, - published {Episode successfully published!} - scheduled {Episode publication successfully scheduled!} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not published.} + published {Odcinek został pomyślnie opublikowany!} + scheduled {Publikacja odcinka pomyślnie zaplanowana!} + with_podcast {Ten odcinek zostanie opublikowany w tym samym czasie co podcast.} + other {Ten odcinek nie jest opublikowany.} }', - 'publishCancelSuccess' => 'Episode publication successfully cancelled!', - 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', - 'scheduleDateError' => 'Schedule date must be set!', - 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', - 'deleteSuccess' => 'Episode successfully deleted!', - 'deleteError' => 'Failed to delete episode {type, select, - transcript {transcript} - chapters {chapters} - image {cover} + 'publishCancelSuccess' => 'Publikacja odcinka pomyślnie anulowana!', + 'unpublishBeforeDeleteTip' => 'Musisz cofnąć publikację odcinka przed jego usunięciem.', + 'scheduleDateError' => 'Zaplanowana data musi być ustawiona!', + 'deletePublishedEpisodeError' => 'Musisz cofnąć publikację odcinka przed jego usunięciem.', + 'deleteSuccess' => 'Odcinek pomyślnie usunięty!', + 'deleteError' => 'Nie udało się usunąć {type, select, + transcript {transkrypcji} + chapters {rozdziału} + image {okładki} + audio {audio} + other {mediów} + } odcinka.', + 'deleteFileError' => 'Nie udało się usunąć {type, select, + transcript {transkryptu} + chapters {rozdziały} + image {okładka} audio {audio} other {media} - }.', - 'deleteFileError' => 'Failed to delete {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} - } file {file_key}. You may manually remove it from your disk.', - 'sameSlugError' => 'An episode with the chosen slug already exists.', + } plik {file_key}. Możesz ręcznie usunąć go ze swojego dysku.', + 'sameSlugError' => 'Odcinek z wybranym slugiem już istnieje.', ], 'form' => [ 'file_size_error' => @@ -98,7 +100,7 @@ return [ 'cover' => 'Okładka odcinka', 'cover_hint' => 'Jeśli nie ustawisz okładki, zamiast niej zostanie użyta okładka podcastu.', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'cover_size_hint' => 'Okładka musi być kwadratowa o szerokości i wysokości co najmniej 1400 pikseli.', 'title' => 'Tytuł', 'title_hint' => 'Powinien zawierać jasną i zwięzłą nazwę odcinka. Nie podawaj tutaj numerów odcinków ani sezonów.', @@ -115,7 +117,7 @@ return [ 'bonus_hint' => 'Dodatkowa treść do programu (np. informacje zza kulis lub wywiady z obsadą) albo treści promujące inne programy', ], 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium' => 'Odcinek musi być dostępny wyłącznie dla subskrybentów premium', 'parental_advisory' => [ 'label' => 'Kontrola rodzicielska', 'hint' => 'Czy odcinek zawiera treści dla dorosłych?', @@ -132,7 +134,7 @@ return [ 'Ten tekst jest dodawany na końcu każdego opisu odcinka; jest to dobre miejsce do wpisania np. linków społecznościowych.', 'additional_files_section_title' => 'Dodatkowe pliki', 'additional_files_section_subtitle' => - 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'Pliki te mogą być używane przez inne platformy, aby zapewnić lepsze wrażenia odbiorcom. Więcej informacji znajdziesz w {podcastNamespaceLink}.', 'location_section_title' => 'Lokalizacja', 'location_section_subtitle' => 'O jakim miejscu jest ten odcinek?', 'location_name' => 'Nazwa lub adres lokalizacji', @@ -154,9 +156,9 @@ return [ 'Jeśli potrzebujesz tagów RSS, których Castopod nie obsługuje, ustaw je tutaj.', 'custom_rss' => 'Własne tagi RSS dla odcinka', 'custom_rss_hint' => 'Zostaną wstawione w tagu ❬item❭.', - 'block' => 'Episode should be hidden from public catalogues', + 'block' => 'Odcinek powinien być ukryty w publicznych katalogach', 'block_hint' => - 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'Pokazywanie lub ukrywanie odcinka: przełączanie tej funkcji zapobiega pojawieniu się odcinka w podcastach Apple\'a, Google Podcasts, a także aplikacje innych firm, które pobierają z tych katalogów. (Nie sugerowane)', 'submit_create' => 'Stwórz odcinek', 'submit_edit' => 'Zapisz odcinek', ], @@ -170,7 +172,7 @@ return [ 'publication_method' => [ 'now' => 'Teraz', 'schedule' => 'Zaplanuj', - 'with_podcast' => 'Publish alongside podcast', + 'with_podcast' => 'Opublikuj obok podcastu', ], 'scheduled_publication_date' => 'Planowana data publikacji', 'scheduled_publication_date_clear' => 'Wyczyść datę publikacji', @@ -184,21 +186,21 @@ return [ 'message_warning_submit' => 'Opublikuj mimo to', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Nowa data publikacji', + 'new_publication_date_hint' => 'Musi być ustawiona przeszła data.', + 'submit' => 'Edytuj datę publikacji', ], 'unpublish_form' => [ 'disclaimer' => - "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + "Cofnięcie publikacji odcinka spowoduje usunięcie wszystkich powiązanych z nim wpisów i usunięcie go z kanału RSS podcastu.", 'understand' => 'Rozumiem, chcę cofnąć publikację odcinka', 'submit' => 'Cofnij publikację', ], 'delete_form' => [ 'disclaimer' => - "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + "Usunięcie odcinka spowoduje usunięcie wszystkich plików multimedialnych, komentarzy, klipów wideo i powiązanych z nimi dźwięków.", 'understand' => 'Rozumiem, chcę usunąć odcinek', - 'submit' => 'Delete', + 'submit' => 'Usuń', ], 'embed' => [ 'title' => 'Odtwarzacz osadzalny', diff --git a/modules/Admin/Language/pl/Fediverse.php b/modules/Admin/Language/pl/Fediverse.php index e35653ae..2d79854f 100644 --- a/modules/Admin/Language/pl/Fediverse.php +++ b/modules/Admin/Language/pl/Fediverse.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'messages' => [ - 'actorNotFound' => 'The account could not be found!', + 'actorNotFound' => 'Nie udało się znaleźć użytkownika!', 'blockActorSuccess' => '{actor} został zablokowany!', 'unblockActorSuccess' => 'Actor został odblokowany!', 'blockDomainSuccess' => '{domain} została zablokowana!', diff --git a/modules/Admin/Language/pl/Navigation.php b/modules/Admin/Language/pl/Navigation.php index 3b2b74ca..f28a2615 100644 --- a/modules/Admin/Language/pl/Navigation.php +++ b/modules/Admin/Language/pl/Navigation.php @@ -33,7 +33,7 @@ return [ 'settings' => 'Ustawienia', 'settings-general' => 'Ogólne', 'settings-theme' => 'Motyw', - 'about' => 'About', + 'about' => 'Informacje', 'account' => [ 'my-account' => 'Moje konto', 'change-password' => 'Zmień hasło', diff --git a/modules/Admin/Language/pl/Person.php b/modules/Admin/Language/pl/Person.php index baf67094..b1143eb7 100644 --- a/modules/Admin/Language/pl/Person.php +++ b/modules/Admin/Language/pl/Person.php @@ -24,7 +24,7 @@ return [ 'form' => [ 'avatar' => 'Awatar', 'avatar_size_hint' => - 'Avatar must be squared and at least 400px wide and tall.', + 'Awatar musi być kwadratowy o szerokości i wysokości co najmniej 400 pikseli.', 'full_name' => 'Pełne imię i nazwisko', 'full_name_hint' => 'To jest pełne imię i nazwisko lub pseudonim osoby.', 'unique_name' => 'Unikalna nazwa', diff --git a/modules/Admin/Language/pl/Podcast.php b/modules/Admin/Language/pl/Podcast.php index 730e30b1..62f674c5 100644 --- a/modules/Admin/Language/pl/Podcast.php +++ b/modules/Admin/Language/pl/Podcast.php @@ -16,38 +16,38 @@ return [ 'new_episode' => 'Nowy Odcinek', 'view' => 'Wyświetl podcast', 'edit' => 'Edytuj podcast', - 'publish' => 'Publish podcast', - 'publish_edit' => 'Edit publication', + 'publish' => 'Opublikuj podcast', + 'publish_edit' => 'Edytuj publikację', 'delete' => 'Usuń podcast', 'see_episodes' => 'Zobacz odcinki', 'see_contributors' => 'Zobacz kontrybutorów', 'go_to_page' => 'Idź do strony', 'latest_episodes' => 'Najnowsze odcinki', 'see_all_episodes' => 'Zobacz wszystkie odcinki', - 'draft' => 'Draft', + 'draft' => 'Wersja robocza', 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', + 'createSuccess' => 'Podcast został pomyślnie utworzony!', 'editSuccess' => 'Podcast został pomyślnie zaktualizowany!', 'importSuccess' => 'Podcast został pomyślnie zaimportowany!', - 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', - 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, - cover {cover} - banner {banner} - other {media} - }.', - 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, - transcript {transcript} - chapters {chapters} - image {cover} + 'deleteSuccess' => 'Podcast @{podcast_handle} został pomyślnie usunięty!', + 'deletePodcastMediaError' => 'Nie udało się usunąć {type, select, + cover {okładki} + banner {baneru} + other {mediów} + } podcastu.', + 'deleteEpisodeMediaError' => 'Nie udało się usunąć {episode_slug} {type, select, + transcript {transkrypcji} + chapters {rozdziału} + image {okładki} audio {audio} - other {media} - }.', - 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + other {mediów} + } odcinka.', + 'deletePodcastMediaFolderError' => 'Nie udało się usunąć folderu podcast {folder_path}. Możesz go ręcznie usunąć ze swojego dysku.', 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, one {# episode was} other {# episodes were} } added to the podcast!', - 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'podcastFeedUpToDate' => 'Podcast jest już aktualny.', 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', 'publishError' => 'This podcast is either already published or scheduled for publication.', 'publishEditError' => 'This podcast is not scheduled for publication.', diff --git a/modules/Admin/Language/pl/PodcastImport.php b/modules/Admin/Language/pl/PodcastImport.php index a68c6d0a..eeceb4fd 100644 --- a/modules/Admin/Language/pl/PodcastImport.php +++ b/modules/Admin/Language/pl/PodcastImport.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'warning' => - 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', + 'Ta procedura może zająć dużo czasu. Ponieważ bieżąca wersja nie pokazuje żadnego postępu podczas działania, nie zobaczysz żadnych aktualizacji dopóki nie zostanie wykonana. W przypadku błędu przekroczenia limitu czasu, zwiększ wartość `max_execution_time`.', 'old_podcast_section_title' => 'Podcast do zaimportowania', 'old_podcast_section_subtitle' => 'Upewnij się, że masz prawa do tego podcastu zanim go zaimportujesz. Kopiowanie i nadawanie podcastu bez odpowiednich praw jest piractwem i podlega ściganiu.', diff --git a/modules/Admin/Language/pl/PodcastNavigation.php b/modules/Admin/Language/pl/PodcastNavigation.php index 7f3327f1..0309c726 100644 --- a/modules/Admin/Language/pl/PodcastNavigation.php +++ b/modules/Admin/Language/pl/PodcastNavigation.php @@ -26,8 +26,8 @@ return [ 'podcast-analytics-listening-time' => 'Czas odsłuchu', 'podcast-analytics-time-periods' => 'Okresy czasu', 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-list' => 'Wszystkie subskrypcje', + 'subscription-add' => 'Dodaj subskrypcję', 'contributors' => 'Kontrybutorzy', 'contributor-list' => 'Wszyscy kontrybutorzy', 'contributor-add' => 'Dodaj kontrybutora', diff --git a/modules/Admin/Language/pl/Settings.php b/modules/Admin/Language/pl/Settings.php index 09bcfde0..4bb258f3 100644 --- a/modules/Admin/Language/pl/Settings.php +++ b/modules/Admin/Language/pl/Settings.php @@ -15,7 +15,7 @@ return [ 'site_icon' => 'Ikona witryny', 'site_icon_delete' => 'Usuń ikonę witryny', 'site_icon_hint' => 'Ikony witryny są widoczne na kartach przeglądarki, paskach zakładek oraz po dodaniu witryny jako skrótu na urządzeniach mobilnych.', - 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_icon_helper' => 'Ikona musi być kwadratowa o szerokości i wysokości co najmniej 512 pikseli.', 'site_name' => 'Nazwa strony', 'site_description' => 'Opis strony', 'submit' => 'Zapisz', @@ -35,8 +35,8 @@ return [ 'reset_counts_helper' => 'Ta opcja zresetuje i ponownie obliczy wszystkie liczniki danych (liczbę obserwujących, wpisów, komentarzy, …).', 'rewrite_media' => 'Przepisz metadane multimediów', 'rewrite_media_helper' => 'Ta opcja usunie wszystkie zbędne pliki multimedialne i odtworzy je (obrazy, pliki audio, transkrypcje, rozdziały, …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'rename_episodes_files' => 'Zmień nazwę plików audio odcinka', + 'rename_episodes_files_hint' => 'Ta opcja zmieni nazwę wszystkich odcinków plików audio na losowy ciąg znaków. Użyj tego, jeśli jeden z Twoich prywatnych odcinków został ujawniony, ponieważ to skutecznie go ukryje.', 'clear_cache' => 'Wyczyść całą pamięć podręczną', 'clear_cache_helper' => 'Ta opcja opróżni pamięć podręczną (cache) redis lub zapisywalne/buforowane pliki.', 'run' => 'Przeprowadź porządkowanie', diff --git a/modules/Admin/Language/pl/VideoClip.php b/modules/Admin/Language/pl/VideoClip.php index 6ff09752..c4616ace 100644 --- a/modules/Admin/Language/pl/VideoClip.php +++ b/modules/Admin/Language/pl/VideoClip.php @@ -65,7 +65,7 @@ return [ 'title' => 'Brakujące wymagania', 'missing' => 'Brakuje wymagań. Upewnij się, że dodałeś wszystkie wymagane elementy, aby móc tworzyć wideo do tego odcinka!', 'ffmpeg' => 'FFmpeg', - 'gd' => 'Graphics Draw (GD)', + 'gd' => 'Rysunek graficzny (GD)', 'freetype' => 'Freetype library dla GD', 'transcript' => 'Plik z transkrypcją (.srt)', ], diff --git a/modules/Admin/Language/pt-BR/Charts.php b/modules/Admin/Language/pt-BR/Charts.php index ff2e91d1..b0196488 100644 --- a/modules/Admin/Language/pt-BR/Charts.php +++ b/modules/Admin/Language/pt-BR/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Largura de banda usada diária (em MB)', 'total_storage_by_month' => 'Armazenamento mensal (em MB)', 'total_bandwidth_by_month' => 'Largura de banda usada mensalmente (em MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-BR/Episode.php index fbd6d601..9d468743 100644 --- a/modules/Admin/Language/pt-BR/Episode.php +++ b/modules/Admin/Language/pt-BR/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episódio', 'visibility' => 'Visibilidade', + 'downloads' => 'Downloads', 'comments' => 'Comentários', 'actions' => 'Ações', ], diff --git a/modules/Admin/Language/pt-BR/PodcastNavigation.php b/modules/Admin/Language/pt-BR/PodcastNavigation.php index 91e41655..29e4b786 100644 --- a/modules/Admin/Language/pt-BR/PodcastNavigation.php +++ b/modules/Admin/Language/pt-BR/PodcastNavigation.php @@ -26,8 +26,8 @@ return [ 'podcast-analytics-listening-time' => 'Tempo de escuta', 'podcast-analytics-time-periods' => 'Períodos de tempo', 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-list' => 'Todas as assinaturas', + 'subscription-add' => 'Adicionar assinatura', 'contributors' => 'Contribuidores', 'contributor-list' => 'Todos os contribuidores', 'contributor-add' => 'Adicionar contribuidor', diff --git a/modules/Admin/Language/pt-BR/Settings.php b/modules/Admin/Language/pt-BR/Settings.php index 84146001..f326a094 100644 --- a/modules/Admin/Language/pt-BR/Settings.php +++ b/modules/Admin/Language/pt-BR/Settings.php @@ -35,8 +35,8 @@ return [ 'reset_counts_helper' => 'Esta opção irá recalcular e redefinir todas as contagens de dados (número de seguidores, publicações, comentários, …).', 'rewrite_media' => 'Reescrever metadados de mídia', 'rewrite_media_helper' => 'Esta opção apagará todos os arquivos de mídia desnecessários e os recriará (imagens, arquivos de áudio, transcrições, capítulos, …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'rename_episodes_files' => 'Renomear os arquivos de áudio de episódios', + 'rename_episodes_files_hint' => 'Esta opção irá renomear todos os episódios de arquivos de áudio para uma sequência aleatória de caracteres. Use isto se o link de seus episódios privados foi vazado, pois isso irá escondê-los efetivamente.', 'clear_cache' => 'Limpar todo o cache', 'clear_cache_helper' => 'Esta opção irá liberar o cache do redis ou arquivos graváveis/cache.', 'run' => 'Executar manutenção', diff --git a/modules/Admin/Language/pt/Charts.php b/modules/Admin/Language/pt/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/pt/Charts.php +++ b/modules/Admin/Language/pt/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/pt/Episode.php b/modules/Admin/Language/pt/Episode.php index 713b517b..5ed5e3ac 100644 --- a/modules/Admin/Language/pt/Episode.php +++ b/modules/Admin/Language/pt/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/ro/Charts.php b/modules/Admin/Language/ro/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/ro/Charts.php +++ b/modules/Admin/Language/ro/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/ro/Episode.php b/modules/Admin/Language/ro/Episode.php index 713b517b..5ed5e3ac 100644 --- a/modules/Admin/Language/ro/Episode.php +++ b/modules/Admin/Language/ro/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/ru/Charts.php b/modules/Admin/Language/ru/Charts.php index 4b33530e..6ede2510 100644 --- a/modules/Admin/Language/ru/Charts.php +++ b/modules/Admin/Language/ru/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'total_storage_by_month' => 'Monthly storage (in MB)', 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/ru/Episode.php b/modules/Admin/Language/ru/Episode.php index 713b517b..5ed5e3ac 100644 --- a/modules/Admin/Language/ru/Episode.php +++ b/modules/Admin/Language/ru/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Episode', 'visibility' => 'Visibility', + 'downloads' => 'Downloads', 'comments' => 'Comments', 'actions' => 'Actions', ], diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php index 64473454..f837c95b 100644 --- a/modules/Admin/Language/sk/Breadcrumb.php +++ b/modules/Admin/Language/sk/Breadcrumb.php @@ -31,8 +31,8 @@ return [ 'delete' => 'vymazať', 'remove' => 'odstrániť', 'fediverse' => 'fediverse', - 'blocked-actors' => 'blocked actors', - 'blocked-domains' => 'blocked domains', + 'blocked-actors' => 'zablokovaní aktéri', + 'blocked-domains' => 'zablokované domény', 'users' => 'používatelia', 'my-account' => 'môj účet', 'change-password' => 'zmeniť heslo', diff --git a/modules/Admin/Language/sk/Charts.php b/modules/Admin/Language/sk/Charts.php index 8c29dff3..17c1187e 100644 --- a/modules/Admin/Language/sk/Charts.php +++ b/modules/Admin/Language/sk/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Denný prenos údajov (v MB)', 'total_storage_by_month' => 'Mesačné úložisko (v MB)', 'total_bandwidth_by_month' => 'Mesačný prenos údajov (v MB)', + 'total_bandwidth_by_month_limit' => 'Obmedzený na {totalBandwidth} za mesiac', ]; diff --git a/modules/Admin/Language/sk/Countries.php b/modules/Admin/Language/sk/Countries.php index 870a5a5b..305fa5d2 100644 --- a/modules/Admin/Language/sk/Countries.php +++ b/modules/Admin/Language/sk/Countries.php @@ -187,12 +187,12 @@ Laoská ľudovodemokratická Republika", 'MW' => 'Malawi', 'MX' => 'Mexiko', 'MY' => 'Malajzia', - 'MZ' => 'Mozambique', + 'MZ' => 'Mozambik', 'N/A' => 'Not Applicable (local IP…)', - 'NA' => 'Namibia', + 'NA' => 'Namíbia', 'NC' => 'Nová Kaledónia', 'NE' => 'Niger', - 'NF' => 'Norfolk Island', + 'NF' => 'Ostrov Norfolk', 'NG' => 'Nigéria', 'NI' => 'Nikaragua', 'NL' => 'Holandsko', @@ -204,58 +204,58 @@ Laoská ľudovodemokratická Republika", 'OM' => 'Omán', 'PA' => 'Panama', 'PE' => 'Peru', - 'PF' => 'French Polynesia', - 'PG' => 'Papua New Guinea', - 'PH' => 'Philippines', + 'PF' => 'Francúzska Polynézia', + 'PG' => 'Papua-Nová Guinea', + 'PH' => 'Filipíny', 'PK' => 'Pakistan', - 'PL' => 'Poland', - 'PM' => 'Saint Pierre and Miquelon', - 'PN' => 'Pitcairn', - 'PR' => 'Puerto Rico', + 'PL' => 'Poľsko', + 'PM' => 'Svätý Peter a Michal', + 'PN' => 'Pitcairnove ostrovy', + 'PR' => 'Portoriko', 'PS' => 'Palestínske okupované územia', 'PT' => 'Portugalsko', 'PW' => 'Palau', - 'PY' => 'Paraguay', - 'QA' => 'Qatar', + 'PY' => 'Paraguaj', + 'QA' => 'Katar', 'RE' => 'Réunion', - 'RO' => 'Romania', - 'RS' => 'Serbia', + 'RO' => 'Rumunsko', + 'RS' => 'Srbsko', 'RU' => 'Ruská Federácia', 'RW' => 'Rwanda', - 'SA' => 'Saudi Arabia', - 'SB' => 'Solomon Islands', - 'SC' => 'Seychelles', - 'SD' => 'Sudan', - 'SE' => 'Sweden', - 'SG' => 'Singapore', - 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SA' => 'Saudská Arábia', + 'SB' => 'Šalamúnove ostrovy', + 'SC' => 'Seychely', + 'SD' => 'Sudán', + 'SE' => 'Švédsko', + 'SG' => 'Singapur', + 'SH' => 'Svätá Helena, Ascension a Tristan da Cunha', 'SI' => 'Slovinsko', - 'SJ' => 'Svalbard and Jan Mayen', + 'SJ' => 'Špicbergy a Jan Mayen', 'SK' => 'Slovensko', 'SL' => 'Sierra Leone', - 'SM' => 'San Marino', + 'SM' => 'San Maríno', 'SN' => 'Senegal', 'SO' => 'Somálsko', - 'SR' => 'Suriname', + 'SR' => 'Surinam', 'SS' => 'Južný Sudán', - 'ST' => 'Sao Tome and Principe', + 'ST' => 'Svätý Tomáš a Principov ostrov', 'SV' => 'Salvádor', 'SX' => 'Sint Maarten (Dutch part)', - 'SY' => 'Syrian Arab Republic', + 'SY' => 'Sýrska Arabská Republika', 'SZ' => 'Svazijsko', 'TC' => 'Turks and Caicos Islands', - 'TD' => 'Chad', + 'TD' => 'Čad', 'TF' => 'Francúzske južné územia', 'TG' => 'Togo', 'TH' => 'Thajsko', 'TJ' => 'Tadžikistan', 'TK' => 'Tokelau', - 'TL' => 'Timor-Leste', + 'TL' => 'Východný Timor', 'TM' => 'Turkménsko', 'TN' => 'Tunisko', 'TO' => 'Tonga', 'TR' => 'Turecko', - 'TT' => 'Trinidad and Tobago', + 'TT' => 'Trinidad a Tobago', 'TV' => 'Tuvalu', 'TW' => 'Taiwan, provincia Číny', 'TZ' => 'Tanzánia', diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php index f44c663a..58531d51 100644 --- a/modules/Admin/Language/sk/Episode.php +++ b/modules/Admin/Language/sk/Episode.php @@ -59,6 +59,7 @@ return [ }', 'episode' => 'Epizóda', 'visibility' => 'Viditeľnosť', + 'downloads' => 'Downloads', 'comments' => 'Komentáre', 'actions' => 'Úkony', ], diff --git a/modules/Admin/Language/sk/EpisodeNavigation.php b/modules/Admin/Language/sk/EpisodeNavigation.php index 6283072b..ccf727da 100644 --- a/modules/Admin/Language/sk/EpisodeNavigation.php +++ b/modules/Admin/Language/sk/EpisodeNavigation.php @@ -13,11 +13,11 @@ return [ 'dashboard' => 'Nástenka epizódy', 'episode-view' => 'Domov', 'episode-edit' => 'Upraviť časť', - 'episode-persons-manage' => 'Manage persons', + 'episode-persons-manage' => 'Spravovať osobnosti', 'embed-add' => 'Vnorený prehrávač', 'clips' => 'Klipy', 'video-clips-list' => 'Video clips', 'video-clips-create' => 'New video clip', 'soundbites-list' => 'Soundbites', - 'soundbites-create' => 'New soundbite', + 'soundbites-create' => 'Nová zvučka', ]; diff --git a/modules/Admin/Language/sk/Fediverse.php b/modules/Admin/Language/sk/Fediverse.php index 1a5e0a27..01b85327 100644 --- a/modules/Admin/Language/sk/Fediverse.php +++ b/modules/Admin/Language/sk/Fediverse.php @@ -11,22 +11,22 @@ declare(strict_types=1); return [ 'messages' => [ 'actorNotFound' => 'Účet nieje možné nájsť!', - 'blockActorSuccess' => '{actor} has been blocked!', - 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockActorSuccess' => '{actor} bol/i zablokovaný!', + 'unblockActorSuccess' => 'Aktér bol odblokovaný!', 'blockDomainSuccess' => '{domain} has been blocked!', 'unblockDomainSuccess' => '{domain} has been unblocked!', ], - 'blocked_actors' => 'Zablokované účty', + 'blocked_actors' => 'Blokované účty', 'blocked_domains' => 'Zablokované domény', 'block_lists_form' => [ 'handle' => 'Account handle', 'handle_hint' => 'Input @username@domain account.', - 'domain' => 'Domain name', - 'submit' => 'Block!', + 'domain' => 'Názov domény', + 'submit' => 'Blokovať!', ], 'list' => [ 'actor' => 'Účet', - 'domain' => 'Domain name', - 'unblock' => 'Unblock', + 'domain' => 'Názov domény', + 'unblock' => 'Odblokovať', ], ]; diff --git a/modules/Admin/Language/sk/Install.php b/modules/Admin/Language/sk/Install.php index 6282e10b..b3bb16b6 100644 --- a/modules/Admin/Language/sk/Install.php +++ b/modules/Admin/Language/sk/Install.php @@ -13,8 +13,8 @@ return [ 'manual_config_subtitle' => 'Create a `.env` file with your settings and refresh the page to continue installation.', 'form' => [ - 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', + 'instance_config' => 'Nastavenie inštancie', + 'hostname' => 'Názov hostiteľa', 'media_base_url' => 'Media base URL', 'media_base_url_hint' => 'If you use a CDN and/or an external analytics service, you may set them here.', @@ -24,17 +24,17 @@ return [ 'auth_gateway' => 'Auth gateway', 'auth_gateway_hint' => 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', + 'database_config' => 'Nastavenie databázy', 'database_config_hint' => 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', + 'db_name' => 'Názov databázy', + 'db_username' => 'Prihlasovacie meno do databázy', + 'db_password' => 'Heslo databázy', + 'db_prefix' => 'Prefix databázy', 'db_prefix_hint' => "The prefix of the Castopod table names, leave as is if you don't know what it means.", - 'cache_config' => 'Cache configuration', + 'cache_config' => 'Nastavenie cache', 'cache_config_hint' => 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', 'cache_handler' => 'Obslužný mechanizmus vyrovnávacej pamäte', diff --git a/modules/Admin/Language/sk/Navigation.php b/modules/Admin/Language/sk/Navigation.php index 45badfd7..b9ef4b18 100644 --- a/modules/Admin/Language/sk/Navigation.php +++ b/modules/Admin/Language/sk/Navigation.php @@ -33,7 +33,7 @@ return [ 'settings' => 'Nastavenia', 'settings-general' => 'Všeobecné', 'settings-theme' => 'Vzhľad', - 'about' => 'About', + 'about' => 'O', 'account' => [ 'my-account' => 'Môj účet', 'change-password' => 'Zmeniť heslo', diff --git a/modules/Admin/Language/sk/Page.php b/modules/Admin/Language/sk/Page.php index 72892ebf..8122ca81 100644 --- a/modules/Admin/Language/sk/Page.php +++ b/modules/Admin/Language/sk/Page.php @@ -15,13 +15,13 @@ return [ 'create' => 'Nová stránka', 'go_to_page' => 'Prejsť na stránku', 'edit' => 'Upraviť stránku', - 'delete' => 'Delete page', + 'delete' => 'Vymazať stránku', 'form' => [ - 'title' => 'Title', - 'permalink' => 'Permalink', - 'content' => 'Content', - 'submit_create' => 'Create page', - 'submit_edit' => 'Save', + 'title' => 'Názov', + 'permalink' => 'Trvalý odkaz', + 'content' => 'Obsah', + 'submit_create' => 'Vytvoriť stránku', + 'submit_edit' => 'Uložiť', ], 'messages' => [ 'createSuccess' => 'The page “{pageTitle}” was created successfully!', diff --git a/modules/Admin/Language/sk/Pager.php b/modules/Admin/Language/sk/Pager.php index e25ee638..41adf3d7 100644 --- a/modules/Admin/Language/sk/Pager.php +++ b/modules/Admin/Language/sk/Pager.php @@ -10,12 +10,12 @@ declare(strict_types=1); return [ 'pageNavigation' => 'Page navigation', - 'first' => 'First', - 'previous' => 'Previous', - 'next' => 'Next', - 'last' => 'Last', - 'older' => 'Older', - 'newer' => 'Newer', + 'first' => 'Prvá', + 'previous' => 'Predošlá', + 'next' => 'Ďalšia', + 'last' => 'Posledná', + 'older' => 'Staršia', + 'newer' => 'Novšia', 'invalidTemplate' => '{0} is not a valid Pager template.', 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', ]; diff --git a/modules/Admin/Language/sk/Person.php b/modules/Admin/Language/sk/Person.php index 5ce1e02f..38e1f073 100644 --- a/modules/Admin/Language/sk/Person.php +++ b/modules/Admin/Language/sk/Person.php @@ -9,48 +9,48 @@ declare(strict_types=1); */ return [ - 'persons' => 'Persons', - 'all_persons' => 'All persons', - 'no_person' => 'Nobody found!', - 'create' => 'Create a person', - 'view' => 'View person', - 'edit' => 'Edit person', - 'delete' => 'Delete person', + 'persons' => 'Osobnosti', + 'all_persons' => 'Všetky osobnosti', + 'no_person' => 'Nikto nenájdený!', + 'create' => 'Vytvoriť osobnosť', + 'view' => 'Ukázať osobnosť', + 'edit' => 'Upraviť osobnosť', + 'delete' => 'Vymazať osobnosť', 'messages' => [ 'createSuccess' => 'Person has been successfully created!', 'editSuccess' => 'Person has been successfully updated!', - 'deleteSuccess' => 'Person has been removed!', + 'deleteSuccess' => 'Osobnosť bol/a odstránená!', ], 'form' => [ 'avatar' => 'Avatar', 'avatar_size_hint' => 'Avatar must be squared and at least 400px wide and tall.', - 'full_name' => 'Full name', + 'full_name' => 'Celé meno', 'full_name_hint' => 'This is the full name or alias of the person.', - 'unique_name' => 'Unique name', - 'unique_name_hint' => 'Used for URLs', + 'unique_name' => 'Unikátne meno', + 'unique_name_hint' => 'Použité pre URL odkazy', 'information_url' => 'Information URL', 'information_url_hint' => 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', - 'submit_create' => 'Create person', - 'submit_edit' => 'Save person', + 'submit_create' => 'Vytvoriť osobnosť', + 'submit_edit' => 'Uložiť osobnosť', ], 'podcast_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this podcast', + 'title' => 'Spravovať osobnosti', + 'add_section_title' => 'Pridať osobnosti k tomuto podcastu', 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'persons' => 'Osobnosti', 'persons_hint' => 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'roles' => 'Úlohy', 'roles_hint' => 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'submit_add' => 'Pridať osob(y)', + 'remove' => 'Odstrániť', ], 'episode_form' => [ 'title' => 'Spravovať osobnosti', - 'add_section_title' => 'Add persons to this episode', + 'add_section_title' => 'Pridať osobnosti k tejto epizóde', 'add_section_subtitle' => 'You may pick several persons and roles.', 'persons' => 'Osobnosti', 'persons_hint' => diff --git a/modules/Admin/Language/sk/Platforms.php b/modules/Admin/Language/sk/Platforms.php index 678bdcbf..bd52fd09 100644 --- a/modules/Admin/Language/sk/Platforms.php +++ b/modules/Admin/Language/sk/Platforms.php @@ -15,7 +15,7 @@ return [ 'visible' => 'Zobraziť na úvodnej stránke podcastu?', 'on_embed' => 'Zobraziť na vnorenom prehrávači?', 'remove' => 'Remove {platformName}', - 'submit' => 'Save', + 'submit' => 'Uložiť', 'messages' => [ 'updateSuccess' => 'Platform links have been successfully updated!', 'removeLinkSuccess' => 'The platform link has been removed.', diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php index 082d77d0..f1c27de2 100644 --- a/modules/Admin/Language/sk/Podcast.php +++ b/modules/Admin/Language/sk/Podcast.php @@ -9,24 +9,24 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found!', - 'create' => 'Create podcast', - 'import' => 'Import podcast', + 'all_podcasts' => 'Všetky podcasty', + 'no_podcast' => 'Žiadny podcast nenájdený!', + 'create' => 'Vytvoriť podcast', + 'import' => 'Importovať podcast', 'new_episode' => 'Nová časť', - 'view' => 'View podcast', - 'edit' => 'Edit podcast', - 'publish' => 'Publish podcast', - 'publish_edit' => 'Edit publication', - 'delete' => 'Delete podcast', - 'see_episodes' => 'See episodes', - 'see_contributors' => 'See contributors', - 'go_to_page' => 'Go to page', + 'view' => 'Zobraziť podcast', + 'edit' => 'Upraviť podcast', + 'publish' => 'Zverejniť podcast', + 'publish_edit' => 'Upraviť zverejnené', + 'delete' => 'Vymazať podcast', + 'see_episodes' => 'Ukázať časti', + 'see_contributors' => 'Pozrieť prispievateľov', + 'go_to_page' => 'Prejsť na stránku', 'latest_episodes' => 'Posledné časti', 'see_all_episodes' => 'Pozrieť všetky časti', - 'draft' => 'Draft', + 'draft' => 'Koncept', 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', + 'createSuccess' => 'Podcast úspešne vytvorený!', 'editSuccess' => 'Podcast has been successfully updated!', 'importSuccess' => 'Podcast has been successfully imported!', 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', @@ -62,25 +62,25 @@ return [ 'banner' => 'Podcast banner', 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', 'banner_delete' => 'Delete podcast banner', - 'title' => 'Title', + 'title' => 'Názov', 'handle' => 'Handle', 'handle_hint' => 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', 'type' => [ - 'label' => 'Type', - 'episodic' => 'Episodic', + 'label' => 'Typ', + 'episodic' => 'Epizodický', 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', 'serial' => 'Serial', 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', ], - 'description' => 'Description', - 'classification_section_title' => 'Classification', + 'description' => 'Popis', + 'classification_section_title' => 'Zaradenie', 'classification_section_subtitle' => 'These fields will impact your audience and competition.', - 'language' => 'Language', - 'category' => 'Category', - 'category_placeholder' => 'Select a category…', - 'other_categories' => 'Other categories', + 'language' => 'Jazyk', + 'category' => 'Kategória', + 'category_placeholder' => 'Vybrať kategóriu…', + 'other_categories' => 'Ostatné kategórie', 'parental_advisory' => [ 'label' => 'Parental advisory', 'hint' => 'Does it contain explicit content?', @@ -96,11 +96,11 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', - 'publisher' => 'Publisher', + 'publisher' => 'Vydavateľ', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', 'copyright' => 'Copyright', - 'location_section_title' => 'Location', + 'location_section_title' => 'Umiestnenie', 'location_section_subtitle' => 'What place is this podcast about?', 'location_name' => 'Location name or address', 'location_name_hint' => 'This can be a real place or fictional', @@ -129,12 +129,12 @@ return [ 'update_feed_tip' => 'Import this podcast\'s latest episodes', 'partnership' => 'Partnership', 'partner_id' => 'ID', - 'partner_link_url' => 'Link URL', - 'partner_image_url' => 'Image URL', + 'partner_link_url' => 'URL adresa odkazu', + 'partner_image_url' => 'URL adresa obrázka', 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', + 'status_section_title' => 'Stav', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', @@ -173,15 +173,15 @@ return [ 'performing_arts' => 'Performing Arts', 'visual_arts' => 'Visual Arts', 'careers' => 'Careers', - 'entrepreneurship' => 'Entrepreneurship', - 'investing' => 'Investing', + 'entrepreneurship' => 'Podnikateľský', + 'investing' => 'Investičný', 'management' => 'Management', 'marketing' => 'Marketing', - 'non_profit' => 'Non-Profit', + 'non_profit' => 'Neziskový', 'comedy_interviews' => 'Comedy Interviews', 'improv' => 'Improv', 'stand_up' => 'Stand-Up', - 'courses' => 'Courses', + 'courses' => 'Kurzy', 'how_to' => 'How To', 'language_learning' => 'Language Learning', 'self_improvement' => 'Self-Improvement', @@ -190,14 +190,14 @@ return [ 'science_fiction' => 'Science Fiction', 'alternative_health' => 'Alternative Health', 'fitness' => 'Fitness', - 'medicine' => 'Medicine', + 'medicine' => 'Medicínsky', 'mental_health' => 'Mental Health', 'nutrition' => 'Nutrition', - 'sexuality' => 'Sexuality', + 'sexuality' => 'Sexualita', 'education_for_kids' => 'Education for Kids', 'parenting' => 'Parenting', 'pets_and_animals' => 'Pets & Animals', - 'stories_for_kids' => 'Stories for Kids', + 'stories_for_kids' => 'Príbehy pre deti', 'animation_and_manga' => 'Animation & Manga', 'automotive' => 'Automotive', 'aviation' => 'Aviation', @@ -229,14 +229,14 @@ return [ 'life_sciences' => 'Life Sciences', 'mathematics' => 'Mathematics', 'natural_sciences' => 'Natural Sciences', - 'nature' => 'Nature', - 'physics' => 'Physics', + 'nature' => 'Príroda', + 'physics' => 'Fyzika', 'social_sciences' => 'Social Sciences', - 'documentary' => 'Documentary', + 'documentary' => 'Dokumentárny', 'personal_journals' => 'Personal Journals', - 'philosophy' => 'Philosophy', + 'philosophy' => 'Filozofia', 'places_and_travel' => 'Places & Travel', - 'relationships' => 'Relationships', + 'relationships' => 'Vzťahy', 'baseball' => 'Baseball', 'basketball' => 'Basketball', 'cricket' => 'Cricket', @@ -247,19 +247,19 @@ return [ 'rugby' => 'Rugby', 'running' => 'Running', 'soccer' => 'Soccer', - 'swimming' => 'Swimming', - 'tennis' => 'Tennis', + 'swimming' => 'Plávanie', + 'tennis' => 'Tenis', 'volleyball' => 'Volleyball', - 'wilderness' => 'Wilderness', - 'wrestling' => 'Wrestling', + 'wilderness' => 'Divočina', + 'wrestling' => 'Zápasnícky', 'after_shows' => 'After Shows', - 'film_history' => 'Film History', - 'film_interviews' => 'Film Interviews', - 'film_reviews' => 'Film Reviews', - 'tv_reviews' => 'TV Reviews', + 'film_history' => 'Filmová história', + 'film_interviews' => 'Filmové rozhovory', + 'film_reviews' => 'Filmové recenzie', + 'tv_reviews' => 'TV recenzie', ], 'publish_form' => [ - 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'back_to_podcast_dashboard' => 'Späť na podcastovú nástenku', 'post' => 'Your announcement post', 'post_hint' => "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", diff --git a/modules/Admin/Language/sr_Latn/Breadcrumb.php b/modules/Admin/Language/sr_Latn/Breadcrumb.php index 558b90f7..f9e57ca1 100644 --- a/modules/Admin/Language/sr_Latn/Breadcrumb.php +++ b/modules/Admin/Language/sr_Latn/Breadcrumb.php @@ -9,47 +9,47 @@ declare(strict_types=1); */ return [ - 'label' => 'breadcrumb', + 'label' => 'breadcrumb polja', config('Admin') - ->gateway => 'Home', - 'podcasts' => 'podcasts', - 'episodes' => 'episodes', - 'subscriptions' => 'subscriptions', - 'contributors' => 'contributors', - 'pages' => 'pages', - 'settings' => 'settings', - 'theme' => 'theme', - 'about' => 'about', - 'add' => 'add', - 'new' => 'new', - 'edit' => 'edit', - 'persons' => 'persons', - 'publish' => 'publish', - 'publish-edit' => 'edit publication', - 'publish-date-edit' => 'edit publication date', - 'unpublish' => 'unpublish', - 'delete' => 'delete', - 'remove' => 'remove', + ->gateway => 'Početna', + 'podcasts' => 'podkasti', + 'episodes' => 'epizode', + 'subscriptions' => 'pretplate', + 'contributors' => 'saradnici', + 'pages' => 'stranice', + 'settings' => 'podešavanja', + 'theme' => 'tema', + 'about' => 'osnovni podaci', + 'add' => 'dodaj', + 'new' => 'nov', + 'edit' => 'izmeni', + 'persons' => 'osobe', + 'publish' => 'objavi', + 'publish-edit' => 'uredi objavu', + 'publish-date-edit' => 'uredi datum objave', + 'unpublish' => 'ukolni objavu', + 'delete' => 'obriši', + 'remove' => 'ukloni', 'fediverse' => 'fediverse', - 'blocked-actors' => 'blocked actors', - 'blocked-domains' => 'blocked domains', - 'users' => 'users', - 'my-account' => 'my account', - 'change-password' => 'change password', - 'import' => 'feed import', - 'platforms' => 'platforms', - 'social' => 'social networks', - 'funding' => 'funding', - 'analytics' => 'analytics', - 'locations' => 'locations', - 'webpages' => 'web pages', - 'unique-listeners' => 'unique listeners', - 'players' => 'players', - 'listening-time' => 'listening time', - 'time-periods' => 'time periods', - 'soundbites' => 'soundbites', - 'video-clips' => 'video clips', - 'embed' => 'embeddable player', - 'notifications' => 'notifications', - 'suspend' => 'suspend', + 'blocked-actors' => 'blokirani nalozi', + 'blocked-domains' => 'blokirani domeni', + 'users' => 'korisnici', + 'my-account' => 'moj nalog', + 'change-password' => 'promenite lozinku', + 'import' => 'importuj feed', + 'platforms' => 'platforme', + 'social' => 'društvene mreže', + 'funding' => 'finansiranje', + 'analytics' => 'analitika', + 'locations' => 'lokacije', + 'webpages' => 'veb strane', + 'unique-listeners' => 'jedinstveni slušaoci', + 'players' => 'plejeri', + 'listening-time' => 'ukupno vreme slušanja', + 'time-periods' => 'vremenski periodi', + 'soundbites' => 'zvučni isečci', + 'video-clips' => 'video isečci', + 'embed' => 'embedovan plejer', + 'notifications' => 'obaveštenja', + 'suspend' => 'obustavi', ]; diff --git a/modules/Admin/Language/sr_Latn/Charts.php b/modules/Admin/Language/sr_Latn/Charts.php index 4b33530e..cb90b13b 100644 --- a/modules/Admin/Language/sr_Latn/Charts.php +++ b/modules/Admin/Language/sr_Latn/Charts.php @@ -9,32 +9,33 @@ declare(strict_types=1); */ return [ - 'by_service_weekly' => 'Episode downloads by service (for the past week)', - 'by_player_weekly' => 'Episode downloads by player (for the past week)', - 'by_player_yearly' => 'Episode downloads by player (for the past year)', - 'by_device_weekly' => 'Episode downloads by device (for the past week)', - 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', - 'podcast_by_region' => 'Episode downloads by region (for the past week)', - 'unique_daily_listeners' => 'Daily unique listeners', - 'unique_monthly_listeners' => 'Monthly unique listeners', - 'by_browser' => 'Web pages usage by browser (for the past week)', - 'podcast_by_day' => 'Episode daily downloads', - 'podcast_by_month' => 'Episode monthly downloads', - 'episode_by_day' => 'Episode daily downloads (first 60 days)', - 'episode_by_month' => 'Episode monthly downloads', + 'by_service_weekly' => 'Preuzimanja epizode po servisu (za prošlu nedelju)', + 'by_player_weekly' => 'Preuzimanja epizode po plejeru (za prošlu nedelju)', + 'by_player_yearly' => 'Preuzimanja epizode po plejeru (za prošlu godinu)', + 'by_device_weekly' => 'Preuzimanja epizode po uređaju (za prošlu nedelju)', + 'by_os_weekly' => 'Preuzimanja epizode po operativnom sistemu (za prošlu nedelju)', + 'podcast_by_region' => 'Preuzimanja epizode po regionu (za prošlu nedelju)', + 'unique_daily_listeners' => 'Svakodnevni jedinstveni slušaoci', + 'unique_monthly_listeners' => 'Mesečni jedinstveni slušaoci', + 'by_browser' => 'Korišćenje veb stranica od strane pretraživača (za prošlu nedelju)', + 'podcast_by_day' => 'Dnevno preuzimanje epizoda', + 'podcast_by_month' => 'Mesečno preuzimanje epizoda', + 'episode_by_day' => 'Dnevno preuzimanje epizoda (prvih 60 dana)', + 'episode_by_month' => 'Mesečno preuzimanje epizoda', 'episodes_by_day' => - '5 latest episodes downloads (during their first 60 days)', - 'by_country_weekly' => 'Episode downloads by country (for the past week)', - 'by_country_yearly' => 'Episode downloads by country (for the past year)', - 'by_domain_weekly' => 'Web pages visits by source (for the past week)', - 'by_domain_yearly' => 'Web pages visits by source (for the past year)', - 'by_entry_page' => 'Web pages visits by landing page (for the past week)', - 'podcast_bots' => 'Bots (crawlers)', - 'daily_listening_time' => 'Daily cumulative listening time', - 'monthly_listening_time' => 'Monthly cumulative listening time', - 'by_weekday' => 'By week day (for the past 60 days)', - 'by_hour' => 'By time of day (for the past 60 days)', - 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', - 'total_storage_by_month' => 'Monthly storage (in MB)', - 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'Preuzimanja poslednjih 5 epizoda (u prvih 60 dana)', + 'by_country_weekly' => 'Preuzimanja epizode po državi (za prošlu nedelju)', + 'by_country_yearly' => 'Preuzimanja epizode po državi (za prošlu godinu)', + 'by_domain_weekly' => 'Posete veb stranicama prema izvoru (za prošlu nedelju)', + 'by_domain_yearly' => 'Posete veb stranicama prema izvoru (za prošlu godinu)', + 'by_entry_page' => 'Posete veb stranicama prema odredišnoj stranici (za prošlu nedelju)', + 'podcast_bots' => 'Botovi (pokretači)', + 'daily_listening_time' => 'Dnevno kumulativno vreme slušanja', + 'monthly_listening_time' => 'Mesečno kumulativno vreme slušanja', + 'by_weekday' => 'Po danu u nedelji (za poslednjih 60 dana)', + 'by_hour' => 'Po dobu dana (za poslednjih 60 dana)', + 'podcast_by_bandwidth' => 'Dnevno korišćen protok (u MB)', + 'total_storage_by_month' => 'Mesečni skladišni prostor (u MB)', + 'total_bandwidth_by_month' => 'Mesečno korišćen protok (u MB)', + 'total_bandwidth_by_month_limit' => 'Ograničeno na {totalBandwidth} mesečno', ]; diff --git a/modules/Admin/Language/sr_Latn/Common.php b/modules/Admin/Language/sr_Latn/Common.php index 596c8bcd..0b2b3cdb 100644 --- a/modules/Admin/Language/sr_Latn/Common.php +++ b/modules/Admin/Language/sr_Latn/Common.php @@ -9,43 +9,43 @@ declare(strict_types=1); */ return [ - 'yes' => 'Yes', - 'no' => 'No', - 'cancel' => 'Cancel', - 'optional' => 'Optional', - 'more' => 'More', - 'no_data' => 'No data found!', - 'close' => 'Close', - 'edit' => 'Edit', - 'copy' => 'Copy', - 'copied' => 'Copied!', - 'home' => 'Home', - 'explicit' => 'Explicit', - 'powered_by' => 'Powered by {castopod}', - 'actions' => 'Actions', - 'pageInfo' => 'Page {currentPage} out of {pageCount}', - 'go_back' => 'Go back', + 'yes' => 'Da', + 'no' => 'Ne', + 'cancel' => 'Otkaži', + 'optional' => 'Opciono', + 'more' => 'Više', + 'no_data' => 'Nema pronađenih podataka!', + 'close' => 'Zatvori', + 'edit' => 'Izmeni', + 'copy' => 'Kopiraj', + 'copied' => 'Kopirano!', + 'home' => 'Početna stranica', + 'explicit' => 'Eksplicitno', + 'powered_by' => 'Pokreće {castopod}', + 'actions' => 'Akcije', + 'pageInfo' => 'Stranica {currentPage} od {pageCount}', + 'go_back' => 'Nazad', 'forms' => [ 'editor' => [ - 'write' => 'Write', - 'preview' => 'Preview', - 'help' => 'Powered by markdown', + 'write' => 'Piši', + 'preview' => 'Pregled', + 'help' => 'Pokreće markdown', ], 'multiSelect' => [ - 'selectText' => 'Press to select', - 'loadingText' => 'Loading…', - 'noResultsText' => 'No results found', - 'noChoicesText' => 'No choices to choose from', - 'maxItemText' => 'Cannot add more items', + 'selectText' => 'Pritisni da odabereš', + 'loadingText' => 'Učitavanje…', + 'noResultsText' => 'Nije pronađen nijedan rezultat', + 'noChoicesText' => 'Nema opcija koje je moguće odabrati', + 'maxItemText' => 'Nije moguće dodati više stavki', ], - 'upload_file' => 'Upload a file', - 'remote_url' => 'Remote URL', + 'upload_file' => 'Otpremite datoteku', + 'remote_url' => 'Daljinski URL', ], 'play_episode_button' => [ - 'play' => 'Play', - 'playing' => 'Playing', + 'play' => 'Pusti', + 'playing' => 'Reprodukujem', ], - 'size_limit' => 'Size limit: {0}.', - 'choose_interact' => 'Choose how to interact', - 'view' => 'View', + 'size_limit' => 'Limit veličine: {0}.', + 'choose_interact' => 'Odaberite način interakcije', + 'view' => 'Pogledaj', ]; diff --git a/modules/Admin/Language/sr_Latn/Countries.php b/modules/Admin/Language/sr_Latn/Countries.php index 4cd5d9c8..eb139a8c 100644 --- a/modules/Admin/Language/sr_Latn/Countries.php +++ b/modules/Admin/Language/sr_Latn/Countries.php @@ -11,210 +11,210 @@ declare(strict_types=1); */ return [ - 'AD' => 'Andorra', - 'AE' => 'United Arab Emirates', - 'AF' => 'Afghanistan', - 'AG' => 'Antigua and Barbuda', - 'AI' => 'Anguilla', - 'AL' => 'Albania', - 'AM' => 'Armenia', + 'AD' => 'Andora', + 'AE' => 'Ujedinjeni Arapski Emirati', + 'AF' => 'Afganistan', + 'AG' => 'Antiga i Barbuda', + 'AI' => 'Angvila', + 'AL' => 'Albanija', + 'AM' => 'Jermenija', 'AO' => 'Angola', - 'AQ' => 'Antarctica', + 'AQ' => 'Antarktik', 'AR' => 'Argentina', - 'AS' => 'American Samoa', - 'AT' => 'Austria', - 'AU' => 'Australia', + 'AS' => 'Američka Samoa', + 'AT' => 'Austrija', + 'AU' => 'Australija', 'AW' => 'Aruba', - 'AX' => 'Åland Islands', - 'AZ' => 'Azerbaijan', - 'BA' => 'Bosnia and Herzegovina', + 'AX' => 'Olandska Ostrva', + 'AZ' => 'Azerbejdžan', + 'BA' => 'Bosna i Hercegovina', 'BB' => 'Barbados', - 'BD' => 'Bangladesh', - 'BE' => 'Belgium', + 'BD' => 'Bangladeš', + 'BE' => 'Bеlgija', 'BF' => 'Burkina Faso', - 'BG' => 'Bulgaria', - 'BH' => 'Bahrain', + 'BG' => 'Bugarska', + 'BH' => 'Bahrеin', 'BI' => 'Burundi', 'BJ' => 'Benin', - 'BL' => 'Saint Barthélemy', + 'BL' => 'Sveti Bartolomej', 'BM' => 'Bermuda', - 'BN' => 'Brunei Darussalam', - 'BO' => 'Bolivia, Plurinational State of', - 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BN' => 'Bruneji Darusalam', + 'BO' => 'Bolivija, Višenacionalna Država', + 'BQ' => 'Bonеr, Svеti Eustahijе i Saba', 'BR' => 'Brazil', - 'BS' => 'Bahamas', - 'BT' => 'Bhutan', - 'BV' => 'Bouvet Island', - 'BW' => 'Botswana', - 'BY' => 'Belarus', + 'BS' => 'Bahami', + 'BT' => 'Butan', + 'BV' => 'Ostrvo Buve', + 'BW' => 'Bocvana', + 'BY' => 'Bеlorusija', 'BZ' => 'Belize', - 'CA' => 'Canada', - 'CC' => 'Cocos (Keeling) Islands', - 'CD' => 'Congo, the Democratic Republic of the', - 'CF' => 'Central African Republic', - 'CG' => 'Congo', - 'CH' => 'Switzerland', - 'CI' => "Côte d'Ivoire", - 'CK' => 'Cook Islands', - 'CL' => 'Chile', - 'CM' => 'Cameroon', - 'CN' => 'China', - 'CO' => 'Colombia', - 'CR' => 'Costa Rica', - 'CU' => 'Cuba', - 'CV' => 'Cape Verde', - 'CW' => 'Curaçao', - 'CX' => 'Christmas Island', - 'CY' => 'Cyprus', - 'CZ' => 'Czech Republic', - 'DE' => 'Germany', - 'DJ' => 'Djibouti', - 'DK' => 'Denmark', - 'DM' => 'Dominica', - 'DO' => 'Dominican Republic', - 'DZ' => 'Algeria', - 'EC' => 'Ecuador', - 'EE' => 'Estonia', - 'EG' => 'Egypt', - 'EH' => 'Western Sahara', - 'ER' => 'Eritrea', - 'ES' => 'Spain', - 'ET' => 'Ethiopia', - 'FI' => 'Finland', - 'FJ' => 'Fiji', - 'FK' => 'Falkland Islands (Malvinas)', - 'FM' => 'Micronesia, Federated States of', - 'FO' => 'Faroe Islands', - 'FR' => 'France', + 'CA' => 'Kanada', + 'CC' => 'Kokosova (Kilingova) Ostrva', + 'CD' => 'Demokratska Republika Kongo', + 'CF' => 'Centralnoafrička Republika', + 'CG' => 'Kongo', + 'CH' => 'Švajcarska', + 'CI' => "Obala Slonovače", + 'CK' => 'Kukova ostrva', + 'CL' => 'Čilе', + 'CM' => 'Kamerun', + 'CN' => 'Kina', + 'CO' => 'Kolumbija', + 'CR' => 'Kostarika', + 'CU' => 'Kuba', + 'CV' => 'Zelenortska Ostrva', + 'CW' => 'Kurasao', + 'CX' => 'Uskršnja ostrva', + 'CY' => 'Kipar', + 'CZ' => 'Češka Republika', + 'DE' => 'Nemačka', + 'DJ' => 'Džibuti', + 'DK' => 'Danska', + 'DM' => 'Dominika', + 'DO' => 'Dominikanska Republika', + 'DZ' => 'Alžir', + 'EC' => 'Ekvador', + 'EE' => 'Estonija', + 'EG' => 'Egipat', + 'EH' => 'Zapadna Sahara', + 'ER' => 'Eritreja', + 'ES' => 'Španija', + 'ET' => 'Etiopija', + 'FI' => 'Finska', + 'FJ' => 'Fidži', + 'FK' => 'Foklandska ostrva (Malvini)', + 'FM' => 'Savezne države Mikronezije', + 'FO' => 'Farska Ostrva', + 'FR' => 'Francuska', 'GA' => 'Gabon', - 'GB' => 'United Kingdom', + 'GB' => 'Ujedinjeno Kraljevstvo', 'GD' => 'Grenada', - 'GE' => 'Georgia', - 'GF' => 'French Guiana', - 'GG' => 'Guernsey', - 'GH' => 'Ghana', + 'GE' => 'Gruzija', + 'GF' => 'Francuska Gvajana', + 'GG' => 'Gernzi', + 'GH' => 'Gana', 'GI' => 'Gibraltar', - 'GL' => 'Greenland', - 'GM' => 'Gambia', - 'GN' => 'Guinea', - 'GP' => 'Guadeloupe', - 'GQ' => 'Equatorial Guinea', - 'GR' => 'Greece', - 'GS' => 'South Georgia and the South Sandwich Islands', - 'GT' => 'Guatemala', + 'GL' => 'Grеnland', + 'GM' => 'Gambija', + 'GN' => 'Gvineja', + 'GP' => 'Gvadelupe', + 'GQ' => 'Ekvatorijalna Gvineja', + 'GR' => 'Grčka', + 'GS' => 'Južna Džordžija i Južna Sendvič Ostrva', + 'GT' => 'Gvatemala', 'GU' => 'Guam', - 'GW' => 'Guinea-Bissau', - 'GY' => 'Guyana', + 'GW' => 'Gvineja-Bisao', + 'GY' => 'Gvajana', 'HK' => 'Hong Kong', - 'HM' => 'Heard Island and McDonald Islands', + 'HM' => 'Ostrva Herd i Makdonald', 'HN' => 'Honduras', - 'HR' => 'Croatia', + 'HR' => 'Hrvatska', 'HT' => 'Haiti', - 'HU' => 'Hungary', - 'ID' => 'Indonesia', - 'IE' => 'Ireland', - 'IL' => 'Israel', - 'IM' => 'Isle of Man', - 'IN' => 'India', - 'IO' => 'British Indian Ocean Territory', - 'IQ' => 'Iraq', - 'IR' => 'Iran, Islamic Republic of', - 'IS' => 'Iceland', - 'IT' => 'Italy', - 'JE' => 'Jersey', - 'JM' => 'Jamaica', + 'HU' => 'Mađarska', + 'ID' => 'Indonezija', + 'IE' => 'Irska', + 'IL' => 'Izrael', + 'IM' => 'Ostrvo Man', + 'IN' => 'Indija', + 'IO' => 'Britanska Territorija u Indijskom Okeanu', + 'IQ' => 'Irak', + 'IR' => 'Islamska Republika Iran', + 'IS' => 'Island', + 'IT' => 'Italija', + 'JE' => 'Džersi', + 'JM' => 'Jamajka', 'JO' => 'Jordan', 'JP' => 'Japan', - 'KE' => 'Kenya', - 'KG' => 'Kyrgyzstan', - 'KH' => 'Cambodia', + 'KE' => 'Kenija', + 'KG' => 'Kirgistan', + 'KH' => 'Kambodža', 'KI' => 'Kiribati', - 'KM' => 'Comoros', - 'KN' => 'Saint Kitts and Nevis', - 'KP' => "Korea, Democratic People's Republic of", - 'KR' => 'Korea, Republic of', - 'KW' => 'Kuwait', - 'KY' => 'Cayman Islands', - 'KZ' => 'Kazakhstan', - 'LA' => "Lao People's Democratic Republic", - 'LB' => 'Lebanon', - 'LC' => 'Saint Lucia', - 'LI' => 'Liechtenstein', - 'LK' => 'Sri Lanka', - 'LR' => 'Liberia', - 'LS' => 'Lesotho', - 'LT' => 'Lithuania', - 'LU' => 'Luxembourg', - 'LV' => 'Latvia', - 'LY' => 'Libya', - 'MA' => 'Morocco', - 'MC' => 'Monaco', - 'MD' => 'Moldova, Republic of', - 'ME' => 'Montenegro', - 'MF' => 'Saint Martin (French part)', - 'MG' => 'Madagascar', - 'MH' => 'Marshall Islands', - 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'KM' => 'Komorska Ostrva', + 'KN' => 'Sveti Kits i Nevis', + 'KP' => "Demokratska Narodna Republika Koreja", + 'KR' => 'Republika Koreja', + 'KW' => 'Kuvajt', + 'KY' => 'Kajmanska ostrva', + 'KZ' => 'Kazahstan', + 'LA' => "Laos", + 'LB' => 'Liban', + 'LC' => 'Sveta Lucija', + 'LI' => 'Lihtenštajn', + 'LK' => 'Šri Lanka', + 'LR' => 'Liberija', + 'LS' => 'Lesoto', + 'LT' => 'Litvanija', + 'LU' => 'Luksemburg', + 'LV' => 'Letonija', + 'LY' => 'Libija', + 'MA' => 'Maroko', + 'MC' => 'Monako', + 'MD' => 'Republika Moldavija', + 'ME' => 'Crna Gora', + 'MF' => 'Sveti Martin (Francuski deo)', + 'MG' => 'Madagaskar', + 'MH' => 'Maršalska Ostrva', + 'MK' => 'Severna Makedonija', 'ML' => 'Mali', - 'MM' => 'Myanmar', - 'MN' => 'Mongolia', - 'MO' => 'Macao', - 'MP' => 'Northern Mariana Islands', - 'MQ' => 'Martinique', - 'MR' => 'Mauritania', - 'MS' => 'Montserrat', + 'MM' => 'Mijanmar', + 'MN' => 'Mongolija', + 'MO' => 'Makao', + 'MP' => 'Severna Marijanska Ostrva', + 'MQ' => 'Martinik', + 'MR' => 'Mauritanija', + 'MS' => 'Montserat', 'MT' => 'Malta', - 'MU' => 'Mauritius', - 'MV' => 'Maldives', - 'MW' => 'Malawi', - 'MX' => 'Mexico', - 'MY' => 'Malaysia', - 'MZ' => 'Mozambique', - 'N/A' => 'Not Applicable (local IP…)', - 'NA' => 'Namibia', - 'NC' => 'New Caledonia', + 'MU' => 'Mauricijus', + 'MV' => 'Maldivi', + 'MW' => 'Malavi', + 'MX' => 'Meksiko', + 'MY' => 'Malezija', + 'MZ' => 'Mozambik', + 'N/A' => 'Nije primenjivo (Lokalna IP…)', + 'NA' => 'Namibija', + 'NC' => 'Nova Kaledonija', 'NE' => 'Niger', - 'NF' => 'Norfolk Island', - 'NG' => 'Nigeria', - 'NI' => 'Nicaragua', - 'NL' => 'Netherlands', - 'NO' => 'Norway', + 'NF' => 'Ostrvo Norfolk', + 'NG' => 'Nigerija', + 'NI' => 'Nikaragva', + 'NL' => 'Holandija', + 'NO' => 'Norveška', 'NP' => 'Nepal', 'NR' => 'Nauru', - 'NU' => 'Niue', - 'NZ' => 'New Zealand', + 'NU' => 'Nijue', + 'NZ' => 'Novi Zeland', 'OM' => 'Oman', 'PA' => 'Panama', 'PE' => 'Peru', - 'PF' => 'French Polynesia', - 'PG' => 'Papua New Guinea', - 'PH' => 'Philippines', + 'PF' => 'Francuska Polinezija', + 'PG' => 'Papua Nova Gvinеja', + 'PH' => 'Filipini', 'PK' => 'Pakistan', - 'PL' => 'Poland', - 'PM' => 'Saint Pierre and Miquelon', - 'PN' => 'Pitcairn', - 'PR' => 'Puerto Rico', - 'PS' => 'Palestine, State of', - 'PT' => 'Portugal', + 'PL' => 'Poljska', + 'PM' => 'Sen Pjer i Mikelon', + 'PN' => 'Pitkern', + 'PR' => 'Portoriko', + 'PS' => 'Palestina', + 'PT' => 'Portugalija', 'PW' => 'Palau', - 'PY' => 'Paraguay', - 'QA' => 'Qatar', - 'RE' => 'Réunion', - 'RO' => 'Romania', - 'RS' => 'Serbia', - 'RU' => 'Russian Federation', - 'RW' => 'Rwanda', - 'SA' => 'Saudi Arabia', - 'SB' => 'Solomon Islands', - 'SC' => 'Seychelles', + 'PY' => 'Paragvaj', + 'QA' => 'Katar', + 'RE' => 'Rejunion', + 'RO' => 'Rumunija', + 'RS' => 'Srbija', + 'RU' => 'Ruska Federacija', + 'RW' => 'Ruanda', + 'SA' => 'Saudijska Arabija', + 'SB' => 'Solomonova ostrva', + 'SC' => 'Sejšeli', 'SD' => 'Sudan', - 'SE' => 'Sweden', - 'SG' => 'Singapore', - 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', - 'SI' => 'Slovenia', - 'SJ' => 'Svalbard and Jan Mayen', - 'SK' => 'Slovakia', - 'SL' => 'Sierra Leone', + 'SE' => 'Švedska', + 'SG' => 'Singapur', + 'SH' => 'Sveta Helena, Asension i Tristan da Kunja', + 'SI' => 'Slovеnija', + 'SJ' => 'Svalbard i Jan Majen', + 'SK' => 'Slovačka', + 'SL' => 'Sijera Leone', 'SM' => 'San Marino', 'SN' => 'Senegal', 'SO' => 'Somalia', diff --git a/modules/Admin/Language/sr_Latn/Episode.php b/modules/Admin/Language/sr_Latn/Episode.php index 713b517b..c38350a6 100644 --- a/modules/Admin/Language/sr_Latn/Episode.php +++ b/modules/Admin/Language/sr_Latn/Episode.php @@ -13,201 +13,202 @@ return [ 'season_abbr' => 'S{seasonNumber}', 'number' => 'Episode {episodeNumber}', 'number_abbr' => 'Ep. {episodeNumber}', - 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', - 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'season_episode' => 'Sezona {seasonNumber} epizoda {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', 'number_of_comments' => '{numberOfComments, plural, - one {# comment} - other {# comments} + one {# komentar} + other {# komentara} }', - 'all_podcast_episodes' => 'All podcast episodes', - 'back_to_podcast' => 'Go back to podcast', - 'edit' => 'Edit', - 'publish' => 'Publish', - 'publish_edit' => 'Edit publication', - 'publish_date_edit' => 'Edit publication date', - 'unpublish' => 'Unpublish', - 'publish_error' => 'Episode is already published.', - 'publish_edit_error' => 'Episode is already published.', - 'publish_cancel_error' => 'Episode is already published.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', - 'unpublish_error' => 'Episode is not published.', - 'delete' => 'Delete', - 'go_to_page' => 'Go to page', - 'create' => 'Add an episode', + 'all_podcast_episodes' => 'Sve epizode podkasta', + 'back_to_podcast' => 'Nazad na podkast', + 'edit' => 'Izmeni', + 'publish' => 'Objavi', + 'publish_edit' => 'Uredi objavu', + 'publish_date_edit' => 'Uredi datum objave', + 'unpublish' => 'Opozovi objavu', + 'publish_error' => 'Epizoda je već objavljena.', + 'publish_edit_error' => 'Epizoda je već objavljena.', + 'publish_cancel_error' => 'Epizoda je već objavljena.', + 'publish_date_edit_error' => 'Epizoda još uvek nije objavljena, ne možete urediti datum objave.', + 'publish_date_edit_future_error' => 'Datum objavljivanja epizode može se podesiti samo na pređašnji datum. Ukoliko želite da ponovo zakažete objavu epizode u budućnosti, morate prvo opozvati njenu objavu.', + 'publish_date_edit_success' => 'Datum objave epizode je uspešno uređen!', + 'unpublish_error' => 'Epizoda nije objavljena.', + 'delete' => 'Obriši', + 'go_to_page' => 'Idi na stranu', + 'create' => 'Dodaj epizodu', 'publication_status' => [ - 'published' => 'Published', - 'with_podcast' => 'Published', - 'scheduled' => 'Scheduled', - 'not_published' => 'Not published', + 'published' => 'Objavljeno', + 'with_podcast' => 'Objavljeno', + 'scheduled' => 'Zakazano', + 'not_published' => 'Neobjavljeno', ], - 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'with_podcast_hint' => 'Objaviti u isto vreme kad i podkast', 'list' => [ 'search' => [ - 'placeholder' => 'Search for an episode', - 'clear' => 'Clear search', - 'submit' => 'Search', + 'placeholder' => 'Traži epizodu', + 'clear' => 'Očisti pretragu', + 'submit' => 'Pretraga', ], 'number_of_episodes' => '{numberOfEpisodes, plural, - one {# episode} - other {# episodes} + one {# epizoda} + other {# epizode} }', - 'episode' => 'Episode', - 'visibility' => 'Visibility', - 'comments' => 'Comments', - 'actions' => 'Actions', + 'episode' => 'Epizoda', + 'visibility' => 'Vidljivost', + 'downloads' => 'Downloads', + 'comments' => 'Komentari', + 'actions' => 'Akcije', ], 'messages' => [ - 'createSuccess' => 'Episode has been successfully created!', - 'editSuccess' => 'Episode has been successfully updated!', + 'createSuccess' => 'Epizoda je uspešno kreirana!', + 'editSuccess' => 'Epizoda je uspešno ažurirana!', 'publishSuccess' => '{publication_status, select, - published {Episode successfully published!} - scheduled {Episode publication successfully scheduled!} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not published.} + published {Epizoda je uspešno objavljena!} + scheduled {Epizoda je uspešno zakazana!} + with_podcast {Ova epizoda će biti objavljena u isto vreme kad i podkast.} + other {Ova epizoda nije objavljena.} }', - 'publishCancelSuccess' => 'Episode publication successfully cancelled!', - 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', - 'scheduleDateError' => 'Schedule date must be set!', - 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', - 'deleteSuccess' => 'Episode successfully deleted!', - 'deleteError' => 'Failed to delete episode {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} + 'publishCancelSuccess' => 'Objavljivanje epizode je uspešno otkazano!', + 'unpublishBeforeDeleteTip' => 'Morate opozvati objavljivanje epizode pre nego što je izbrišete.', + 'scheduleDateError' => 'Morate zakazati datum objave!', + 'deletePublishedEpisodeError' => 'Molimo vas opozovite objavu epizode pre nego što je izbrišete.', + 'deleteSuccess' => 'Epizoda uspešno izbrisana!', + 'deleteError' => 'Neuspešno brisanje {type, select, + transcript {transkripta} + chapters {poglavlja} + image {omota} + audio {zvuka} + other {medija} }.', - 'deleteFileError' => 'Failed to delete {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} - } file {file_key}. You may manually remove it from your disk.', - 'sameSlugError' => 'An episode with the chosen slug already exists.', + 'deleteFileError' => 'Neuspešno brisanje {type, select, + transcript {transkripta} + chapters {poglavlja} + image {omota} + audio {zvuka} + other {medija} + } datoteke {file_key}. Možete je ukloniti ručno sa diska.', + 'sameSlugError' => 'Odabrano URL ime (slug) epizode već postoji.', ], 'form' => [ 'file_size_error' => - 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', - 'audio_file' => 'Audio file', - 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', - 'info_section_title' => 'Episode info', - 'cover' => 'Episode cover', + 'Veličina vaše datoteke je prevelika! Maksimalna veličina je {0}. Povećajte `memory_limit`, `upload_max_filesize` i `post_max_size` vrednosti u vašoj datoteci php konfiguracije, potom ponovo pokrenite veb server da bi ste otpremili datoteku.', + 'audio_file' => 'Zvučna datoteka', + 'audio_file_hint' => 'Odaberite .mp3 ili .m4a zvučnu datoteku.', + 'info_section_title' => 'Informacije o epizodi', + 'cover' => 'Omot epizode', 'cover_hint' => - 'If you do not set a cover, the podcast cover will be used instead.', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', - 'title' => 'Title', + 'Ukoliko ne postavite omot epizode, koristiće se omot podkasta.', + 'cover_size_hint' => 'Omot mora biti kvadratnog oblika i minimum 1400px širok i visok.', + 'title' => 'Naslov', 'title_hint' => - 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', - 'permalink' => 'Permalink', - 'season_number' => 'Season', - 'episode_number' => 'Episode', + 'Treba sadržati jasan i koncizan naziv epizode. Nemojte upisivati broj sezone ili epizode ovde.', + 'permalink' => 'Trajni link', + 'season_number' => 'Sezona', + 'episode_number' => 'Epizoda', 'type' => [ - 'label' => 'Type', - 'full' => 'Full', - 'full_hint' => 'Complete content (the episode)', - 'trailer' => 'Trailer', - 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'label' => 'Vrsta', + 'full' => 'Cela', + 'full_hint' => 'Kompletan sadržaj (epizoda)', + 'trailer' => 'Najava', + 'trailer_hint' => 'Kratak, promotivni deo sadržaja koji predstavlja pregled aktuelne emisije', 'bonus' => 'Bonus', - 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + 'bonus_hint' => 'Dodatni sadržaj za emisiju (na primer, informacije iza scene ili intervjui sa glumcima) ili unakrsni promotivni sadržaj za drugu emisiju', ], 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium' => 'Epizoda mora biti dostupna samo premium pretplatnicima', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does the episode contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'label' => 'Roditeljsko savetovanje', + 'hint' => 'Da li epizoda sadrži eksplicitan sadržaj?', + 'undefined' => 'nedefinisano', + 'clean' => 'Čisto', + 'explicit' => 'Eksplicitno', ], - 'show_notes_section_title' => 'Show notes', + 'show_notes_section_title' => 'Prikaži beleške', 'show_notes_section_subtitle' => - 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', - 'description' => 'Description', - 'description_footer' => 'Description footer', + 'Do 4000 znakova, budite jasni i sažeti. Beleške pomažu potencijalnim slušaocima da pronađu epizodu.', + 'description' => 'Opis', + 'description_footer' => 'Podnožje opisa', 'description_footer_hint' => - 'This text is added at the end of each episode description, it is a good place to input your social links for example.', - 'additional_files_section_title' => 'Additional files', + 'Ovaj tekst se dodaje na kraj opisa svake epizode, ovo je pravo mesto za vaše linkove ka društvenim mrežama naprimer.', + 'additional_files_section_title' => 'Dodatne datoteke', 'additional_files_section_subtitle' => - 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this episode about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real or fictional location', - 'transcript' => 'Transcript (subtitles / closed captions)', - 'transcript_hint' => 'Only .srt are allowed.', - 'transcript_download' => 'Download transcript', - 'transcript_file' => 'Transcript file (.srt)', - 'transcript_remote_url' => 'Remote url for transcript', - 'transcript_file_delete' => 'Delete transcript file', - 'chapters' => 'Chapters', - 'chapters_hint' => 'File must be in JSON Chapters format.', - 'chapters_download' => 'Download chapters', - 'chapters_file' => 'Chapters file', - 'chapters_remote_url' => 'Remote url for chapters file', - 'chapters_file_delete' => 'Delete chapters file', - 'advanced_section_title' => 'Advanced Parameters', + 'Ove datoteke mogu biti korišćene od strane drugih platformi radi boljeg iskustva vaše publike. Pogledajte {podcastNamespaceLink} za više informacija.', + 'location_section_title' => 'Lokacija', + 'location_section_subtitle' => 'O kom mestu je ova epizoda?', + 'location_name' => 'Ime ili adresa lokacije', + 'location_name_hint' => 'Ovo može biti prava ili fiktivna lokacija', + 'transcript' => 'Transkript (titlovi)', + 'transcript_hint' => 'Samo .srt datoteke su dozvoljene.', + 'transcript_download' => 'Preuzmi transkript', + 'transcript_file' => 'Datoteka transkripta (.srt)', + 'transcript_remote_url' => 'Udaljeni Url za transkript', + 'transcript_file_delete' => 'Obriši datoteku transkripta', + 'chapters' => 'Poglavlja', + 'chapters_hint' => 'Datoteka mora biti u JSON Poglavlja formatu.', + 'chapters_download' => 'Preuzmi poglavlja', + 'chapters_file' => 'Datoteka poglavlja', + 'chapters_remote_url' => 'Udaljeni Url za datoteku poglavlja', + 'chapters_file_delete' => 'Obriši datoteku poglavlja', + 'advanced_section_title' => 'Napredni parametri', 'advanced_section_subtitle' => - 'If you need RSS tags that Castopod does not handle, set them here.', - 'custom_rss' => 'Custom RSS tags for the episode', - 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', - 'block' => 'Episode should be hidden from public catalogues', + 'Ukoliko su vam potrebni RSS tagovi koje Castopod ne obrađuje, postavite ih ovde.', + 'custom_rss' => 'Posebni RSS tagovi epizode', + 'custom_rss_hint' => 'Ovo će biti ubačeno u ❬item❭ tag.', + 'block' => 'Epizoda treba biti sakriivena u javnim katalozima', 'block_hint' => 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', - 'submit_create' => 'Create episode', - 'submit_edit' => 'Save episode', + 'submit_create' => 'Kreiraj epizodu', + 'submit_edit' => 'Sačuvaj epizodu', ], 'publish_form' => [ - 'back_to_episode_dashboard' => 'Back to episode dashboard', - 'post' => 'Your announcement post', + 'back_to_episode_dashboard' => 'Nazad na komandnu tablu epizode', + 'post' => 'Najava vaše objave', 'post_hint' => - "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'publication_date' => 'Publication date', + "Napišite poruku da najavite objavu vaše epizode. Poruka će biti poslata svim vašim pratiocima u fediversu i istaknuta na stranici vašeg podkasta.", + 'message_placeholder' => 'Napišite poruku…', + 'publication_date' => 'Datum objavljivanja', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', - 'with_podcast' => 'Publish alongside podcast', + 'now' => 'Sada', + 'schedule' => 'Raspored', + 'with_podcast' => 'Objavi uz podkast', ], - 'scheduled_publication_date' => 'Scheduled publication date', - 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date' => 'Planiran datum objave', + 'scheduled_publication_date_clear' => 'Ukloni datum objave', 'scheduled_publication_date_hint' => - 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit' => 'Publish', - 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', - 'message_warning' => 'You did not write a message for your announcement post!', - 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', - 'message_warning_submit' => 'Publish anyways', + 'Možete zakazati objavu epizode u budućnosti. Ovo polje mora biti popunjeno u YYYY-MM-DD HH:mm formatu', + 'submit' => 'Objavi', + 'submit_edit' => 'Uredi objavu', + 'cancel_publication' => 'Poništi objavu', + 'message_warning' => 'Niste napisali poruku za najavu objave!', + 'message_warning_hint' => 'Poruka povećava šanse za angažovanjem na društvenim mrežama, rezultirajući u većoj vidljivosti vaše epizode.', + 'message_warning_submit' => 'Objavi svakako', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Novi datum objavljivanja', + 'new_publication_date_hint' => 'Mora biti podešeno na prošli datum.', + 'submit' => 'Uredi datum objavljivanja', ], 'unpublish_form' => [ 'disclaimer' => - "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", - 'understand' => 'I understand, I want to unpublish the episode', - 'submit' => 'Unpublish', + "Opozivanje objavljivanja epizode će obrisati sve komentare i obajve povezane sa eppizodom i ukloniti je i RSS feed-a podkasta.", + 'understand' => 'Razumem, želim da opozovem objavu epizode', + 'submit' => 'Opozovi objavu', ], 'delete_form' => [ 'disclaimer' => - "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", - 'understand' => 'I understand, I want to delete the episode', - 'submit' => 'Delete', + "Brisanje epizode će obrisati sve medijske datoteke, komentare, video i zvučne isečke povezane sa njom.", + 'understand' => 'Razumem, želim da obrišem epizodu', + 'submit' => 'Obriši', ], 'embed' => [ - 'title' => 'Embeddable player', + 'title' => 'Embedovan plejer', 'label' => - 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', - 'clipboard_iframe' => 'Copy embeddable player to clipboard', - 'clipboard_url' => 'Copy address to clipboard', - 'dark' => 'Dark', - 'dark-transparent' => 'Dark transparent', - 'light' => 'Light', - 'light-transparent' => 'Light transparent', + 'Odaberite boju teme, kopirajte embedovan plejer i nalepite ga na vaš sajt.', + 'clipboard_iframe' => 'Kopirajte kod embedovanog plejera', + 'clipboard_url' => 'Kopirajte adresu', + 'dark' => 'Tamna', + 'dark-transparent' => 'Tamna providna', + 'light' => 'Svetla', + 'light-transparent' => 'Svetla providna', ], ]; diff --git a/modules/Admin/Language/sr_Latn/EpisodeNavigation.php b/modules/Admin/Language/sr_Latn/EpisodeNavigation.php index 1406e301..48cf7138 100644 --- a/modules/Admin/Language/sr_Latn/EpisodeNavigation.php +++ b/modules/Admin/Language/sr_Latn/EpisodeNavigation.php @@ -9,15 +9,15 @@ declare(strict_types=1); */ return [ - 'go_to_page' => 'View episode page', - 'dashboard' => 'Episode dashboard', - 'episode-view' => 'Home', - 'episode-edit' => 'Edit episode', - 'episode-persons-manage' => 'Manage persons', - 'embed-add' => 'Embeddable player', - 'clips' => 'Clips', - 'video-clips-list' => 'Video clips', - 'video-clips-create' => 'New video clip', - 'soundbites-list' => 'Soundbites', - 'soundbites-create' => 'New soundbite', + 'go_to_page' => 'Pogledaj stranicu epizode', + 'dashboard' => 'Kontrolna tabla epizode', + 'episode-view' => 'Početna', + 'episode-edit' => 'Uredi epizodu', + 'episode-persons-manage' => 'Uredi osobe', + 'embed-add' => 'Embedovan plejer', + 'clips' => 'Isečci', + 'video-clips-list' => 'Video isečci', + 'video-clips-create' => 'Novi video isečak', + 'soundbites-list' => 'Zvučni isečci', + 'soundbites-create' => 'Novi zvučni isečak', ]; diff --git a/modules/Admin/Language/sr_Latn/Fediverse.php b/modules/Admin/Language/sr_Latn/Fediverse.php index 0e4ca66d..97b2088f 100644 --- a/modules/Admin/Language/sr_Latn/Fediverse.php +++ b/modules/Admin/Language/sr_Latn/Fediverse.php @@ -10,8 +10,8 @@ declare(strict_types=1); return [ 'messages' => [ - 'actorNotFound' => 'The account could not be found!', - 'blockActorSuccess' => '{actor} has been blocked!', + 'actorNotFound' => 'Nalog ne može biti pronađen!', + 'blockActorSuccess' => '{actor} je blokiran!', 'unblockActorSuccess' => 'Actor has been unblocked!', 'blockDomainSuccess' => '{domain} has been blocked!', 'unblockDomainSuccess' => '{domain} has been unblocked!', diff --git a/modules/Admin/Language/sr_Latn/Navigation.php b/modules/Admin/Language/sr_Latn/Navigation.php index 610f1434..b23a7981 100644 --- a/modules/Admin/Language/sr_Latn/Navigation.php +++ b/modules/Admin/Language/sr_Latn/Navigation.php @@ -9,34 +9,34 @@ declare(strict_types=1); */ return [ - 'toggle_sidebar' => 'Toggle sidebar', - 'go_to_website' => 'Go to website', - 'go_to_admin' => 'Go to admin', - 'dashboard' => 'Dashboard', - 'admin' => 'Home', - 'podcasts' => 'Podcasts', - 'podcast-list' => 'All podcasts', - 'podcast-create' => 'New podcast', - 'podcast-import' => 'Import a podcast', - 'persons' => 'Persons', - 'person-list' => 'All persons', - 'person-create' => 'New person', - 'fediverse' => 'Fediverse', - 'fediverse-blocked-actors' => 'Blocked accounts', - 'fediverse-blocked-domains' => 'Blocked domains', - 'users' => 'Users', - 'user-list' => 'All users', - 'user-create' => 'New user', - 'pages' => 'Pages', - 'page-list' => 'All pages', - 'page-create' => 'New Page', - 'settings' => 'Settings', - 'settings-general' => 'General', - 'settings-theme' => 'Theme', - 'about' => 'About', + 'toggle_sidebar' => 'Uključite bočnu traku', + 'go_to_website' => 'Idi na sajt', + 'go_to_admin' => 'Idi na administratora', + 'dashboard' => 'Kontrolna tabla', + 'admin' => 'Početna', + 'podcasts' => 'Podkasti', + 'podcast-list' => 'Svi podkasti', + 'podcast-create' => 'Novi podkast', + 'podcast-import' => 'Uvezi podkast', + 'persons' => 'Osobe', + 'person-list' => 'Sve osobe', + 'person-create' => 'Nova osoba', + 'fediverse' => 'Fediverzum', + 'fediverse-blocked-actors' => 'Blokirani nalozi', + 'fediverse-blocked-domains' => 'Blokirani domeni', + 'users' => 'Korisnici', + 'user-list' => 'Svi korisnici', + 'user-create' => 'Novi korisnik', + 'pages' => 'Stranice', + 'page-list' => 'Sve stranice', + 'page-create' => 'Nova Stranica', + 'settings' => 'Podešavanja', + 'settings-general' => 'Opšte', + 'settings-theme' => 'Tema', + 'about' => 'Osnovni podaci', 'account' => [ - 'my-account' => 'My account', - 'change-password' => 'Change password', - 'logout' => 'Logout', + 'my-account' => 'Moj nalog', + 'change-password' => 'Promenite lozinku', + 'logout' => 'Odjava', ], ]; diff --git a/modules/Admin/Language/sr_Latn/Page.php b/modules/Admin/Language/sr_Latn/Page.php index b6f49de5..224fa82e 100644 --- a/modules/Admin/Language/sr_Latn/Page.php +++ b/modules/Admin/Language/sr_Latn/Page.php @@ -9,22 +9,22 @@ declare(strict_types=1); */ return [ - 'back_to_home' => 'Back to home', - 'page' => 'Page', - 'all_pages' => 'All pages', - 'create' => 'New page', - 'go_to_page' => 'Go to page', - 'edit' => 'Edit page', - 'delete' => 'Delete page', + 'back_to_home' => 'Natrag na početnu', + 'page' => 'Stranica', + 'all_pages' => 'Sve stranice', + 'create' => 'Nova Stranica', + 'go_to_page' => 'Idi na stranicu', + 'edit' => 'Izmeni stranicu', + 'delete' => 'Obriši stranicu', 'form' => [ - 'title' => 'Title', - 'permalink' => 'Permalink', - 'content' => 'Content', - 'submit_create' => 'Create page', - 'submit_edit' => 'Save', + 'title' => 'Naslov', + 'permalink' => 'Trajni link', + 'content' => 'Sadržaj', + 'submit_create' => 'Napravi stranicu', + 'submit_edit' => 'Sačuvaj', ], 'messages' => [ - 'createSuccess' => 'The page “{pageTitle}” was created successfully!', - 'editSuccess' => 'The page was successfully updated!', + 'createSuccess' => 'Stranica “{pageTitle}” je uspešno napravljena!', + 'editSuccess' => 'Stranica je uspešno ažurirana!', ], ]; diff --git a/modules/Admin/Language/sr_Latn/Pager.php b/modules/Admin/Language/sr_Latn/Pager.php index e25ee638..6aac1696 100644 --- a/modules/Admin/Language/sr_Latn/Pager.php +++ b/modules/Admin/Language/sr_Latn/Pager.php @@ -9,13 +9,13 @@ declare(strict_types=1); */ return [ - 'pageNavigation' => 'Page navigation', - 'first' => 'First', - 'previous' => 'Previous', - 'next' => 'Next', - 'last' => 'Last', - 'older' => 'Older', - 'newer' => 'Newer', + 'pageNavigation' => 'Navigacija po stranicama', + 'first' => 'Prva', + 'previous' => 'Prеthodna', + 'next' => 'Sledeća', + 'last' => 'Poslednja', + 'older' => 'Starije', + 'newer' => 'Novije', 'invalidTemplate' => '{0} is not a valid Pager template.', 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', ]; diff --git a/modules/Admin/Language/sr_Latn/Person.php b/modules/Admin/Language/sr_Latn/Person.php index a652be9f..e2e40df6 100644 --- a/modules/Admin/Language/sr_Latn/Person.php +++ b/modules/Admin/Language/sr_Latn/Person.php @@ -9,57 +9,57 @@ declare(strict_types=1); */ return [ - 'persons' => 'Persons', - 'all_persons' => 'All persons', - 'no_person' => 'Nobody found!', - 'create' => 'Create a person', - 'view' => 'View person', - 'edit' => 'Edit person', - 'delete' => 'Delete person', + 'persons' => 'Osobe', + 'all_persons' => 'Sve osobe', + 'no_person' => 'Niko nije pronađen!', + 'create' => 'Kreiraj novu osobu', + 'view' => 'Pogledaj osobu', + 'edit' => 'Izmeni osobu', + 'delete' => 'Obriši osobu', 'messages' => [ - 'createSuccess' => 'Person has been successfully created!', - 'editSuccess' => 'Person has been successfully updated!', - 'deleteSuccess' => 'Person has been removed!', + 'createSuccess' => 'Osoba je uspešno kreirana!', + 'editSuccess' => 'Osoba je uspešno izmenjena!', + 'deleteSuccess' => 'Osoba je uklonjena!', ], 'form' => [ 'avatar' => 'Avatar', 'avatar_size_hint' => - 'Avatar must be squared and at least 400px wide and tall.', - 'full_name' => 'Full name', - 'full_name_hint' => 'This is the full name or alias of the person.', - 'unique_name' => 'Unique name', - 'unique_name_hint' => 'Used for URLs', - 'information_url' => 'Information URL', + 'Avatar mora biti kvadratnog oblika i minimum 400px širok i visok.', + 'full_name' => 'Puno ime', + 'full_name_hint' => 'Ovo je puno ime ili nadimak osobe.', + 'unique_name' => 'Jedinstveno ime', + 'unique_name_hint' => 'Koristi se za URL', + 'information_url' => 'Informacijski URL', 'information_url_hint' => - 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', - 'submit_create' => 'Create person', - 'submit_edit' => 'Save person', + 'Url ka relevantnim informacijama o osobi, kao što su naprimer njihova veb stranica ili profil na društvenim mrežama.', + 'submit_create' => 'Kreiraj novu osobu', + 'submit_edit' => 'Sačuvaj osobu', ], 'podcast_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this podcast', - 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'title' => 'Uredi osobe', + 'add_section_title' => 'Dodaj osobe ovom podkastu', + 'add_section_subtitle' => 'Možete odabrati nekoliko osoba i njihovih uloga.', + 'persons' => 'Osobe', 'persons_hint' => - 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'Možete odabrati jednu ili nekoliko osoba sa istim ulogama. Morate prvo kreirati osobe.', + 'roles' => 'Uloge', 'roles_hint' => - 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'Možete odabrati jednu, nekoliko ili nijednu ulogu za osobu.', + 'submit_add' => 'Dodaj osobu(e)', + 'remove' => 'Ukloni', ], 'episode_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this episode', - 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'title' => 'Upravljaj osobama', + 'add_section_title' => 'Dodaj osobe ovoj epizodi', + 'add_section_subtitle' => 'Možete odabrati nekoliko osoba i njihovih uloga.', + 'persons' => 'Osobe', 'persons_hint' => - 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'Možete odabrati jednu ili nekoliko osoba sa istim ulogama. Morate prvo kreirati osobe.', + 'roles' => 'Uloge', 'roles_hint' => - 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'Možete odabrati jednu, nekoliko ili nijednu ulogu za osobu.', + 'submit_add' => 'Dodaj osobu(e)', + 'remove' => 'Ukloni', ], - 'credits' => 'Credits', + 'credits' => 'Zasluge', ]; diff --git a/modules/Admin/Language/sr_Latn/Platforms.php b/modules/Admin/Language/sr_Latn/Platforms.php index ab17d599..a55c8dcd 100644 --- a/modules/Admin/Language/sr_Latn/Platforms.php +++ b/modules/Admin/Language/sr_Latn/Platforms.php @@ -9,22 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', - 'home_url' => 'Go to {platformName} website', - 'submit_url' => 'Submit your podcast on {platformName}', - 'visible' => 'Display in podcast homepage?', - 'on_embed' => 'Display on embeddable player?', - 'remove' => 'Remove {platformName}', - 'submit' => 'Save', + 'title' => 'Platforme', + 'home_url' => 'Idi na {platformName} stranicu', + 'submit_url' => 'Dodaj svoj podkast na {platformName}', + 'visible' => 'Prikaži na naslovnoj strani podkasta?', + 'on_embed' => 'Prikaži na embedovanom plejeru?', + 'remove' => 'Ukloni {platformName}', + 'submit' => 'Sačuvaj', 'messages' => [ - 'updateSuccess' => 'Platform links have been successfully updated!', - 'removeLinkSuccess' => 'The platform link has been removed.', + 'updateSuccess' => 'Veze sa platformama su uspešno ažurirane!', + 'removeLinkSuccess' => 'Veza ka platformi je izbrisana.', 'removeLinkError' => - 'The platform link could not be removed. Try again.', + 'Vezu sa platformom nije moguće ukloniti. Probajte ponovo.', ], 'description' => [ - 'podcasting' => 'The podcast ID on this platform', - 'social' => 'The podcast account ID on this platform', - 'funding' => 'Call to action message', + 'podcasting' => 'ID podkasta na ovoj platformi', + 'social' => 'ID naloga podkasta na ovoj platformi', + 'funding' => 'Poruka poziva na akciju', ], ]; diff --git a/modules/Admin/Language/sr_Latn/Podcast.php b/modules/Admin/Language/sr_Latn/Podcast.php index 2d46aff5..72c3b387 100644 --- a/modules/Admin/Language/sr_Latn/Podcast.php +++ b/modules/Admin/Language/sr_Latn/Podcast.php @@ -9,69 +9,69 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found!', - 'create' => 'Create podcast', - 'import' => 'Import podcast', - 'new_episode' => 'New Episode', - 'view' => 'View podcast', - 'edit' => 'Edit podcast', - 'publish' => 'Publish podcast', - 'publish_edit' => 'Edit publication', - 'delete' => 'Delete podcast', - 'see_episodes' => 'See episodes', - 'see_contributors' => 'See contributors', - 'go_to_page' => 'Go to page', - 'latest_episodes' => 'Latest episodes', - 'see_all_episodes' => 'See all episodes', - 'draft' => 'Draft', + 'all_podcasts' => 'Svi podkasti', + 'no_podcast' => 'Nema pronađenih podkasta!', + 'create' => 'Napravi podkast', + 'import' => 'Uvezi podkast', + 'new_episode' => 'Nova epizoda', + 'view' => 'Pogledaj epizodu', + 'edit' => 'Uredi podkast', + 'publish' => 'Objavi podkast', + 'publish_edit' => 'Uredi objavu', + 'delete' => 'Obriši podkast', + 'see_episodes' => 'Pogledaj epizode', + 'see_contributors' => 'Pogledaj saradnike', + 'go_to_page' => 'Idi na stranicu', + 'latest_episodes' => 'Najnovije epizode', + 'see_all_episodes' => 'Prikaži sve epizode', + 'draft' => 'Nacrt', 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', - 'editSuccess' => 'Podcast has been successfully updated!', - 'importSuccess' => 'Podcast has been successfully imported!', - 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', - 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, - cover {cover} - banner {banner} - other {media} + 'createSuccess' => 'Podkast uspešno kreiran!', + 'editSuccess' => 'Podkast je uspešno ažuriran!', + 'importSuccess' => 'Podkast je uspešno uvezen!', + 'deleteSuccess' => 'Podkast @{podcast_handle} je uspešno obrisan!', + 'deletePodcastMediaError' => 'Neuspešno brisanje podkast {type, select, + cover {omota} + banner {banera} + other {medija} }.', - 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} + 'deleteEpisodeMediaError' => 'Neuspešno brisanje {episode_slug} {type, select, + transcript {transkripta} + chapters {poglavlja} + image {omota} + audio {zvuka} + other {medija} }.', - 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', - 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, - one {# episode was} - other {# episodes were} - } added to the podcast!', - 'podcastFeedUpToDate' => 'Podcast is already up to date.', - 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', - 'publishError' => 'This podcast is either already published or scheduled for publication.', - 'publishEditError' => 'This podcast is not scheduled for publication.', - 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', - 'scheduleDateError' => 'Schedule date must be set!', + 'deletePodcastMediaFolderError' => 'Neuspešno brisanje podkast medija direktorijuma {folder_path}. Možete ga ručno ukloniti sa diska.', + 'podcastFeedUpdateSuccess' => 'Uspešno ažuriranje: {number_of_new_episodes, plural, + one {# epizoda je} + other {# epizode su} + } deo podkasta!', + 'podcastFeedUpToDate' => 'Podkast je već ažuriran.', + 'podcastNotImported' => 'Podkast nije moguće ažurirati jer nije uvezen.', + 'publishError' => 'Ovaj podkast je ili već objavljen ili zakazan za objavu.', + 'publishEditError' => 'Ovaj podkast nije zakazan za objavu.', + 'publishCancelSuccess' => 'Objavljivanje podkasta je uspešno otkazano!', + 'scheduleDateError' => 'Morate zakazati datum objave!', ], 'form' => [ - 'identity_section_title' => 'Podcast identity', - 'identity_section_subtitle' => 'These fields allow you to get noticed.', - 'cover' => 'Podcast cover', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', - 'banner' => 'Podcast banner', - 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', - 'banner_delete' => 'Delete podcast banner', - 'title' => 'Title', + 'identity_section_title' => 'Identitet podkasta', + 'identity_section_subtitle' => 'Ova polja vam pomažu da budete prepoznati.', + 'cover' => 'Omot podkasta', + 'cover_size_hint' => 'Omot mora biti kvadratnog oblika i minimum 1400px širok i visok.', + 'banner' => 'Baner podkasta', + 'banner_size_hint' => 'Baner mora imati odnos 3:1 i biti najmanje 1500px širok.', + 'banner_delete' => 'Obriši baner podkasta', + 'title' => 'Naslov', 'handle' => 'Handle', 'handle_hint' => - 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'Koristi se radi identifikacije podkasta. Velika slova, mala slova, brojevi i donja crta su prihvatljivi.', 'type' => [ - 'label' => 'Type', - 'episodic' => 'Episodic', - 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', - 'serial' => 'Serial', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + 'label' => 'Vrsta', + 'episodic' => 'Epizodno', + 'episodic_hint' => 'Ukoliko su epizode namenjene za konzumiranje bez nekog specifičnog reda. Najnovija epizoda će biti predstavljena prva u redosledu.', + 'serial' => 'Serijski', + 'serial_hint' => 'Ukoliko su epizode namenjene za konzumiranje specifičnim redom. Najstarija epizoda će biti predstavljena prva u redosledu.', ], 'description' => 'Description', 'classification_section_title' => 'Classification', @@ -129,173 +129,173 @@ return [ 'update_feed_tip' => 'Import this podcast\'s latest episodes', 'partnership' => 'Partnership', 'partner_id' => 'ID', - 'partner_link_url' => 'Link URL', - 'partner_image_url' => 'Image URL', - 'partner_id_hint' => 'Your own partner ID', - 'partner_link_url_hint' => 'The generic partner link address', - 'partner_image_url_hint' => 'The generic partner image address', + 'partner_link_url' => 'URL adresa veze', + 'partner_image_url' => 'URL adresa slike', + 'partner_id_hint' => 'Vaš partnerski ID', + 'partner_link_url_hint' => 'Generička adresa veze partnera', + 'partner_image_url_hint' => 'Generička adresa slike partnera', 'status_section_title' => 'Status', - 'block' => 'Podcast should be hidden from public catalogues', + 'block' => 'Podkast treba sakriti iz javnih kataloga', 'block_hint' => - 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', - 'complete' => 'Podcast will not be having new episodes', - 'lock' => 'Prevent podcast from being copied', + 'Prikazan ili sakriven status podkasta: ukoliko uključite ovu opciju onemogućavate prikazivanje vašeg podkasta na paltformama za slušanje podkasta kao što su Apple Podcasts, Google Podcasts i sličnim direktorijima. (Nije zagarantovano)', + 'complete' => 'Podkast više neće imati novih epizoda', + 'lock' => 'Sprečite kopiranje podkasta', 'lock_hint' => - 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', - 'submit_create' => 'Create podcast', - 'submit_edit' => 'Save podcast', + 'Cilj ovoga je da komunicira sa drugim podkast platformama i ne dozvoli im da povlače vaš sadržaj. Ukoliko odaberete Da, to znači da će svaki njihov pokušaj da izlistaju vaš sadržaj na svojoj platformi biti odbijen.', + 'submit_create' => 'Napravi podkast', + 'submit_edit' => 'Sačuvaj podkast', ], 'category_options' => [ - 'uncategorized' => 'uncategorized', - 'arts' => 'Arts', - 'business' => 'Business', - 'comedy' => 'Comedy', - 'education' => 'Education', - 'fiction' => 'Fiction', - 'government' => 'Government', - 'health_and_fitness' => 'Health & Fitness', - 'history' => 'History', - 'kids_and_family' => 'Kids & Family', - 'leisure' => 'Leisure', - 'music' => 'Music', - 'news' => 'News', - 'religion_and_spirituality' => 'Religion & Spirituality', - 'science' => 'Science', - 'society_and_culture' => 'Society & Culture', - 'sports' => 'Sports', - 'technology' => 'Technology', - 'true_crime' => 'True Crime', - 'tv_and_film' => 'TV & Film', - 'books' => 'Books', - 'design' => 'Design', - 'fashion_and_beauty' => 'Fashion & Beauty', - 'food' => 'Food', - 'performing_arts' => 'Performing Arts', - 'visual_arts' => 'Visual Arts', - 'careers' => 'Careers', - 'entrepreneurship' => 'Entrepreneurship', - 'investing' => 'Investing', - 'management' => 'Management', + 'uncategorized' => 'nekategorizovano', + 'arts' => 'Umetnost', + 'business' => 'Posao', + 'comedy' => 'Komedija', + 'education' => 'Obrazovanje', + 'fiction' => 'Fikcija', + 'government' => 'Vlada', + 'health_and_fitness' => 'Zdravlje i Fitnes', + 'history' => 'Istorija', + 'kids_and_family' => 'Deca i Porodica', + 'leisure' => 'Razonoda', + 'music' => 'Muzika', + 'news' => 'Vesti', + 'religion_and_spirituality' => 'Religija i spiritualnost', + 'science' => 'Nauka', + 'society_and_culture' => 'Društvo i Kultura', + 'sports' => 'Sport', + 'technology' => 'Tehnologija', + 'true_crime' => 'Istinski zločini', + 'tv_and_film' => 'Televizija i Film', + 'books' => 'Knjige', + 'design' => 'Dizajn', + 'fashion_and_beauty' => 'Moda i Lepota', + 'food' => 'Hrana', + 'performing_arts' => 'Izvođačka umetnost', + 'visual_arts' => 'Likovna umetnost', + 'careers' => 'Karijera', + 'entrepreneurship' => 'Prednuzetništvo', + 'investing' => 'Investiranje', + 'management' => 'Upravljanje', 'marketing' => 'Marketing', - 'non_profit' => 'Non-Profit', - 'comedy_interviews' => 'Comedy Interviews', - 'improv' => 'Improv', - 'stand_up' => 'Stand-Up', - 'courses' => 'Courses', - 'how_to' => 'How To', - 'language_learning' => 'Language Learning', - 'self_improvement' => 'Self-Improvement', - 'comedy_fiction' => 'Comedy Fiction', + 'non_profit' => 'Neprofitna udruženja', + 'comedy_interviews' => 'Komični intervjui', + 'improv' => 'Improvizacija', + 'stand_up' => 'Stendap komedija', + 'courses' => 'Kursevi', + 'how_to' => 'Uradi sam', + 'language_learning' => 'Učenje jezika', + 'self_improvement' => 'Samopoboljšanje', + 'comedy_fiction' => 'Komična fantastika', 'drama' => 'Drama', - 'science_fiction' => 'Science Fiction', - 'alternative_health' => 'Alternative Health', - 'fitness' => 'Fitness', - 'medicine' => 'Medicine', - 'mental_health' => 'Mental Health', - 'nutrition' => 'Nutrition', - 'sexuality' => 'Sexuality', - 'education_for_kids' => 'Education for Kids', - 'parenting' => 'Parenting', - 'pets_and_animals' => 'Pets & Animals', - 'stories_for_kids' => 'Stories for Kids', - 'animation_and_manga' => 'Animation & Manga', - 'automotive' => 'Automotive', - 'aviation' => 'Aviation', - 'crafts' => 'Crafts', - 'games' => 'Games', - 'hobbies' => 'Hobbies', - 'home_and_garden' => 'Home & Garden', - 'video_games' => 'Video Games', - 'music_commentary' => 'Music Commentary', - 'music_history' => 'Music History', - 'music_interviews' => 'Music Interviews', - 'business_news' => 'Business News', - 'daily_news' => 'Daily News', - 'entertainment_news' => 'Entertainment News', - 'news_commentary' => 'News Commentary', - 'politics' => 'Politics', - 'sports_news' => 'Sports News', - 'tech_news' => 'Tech News', - 'buddhism' => 'Buddhism', - 'christianity' => 'Christianity', - 'hinduism' => 'Hinduism', + 'science_fiction' => 'Naučna Fantastika', + 'alternative_health' => 'Alternativno zdravlje', + 'fitness' => 'Fitnes', + 'medicine' => 'Medicina', + 'mental_health' => 'Mentalno zdravlje', + 'nutrition' => 'Nutricionizam', + 'sexuality' => 'Seksualnost', + 'education_for_kids' => 'Obrazovanje dece', + 'parenting' => 'Roditeljstvo', + 'pets_and_animals' => 'Ljubimci i životinje', + 'stories_for_kids' => 'Priče za decu', + 'animation_and_manga' => 'Animacija i Manga', + 'automotive' => 'Automobilizam', + 'aviation' => 'Avijacija', + 'crafts' => 'Zanati', + 'games' => 'Igre', + 'hobbies' => 'Hobiji', + 'home_and_garden' => 'Dom i bašta', + 'video_games' => 'Video igre', + 'music_commentary' => 'Komentari muzike', + 'music_history' => 'Istorija muzike', + 'music_interviews' => 'Muzički intervjui', + 'business_news' => 'Vesti iz preduzetništva', + 'daily_news' => 'Dnevne vesti', + 'entertainment_news' => 'Vesti iz zabave', + 'news_commentary' => 'Komentari vesti', + 'politics' => 'Politika', + 'sports_news' => 'Sportske vesti', + 'tech_news' => 'Tehnološke vesti', + 'buddhism' => 'Budizam', + 'christianity' => 'Hrišćanstvo', + 'hinduism' => 'Hinduizam', 'islam' => 'Islam', - 'judaism' => 'Judaism', - 'religion' => 'Religion', - 'spirituality' => 'Spirituality', - 'astronomy' => 'Astronomy', - 'chemistry' => 'Chemistry', - 'earth_sciences' => 'Earth Sciences', - 'life_sciences' => 'Life Sciences', - 'mathematics' => 'Mathematics', - 'natural_sciences' => 'Natural Sciences', - 'nature' => 'Nature', - 'physics' => 'Physics', + 'judaism' => 'Judeizam', + 'religion' => 'Religija', + 'spirituality' => 'Duhovnost', + 'astronomy' => 'Astronomija', + 'chemistry' => 'Hemija', + 'earth_sciences' => 'Studije zemlje', + 'life_sciences' => 'Studije života', + 'mathematics' => 'Matematika', + 'natural_sciences' => 'Prirodne nauke', + 'nature' => 'Priroda', + 'physics' => 'Fizika', 'social_sciences' => 'Social Sciences', 'documentary' => 'Documentary', - 'personal_journals' => 'Personal Journals', - 'philosophy' => 'Philosophy', - 'places_and_travel' => 'Places & Travel', - 'relationships' => 'Relationships', - 'baseball' => 'Baseball', - 'basketball' => 'Basketball', - 'cricket' => 'Cricket', - 'fantasy_sports' => 'Fantasy Sports', - 'football' => 'Football', + 'personal_journals' => 'Lični dnevnici', + 'philosophy' => 'Filozofija', + 'places_and_travel' => 'Mesta i Putovanje', + 'relationships' => 'Veze', + 'baseball' => 'Bejzbol', + 'basketball' => 'Košarka', + 'cricket' => 'Kriket', + 'fantasy_sports' => 'Fantazi sport', + 'football' => 'Američki fudbal', 'golf' => 'Golf', - 'hockey' => 'Hockey', - 'rugby' => 'Rugby', - 'running' => 'Running', - 'soccer' => 'Soccer', - 'swimming' => 'Swimming', - 'tennis' => 'Tennis', - 'volleyball' => 'Volleyball', - 'wilderness' => 'Wilderness', - 'wrestling' => 'Wrestling', - 'after_shows' => 'After Shows', - 'film_history' => 'Film History', - 'film_interviews' => 'Film Interviews', - 'film_reviews' => 'Film Reviews', - 'tv_reviews' => 'TV Reviews', + 'hockey' => 'Hokej', + 'rugby' => 'Ragbi', + 'running' => 'Trčanje', + 'soccer' => 'Fudbal', + 'swimming' => 'Plivanje', + 'tennis' => 'Tenis', + 'volleyball' => 'Odbojka', + 'wilderness' => 'Divljina', + 'wrestling' => 'Rvanje', + 'after_shows' => 'Posle emisija', + 'film_history' => 'Filmska istorija', + 'film_interviews' => 'Filmski intervjui', + 'film_reviews' => 'Filmske recenzije', + 'tv_reviews' => 'Televizijske recenzije', ], 'publish_form' => [ - 'back_to_podcast_dashboard' => 'Back to podcast dashboard', - 'post' => 'Your announcement post', + 'back_to_podcast_dashboard' => 'Nazad na komandnu tablu podkasta', + 'post' => 'Najava vaše objave', 'post_hint' => - "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'submit' => 'Publish', - 'publication_date' => 'Publication date', + "Napišite poruku kako bi ste najavili objavljivanje vašeg podkasta. Ova poruka će biti istaknuta na početnoj stranici vašeg podkasta.", + 'message_placeholder' => 'Napišite poruku…', + 'submit' => 'Objavi', + 'publication_date' => 'Datum objavljivanja', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', + 'now' => 'Sada', + 'schedule' => 'Raspored', ], - 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date' => 'Planiran datum objave', 'scheduled_publication_date_hint' => - 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', - 'message_warning' => 'You did not write a message for your announcement post!', - 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', - 'message_warning_submit' => 'Publish anyway', + 'Možete zakazati objavu podkasta u budućnosti. Ovo polje mora biti popunjeno u YYYY-MM-DD HH:mm formatu', + 'submit_edit' => 'Uredi objavu', + 'cancel_publication' => 'Poništi objavu', + 'message_warning' => 'Niste napisali poruku za najavu objave!', + 'message_warning_hint' => 'Poruka povećava šanse za angažovanjem na društvenim mrežama, rezultirajući u većoj vidljivosti vašeg podkasta.', + 'message_warning_submit' => 'Objavi svakako', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', - 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + 'draft_mode' => 'režim nacrta', + 'not_published' => 'Ovaj podkast nije još uvek objavljen.', + 'scheduled' => 'Ovaj podkast je zakazan za objavu {publication_date}.', ], 'delete_form' => [ 'disclaimer' => - "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", - 'understand' => 'I understand, I want the podcast to be permanently deleted', - 'submit' => 'Delete', + "Brisanjem podkasta obrisaće se i sve epizode, medijske datoteke, objave i analitika povezana sa njim. Ova radnja je nepovratna, nakon toga nećete više moći da ih preuzmete ili povratite.", + 'understand' => 'Razumem, želim da trajno obrišem podkast', + 'submit' => 'Obriši', ], - 'by' => 'By {publisher}', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'by' => 'Od {publisher}', + 'season' => 'Sezona {seasonNumber}', + 'list_of_episodes_year' => '{year} epizoda ({episodeCount})', 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', + 'Sezona {seasonNumber} epizoda ({episodeCount})', + 'no_episode' => 'Nijedna epizode nije pronađena!', 'follow' => 'Follow', 'followers' => '{numberOfFollowers, plural, one {# follower} diff --git a/modules/Admin/Language/sr_Latn/PodcastNavigation.php b/modules/Admin/Language/sr_Latn/PodcastNavigation.php index b4d7ddc0..491b6773 100644 --- a/modules/Admin/Language/sr_Latn/PodcastNavigation.php +++ b/modules/Admin/Language/sr_Latn/PodcastNavigation.php @@ -32,7 +32,7 @@ return [ 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', - 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-podcasting' => 'Podkasting', + 'platforms-social' => 'Društvene mreže', + 'platforms-funding' => 'Finansiranje', ]; diff --git a/modules/Admin/Language/sr_Latn/Settings.php b/modules/Admin/Language/sr_Latn/Settings.php index 4a70dcba..650bd13d 100644 --- a/modules/Admin/Language/sr_Latn/Settings.php +++ b/modules/Admin/Language/sr_Latn/Settings.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'General settings', + 'title' => 'Opšta podešavanja', 'instance' => [ 'title' => 'Instance', - 'site_icon' => 'Site icon', - 'site_icon_delete' => 'Delete site icon', + 'site_icon' => 'Ikonica sajta', + 'site_icon_delete' => 'Obriši ikonicu sajta', 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', 'site_name' => 'Site name', diff --git a/modules/Admin/Language/sv/Charts.php b/modules/Admin/Language/sv/Charts.php index 708e96f8..868b40fd 100644 --- a/modules/Admin/Language/sv/Charts.php +++ b/modules/Admin/Language/sv/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Dagligen använd bandbredd (i MB)', 'total_storage_by_month' => 'Månadslagring (i MB)', 'total_bandwidth_by_month' => 'Månatlig använd bandbredd (i MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/sv/Episode.php b/modules/Admin/Language/sv/Episode.php index 98280f8d..b289b8df 100644 --- a/modules/Admin/Language/sv/Episode.php +++ b/modules/Admin/Language/sv/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => 'Avsnitt', 'visibility' => 'Synlighet', + 'downloads' => 'Downloads', 'comments' => 'Kommentarer', 'actions' => 'Åtgärder', ], diff --git a/modules/Admin/Language/uk/AboutCastopod.php b/modules/Admin/Language/uk/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/uk/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/uk/Breadcrumb.php b/modules/Admin/Language/uk/Breadcrumb.php new file mode 100644 index 00000000..558b90f7 --- /dev/null +++ b/modules/Admin/Language/uk/Breadcrumb.php @@ -0,0 +1,55 @@ + 'breadcrumb', + config('Admin') + ->gateway => 'Home', + 'podcasts' => 'podcasts', + 'episodes' => 'episodes', + 'subscriptions' => 'subscriptions', + 'contributors' => 'contributors', + 'pages' => 'pages', + 'settings' => 'settings', + 'theme' => 'theme', + 'about' => 'about', + 'add' => 'add', + 'new' => 'new', + 'edit' => 'edit', + 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'publish-date-edit' => 'edit publication date', + 'unpublish' => 'unpublish', + 'delete' => 'delete', + 'remove' => 'remove', + 'fediverse' => 'fediverse', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', + 'users' => 'users', + 'my-account' => 'my account', + 'change-password' => 'change password', + 'import' => 'feed import', + 'platforms' => 'platforms', + 'social' => 'social networks', + 'funding' => 'funding', + 'analytics' => 'analytics', + 'locations' => 'locations', + 'webpages' => 'web pages', + 'unique-listeners' => 'unique listeners', + 'players' => 'players', + 'listening-time' => 'listening time', + 'time-periods' => 'time periods', + 'soundbites' => 'soundbites', + 'video-clips' => 'video clips', + 'embed' => 'embeddable player', + 'notifications' => 'notifications', + 'suspend' => 'suspend', +]; diff --git a/modules/Admin/Language/uk/Charts.php b/modules/Admin/Language/uk/Charts.php new file mode 100644 index 00000000..6ede2510 --- /dev/null +++ b/modules/Admin/Language/uk/Charts.php @@ -0,0 +1,41 @@ + 'Episode downloads by service (for the past week)', + 'by_player_weekly' => 'Episode downloads by player (for the past week)', + 'by_player_yearly' => 'Episode downloads by player (for the past year)', + 'by_device_weekly' => 'Episode downloads by device (for the past week)', + 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', + 'podcast_by_region' => 'Episode downloads by region (for the past week)', + 'unique_daily_listeners' => 'Daily unique listeners', + 'unique_monthly_listeners' => 'Monthly unique listeners', + 'by_browser' => 'Web pages usage by browser (for the past week)', + 'podcast_by_day' => 'Episode daily downloads', + 'podcast_by_month' => 'Episode monthly downloads', + 'episode_by_day' => 'Episode daily downloads (first 60 days)', + 'episode_by_month' => 'Episode monthly downloads', + 'episodes_by_day' => + '5 latest episodes downloads (during their first 60 days)', + 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_yearly' => 'Episode downloads by country (for the past year)', + 'by_domain_weekly' => 'Web pages visits by source (for the past week)', + 'by_domain_yearly' => 'Web pages visits by source (for the past year)', + 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + 'podcast_bots' => 'Bots (crawlers)', + 'daily_listening_time' => 'Daily cumulative listening time', + 'monthly_listening_time' => 'Monthly cumulative listening time', + 'by_weekday' => 'By week day (for the past 60 days)', + 'by_hour' => 'By time of day (for the past 60 days)', + 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', + 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', +]; diff --git a/modules/Admin/Language/uk/Common.php b/modules/Admin/Language/uk/Common.php new file mode 100644 index 00000000..596c8bcd --- /dev/null +++ b/modules/Admin/Language/uk/Common.php @@ -0,0 +1,51 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'more' => 'More', + 'no_data' => 'No data found!', + 'close' => 'Close', + 'edit' => 'Edit', + 'copy' => 'Copy', + 'copied' => 'Copied!', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', + 'forms' => [ + 'editor' => [ + 'write' => 'Write', + 'preview' => 'Preview', + 'help' => 'Powered by markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Press to select', + 'loadingText' => 'Loading…', + 'noResultsText' => 'No results found', + 'noChoicesText' => 'No choices to choose from', + 'maxItemText' => 'Cannot add more items', + ], + 'upload_file' => 'Upload a file', + 'remote_url' => 'Remote URL', + ], + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'size_limit' => 'Size limit: {0}.', + 'choose_interact' => 'Choose how to interact', + 'view' => 'View', +]; diff --git a/modules/Admin/Language/uk/Countries.php b/modules/Admin/Language/uk/Countries.php new file mode 100644 index 00000000..4cd5d9c8 --- /dev/null +++ b/modules/Admin/Language/uk/Countries.php @@ -0,0 +1,264 @@ + 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia, Plurinational State of', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, the Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => "Côte d'Ivoire", + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cape Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia, Federated States of', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran, Islamic Republic of', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao People's Democratic Republic", + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'N/A' => 'Not Applicable (local IP…)', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Swaziland', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See (Vatican City State)', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/uk/Dashboard.php b/modules/Admin/Language/uk/Dashboard.php new file mode 100644 index 00000000..881073fd --- /dev/null +++ b/modules/Admin/Language/uk/Dashboard.php @@ -0,0 +1,28 @@ + 'Admin dashboard', + 'welcome_message' => 'Welcome to the admin area!', + 'podcasts' => [ + 'title' => 'Podcasts', + 'not_found' => 'No published podcast', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'episodes' => [ + 'title' => 'Episodes', + 'not_found' => 'No published episode', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'storage' => [ + 'title' => 'Storage', + 'subtitle' => '{totalUploaded} out of {totalStorage}', + ], +]; diff --git a/modules/Admin/Language/uk/Episode.php b/modules/Admin/Language/uk/Episode.php new file mode 100644 index 00000000..98498bee --- /dev/null +++ b/modules/Admin/Language/uk/Episode.php @@ -0,0 +1,214 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'edit' => 'Edit', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'publish_date_edit' => 'Edit publication date', + 'unpublish' => 'Unpublish', + 'publish_error' => 'Episode is already published.', + 'publish_edit_error' => 'Episode is already published.', + 'publish_cancel_error' => 'Episode is already published.', + 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', + 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', + 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'unpublish_error' => 'Episode is not published.', + 'delete' => 'Delete', + 'go_to_page' => 'Go to page', + 'create' => 'Add an episode', + 'publication_status' => [ + 'published' => 'Published', + 'with_podcast' => 'Published', + 'scheduled' => 'Scheduled', + 'not_published' => 'Not published', + ], + 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Search for an episode', + 'clear' => 'Clear search', + 'submit' => 'Search', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# episode} + other {# episodes} + }', + 'episode' => 'Episode', + 'visibility' => 'Visibility', + 'downloads' => 'Downloads', + 'comments' => 'Comments', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'Episode has been successfully created!', + 'editSuccess' => 'Episode has been successfully updated!', + 'publishSuccess' => '{publication_status, select, + published {Episode successfully published!} + scheduled {Episode publication successfully scheduled!} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not published.} + }', + 'publishCancelSuccess' => 'Episode publication successfully cancelled!', + 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', + 'scheduleDateError' => 'Schedule date must be set!', + 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'deleteSuccess' => 'Episode successfully deleted!', + 'deleteError' => 'Failed to delete episode {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_path}. You may manually remove it from your disk.', + 'sameSlugError' => 'An episode with the chosen slug already exists.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapters', + 'chapters_hint' => 'File must be in JSON Chapters format.', + 'chapters_download' => 'Download chapters', + 'chapters_file' => 'Chapters file', + 'chapters_remote_url' => 'Remote url for chapters file', + 'chapters_file_delete' => 'Delete chapters file', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the episode', + 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', + 'block' => 'Episode should be hidden from public catalogues', + 'block_hint' => + 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'submit_create' => 'Create episode', + 'submit_edit' => 'Save episode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Back to episode dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + 'with_podcast' => 'Publish alongside podcast', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', + 'message_warning_submit' => 'Publish anyways', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'New publication date', + 'new_publication_date_hint' => 'Must be set to a past date.', + 'submit' => 'Edit publication date', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + 'understand' => 'I understand, I want to delete the episode', + 'submit' => 'Delete', + ], + 'embed' => [ + 'title' => 'Embeddable player', + 'label' => + 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', + 'clipboard_iframe' => 'Copy embeddable player to clipboard', + 'clipboard_url' => 'Copy address to clipboard', + 'dark' => 'Dark', + 'dark-transparent' => 'Dark transparent', + 'light' => 'Light', + 'light-transparent' => 'Light transparent', + ], +]; diff --git a/modules/Admin/Language/uk/EpisodeNavigation.php b/modules/Admin/Language/uk/EpisodeNavigation.php new file mode 100644 index 00000000..1406e301 --- /dev/null +++ b/modules/Admin/Language/uk/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'View episode page', + 'dashboard' => 'Episode dashboard', + 'episode-view' => 'Home', + 'episode-edit' => 'Edit episode', + 'episode-persons-manage' => 'Manage persons', + 'embed-add' => 'Embeddable player', + 'clips' => 'Clips', + 'video-clips-list' => 'Video clips', + 'video-clips-create' => 'New video clip', + 'soundbites-list' => 'Soundbites', + 'soundbites-create' => 'New soundbite', +]; diff --git a/modules/Admin/Language/uk/Fediverse.php b/modules/Admin/Language/uk/Fediverse.php new file mode 100644 index 00000000..0e4ca66d --- /dev/null +++ b/modules/Admin/Language/uk/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'The account could not be found!', + 'blockActorSuccess' => '{actor} has been blocked!', + 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockDomainSuccess' => '{domain} has been blocked!', + 'unblockDomainSuccess' => '{domain} has been unblocked!', + ], + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/modules/Admin/Language/uk/Home.php b/modules/Admin/Language/uk/Home.php new file mode 100644 index 00000000..6249bab1 --- /dev/null +++ b/modules/Admin/Language/uk/Home.php @@ -0,0 +1,14 @@ + 'Усі подкасти', + 'no_podcast' => 'Подкастів не знайдено', +]; diff --git a/modules/Admin/Language/uk/Install.php b/modules/Admin/Language/uk/Install.php new file mode 100644 index 00000000..814cd8c2 --- /dev/null +++ b/modules/Admin/Language/uk/Install.php @@ -0,0 +1,61 @@ + 'Ручне налаштування', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Ім\'я хоста бази даних', + 'db_name' => 'Назва бази даних', + 'db_username' => 'Ім\'я користувача бази даних', + 'db_password' => 'Пароль бази даних', + 'db_prefix' => 'Префікс бази даних', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Обробник кешу', + 'cacheHandlerOptions' => [ + 'file' => 'Файл', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Далі', + 'submit' => 'Завершити установку', + 'create_superadmin' => 'Створіть свій обліковий запис головного адміністратора', + 'email' => 'Пошта', + 'username' => 'Ім\'я користувача', + 'password' => 'Пароль', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Ваш обліковий запис суперадміністратора було успішно створено. Увійдіть, щоб почати подкасти!', + 'databaseConnectError' => + 'Кастопод не зміг підключитись до бази даних. Змініть конфігурацію бази даних і повторіть спробу.', + 'writeError' => + "Не вдалося створити/записати файл `.env`. Ви повинні створити його вручну, перейшовши шаблон файлу `.env.example` в пакеті Castopode.", + ], +]; diff --git a/modules/Admin/Language/uk/Navigation.php b/modules/Admin/Language/uk/Navigation.php new file mode 100644 index 00000000..610f1434 --- /dev/null +++ b/modules/Admin/Language/uk/Navigation.php @@ -0,0 +1,42 @@ + 'Toggle sidebar', + 'go_to_website' => 'Go to website', + 'go_to_admin' => 'Go to admin', + 'dashboard' => 'Dashboard', + 'admin' => 'Home', + 'podcasts' => 'Podcasts', + 'podcast-list' => 'All podcasts', + 'podcast-create' => 'New podcast', + 'podcast-import' => 'Import a podcast', + 'persons' => 'Persons', + 'person-list' => 'All persons', + 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', + 'users' => 'Users', + 'user-list' => 'All users', + 'user-create' => 'New user', + 'pages' => 'Pages', + 'page-list' => 'All pages', + 'page-create' => 'New Page', + 'settings' => 'Settings', + 'settings-general' => 'General', + 'settings-theme' => 'Theme', + 'about' => 'About', + 'account' => [ + 'my-account' => 'My account', + 'change-password' => 'Change password', + 'logout' => 'Logout', + ], +]; diff --git a/modules/Admin/Language/uk/Notifications.php b/modules/Admin/Language/uk/Notifications.php new file mode 100644 index 00000000..2b139d51 --- /dev/null +++ b/modules/Admin/Language/uk/Notifications.php @@ -0,0 +1,19 @@ + 'Notifications', + 'reply' => '{actor_username} replied to your post', + 'favourite' => '{actor_username} favourited your post', + 'reblog' => '{actor_username} shared your post', + 'follow' => '{actor_username} started following you', + 'no_notifications' => 'No notifications', + 'mark_all_as_read' => 'Mark all as read', +]; diff --git a/modules/Admin/Language/uk/Page.php b/modules/Admin/Language/uk/Page.php new file mode 100644 index 00000000..b6f49de5 --- /dev/null +++ b/modules/Admin/Language/uk/Page.php @@ -0,0 +1,30 @@ + 'Back to home', + 'page' => 'Page', + 'all_pages' => 'All pages', + 'create' => 'New page', + 'go_to_page' => 'Go to page', + 'edit' => 'Edit page', + 'delete' => 'Delete page', + 'form' => [ + 'title' => 'Title', + 'permalink' => 'Permalink', + 'content' => 'Content', + 'submit_create' => 'Create page', + 'submit_edit' => 'Save', + ], + 'messages' => [ + 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'editSuccess' => 'The page was successfully updated!', + ], +]; diff --git a/modules/Admin/Language/uk/Pager.php b/modules/Admin/Language/uk/Pager.php new file mode 100644 index 00000000..c940f604 --- /dev/null +++ b/modules/Admin/Language/uk/Pager.php @@ -0,0 +1,21 @@ + 'Навігація між сторінками', + 'first' => 'Перший', + 'previous' => 'Попередній', + 'next' => 'Наступний', + 'last' => 'Останній', + 'older' => 'Старші', + 'newer' => 'Новіші', + 'invalidTemplate' => '{0} не є правильним шаблоном Пейджера.', + 'invalidPaginationGroup' => '{0} - некоректна група нумерацій.', +]; diff --git a/modules/Admin/Language/uk/Person.php b/modules/Admin/Language/uk/Person.php new file mode 100644 index 00000000..a652be9f --- /dev/null +++ b/modules/Admin/Language/uk/Person.php @@ -0,0 +1,65 @@ + 'Persons', + 'all_persons' => 'All persons', + 'no_person' => 'Nobody found!', + 'create' => 'Create a person', + 'view' => 'View person', + 'edit' => 'Edit person', + 'delete' => 'Delete person', + 'messages' => [ + 'createSuccess' => 'Person has been successfully created!', + 'editSuccess' => 'Person has been successfully updated!', + 'deleteSuccess' => 'Person has been removed!', + ], + 'form' => [ + 'avatar' => 'Avatar', + 'avatar_size_hint' => + 'Avatar must be squared and at least 400px wide and tall.', + 'full_name' => 'Full name', + 'full_name_hint' => 'This is the full name or alias of the person.', + 'unique_name' => 'Unique name', + 'unique_name_hint' => 'Used for URLs', + 'information_url' => 'Information URL', + 'information_url_hint' => + 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', + 'submit_create' => 'Create person', + 'submit_edit' => 'Save person', + ], + 'podcast_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this podcast', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'episode_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this episode', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'credits' => 'Credits', +]; diff --git a/modules/Admin/Language/uk/Platforms.php b/modules/Admin/Language/uk/Platforms.php new file mode 100644 index 00000000..ab17d599 --- /dev/null +++ b/modules/Admin/Language/uk/Platforms.php @@ -0,0 +1,30 @@ + 'Platforms', + 'home_url' => 'Go to {platformName} website', + 'submit_url' => 'Submit your podcast on {platformName}', + 'visible' => 'Display in podcast homepage?', + 'on_embed' => 'Display on embeddable player?', + 'remove' => 'Remove {platformName}', + 'submit' => 'Save', + 'messages' => [ + 'updateSuccess' => 'Platform links have been successfully updated!', + 'removeLinkSuccess' => 'The platform link has been removed.', + 'removeLinkError' => + 'The platform link could not be removed. Try again.', + ], + 'description' => [ + 'podcasting' => 'The podcast ID on this platform', + 'social' => 'The podcast account ID on this platform', + 'funding' => 'Call to action message', + ], +]; diff --git a/modules/Admin/Language/uk/Podcast.php b/modules/Admin/Language/uk/Podcast.php new file mode 100644 index 00000000..2d46aff5 --- /dev/null +++ b/modules/Admin/Language/uk/Podcast.php @@ -0,0 +1,314 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found!', + 'create' => 'Create podcast', + 'import' => 'Import podcast', + 'new_episode' => 'New Episode', + 'view' => 'View podcast', + 'edit' => 'Edit podcast', + 'publish' => 'Publish podcast', + 'publish_edit' => 'Edit publication', + 'delete' => 'Delete podcast', + 'see_episodes' => 'See episodes', + 'see_contributors' => 'See contributors', + 'go_to_page' => 'Go to page', + 'latest_episodes' => 'Latest episodes', + 'see_all_episodes' => 'See all episodes', + 'draft' => 'Draft', + 'messages' => [ + 'createSuccess' => 'Podcast successfully created!', + 'editSuccess' => 'Podcast has been successfully updated!', + 'importSuccess' => 'Podcast has been successfully imported!', + 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, + cover {cover} + banner {banner} + other {media} + }.', + 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, + one {# episode was} + other {# episodes were} + } added to the podcast!', + 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', + 'publishError' => 'This podcast is either already published or scheduled for publication.', + 'publishEditError' => 'This podcast is not scheduled for publication.', + 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', + 'scheduleDateError' => 'Schedule date must be set!', + ], + 'form' => [ + 'identity_section_title' => 'Podcast identity', + 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'cover' => 'Podcast cover', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'banner' => 'Podcast banner', + 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_delete' => 'Delete podcast banner', + 'title' => 'Title', + 'handle' => 'Handle', + 'handle_hint' => + 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'type' => [ + 'label' => 'Type', + 'episodic' => 'Episodic', + 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', + 'serial' => 'Serial', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + ], + 'description' => 'Description', + 'classification_section_title' => 'Classification', + 'classification_section_subtitle' => + 'These fields will impact your audience and competition.', + 'language' => 'Language', + 'category' => 'Category', + 'category_placeholder' => 'Select a category…', + 'other_categories' => 'Other categories', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does it contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'author_section_title' => 'Author', + 'author_section_subtitle' => 'Who is managing the podcast?', + 'owner_name' => 'Owner name', + 'owner_name_hint' => + 'For administrative use only. Visible in the public RSS feed.', + 'owner_email' => 'Owner email', + 'owner_email_hint' => + 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'publisher' => 'Publisher', + 'publisher_hint' => + 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'copyright' => 'Copyright', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this podcast about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real place or fictional', + 'monetization_section_title' => 'Monetization', + 'monetization_section_subtitle' => + 'Earn money thanks to your audience.', + 'premium' => 'Premium', + 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_enable' => 'Enable OP3 analytics service', + 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'payment_pointer_hint' => + 'This is your where you will receive money thanks to Web Monetization', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the podcast', + 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'new_feed_url' => 'New feed URL', + 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', + 'old_feed_url' => 'Old feed URL', + 'update_feed' => 'Update feed', + 'update_feed_tip' => 'Import this podcast\'s latest episodes', + 'partnership' => 'Partnership', + 'partner_id' => 'ID', + 'partner_link_url' => 'Link URL', + 'partner_image_url' => 'Image URL', + 'partner_id_hint' => 'Your own partner ID', + 'partner_link_url_hint' => 'The generic partner link address', + 'partner_image_url_hint' => 'The generic partner image address', + 'status_section_title' => 'Status', + 'block' => 'Podcast should be hidden from public catalogues', + 'block_hint' => + 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'complete' => 'Podcast will not be having new episodes', + 'lock' => 'Prevent podcast from being copied', + 'lock_hint' => + 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', + 'submit_create' => 'Create podcast', + 'submit_edit' => 'Save podcast', + ], + 'category_options' => [ + 'uncategorized' => 'uncategorized', + 'arts' => 'Arts', + 'business' => 'Business', + 'comedy' => 'Comedy', + 'education' => 'Education', + 'fiction' => 'Fiction', + 'government' => 'Government', + 'health_and_fitness' => 'Health & Fitness', + 'history' => 'History', + 'kids_and_family' => 'Kids & Family', + 'leisure' => 'Leisure', + 'music' => 'Music', + 'news' => 'News', + 'religion_and_spirituality' => 'Religion & Spirituality', + 'science' => 'Science', + 'society_and_culture' => 'Society & Culture', + 'sports' => 'Sports', + 'technology' => 'Technology', + 'true_crime' => 'True Crime', + 'tv_and_film' => 'TV & Film', + 'books' => 'Books', + 'design' => 'Design', + 'fashion_and_beauty' => 'Fashion & Beauty', + 'food' => 'Food', + 'performing_arts' => 'Performing Arts', + 'visual_arts' => 'Visual Arts', + 'careers' => 'Careers', + 'entrepreneurship' => 'Entrepreneurship', + 'investing' => 'Investing', + 'management' => 'Management', + 'marketing' => 'Marketing', + 'non_profit' => 'Non-Profit', + 'comedy_interviews' => 'Comedy Interviews', + 'improv' => 'Improv', + 'stand_up' => 'Stand-Up', + 'courses' => 'Courses', + 'how_to' => 'How To', + 'language_learning' => 'Language Learning', + 'self_improvement' => 'Self-Improvement', + 'comedy_fiction' => 'Comedy Fiction', + 'drama' => 'Drama', + 'science_fiction' => 'Science Fiction', + 'alternative_health' => 'Alternative Health', + 'fitness' => 'Fitness', + 'medicine' => 'Medicine', + 'mental_health' => 'Mental Health', + 'nutrition' => 'Nutrition', + 'sexuality' => 'Sexuality', + 'education_for_kids' => 'Education for Kids', + 'parenting' => 'Parenting', + 'pets_and_animals' => 'Pets & Animals', + 'stories_for_kids' => 'Stories for Kids', + 'animation_and_manga' => 'Animation & Manga', + 'automotive' => 'Automotive', + 'aviation' => 'Aviation', + 'crafts' => 'Crafts', + 'games' => 'Games', + 'hobbies' => 'Hobbies', + 'home_and_garden' => 'Home & Garden', + 'video_games' => 'Video Games', + 'music_commentary' => 'Music Commentary', + 'music_history' => 'Music History', + 'music_interviews' => 'Music Interviews', + 'business_news' => 'Business News', + 'daily_news' => 'Daily News', + 'entertainment_news' => 'Entertainment News', + 'news_commentary' => 'News Commentary', + 'politics' => 'Politics', + 'sports_news' => 'Sports News', + 'tech_news' => 'Tech News', + 'buddhism' => 'Buddhism', + 'christianity' => 'Christianity', + 'hinduism' => 'Hinduism', + 'islam' => 'Islam', + 'judaism' => 'Judaism', + 'religion' => 'Religion', + 'spirituality' => 'Spirituality', + 'astronomy' => 'Astronomy', + 'chemistry' => 'Chemistry', + 'earth_sciences' => 'Earth Sciences', + 'life_sciences' => 'Life Sciences', + 'mathematics' => 'Mathematics', + 'natural_sciences' => 'Natural Sciences', + 'nature' => 'Nature', + 'physics' => 'Physics', + 'social_sciences' => 'Social Sciences', + 'documentary' => 'Documentary', + 'personal_journals' => 'Personal Journals', + 'philosophy' => 'Philosophy', + 'places_and_travel' => 'Places & Travel', + 'relationships' => 'Relationships', + 'baseball' => 'Baseball', + 'basketball' => 'Basketball', + 'cricket' => 'Cricket', + 'fantasy_sports' => 'Fantasy Sports', + 'football' => 'Football', + 'golf' => 'Golf', + 'hockey' => 'Hockey', + 'rugby' => 'Rugby', + 'running' => 'Running', + 'soccer' => 'Soccer', + 'swimming' => 'Swimming', + 'tennis' => 'Tennis', + 'volleyball' => 'Volleyball', + 'wilderness' => 'Wilderness', + 'wrestling' => 'Wrestling', + 'after_shows' => 'After Shows', + 'film_history' => 'Film History', + 'film_interviews' => 'Film Interviews', + 'film_reviews' => 'Film Reviews', + 'tv_reviews' => 'TV Reviews', + ], + 'publish_form' => [ + 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'submit' => 'Publish', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', + 'message_warning_submit' => 'Publish anyway', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'not_published' => 'This podcast is not yet published.', + 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", + 'understand' => 'I understand, I want the podcast to be permanently deleted', + 'submit' => 'Delete', + ], + 'by' => 'By {publisher}', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', +]; diff --git a/modules/Admin/Language/uk/PodcastImport.php b/modules/Admin/Language/uk/PodcastImport.php new file mode 100644 index 00000000..7c3ef67d --- /dev/null +++ b/modules/Admin/Language/uk/PodcastImport.php @@ -0,0 +1,37 @@ + + 'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', + 'old_podcast_section_title' => 'The podcast to import', + 'old_podcast_section_subtitle' => + 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', + 'imported_feed_url' => 'Feed URL', + 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', + 'new_podcast_section_title' => 'The new podcast', + 'advanced_params_section_title' => 'Advanced parameters', + 'advanced_params_section_subtitle' => + 'Keep the default values if you have no idea of what the fields are for.', + 'slug_field' => 'Field to be used to calculate episode slug', + 'description_field' => + 'Source field used for episode description / show notes', + 'force_renumber' => 'Force episodes renumbering', + 'force_renumber_hint' => + 'Use this if your podcast does not have episode numbers but wish to set them during import.', + 'season_number' => 'Season number', + 'season_number_hint' => + 'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.', + 'max_episodes' => 'Maximum number of episodes to import', + 'max_episodes_hint' => 'Leave blank to import all episodes', + 'lock_import' => + 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.', + 'submit' => 'Import podcast', +]; diff --git a/modules/Admin/Language/uk/PodcastNavigation.php b/modules/Admin/Language/uk/PodcastNavigation.php new file mode 100644 index 00000000..b4d7ddc0 --- /dev/null +++ b/modules/Admin/Language/uk/PodcastNavigation.php @@ -0,0 +1,38 @@ + 'Go to podcast page', + 'dashboard' => 'Podcast dashboard', + 'podcast-view' => 'Home', + 'podcast-edit' => 'Edit podcast', + 'podcast-persons-manage' => 'Manage persons', + 'episodes' => 'Episodes', + 'episode-list' => 'All episodes', + 'episode-create' => 'New episode', + 'analytics' => 'Analytics', + 'podcast-analytics' => 'Audience overview', + 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-players' => 'Players', + 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-time-periods' => 'Time periods', + 'premium' => 'Premium', + 'subscription-list' => 'All subscriptions', + 'subscription-add' => 'Add subscription', + 'contributors' => 'Contributors', + 'contributor-list' => 'All contributors', + 'contributor-add' => 'Add contributor', + 'platforms' => 'External platforms', + 'platforms-podcasting' => 'Podcasting', + 'platforms-social' => 'Social networks', + 'platforms-funding' => 'Funding', +]; diff --git a/modules/Admin/Language/uk/Settings.php b/modules/Admin/Language/uk/Settings.php new file mode 100644 index 00000000..4a70dcba --- /dev/null +++ b/modules/Admin/Language/uk/Settings.php @@ -0,0 +1,58 @@ + 'General settings', + 'instance' => [ + 'title' => 'Instance', + 'site_icon' => 'Site icon', + 'site_icon_delete' => 'Delete site icon', + 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_name' => 'Site name', + 'site_description' => 'Site description', + 'submit' => 'Save', + 'editSuccess' => 'Instance has been updated successfully!', + 'deleteIconSuccess' => 'Site icon has been remove successfully!', + ], + 'images' => [ + 'title' => 'Images', + 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'regenerate' => 'Regenerate images', + 'regenerationSuccess' => 'All images have been regenerated successfully!', + ], + 'housekeeping' => [ + 'title' => 'Housekeeping', + 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', + 'reset_counts' => 'Reset counts', + 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', + 'rewrite_media' => 'Rewrite media metadata', + 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', + 'rename_episodes_files' => 'Rename episode audio files', + 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'clear_cache' => 'Clear all cache', + 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'run' => 'Run housekeeping', + 'runSuccess' => 'Housekeeping has been run successfully!', + ], + 'theme' => [ + 'title' => 'Theme', + 'accent_section_title' => 'Accent color', + 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', + 'pine' => 'Pine', + 'crimson' => 'Crimson', + 'amber' => 'Amber', + 'lake' => 'Lake', + 'jacaranda' => 'Jacaranda', + 'onyx' => 'Onyx', + 'submit' => 'Save', + 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + ], +]; diff --git a/modules/Admin/Language/uk/Soundbite.php b/modules/Admin/Language/uk/Soundbite.php new file mode 100644 index 00000000..a3f828fe --- /dev/null +++ b/modules/Admin/Language/uk/Soundbite.php @@ -0,0 +1,31 @@ + [ + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', + ], + 'messages' => [ + 'createSuccess' => 'Soundbite has been successfully created!', + 'deleteSuccess' => 'Soundbite has been successfully removed!', + ], + 'form' => [ + 'title' => 'New soundbite', + 'soundbite_title' => 'Soundbite title', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'submit' => 'Create soundbite', + ], + 'play' => 'Play soundbite', + 'stop' => 'Stop soundbite', + 'create' => 'New soundbite', + 'delete' => 'Delete soundbite', +]; diff --git a/modules/Admin/Language/uk/Validation.php b/modules/Admin/Language/uk/Validation.php new file mode 100644 index 00000000..3bc78cfe --- /dev/null +++ b/modules/Admin/Language/uk/Validation.php @@ -0,0 +1,16 @@ + + '{field} is either not an image, or it is not wide or tall enough.', + 'is_image_ratio' => + '{field} is either not an image or not of the right ratio.', +]; diff --git a/modules/Admin/Language/uk/VideoClip.php b/modules/Admin/Language/uk/VideoClip.php new file mode 100644 index 00000000..638de697 --- /dev/null +++ b/modules/Admin/Language/uk/VideoClip.php @@ -0,0 +1,72 @@ + [ + 'title' => 'Video clips', + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Clip is waiting to be processed.', + 'pending' => 'pending', + 'pending_hint' => 'Clip will be generated shortly.', + 'running' => 'running', + 'running_hint' => 'Clip is being generated.', + 'failed' => 'failed', + 'failed_hint' => 'Clip could not be generated: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Clip was generated successfully!', + ], + 'clip' => 'Clip', + 'duration' => 'Job duration', + ], + 'title' => 'Video clip: {videoClipLabel}', + 'download_clip' => 'Download clip', + 'create' => 'New video clip', + 'go_to_page' => 'Go to clip page', + 'retry' => 'Retry clip generation', + 'delete' => 'Delete clip', + 'logs' => 'Job logs', + 'messages' => [ + 'alreadyExistingError' => 'The video clip you are trying to create already exists!', + 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', + 'deleteSuccess' => 'Video clip has been successfully removed!', + ], + 'format' => [ + 'landscape' => 'Landscape', + 'portrait' => 'Portrait', + 'squared' => 'Squared', + ], + 'form' => [ + 'title' => 'New video clip', + 'params_section_title' => 'Video clip parameters', + 'clip_title' => 'Clip title', + 'format' => [ + 'label' => 'Choose a format', + 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', + 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', + 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + ], + 'theme' => 'Select a theme', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'trim_start' => 'Trim start', + 'trim_end' => 'Trim end', + 'submit' => 'Create video clip', + ], + 'requirements' => [ + 'title' => 'Missing requirements', + 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'ffmpeg' => 'FFmpeg', + 'gd' => 'Graphics Draw (GD)', + 'freetype' => 'Freetype library for GD', + 'transcript' => 'Transcript file (.srt)', + ], +]; diff --git a/modules/Admin/Language/zh-Hans/Charts.php b/modules/Admin/Language/zh-Hans/Charts.php index e623691a..92a6e4c2 100644 --- a/modules/Admin/Language/zh-Hans/Charts.php +++ b/modules/Admin/Language/zh-Hans/Charts.php @@ -37,4 +37,5 @@ return [ 'podcast_by_bandwidth' => '每日使用带宽(MB)', 'total_storage_by_month' => '每月存储量 (MB)', 'total_bandwidth_by_month' => '每月使用带宽(MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', ]; diff --git a/modules/Admin/Language/zh-Hans/Episode.php b/modules/Admin/Language/zh-Hans/Episode.php index 6495f1a3..3c0afc81 100644 --- a/modules/Admin/Language/zh-Hans/Episode.php +++ b/modules/Admin/Language/zh-Hans/Episode.php @@ -55,6 +55,7 @@ return [ }', 'episode' => '剧集', 'visibility' => '可见性', + 'downloads' => 'Downloads', 'comments' => '评论', 'actions' => '操作', ], diff --git a/modules/Auth/Language/ca/Auth.php b/modules/Auth/Language/ca/Auth.php index a47932e3..b939afe2 100644 --- a/modules/Auth/Language/ca/Auth.php +++ b/modules/Auth/Language/ca/Auth.php @@ -11,84 +11,84 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Propietari de la instància', + 'description' => 'Propietari del Castopod.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Super administrador', + 'description' => 'Té control complet sobre Castopod.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Administrador', + 'description' => 'Administra el contingut de Castopod.', ], 'podcaster' => [ 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'description' => 'Usos generals de Castopod.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => 'Pot accedir a l\'àrea d\'administració de Castopod.', + 'admin.settings' => 'Pot accedir a la configuració de Castopod.', + 'users.manage' => 'Pot administrar els usuaris de Castopod.', + 'persons.manage' => 'Pot administrar persones.', + 'pages.manage' => 'Pot administrar pàgines.', + 'podcasts.view' => 'Pot veure els pòdcasts.', + 'podcasts.create' => 'Pot crear nous pòdcasts.', + 'podcasts.import' => 'Pot importar pòdcasts.', + 'fediverse.manage-blocks' => 'Pot evitar que actors/dominis del fedivers interactuen amb Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Propietari del pòdcast', + 'description' => 'El propietari del pòdcast.', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => 'Administrador', + 'description' => 'Té control complet del pòdcast #{id}.', ], 'editor' => [ 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'description' => 'Administra els continguts i la publicació del pòdcast #{id}.', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => 'Autor', + 'description' => 'Administra el contingut del podcast #{id} però no el pot publicar.', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => 'Convidat', + 'description' => 'Col·laborador general del podcast #{id}.', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => 'Pot veure el tauler i les estadístiques del podcast #{id}.', + 'edit' => 'Pot editar el podcast #{id}.', + 'delete' => 'Pot suprimir el podcast #{id}.', + 'manage-import' => 'Pot sincronitzar el podcast importat #{id}.', + 'manage-persons' => 'Pot gestionar les subscripcions del podcast #{id}.', + 'manage-subscriptions' => 'Pot gestionar les subscripcions del podcast #{id}.', + 'manage-contributors' => 'Pot gestionar els col·laboradors del podcast #{id}.', + 'manage-platforms' => 'Pot establir/eliminar enllaços de plataforma del podcast #{id}.', + 'manage-publications' => 'Pot publicar el podcast #{id}.', + 'manage-notifications' => 'Pot veure i marcar les notificacions com a llegides per al podcast #{id}.', + 'interact-as' => 'Pot interactuar en nom del podcast #{id} per marcar les publicacions com a preferides, compartir-les o respondre-hi.', + 'episodes.view' => 'Pot veure taulers i estadístiques dels episodis del podcast #{id}.', + 'episodes.create' => 'Pot crear episodis per al podcast #{id}.', + 'episodes.edit' => 'Pot editar episodis del podcast #{id}.', + 'episodes.delete' => 'Pot suprimir episodis del podcast #{id}.', + 'episodes.manage-persons' => 'Pot gestionar persones d\'episodi del podcast #{id}.', + 'episodes.manage-clips' => 'Pot gestionar clips de vídeo o fragments de so del pòdcast #{id}.', + 'episodes.manage-publications' => 'Pot publicar/anul·lar la publicació d\'episodis i publicacions del pòdcast #{id}.', + 'episodes.manage-comments' => 'Pot crear/eliminar comentaris d\'episodi del pòdcast #{id}.', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'El teu codi de 6 dígits', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', + 'notEnoughPrivilege' => 'No teniu prou permisos per accedir a aquesta pàgina.', + 'set_password' => 'Estableix la teva contrasenya', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'welcomeSubject' => 'Has estat convidat a {siteName}', + 'emailWelcomeMailBody' => 'S\'ha creat un compte per a tu a {domain}, fes clic a l\'enllaç d\'inici de sessió següent per configurar la teva contrasenya. L\'enllaç és vàlid durant {numberOfHours} hores després de l\'hora d\'enviament d\'aquest correu electrònic.', ]; diff --git a/modules/Auth/Language/ca/Contributor.php b/modules/Auth/Language/ca/Contributor.php index e17f7fe0..4105f38e 100644 --- a/modules/Auth/Language/ca/Contributor.php +++ b/modules/Auth/Language/ca/Contributor.php @@ -29,15 +29,15 @@ return [ 'submit_edit' => 'Actualitzar el rol', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Suprimeix {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'Esteu a punt d\'eliminar {contributor} dels col·laboradors. Ja no podrà accedir a "{podcastTitle}".', + 'understand' => 'Entenc, vull eliminar {contributor} de "{podcastTitle}"', + 'submit' => 'Suprimeix', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", + 'editSuccess' => 'El rol ha canviat correctament!', + 'editOwnerError' => "No pots editar el propietari del podcast!", 'removeOwnerError' => "No podeu eliminar al propietari del podcast!", 'removeSuccess' => 'S\'ha eliminat a {username} de {podcastTitle}', diff --git a/modules/Auth/Language/ca/User.php b/modules/Auth/Language/ca/User.php index 6520db70..c269cfa4 100644 --- a/modules/Auth/Language/ca/User.php +++ b/modules/Auth/Language/ca/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_role' => "Edit {username}'s role", + 'edit_role' => "Editeu el rol de {username}", 'ban' => 'Bandejar', 'unban' => 'Re-admetre', 'delete' => 'Eliminar', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Tots els usuaris', 'list' => [ 'user' => 'Usuari', - 'role' => 'Role', + 'role' => 'Rol', 'banned' => 'Bandejat?', ], 'form' => [ @@ -26,7 +26,7 @@ return [ 'username' => 'Nom de l\'usuari', 'password' => 'Contrasenya', 'new_password' => 'Nova contrasenya', - 'role' => 'Role', + 'role' => 'Rol', 'roles' => 'Rols', 'permissions' => 'Permisos', 'submit_create' => 'Crea un usuari', @@ -34,11 +34,11 @@ return [ 'submit_password_change' => 'Canviat!', ], 'delete_form' => [ - 'title' => 'Delete {user}', + 'title' => 'Suprimeix {user}', 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', + "Esteu a punt de suprimir {user} permanentment. Ja no podrà accedir a l'àrea d'administració.", + 'understand' => 'Entenc, vull suprimir {user} permanentment', + 'submit' => 'Suprimeix', ], 'messages' => [ 'createSuccess' => @@ -52,7 +52,7 @@ return [ 'banSuperAdminError' => '{username} és un superadministrador, hom simplement no bandeja a un superadministrador...', 'deleteOwnerError' => - '{username} is the instance owner, one does not simply delete the owner…', + '{username} és el propietari de la instància, un no pot suprimir senzillament el propietari…', 'deleteSuperAdminError' => '{username} és un superadministrador, hom simplement no elimina a un superadministrador...', 'deleteSuccess' => '{username} ha estat eliminat.', diff --git a/modules/Auth/Language/de/Auth.php b/modules/Auth/Language/de/Auth.php index e64fbec7..1cef24ad 100644 --- a/modules/Auth/Language/de/Auth.php +++ b/modules/Auth/Language/de/Auth.php @@ -36,7 +36,7 @@ return [ 'podcasts.view' => 'Kann alle Podcasts einsehen.', 'podcasts.create' => 'Kann neue Podcasts erstellen.', 'podcasts.import' => 'Kann Podcasts importieren.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'fediverse.manage-blocks' => 'Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren.', ], 'podcast_groups' => [ 'owner' => [ @@ -71,14 +71,14 @@ return [ 'manage-platforms' => 'Kann Plattform-Links des Podcasts #{id} verwalten.', 'manage-publications' => 'Kann Podcast #{id} veröffentlichen.', 'manage-notifications' => 'Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'interact-as' => 'Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten.', 'episodes.view' => 'Kann Dashboards und Analysen von Episoden des Podcasts #{id} einsehen.', 'episodes.create' => 'Kann Folgen für Podcast #{id} erstellen.', 'episodes.edit' => 'Kann Folgen von Podcast #{id} bearbeiten.', 'episodes.delete' => 'Kann Folgen von Podcast #{id} löschen.', 'episodes.manage-persons' => 'Kann Personen von Episoden des Podcasts #{id} verwalten.', 'episodes.manage-clips' => 'Kann Videoclips und Soundbites des Podcasts #{id} verwalten.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-publications' => 'Kann Episoden und Posts von Podcast #{id} veröffentlichen/zurückziehen.', 'episodes.manage-comments' => 'Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen.', ], @@ -90,5 +90,5 @@ return [ // Welcome email 'welcomeSubject' => 'Sie wurden zu {siteName} eingeladen', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'emailWelcomeMailBody' => 'Ein Account auf {domain} wurde für Sie angelegt, klicken Sie auf den unten stehenden Login-Link, um Ihr Passwort festzulegen. Der Link ist mit Versand der Mail für {numberOfHours} gültig.', ]; diff --git a/modules/Auth/Language/de/Contributor.php b/modules/Auth/Language/de/Contributor.php index 89e53d1c..27ff60dc 100644 --- a/modules/Auth/Language/de/Contributor.php +++ b/modules/Auth/Language/de/Contributor.php @@ -10,9 +10,9 @@ declare(strict_types=1); return [ 'podcast_contributors' => 'Podcast-Administratoren', - 'view' => "{username}'s Administration von {podcastTitle}", - 'add' => 'Adminstrator zufügen', - 'add_contributor' => 'Administrator zufügen für {0}', + 'view' => "{username}'s Mitwirkung an {podcastTitle}", + 'add' => 'Mitwirkenden zufügen', + 'add_contributor' => 'Mitwirkenden zufügen für {0}', 'edit_role' => 'Rolle aktualisieren für {0}', 'edit' => 'Bearbeiten', 'remove' => 'Entfernen', diff --git a/modules/Auth/Language/de/User.php b/modules/Auth/Language/de/User.php index 47c7ad2f..68649b0a 100644 --- a/modules/Auth/Language/de/User.php +++ b/modules/Auth/Language/de/User.php @@ -9,17 +9,17 @@ declare(strict_types=1); */ return [ - 'edit_role' => "{username}'s Rolle bearbeiten", - 'ban' => 'Bannen', - 'unban' => 'Entbannen', + 'edit_role' => "Die Rolle(n) von {username} bearbeiten", + 'ban' => 'Sperren', + 'unban' => 'Entsperren', 'delete' => 'Löschen', 'create' => 'Neuer Benutzer', - 'view' => "{username}'s Info", + 'view' => "{username}-Infos", 'all_users' => 'Alle Benutzer', 'list' => [ 'user' => 'Benutzer', 'role' => 'Rolle', - 'banned' => 'Gebannt?', + 'banned' => 'Gesperrt?', ], 'form' => [ 'email' => 'E-mail', @@ -48,7 +48,7 @@ return [ 'banSuccess' => '{username} wurde gebannt.', 'unbanSuccess' => '{username} wurde entbannt.', 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', + '{username} ist Eigentümer der Instanz, Eigentümer können nicht gelöscht werden…', 'banSuperAdminError' => '{username} ist ein Superadmin, man bannt nicht einfach einen Superadmin…', 'deleteOwnerError' => diff --git a/modules/Auth/Language/fr/Auth.php b/modules/Auth/Language/fr/Auth.php index a47932e3..39a0aaef 100644 --- a/modules/Auth/Language/fr/Auth.php +++ b/modules/Auth/Language/fr/Auth.php @@ -11,84 +11,84 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Propriétaire de l\'instance', + 'description' => 'Le propriétaire du Castopod.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Super administrat·rice·eur', + 'description' => 'A un contrôle complet sur Castopod.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Gestionnaire', + 'description' => 'Gère le contenu de Castopod.', ], 'podcaster' => [ - 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'title' => 'Podcast·rice·eur', + 'description' => 'Utilisateurs généraux de Castopod.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => 'Peut accéder à la zone d\'administration Castopod.', + 'admin.settings' => 'Peut accéder aux paramètres de Castopod.', + 'users.manage' => 'Peut gérer les utilisateurs de Castopod.', + 'persons.manage' => 'Permet de gérer les personnes.', + 'pages.manage' => 'Permet de gérer les pages.', + 'podcasts.view' => 'Peut voir tous les podcasts.', + 'podcasts.create' => 'Peut créer de nouveaux podcasts.', + 'podcasts.import' => 'Peut importer des podcasts.', + 'fediverse.manage-blocks' => 'Peut empêcher des act·rice·eur·s/domaines d\'interagir avec Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Propriétaire du Podcast', + 'description' => 'Le/la propriétaire du podcast.', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => 'Administrateur', + 'description' => 'A un contrôle total sur le podcast #{id}.', ], 'editor' => [ - 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'title' => 'Éditeur', + 'description' => 'Gère le contenu et les publications du podcast #{id}.', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => 'Auteur / Autrice', + 'description' => 'Gère le contenu du podcast #{id} , mais ne peut pas le publier.', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => 'Invité', + 'description' => 'Contributeur général du podcast #{id}.', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => 'Peut voir le tableau de bord et les analyses du podcast #{id}.', + 'edit' => 'Peut éditer le podcast #{id}.', + 'delete' => 'Peut supprimer le podcast #{id}.', + 'manage-import' => 'Peut synchroniser le podcast importé #{id}.', + 'manage-persons' => 'Permet de gérer les abonnements au podcast #{id}.', + 'manage-subscriptions' => 'Permet de gérer les abonnements au podcast #{id}.', + 'manage-contributors' => 'Permet de gérer les contributeurs du podcast #{id}.', + 'manage-platforms' => 'Peut configurer/supprimer les liens de la plateforme du podcast #{id}.', + 'manage-publications' => 'Peut publier le podcast #{id}.', + 'manage-notifications' => 'Peut afficher et marquer les notifications comme lues pour le podcast #{id}.', + 'interact-as' => 'Peut interagir en tant que podcast #{id} pour mettre en favori, partager ou répondre aux messages.', + 'episodes.view' => 'Peut voir le tableau de bord et les statistiques du podcast #{id}.', + 'episodes.create' => 'Peut créer des épisodes pour le podcast #{id}.', + 'episodes.edit' => 'Peut modifier les épisodes du podcast #{id}.', + 'episodes.delete' => 'Peut supprimer les épisodes du podcast #{id}.', + 'episodes.manage-persons' => 'Peut gérer les intervenants des épisodes du podcast #{id}.', + 'episodes.manage-clips' => 'Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}.', + 'episodes.manage-publications' => 'Peut publier/dépublier des épisodes et des messages de podcast #{id}.', + 'episodes.manage-comments' => 'Peut créer/supprimer les commentaires de l\'épisode du podcast #{id}.', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'Votre code à 6 chiffres', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', + 'notEnoughPrivilege' => 'Vous n\'avez pas les autorisations pour accéder à cette page.', + 'set_password' => 'Choisis ton mot de passe', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'welcomeSubject' => 'Vous avez été invité·e à rejoindre {siteName}', + 'emailWelcomeMailBody' => 'Un compte a été créé pour vous sur {domain}, cliquez sur le lien de connexion ci-dessous pour définir votre mot de passe. Le lien est valide pendant {numberOfHours} heures après l\'envoi de cet e-mail.', ]; diff --git a/modules/Auth/Language/fr/Contributor.php b/modules/Auth/Language/fr/Contributor.php index 2a1f9dd2..a9006130 100644 --- a/modules/Auth/Language/fr/Contributor.php +++ b/modules/Auth/Language/fr/Contributor.php @@ -29,15 +29,15 @@ return [ 'submit_edit' => 'Mettre à jour le rôle', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Supprimer {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'Vous êtes sur le point de supprimer {contributor} des contributeurs. Ils ne pourront plus accéder à "{podcastTitle}".', + 'understand' => 'Je comprends, je veux retirer {contributor} de "{podcastTitle}"', + 'submit' => 'Retirer', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", + 'editSuccess' => 'Rôle modifié avec succès !', + 'editOwnerError' => "Vous ne pouvez pas modifier le propriétaire du podcast !", 'removeOwnerError' => "Vous ne pouvez pas retirer le propriétaire du podcast !", 'removeSuccess' => 'Vous avez retiré {username} de {podcastTitle}', diff --git a/modules/Auth/Language/fr/User.php b/modules/Auth/Language/fr/User.php index 69d864d1..91139158 100644 --- a/modules/Auth/Language/fr/User.php +++ b/modules/Auth/Language/fr/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_role' => "Edit {username}'s role", + 'edit_role' => "Modifier le rôle de {username}", 'ban' => 'Bloquer', 'unban' => 'Débloquer', 'delete' => 'Supprimer', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Tous les utilisateurs', 'list' => [ 'user' => 'Utilisateurs', - 'role' => 'Role', + 'role' => 'Rôle', 'banned' => 'Bloqué ?', ], 'form' => [ @@ -26,7 +26,7 @@ return [ 'username' => 'Identifiant', 'password' => 'Mot de passe', 'new_password' => 'Nouveau mot de passe', - 'role' => 'Role', + 'role' => 'Rôle', 'roles' => 'Rôles', 'permissions' => 'Permissions', 'submit_create' => 'Créer un utilisateur', @@ -34,11 +34,11 @@ return [ 'submit_password_change' => 'Valider !', ], 'delete_form' => [ - 'title' => 'Delete {user}', + 'title' => 'Supprimer {user}', 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', + "Vous êtes sur le point de supprimer {user} définitivement. Ils ne pourront plus accéder à la zone d'administration.", + 'understand' => 'Je comprends, je veux supprimer {user} définitivement', + 'submit' => 'Supprimer', ], 'messages' => [ 'createSuccess' => @@ -52,7 +52,7 @@ return [ 'banSuperAdminError' => '{username} est un super-utilisateur, on ne bloque pas un super-utilisateur comme ça…', 'deleteOwnerError' => - '{username} is the instance owner, one does not simply delete the owner…', + '{username} est le propriétaire de l\'instance, on ne supprime pas le propriétaire…', 'deleteSuperAdminError' => '{username} est un super-utilisateur, on ne supprime pas un super-utilisateur comme ça…', 'deleteSuccess' => '{username} a été supprimé.', diff --git a/modules/Auth/Language/fr_CA/Auth.php b/modules/Auth/Language/fr_CA/Auth.php new file mode 100644 index 00000000..a47932e3 --- /dev/null +++ b/modules/Auth/Language/fr_CA/Auth.php @@ -0,0 +1,94 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/fr_CA/Contributor.php b/modules/Auth/Language/fr_CA/Contributor.php new file mode 100644 index 00000000..c70badc0 --- /dev/null +++ b/modules/Auth/Language/fr_CA/Contributor.php @@ -0,0 +1,47 @@ + 'Podcast contributors', + 'view' => "{username}'s contribution to {podcastTitle}", + 'add' => 'Add contributor', + 'add_contributor' => 'Add a contributor for {0}', + 'edit_role' => 'Update role for {0}', + 'edit' => 'Edit', + 'remove' => 'Remove', + 'list' => [ + 'username' => 'Username', + 'role' => 'Role', + ], + 'form' => [ + 'user' => 'User', + 'user_placeholder' => 'Select a user…', + 'role' => 'Role', + 'role_placeholder' => 'Select its role…', + 'submit_add' => 'Add contributor', + 'submit_edit' => 'Update role', + ], + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', + ], + 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", + 'removeOwnerError' => "You can't remove the podcast owner!", + 'removeSuccess' => + 'You have successfully removed {username} from {podcastTitle}', + 'alreadyAddedError' => + "The contributor you're trying to add has already been added!", + ], +]; diff --git a/modules/Auth/Language/fr_CA/MyAccount.php b/modules/Auth/Language/fr_CA/MyAccount.php new file mode 100644 index 00000000..6ebbb30e --- /dev/null +++ b/modules/Auth/Language/fr_CA/MyAccount.php @@ -0,0 +1,18 @@ + 'My account info', + 'changePassword' => 'Change my password', + 'messages' => [ + 'wrongPasswordError' => "You've entered the wrong password, try again.", + 'passwordChangeSuccess' => 'Password has been successfully changed!', + ], +]; diff --git a/modules/Auth/Language/fr_CA/User.php b/modules/Auth/Language/fr_CA/User.php new file mode 100644 index 00000000..32ec560c --- /dev/null +++ b/modules/Auth/Language/fr_CA/User.php @@ -0,0 +1,60 @@ + "Edit {username}'s role", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'role' => 'Role', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'role' => 'Role', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Auth/Language/fr_trad/Auth.php b/modules/Auth/Language/fr_trad/Auth.php new file mode 100644 index 00000000..a47932e3 --- /dev/null +++ b/modules/Auth/Language/fr_trad/Auth.php @@ -0,0 +1,94 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/fr_trad/Contributor.php b/modules/Auth/Language/fr_trad/Contributor.php new file mode 100644 index 00000000..c70badc0 --- /dev/null +++ b/modules/Auth/Language/fr_trad/Contributor.php @@ -0,0 +1,47 @@ + 'Podcast contributors', + 'view' => "{username}'s contribution to {podcastTitle}", + 'add' => 'Add contributor', + 'add_contributor' => 'Add a contributor for {0}', + 'edit_role' => 'Update role for {0}', + 'edit' => 'Edit', + 'remove' => 'Remove', + 'list' => [ + 'username' => 'Username', + 'role' => 'Role', + ], + 'form' => [ + 'user' => 'User', + 'user_placeholder' => 'Select a user…', + 'role' => 'Role', + 'role_placeholder' => 'Select its role…', + 'submit_add' => 'Add contributor', + 'submit_edit' => 'Update role', + ], + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', + ], + 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", + 'removeOwnerError' => "You can't remove the podcast owner!", + 'removeSuccess' => + 'You have successfully removed {username} from {podcastTitle}', + 'alreadyAddedError' => + "The contributor you're trying to add has already been added!", + ], +]; diff --git a/modules/Auth/Language/fr_trad/MyAccount.php b/modules/Auth/Language/fr_trad/MyAccount.php new file mode 100644 index 00000000..6ebbb30e --- /dev/null +++ b/modules/Auth/Language/fr_trad/MyAccount.php @@ -0,0 +1,18 @@ + 'My account info', + 'changePassword' => 'Change my password', + 'messages' => [ + 'wrongPasswordError' => "You've entered the wrong password, try again.", + 'passwordChangeSuccess' => 'Password has been successfully changed!', + ], +]; diff --git a/modules/Auth/Language/fr_trad/User.php b/modules/Auth/Language/fr_trad/User.php new file mode 100644 index 00000000..32ec560c --- /dev/null +++ b/modules/Auth/Language/fr_trad/User.php @@ -0,0 +1,60 @@ + "Edit {username}'s role", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'role' => 'Role', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'role' => 'Role', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Auth/Language/nl/Auth.php b/modules/Auth/Language/nl/Auth.php index bdfcaf99..60a631a0 100644 --- a/modules/Auth/Language/nl/Auth.php +++ b/modules/Auth/Language/nl/Auth.php @@ -11,7 +11,7 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', + 'title' => 'Instance eigenaar', 'description' => 'De Castopod eigenaar.', ], 'superadmin' => [ @@ -31,12 +31,12 @@ return [ 'admin.access' => 'Kan toegang krijgen tot de beheeromgeving van Castopod.', 'admin.settings' => 'Kan toegang krijgen tot de instellingen van Castopod.', 'users.manage' => 'Kan Castopod-gebruikers beheren.', - 'persons.manage' => 'Can manage persons.', + 'persons.manage' => 'Kan personen beheren.', 'pages.manage' => 'Kan pagina\'s beheren.', 'podcasts.view' => 'Kan alle podcasts bekijken.', 'podcasts.create' => 'Kan nieuwe podcast aanmaken.', 'podcasts.import' => 'Kan podcasts importeren.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'fediverse.manage-blocks' => 'Kan fediverse actors/domains blokkeren voor interactie met Castopod.', ], 'podcast_groups' => [ 'owner' => [ @@ -65,21 +65,21 @@ return [ 'edit' => 'Kan podcast #{id} wijzigen.', 'delete' => 'Kan podcast #{id} verwijderen.', 'manage-import' => 'Kan de geïmporteerde podcast #{id} synchroniseren.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-persons' => 'Kan abonnementen van podcast #{id} beheren.', 'manage-subscriptions' => 'Kan abonnementen van podcast #{id} beheren.', 'manage-contributors' => 'Kan bijdragers van podcast #{id} beheren.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-platforms' => 'Kan platform links van podcast #{id} instellen of verwijderen.', 'manage-publications' => 'Kan podcast #{id} publiceren.', 'manage-notifications' => 'Kan meldingen bekijken en markeren als gelezen voor podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'interact-as' => 'Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten.', 'episodes.view' => 'Kan dashboard en analyses van de afleveringen van podcast #{id} zien.', 'episodes.create' => 'Kan afleveringen voor podcast #{id} aanmaken.', 'episodes.edit' => 'Kan afleveringen van podcast #{id} wijzigen.', 'episodes.delete' => 'Kan afleveringen van podcast #{id} verwijderen.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-persons' => 'Kan aflevering personen van podcast #{id} beheren.', 'episodes.manage-clips' => 'Kan videoclips of soundbites van podcast #{id} beheren.', 'episodes.manage-publications' => 'Kan afleveringen en berichten van podcast #{id} publiceren/depubliceren.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes.manage-comments' => 'Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen.', ], // missing keys diff --git a/modules/Auth/Language/nl/Contributor.php b/modules/Auth/Language/nl/Contributor.php index 3754bb92..f6b11364 100644 --- a/modules/Auth/Language/nl/Contributor.php +++ b/modules/Auth/Language/nl/Contributor.php @@ -29,15 +29,15 @@ return [ 'submit_edit' => 'Rol bijwerken', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Verwijder {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'Je staat op het punt {contributor} te verwijderen van bijdragers. Ze zullen geen toegang meer hebben tot "{podcastTitle}".', + 'understand' => 'Ik begrijp het, ik wil {contributor} verwijderen van "{podcastTitle}"', + 'submit' => 'Verwijder', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", + 'editSuccess' => 'Rol succesvol veranderd!', + 'editOwnerError' => "Je kunt de eigenaar van podcast niet bewerken!", 'removeOwnerError' => "Je kunt de eigenaar van podcast niet verwijderen!", 'removeSuccess' => 'Je hebt {username} met succes verwijderd van {podcastTitle}', diff --git a/modules/Auth/Language/nl/MyAccount.php b/modules/Auth/Language/nl/MyAccount.php index 6ebbb30e..c7a5d5cf 100644 --- a/modules/Auth/Language/nl/MyAccount.php +++ b/modules/Auth/Language/nl/MyAccount.php @@ -9,10 +9,10 @@ declare(strict_types=1); */ return [ - 'info' => 'My account info', - 'changePassword' => 'Change my password', + 'info' => 'Mijn accountgegevens', + 'changePassword' => 'Wijzig mijn wachtwoord', 'messages' => [ - 'wrongPasswordError' => "You've entered the wrong password, try again.", - 'passwordChangeSuccess' => 'Password has been successfully changed!', + 'wrongPasswordError' => "Je hebt een verkeerd wachtwoord ingevoerd, probeer het opnieuw.", + 'passwordChangeSuccess' => 'Wachtwoord is succesvol gewijzigd!', ], ]; diff --git a/modules/Auth/Language/nl/User.php b/modules/Auth/Language/nl/User.php index e7908f5b..ee321721 100644 --- a/modules/Auth/Language/nl/User.php +++ b/modules/Auth/Language/nl/User.php @@ -9,52 +9,52 @@ declare(strict_types=1); */ return [ - 'edit_role' => "Edit {username}'s role", - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', + 'edit_role' => "Rol van {username} wijzigen", + 'ban' => 'Blokkeren', + 'unban' => 'Deblokkeren', + 'delete' => 'Verwijderen', + 'create' => 'Nieuwe gebruiker', + 'view' => "Info van {username}", + 'all_users' => 'Alle gebruikers', 'list' => [ - 'user' => 'User', - 'role' => 'Role', - 'banned' => 'Banned?', + 'user' => 'Gebruiker', + 'role' => 'Rol', + 'banned' => 'Geblokkeerd?', ], 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'role' => 'Role', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', + 'email' => 'E-mail', + 'username' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', + 'new_password' => 'Nieuw Wachtwoord', + 'role' => 'Rol', + 'roles' => 'Rollen', + 'permissions' => 'Rechten', + 'submit_create' => 'Gebruiker aanmaken', + 'submit_edit' => 'Opslaan', + 'submit_password_change' => 'Wijzigen!', ], 'delete_form' => [ - 'title' => 'Delete {user}', + 'title' => 'Verwijder {user}', 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', + "Je staat op het punt {user} permanent te verwijderen. Deze zal geen toegang meer hebben tot de beheerdersomgeving.", + 'understand' => 'Ik begrijp het, ik wil {user} permanent verwijderen', + 'submit' => 'Verwijderen', ], 'messages' => [ 'createSuccess' => - 'User created successfully! {username} will be prompted with a password reset upon first authentication.', + 'Gebruiker succesvol aangemaakt! Een welkomsmail is naar {username} verzonden met een inloglink, bij de eerste authenticatie zal er om een wachtwoordreset gevraagd worden.', 'roleEditSuccess' => - "{username}'s roles have been successfully updated.", - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', + "De rollen van {username} zijn succesvol bijgewerkt.", + 'banSuccess' => '{username} is geblokkeerd.', + 'unbanSuccess' => '{username} is gedeblokkeerd.', 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', + '{username} is de instance eigenaar, men raakt niet zomaar de eigenaar aan…', 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', + '{username} is een super beheerder, men raakt niet zomaar een super beheerder aan…', 'deleteOwnerError' => - '{username} is the instance owner, one does not simply delete the owner…', + '{username} is de instance eigenaar, men verwijderd niet zomaar de eigenaar…', 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', + '{username} is een superadmin, men verwijderd niet zomaar een superadmin…', + 'deleteSuccess' => '{username} is verwijderd.', ], ]; diff --git a/modules/Auth/Language/pl/Contributor.php b/modules/Auth/Language/pl/Contributor.php index 162a6dd8..ac394200 100644 --- a/modules/Auth/Language/pl/Contributor.php +++ b/modules/Auth/Language/pl/Contributor.php @@ -29,15 +29,15 @@ return [ 'submit_edit' => 'Zaktualizuj rolę', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Usuń {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'Zamierzasz usunąć {contributor} z wspierających. Nie będzie miał już mieć dostępu do "{podcastTitle}".', + 'understand' => 'Rozumiem, chcę usunąć {contributor} z "{podcastTitle}"', + 'submit' => 'Usuń', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", + 'editSuccess' => 'Pomyślnie zmieniono rolę!', + 'editOwnerError' => "Nie możesz usunąć właściciela podcastu!", 'removeOwnerError' => "Nie możesz usunąć właściciela podcastu!", 'removeSuccess' => 'Pomyślnie usunąłeś/aś {username} z {podcastTitle}', diff --git a/modules/Auth/Language/pl/User.php b/modules/Auth/Language/pl/User.php index b0c8d87f..69f2d96b 100644 --- a/modules/Auth/Language/pl/User.php +++ b/modules/Auth/Language/pl/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_role' => "Edit {username}'s role", + 'edit_role' => "Edytuj role użytkownika {username}", 'ban' => 'Zablokuj', 'unban' => 'Odblokuj', 'delete' => 'Usuń', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Wszyscy użytkownicy', 'list' => [ 'user' => 'Użytkownik', - 'role' => 'Role', + 'role' => 'Rola', 'banned' => 'Zablokowany?', ], 'form' => [ @@ -26,7 +26,7 @@ return [ 'username' => 'Nazwa użytkownika', 'password' => 'Hasło', 'new_password' => 'Nowe hasło', - 'role' => 'Role', + 'role' => 'Rola', 'roles' => 'Role', 'permissions' => 'Uprawnienia', 'submit_create' => 'Stwórz użytkownika', @@ -34,11 +34,11 @@ return [ 'submit_password_change' => 'Zmień!', ], 'delete_form' => [ - 'title' => 'Delete {user}', + 'title' => 'Usuń użytkownika {user}', 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', + "Zamierzasz usunąć {user} na stałe. Nie będą już mogli uzyskać dostępu do obszaru administratora.", + 'understand' => 'Rozumiem, chcę trwale usunąć {user}', + 'submit' => 'Usuń', ], 'messages' => [ 'createSuccess' => @@ -52,7 +52,7 @@ return [ 'banSuperAdminError' => '{username} jest superadministratorem, nie można po prostu zablokować superadministratora…', 'deleteOwnerError' => - '{username} is the instance owner, one does not simply delete the owner…', + '{username} jest właścicielem instancji, nie można usunąć właściciela…', 'deleteSuperAdminError' => '{username} jest superadministratorem, nie można po prostu usunąć superadministratora…', 'deleteSuccess' => '{username} został usunięty.', diff --git a/modules/Auth/Language/pt-BR/Contributor.php b/modules/Auth/Language/pt-BR/Contributor.php index a2188fe8..5dc72942 100644 --- a/modules/Auth/Language/pt-BR/Contributor.php +++ b/modules/Auth/Language/pt-BR/Contributor.php @@ -29,15 +29,15 @@ return [ 'submit_edit' => 'Atualizar cargo', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Remover {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'Você está prestes a remover {contributor} dos colaboradores. Eles não poderão mais acessar "{podcastTitle}".', + 'understand' => 'Eu entendo, eu desejo remover {contributor} de "{podcastTitle}"', + 'submit' => 'Remover', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", + 'editSuccess' => 'Cargo alterado com sucesso!', + 'editOwnerError' => "Você não pode editar o dono do podcast!", 'removeOwnerError' => "Você não pode remover o dono do podcast!", 'removeSuccess' => 'Você removeu {username} com sucesso de {podcastTitle}', diff --git a/modules/Auth/Language/uk/Auth.php b/modules/Auth/Language/uk/Auth.php new file mode 100644 index 00000000..a47932e3 --- /dev/null +++ b/modules/Auth/Language/uk/Auth.php @@ -0,0 +1,94 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/uk/Contributor.php b/modules/Auth/Language/uk/Contributor.php new file mode 100644 index 00000000..c70badc0 --- /dev/null +++ b/modules/Auth/Language/uk/Contributor.php @@ -0,0 +1,47 @@ + 'Podcast contributors', + 'view' => "{username}'s contribution to {podcastTitle}", + 'add' => 'Add contributor', + 'add_contributor' => 'Add a contributor for {0}', + 'edit_role' => 'Update role for {0}', + 'edit' => 'Edit', + 'remove' => 'Remove', + 'list' => [ + 'username' => 'Username', + 'role' => 'Role', + ], + 'form' => [ + 'user' => 'User', + 'user_placeholder' => 'Select a user…', + 'role' => 'Role', + 'role_placeholder' => 'Select its role…', + 'submit_add' => 'Add contributor', + 'submit_edit' => 'Update role', + ], + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', + ], + 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", + 'removeOwnerError' => "You can't remove the podcast owner!", + 'removeSuccess' => + 'You have successfully removed {username} from {podcastTitle}', + 'alreadyAddedError' => + "The contributor you're trying to add has already been added!", + ], +]; diff --git a/modules/Auth/Language/uk/MyAccount.php b/modules/Auth/Language/uk/MyAccount.php new file mode 100644 index 00000000..0b511d51 --- /dev/null +++ b/modules/Auth/Language/uk/MyAccount.php @@ -0,0 +1,18 @@ + 'Інформація про аккаунт', + 'changePassword' => 'Змінити мій пароль', + 'messages' => [ + 'wrongPasswordError' => "Ви ввели неправильний пароль, спробуйте ще раз.", + 'passwordChangeSuccess' => 'Ваш пароль успішно змінено.', + ], +]; diff --git a/modules/Auth/Language/uk/User.php b/modules/Auth/Language/uk/User.php new file mode 100644 index 00000000..a9383f65 --- /dev/null +++ b/modules/Auth/Language/uk/User.php @@ -0,0 +1,60 @@ + "Змінити роль «%{name}»", + 'ban' => 'Забанити', + 'unban' => 'Розбанити', + 'delete' => 'Видалити', + 'create' => 'Новий користувач', + 'view' => "{username}інформація", + 'all_users' => 'Усі користувачі', + 'list' => [ + 'user' => 'Користувач', + 'role' => 'Роль', + 'banned' => 'Забанені?', + ], + 'form' => [ + 'email' => 'Пошта', + 'username' => 'Ім\'я користувача', + 'password' => 'Пароль', + 'new_password' => 'Новий пароль', + 'role' => 'Роль', + 'roles' => 'Ролі', + 'permissions' => 'Дозволи', + 'submit_create' => 'Створити користувача', + 'submit_edit' => 'Зберегти', + 'submit_password_change' => 'Змінити', + ], + 'delete_form' => [ + 'title' => 'Видалити користувача?', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Install/Language/de/Install.php b/modules/Install/Language/de/Install.php index b3269fdb..ecebbfa7 100644 --- a/modules/Install/Language/de/Install.php +++ b/modules/Install/Language/de/Install.php @@ -21,10 +21,10 @@ return [ 'Wenn du einen CDN und/oder einen externen Analysedienst verwendest, kannst du diesen hier festlegen.', 'admin_gateway' => 'Admin-Gateway', 'admin_gateway_hint' => - 'Die Route zum Zugriff auf den Admin-Bereich (z.B. https://example.com/cp-admin), wird standardmäßig als "cp-admin" festgelegt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.', + 'Der Pfad zum Zugriff auf den Admin-Bereich (z.B. https://example.com/cp-admin), wird standardmäßig als "cp-admin" festgelegt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.', 'auth_gateway' => 'Auth-Gateway', 'auth_gateway_hint' => - 'Die Route zum Zugriff auf die Authentifizierungsseiten (z. B. https://example.com/cp-auth), wird standardmäßig als "cp-auth" gesetzt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.', + 'Der Pfad zum Zugriff auf die Authentifizierungsseiten (z. B. https://example.com/cp-auth), wird standardmäßig als "cp-auth" gesetzt. Wir empfehlen, sie aus Sicherheitsgründen zu ändern.', 'database_config' => 'Datenbankkonfiguration', 'database_config_hint' => 'Castopod muss sich mit der MySQL-Datenbank (oder MariaDB) verbinden. Wenn diese erforderlichen Informationen nicht verfügbar sind, wende dich bitte an deinen Serveradministrator.', diff --git a/modules/Install/Language/fr_CA/Install.php b/modules/Install/Language/fr_CA/Install.php new file mode 100644 index 00000000..45d26085 --- /dev/null +++ b/modules/Install/Language/fr_CA/Install.php @@ -0,0 +1,62 @@ + 'Castopod installer', + 'manual_config' => 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your Super Admin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Install/Language/fr_trad/Install.php b/modules/Install/Language/fr_trad/Install.php new file mode 100644 index 00000000..45d26085 --- /dev/null +++ b/modules/Install/Language/fr_trad/Install.php @@ -0,0 +1,62 @@ + 'Castopod installer', + 'manual_config' => 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your Super Admin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Install/Language/sk/Install.php b/modules/Install/Language/sk/Install.php index 1f66ef11..2dc1ed4d 100644 --- a/modules/Install/Language/sk/Install.php +++ b/modules/Install/Language/sk/Install.php @@ -25,7 +25,7 @@ return [ 'auth_gateway' => 'Auth gateway', 'auth_gateway_hint' => 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', + 'database_config' => 'Nastavenie databázy', 'database_config_hint' => 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', 'db_hostname' => 'Database hostname', diff --git a/modules/Install/Language/uk/Install.php b/modules/Install/Language/uk/Install.php new file mode 100644 index 00000000..a06569bb --- /dev/null +++ b/modules/Install/Language/uk/Install.php @@ -0,0 +1,62 @@ + 'Кастопод інсталятор', + 'manual_config' => 'Ручне налаштування', + 'manual_config_subtitle' => + 'Створіть файл `.env` з налаштуваннями та перезавантажте сторінку, щоб продовжити встановлення.', + 'form' => [ + 'instance_config' => 'Конфігурація екземпляру', + 'hostname' => 'Ім\'я хоста', + 'media_base_url' => 'URL-адреса бази даних медіа', + 'media_base_url_hint' => + 'Якщо ви використовуєте CDN та/або зовнішній аналітичний сервіс, ви можете встановити їх тут.', + 'admin_gateway' => 'Шлюз Адміністратора', + 'admin_gateway_hint' => + 'Шлях до сторінки аутентифікації (наприклад https://example.com/cp-admin). Встановлений за замовчуванням cp-auth, Ми рекомендуємо вам змінити його з міркувань безпеки.', + 'auth_gateway' => 'Шлюз авторизації', + 'auth_gateway_hint' => + 'Шлях до сторінки аутентифікації (наприклад https://example.com/cp-auth). Встановлений за замовчуванням cp-auth, Ми рекомендуємо вам змінити його з міркувань безпеки.', + 'database_config' => 'Налаштування бази даних', + 'database_config_hint' => + 'Кастопод потребує підключення до бази даних MySQL (або MariaDB) для відновлення. Якщо у вас немає такої необхідної інформації, будь ласка, зверніться до адміністратора вашого сервера.', + 'db_hostname' => 'Ім\'я хоста бази даних', + 'db_name' => 'Назва бази даних', + 'db_username' => 'Ім\'я користувача бази даних', + 'db_password' => 'Пароль бази даних', + 'db_prefix' => 'Префікс бази даних', + 'db_prefix_hint' => + "Залишайте префікс імен таблиць Castopod, якщо ви не знаєте що це значить.", + 'cache_config' => 'Конфігурація кешу', + 'cache_config_hint' => + 'Виберіть бажаний обробник кешу або залиште без змін, як стандартне значення, якщо ви не знаєте, що це означає.', + 'cache_handler' => 'Обробник кешу', + 'cacheHandlerOptions' => [ + 'file' => 'Файл', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Далі', + 'submit' => 'Завершити установку', + 'create_superadmin' => 'Створіть свій обліковий запис головного адміністратора', + 'email' => 'Пошта', + 'username' => 'Ім\'я користувача', + 'password' => 'Пароль', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Ваш обліковий запис головного адміністратора було успішно створено. Увійдіть, щоб почати подкасти!', + 'databaseConnectError' => + 'Castopod не зміг під\'єднатися до вашої бази даних. Перевірте конфігурацію бази даних і повторіть спробу.', + 'writeError' => + "Не вдалося створити/записати файл `.env`. Ви повинні створити його вручну, перейшовши шаблон файлу `.env.example` в пакеті Castopode.", + ], +]; diff --git a/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php index c7a5e116..178640ed 100644 --- a/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/de/PremiumPodcasts.php @@ -10,8 +10,8 @@ declare(strict_types=1); return [ 'podcast_is_premium' => 'Podcast enthält Premium-Episoden', - 'episode_is_premium' => 'Diese Episode ist Premium, nur verfügbar für Premium-Abonnenten', - 'unlock_episode' => 'Diese Episode ist nur für Premium-Abonnenten. Klicken Sie hier zum entsperren!', + 'episode_is_premium' => 'Diese Episode ist nur verfügbar für Premium-Abonnenten', + 'unlock_episode' => 'Diese Episode ist nur für Premium-Abonnenten. Klicke, um sie freizuschalten!', 'banner_unlock' => 'Dieser Podcast enthält Premium-Episoden, nur verfügbar für Premium-Abonnenten.', 'banner_lock' => 'Der Podcast ist freigeschaltet, viel Spaß mit den Premium-Episoden!', 'subscribe' => 'Abonnieren', diff --git a/modules/PremiumPodcasts/Language/de/Subscription.php b/modules/PremiumPodcasts/Language/de/Subscription.php index 32043a80..17e6fe9e 100644 --- a/modules/PremiumPodcasts/Language/de/Subscription.php +++ b/modules/PremiumPodcasts/Language/de/Subscription.php @@ -38,63 +38,63 @@ return [ 'submit_edit' => 'Abonnement bearbeiten', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'link' => 'Link zur Abonnement-Seite', + 'link_hint' => 'Dies fügt einen CTA (Call to Action) zur Webseite hinzu, der Hörer dazu einlädt, den Podcast zu abonnieren.', 'submit' => 'Link speichern', ], 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'disclaimer' => 'Das Pausieren des Abonnements wird dem Abonnenten den Zugang zu den Premium-Inhalten einschränken. Sie können die Pausierung jederzeit wieder aufheben.', 'reason' => 'Grund', 'reason_placeholder' => 'Warum unterbrechen Sie Ihr Abonnement?', "submit" => 'Abonnement unterbrechen', ], 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'disclaimer' => 'Durch das Löschen des Abonnements von {subscriber} werden alle damit verbundenen Analysedaten entfernt.', 'understand' => 'Ich verstehe, entferne das Abonnement dauerhaft', 'submit' => 'Abonnement entfernen', ], 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'addSuccess' => 'Neues Abonnement hinzugefügt! Eine Willkommens-E-Mail wurde an {subscriber} gesendet.', + 'addError' => 'Abonnement konnte nicht hinzugefügt werden.', + 'editSuccess' => 'Das Ablaufdatum des Abonnements wurde aktualisiert! Es wurde eine E-Mail an {subscriber} gesendet.', 'editError' => 'Abonnement konnte nicht bearbeitet werden.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenSuccess' => 'Der Schlüssel wurde neu generiert! Eine E-Mail mit dem neuen Schlüssel wurde an {subscriber} gesendet.', 'regenerateTokenError' => 'Schlüssel konnte nicht neu generiert werden.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + 'deleteSuccess' => 'Das Abonnement wurde entfernt! Es wurde eine E-Mail an {subscriber} gesendet.', + 'deleteError' => 'Abonnement konnte nicht entfernt werden.', + 'suspendSuccess' => 'Das Abonnement wurde pausiert! Es wurde eine E-Mail an {subscriber} gesendet.', + 'suspendError' => 'Abonnement konnte nicht pausiert werden.', + 'resumeSuccess' => 'Das Abonnement wurde fortgesetzt! Es wurde eine E-Mail an {subscriber} gesendet.', + 'resumeError' => 'Abonnement konnte nicht fortgesetzt werden.', + 'linkSaveSuccess' => 'Der Abonnement-Link wurde erfolgreich gespeichert! Dieser wird als CTA (Call to Action) auf der Webseite erscheinen!', + 'linkRemoveSuccess' => 'Der Abonnement-Link wurde erfolgreich entfernt!', ], 'emails' => [ 'greeting' => 'Hey,', 'token' => 'Ihr Token: {0}', 'unique_feed_link' => 'Ihr eindeutiger Feed-Link: {0}', 'how_to_use' => 'Wie nutzt man es?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'two_ways' => 'Sie haben zwei Möglichkeiten, die Premium-Episoden freizuschalten:', + 'import_into_app' => 'Kopieren Sie Ihre einmalige Feed-URL in Ihre Lieblings-Podcast-App (importieren sie diesen als privaten Feed, um Ihre Anmeldedaten geheim zu halten).', + 'go_to_website' => 'Gehen Sie zu der Webseite von {podcastWebsite} und entsperren Sie den Podcast mit Ihrem Schlüssel.', 'welcome_subject' => 'Willkommen bei {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'welcome' => 'Sie haben {podcastTitle} abonniert, vielen Dank und herzlich willkommen!', + 'welcome_token_title' => 'Hier sind Ihre Anmeldedaten, um die Premium-Episoden des Podcasts freizuschalten:', + 'welcome_expires' => 'Ihr Abonnement läuft am {0} ab.', + 'welcome_never_expires' => 'Ihr Abonnement läuft nicht ab.', + 'reset_subject' => 'Ihr Schlüssel wurde zurückgesetzt!', + 'reset_token' => 'Ihr Zugriff auf {podcastTitle} wurde zurückgesetzt!', + 'reset_token_title' => 'Es wurden neue Anmeldedaten generiert, um die Premium-Episoden des Podcasts freizuschalten:', 'edited_subject' => 'Ihr Abonnement wurde aktualisiert!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'edited_expires' => 'Ihr Abonnement für {podcastTitle} läuft am {expiresAt} ab.', + 'edited_never_expires' => 'Ihr Abonnement für {podcastTitle} läuft nie ab!', 'suspended_subject' => 'Ihr Abonnement wurde pausiert!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended' => 'Ihr Abonnement für {podcastTitle} wurde pausiert! Sie können nun nicht mehr auf die Premium-Episoden des Podcasts zugreifen.', 'suspended_reason' => 'Das ist aus dem folgenden Grund: {0}', 'resumed_subject' => 'Ihr Abonnement wurde wieder aufgenommen!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'resumed' => 'Ihr Abonnement für {podcastTitle} wurde fortgesetzt! Sie können nun wieder auf die Premium-Episoden des Podcasts zugreifen.', 'deleted_subject' => 'Ihr Abonnement wurde entfernt!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'deleted' => 'Ihr Abonnement für {podcastTitle} wurde entfernt! Sie können nun nicht mehr auf die Premium-Episoden des Podcasts zugreifen.', 'footer' => '{castopod} betrieben auf {host}', ], ]; diff --git a/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php index 18c0dd4e..007b90bd 100644 --- a/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/fr/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'podcast_is_premium' => 'Le Podcast contient des épisodes premium', + 'episode_is_premium' => 'Cet épisode est premium, uniquement disponible pour les abonnés premium', + 'unlock_episode' => 'Cet épisode est réservé aux abonnés premium. Cliquez pour le débloquer !', + 'banner_unlock' => 'Ce podcast contient des épisodes premium, uniquement disponibles pour les abonnés premium.', + 'banner_lock' => 'Podcast débloqué avec succès ! Profitez des épisodes premium !', + 'subscribe' => 'S\'abonner', + 'lock' => 'Verrouiller', + 'unlock' => 'Déverrouiller', 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'title' => 'Contenu Premium', + 'subtitle' => 'Ce podcast contient des épisodes premium verrouillés ! Avez-vous la clé pour les déverrouiller ?', + 'token' => 'Entrez votre clé', + 'token_hint' => 'Si vous êtes abonné à {podcastTitle}, vous pouvez copier la clé qui vous a été envoyée par e-mail et la coller ici.', + 'submit' => 'Débloquer tous les épisodes!', + 'call_to_action' => 'Débloquer tous les épisodes de {podcastTitle}:', + 'subscribe_cta' => 'Je m’inscris maintenant !', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Podcast débloqué avec succès ! Profitez des épisodes premium !', + 'unlockBadAttempt' => 'Votre clé ne semble pas fonctionner…', + 'lockSuccess' => 'Le podcast a été verouillé avec succès !', ], ]; diff --git a/modules/PremiumPodcasts/Language/fr/Subscription.php b/modules/PremiumPodcasts/Language/fr/Subscription.php index f8af256f..c20be9d2 100644 --- a/modules/PremiumPodcasts/Language/fr/Subscription.php +++ b/modules/PremiumPodcasts/Language/fr/Subscription.php @@ -9,92 +9,92 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Abonnements au podcast', + 'add' => 'Nouvel abonnement', + 'view' => 'Afficher l\'abonnement', + 'edit' => 'Modifier l\'inscription', + 'regenerate_token' => 'Regenerer le token', + 'suspend' => 'Suspendre l\'abonnement', + 'resume' => 'Reprendre l\'abonnement', + 'delete' => 'Supprimer l\'abonnement', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Actif', + 'suspended' => 'Suspendu', + 'expired' => 'Expiré', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', - 'status' => 'Status', + 'number' => 'Numéro', + 'email' => 'Adresse e-mail', + 'expiration_date' => 'Date d\'expiration', + 'unlimited' => 'Illimité', + 'downloads' => 'Téléchargements', + 'status' => 'Statut', ], 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', - 'submit_edit' => 'Edit subscription', + 'email' => 'Adresse e-mail', + 'expiration_date' => 'Date d\'expiration', + 'expiration_date_hint' => 'La date et l\'heure à laquelle l\'abonnement expire. Laissez vide pour un abonnement illimité.', + 'submit_add' => 'Ajouter un abonnement', + 'submit_edit' => 'Modifier l\'inscription', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'link' => 'Lien vers la page d\'abonnement', + 'link_hint' => 'Cela va ajouter un appel à l\'action dans le site Web invitant les auditeurs à s\'abonner au podcast.', + 'submit' => 'Enregistrer le lien', ], 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', + 'disclaimer' => 'Suspendre l\'abonnement empêchera l\'abonné d\'avoir accès au contenu premium. Vous pourrez toujours lever la suspension par la suite.', + 'reason' => 'Raison', + 'reason_placeholder' => 'Pour quelle raison arrêtez vous votre abonnement ?', + "submit" => 'Suspendre l\'abonnement', ], 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', - 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', + 'disclaimer' => 'La suppression de l\'abonnement de {subscriber} supprimera toutes les données d\'analyse qui lui sont associées.', + 'understand' => 'Je comprends, supprimez l\'abonnement définitivement', + 'submit' => 'Supprimer l\'abonnement', ], 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', - 'editError' => 'Subscription could not be edited.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', - 'regenerateTokenError' => 'Token could not be regenerated.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + 'addSuccess' => 'Un nouvel abonnement a été ajouté ! Un e-mail de bienvenue a été envoyé à {subscriber}.', + 'addError' => 'L\'abonnement n\'a pu être ajouté.', + 'editSuccess' => 'La date d\'expiration de l\'abonnement a été mise à jour ! Un e-mail a été envoyé à {subscriber}.', + 'editError' => 'L\'abonnement n\'a pas pu être modifié.', + 'regenerateTokenSuccess' => 'Jeton régénéré ! Un email a été envoyé à {subscriber} avec le nouveau jeton.', + 'regenerateTokenError' => 'Le jeton n\'a pas pu être régénéré.', + 'deleteSuccess' => 'L\'abonnement a été suspendu! Un e-mail a été envoyé à {subscriber}.', + 'deleteError' => 'L\'abonnement n\'a pas pu être supprimé.', + 'suspendSuccess' => 'L\'abonnement a été suspendu! Un e-mail a été envoyé à {subscriber}.', + 'suspendError' => 'L\'abonnement ne peut pas être suspendu.', + 'resumeSuccess' => 'L\'abonnement a été suspendu! Un e-mail a été envoyé à {subscriber}.', + 'resumeError' => 'L\'abonnement n\'a pas pu être repris.', + 'linkSaveSuccess' => 'Le lien de l\'abonnement a été enregistré avec succès ! Il apparaîtra sur le site comme un Appel à l\'action !', + 'linkRemoveSuccess' => 'Le lien de l\'abonnement a été supprimé avec succès !', ], 'emails' => [ - 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', - 'welcome_subject' => 'Welcome to {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', - 'edited_subject' => 'Your subscription has been updated!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', - 'suspended_subject' => 'Your subscription has been suspended!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', - 'suspended_reason' => 'That is for the following reason: {0}', - 'resumed_subject' => 'Your subscription has been resumed!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', - 'deleted_subject' => 'Your subscription has been removed!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', - 'footer' => '{castopod} hosted on {host}', + 'greeting' => 'Hé,', + 'token' => 'Votre jeton : {0}', + 'unique_feed_link' => 'Votre lien de flux unique : {0}', + 'how_to_use' => 'Comment l\'utiliser ?', + 'two_ways' => 'Vous avez deux façons de débloquer les épisodes premium :', + 'import_into_app' => 'Copiez votre URL de flux unique dans votre application de baladodiffusion préférée (importez-la en tant que flux privé pour éviter de dévoiler vos identifiants).', + 'go_to_website' => 'Rendez-vous sur le site web de {podcastWebsite} et débloquez le podcast avec votre jeton.', + 'welcome_subject' => 'Bienvenue sur {podcastTitle}', + 'welcome' => 'Vous vous êtes abonné à {podcastTitle}, merci et bienvenue à bord !', + 'welcome_token_title' => 'Voici vos identifiants pour débloquer les épisodes premium du podcast:', + 'welcome_expires' => 'Votre abonnement a été configuré pour expirer le {0}.', + 'welcome_never_expires' => 'Votre abonnement a été configuré pour ne jamais expirer.', + 'reset_subject' => 'Votre jeton a été réinitialisé !', + 'reset_token' => 'Votre accès à {podcastTitle} a été réinitialisé !', + 'reset_token_title' => 'De nouveaux identifiants ont été générés pour vous permettre de déverrouiller les épisodes premium du podcast:', + 'edited_subject' => 'Votre abonnement a été mis à jour !', + 'edited_expires' => 'Votre abonnement pour {podcastTitle} a été configuré pour expirer le {expiresAt}.', + 'edited_never_expires' => 'Votre abonnement pour {podcastTitle} a été configuré pour ne jamais expirer !', + 'suspended_subject' => 'Votre abonnement a été suspendu !', + 'suspended' => 'Votre abonnement à {podcastTitle} a été suspendu ! Vous ne pouvez plus accéder aux épisodes premium du podcast.', + 'suspended_reason' => 'Pour la raison suivante : {0}', + 'resumed_subject' => 'Votre abonnement a été réactivé !', + 'resumed' => 'Votre abonnement à {podcastTitle} a été réactivé ! Vous pouvez à nouveau accéder aux épisodes premium du podcast.', + 'deleted_subject' => 'Votre abonnement a été supprimé !', + 'deleted' => 'Votre abonnement pour {podcastTitle} a été supprimé ! Vous n\'avez plus accès aux épisodes premium du podcast.', + 'footer' => '{castopod} hébergé sur {host}', ], ]; diff --git a/modules/PremiumPodcasts/Language/fr_CA/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fr_CA/PremiumPodcasts.php new file mode 100644 index 00000000..18c0dd4e --- /dev/null +++ b/modules/PremiumPodcasts/Language/fr_CA/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Podcast contains premium episodes', + 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', + 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', + 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', + 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'subscribe' => 'Subscribe', + 'lock' => 'Lock', + 'unlock' => 'Unlock', + 'unlock_form' => [ + 'title' => 'Premium content', + 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'token' => 'Enter your key', + 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'submit' => 'Unlock all episodes!', + 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'subscribe_cta' => 'Subscribe now!', + ], + 'messages' => [ + 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', + 'unlockBadAttempt' => 'Your key does not seem to be working…', + 'lockSuccess' => 'Podcast was successfully locked!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/fr_CA/Subscription.php b/modules/PremiumPodcasts/Language/fr_CA/Subscription.php new file mode 100644 index 00000000..f8af256f --- /dev/null +++ b/modules/PremiumPodcasts/Language/fr_CA/Subscription.php @@ -0,0 +1,100 @@ + 'Podcast subscriptions', + 'add' => 'New subscription', + 'view' => 'View subscription', + 'edit' => 'Edit subscription', + 'regenerate_token' => 'Regenerate token', + 'suspend' => 'Suspend subscription', + 'resume' => 'Resume subscription', + 'delete' => 'Delete subscription', + 'status' => [ + 'active' => 'Active', + 'suspended' => 'Suspended', + 'expired' => 'Expired', + ], + 'list' => [ + 'number' => 'Number', + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'unlimited' => 'Unlimited', + 'downloads' => 'Downloads', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'submit_add' => 'Add subscription', + 'submit_edit' => 'Edit subscription', + ], + 'form_link_add' => [ + 'link' => 'Subscription page link', + 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'submit' => 'Save link', + ], + 'suspend_form' => [ + 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'reason' => 'Reason', + 'reason_placeholder' => 'Why are you suspending the subscription?', + "submit" => 'Suspend subscription', + ], + 'delete_form' => [ + 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'understand' => 'I understand, remove the subscription permanently', + 'submit' => 'Remove subscription', + ], + 'messages' => [ + 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', + 'addError' => 'Subscription could not be added.', + 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'editError' => 'Subscription could not be edited.', + 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenError' => 'Token could not be regenerated.', + 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', + 'deleteError' => 'Subscription could not be removed.', + 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', + 'suspendError' => 'Subscription could not be suspended.', + 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', + 'resumeError' => 'Subscription could not be resumed.', + 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', + 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + ], + 'emails' => [ + 'greeting' => 'Hey,', + 'token' => 'Your token: {0}', + 'unique_feed_link' => 'Your unique feed link: {0}', + 'how_to_use' => 'How to use?', + 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', + 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'welcome_subject' => 'Welcome to {podcastTitle}', + 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', + 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', + 'welcome_expires' => 'Your subscription was set to expire on {0}.', + 'welcome_never_expires' => 'Your subscription was set to never expire.', + 'reset_subject' => 'Your token was reset!', + 'reset_token' => 'Your access to {podcastTitle} has been reset!', + 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'edited_subject' => 'Your subscription has been updated!', + 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', + 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'suspended_subject' => 'Your subscription has been suspended!', + 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended_reason' => 'That is for the following reason: {0}', + 'resumed_subject' => 'Your subscription has been resumed!', + 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'deleted_subject' => 'Your subscription has been removed!', + 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'footer' => '{castopod} hosted on {host}', + ], +]; diff --git a/modules/PremiumPodcasts/Language/fr_trad/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fr_trad/PremiumPodcasts.php new file mode 100644 index 00000000..18c0dd4e --- /dev/null +++ b/modules/PremiumPodcasts/Language/fr_trad/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Podcast contains premium episodes', + 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', + 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', + 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', + 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'subscribe' => 'Subscribe', + 'lock' => 'Lock', + 'unlock' => 'Unlock', + 'unlock_form' => [ + 'title' => 'Premium content', + 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'token' => 'Enter your key', + 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'submit' => 'Unlock all episodes!', + 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'subscribe_cta' => 'Subscribe now!', + ], + 'messages' => [ + 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', + 'unlockBadAttempt' => 'Your key does not seem to be working…', + 'lockSuccess' => 'Podcast was successfully locked!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/fr_trad/Subscription.php b/modules/PremiumPodcasts/Language/fr_trad/Subscription.php new file mode 100644 index 00000000..f8af256f --- /dev/null +++ b/modules/PremiumPodcasts/Language/fr_trad/Subscription.php @@ -0,0 +1,100 @@ + 'Podcast subscriptions', + 'add' => 'New subscription', + 'view' => 'View subscription', + 'edit' => 'Edit subscription', + 'regenerate_token' => 'Regenerate token', + 'suspend' => 'Suspend subscription', + 'resume' => 'Resume subscription', + 'delete' => 'Delete subscription', + 'status' => [ + 'active' => 'Active', + 'suspended' => 'Suspended', + 'expired' => 'Expired', + ], + 'list' => [ + 'number' => 'Number', + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'unlimited' => 'Unlimited', + 'downloads' => 'Downloads', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'submit_add' => 'Add subscription', + 'submit_edit' => 'Edit subscription', + ], + 'form_link_add' => [ + 'link' => 'Subscription page link', + 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'submit' => 'Save link', + ], + 'suspend_form' => [ + 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'reason' => 'Reason', + 'reason_placeholder' => 'Why are you suspending the subscription?', + "submit" => 'Suspend subscription', + ], + 'delete_form' => [ + 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'understand' => 'I understand, remove the subscription permanently', + 'submit' => 'Remove subscription', + ], + 'messages' => [ + 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', + 'addError' => 'Subscription could not be added.', + 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'editError' => 'Subscription could not be edited.', + 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenError' => 'Token could not be regenerated.', + 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', + 'deleteError' => 'Subscription could not be removed.', + 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', + 'suspendError' => 'Subscription could not be suspended.', + 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', + 'resumeError' => 'Subscription could not be resumed.', + 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', + 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + ], + 'emails' => [ + 'greeting' => 'Hey,', + 'token' => 'Your token: {0}', + 'unique_feed_link' => 'Your unique feed link: {0}', + 'how_to_use' => 'How to use?', + 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', + 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'welcome_subject' => 'Welcome to {podcastTitle}', + 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', + 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', + 'welcome_expires' => 'Your subscription was set to expire on {0}.', + 'welcome_never_expires' => 'Your subscription was set to never expire.', + 'reset_subject' => 'Your token was reset!', + 'reset_token' => 'Your access to {podcastTitle} has been reset!', + 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'edited_subject' => 'Your subscription has been updated!', + 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', + 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'suspended_subject' => 'Your subscription has been suspended!', + 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended_reason' => 'That is for the following reason: {0}', + 'resumed_subject' => 'Your subscription has been resumed!', + 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'deleted_subject' => 'Your subscription has been removed!', + 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'footer' => '{castopod} hosted on {host}', + ], +]; diff --git a/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php index 18c0dd4e..8c05e623 100644 --- a/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/nl/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'podcast_is_premium' => 'Podcast bevat premium afleveringen', + 'episode_is_premium' => 'Aflevering is premium, alleen beschikbaar voor premium abonnees', + 'unlock_episode' => 'Deze aflevering is alleen voor premium abonnees. Klik om te ontgrendelen!', + 'banner_unlock' => 'Deze podcast bevat premium afleveringen, alleen beschikbaar voor premium abonnees.', + 'banner_lock' => 'Podcast is ontgrendeld, geniet van de premium afleveringen!', + 'subscribe' => 'Abonneren', + 'lock' => 'Vergrendel', + 'unlock' => 'Ontgrendel', 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'title' => 'Premium inhoud', + 'subtitle' => 'Deze podcast bevat vergrendelde premium afleveringen! Heb je de sleutel om ze te ontgrendelen?', + 'token' => 'Voer jouw sleutel in', + 'token_hint' => 'Als je geabonneerd bent op {podcastTitle}, kun je de sleutel die naar je verzonden is via e-mail kopiëren en deze hier plakken.', + 'submit' => 'Ontgrendel alle afleveringen!', + 'call_to_action' => 'Ontgrendel alle afleveringen van {podcastTitle}:', + 'subscribe_cta' => 'Nu abonneren!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Podcast is succesvol ontgrendeld! Geniet van de premium afleveringen!', + 'unlockBadAttempt' => 'Jouw sleutel lijkt niet te werken…', + 'lockSuccess' => 'Podcast is succesvol vergrendeld!', ], ]; diff --git a/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php index 18c0dd4e..356bda07 100644 --- a/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/pl/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'podcast_is_premium' => 'Podcast zawiera odcinki premium', + 'episode_is_premium' => 'Odcinek jest dostępny tylko dla subskrybentów premium', + 'unlock_episode' => 'Ten odcinek jest tylko dla subskrybentów premium. Kliknij, aby go odblokować!', + 'banner_unlock' => 'Ten podcast zawiera odcinki premium, dostępne tylko dla subskrybentów premium.', + 'banner_lock' => 'Podcast został odblokowany, ciesz się odcinkami premium!', + 'subscribe' => 'Subskrybuj', + 'lock' => 'Zablokuj', + 'unlock' => 'Odblokuj', 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'title' => 'Zawartość premium', + 'subtitle' => 'Ten podcast zawiera zablokowane odcinki premium! Czy masz klucz do ich odblokowania?', + 'token' => 'Wprowadź swój klucz', + 'token_hint' => 'Jeśli subskrybujesz {podcastTitle} możesz skopiować klucz wysłany do Ciebie pocztą elektroniczną i wkleić go tutaj.', + 'submit' => 'Odblokuj wszystkie odcinki!', + 'call_to_action' => 'Odblokuj wszystkie odcinki {podcastTitle}:', + 'subscribe_cta' => 'Subskrybuj teraz!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Podcast został pomyślnie odblokowany! Ciesz się odcinkami premium!', + 'unlockBadAttempt' => 'Twój klucz nie działa…', + 'lockSuccess' => 'Podcast został pomyślnie zablokowany!', ], ]; diff --git a/modules/PremiumPodcasts/Language/pl/Subscription.php b/modules/PremiumPodcasts/Language/pl/Subscription.php index f8af256f..0d90840d 100644 --- a/modules/PremiumPodcasts/Language/pl/Subscription.php +++ b/modules/PremiumPodcasts/Language/pl/Subscription.php @@ -9,92 +9,92 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Subskrypcje podcastu', + 'add' => 'Nowa subskrypcja', + 'view' => 'Wyświetl subskrypcję', + 'edit' => 'Edytuj subskrypcję', + 'regenerate_token' => 'Wygeneruj nowy token', + 'suspend' => 'Wstrzymaj subskrypcję', + 'resume' => 'Wznów subskrypcję', + 'delete' => 'Usuń subskrypcję', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Aktywne', + 'suspended' => 'Zawieszony', + 'expired' => 'Wygasły', ], 'list' => [ - 'number' => 'Number', + 'number' => 'Numer', 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', + 'expiration_date' => 'Data ważności', + 'unlimited' => 'Nielimitowany', + 'downloads' => 'Pobrane', 'status' => 'Status', ], 'form' => [ 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', - 'submit_edit' => 'Edit subscription', + 'expiration_date' => 'Data ważności', + 'expiration_date_hint' => 'Data i godzina wygaśnięcia subskrypcji. Pozostaw puste dla nieograniczonej subskrypcji.', + 'submit_add' => 'Dodaj subskrypcję', + 'submit_edit' => 'Edytuj subskrypcję', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'link' => 'Link do strony subskrypcji', + 'link_hint' => 'Spowoduje to dodanie przycisku w witrynie zapraszając słuchaczy do subskrypcji podcastu.', + 'submit' => 'Zapisz link', ], 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', + 'disclaimer' => 'Zawieszenie subskrypcji ograniczy abonentowi dostęp do treści premium. Wciąż będziesz mógł później usunąć zawieszenie.', + 'reason' => 'Powód', + 'reason_placeholder' => 'Dlaczego zawieszasz subskrypcję?', + "submit" => 'Wstrzymaj subskrypcję', ], 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', - 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', + 'disclaimer' => 'Usunięcie subskrypcji {subscriber} spowoduje usunięcie wszystkich danych analitycznych z nią związanych.', + 'understand' => 'Rozumiem, usuń subskrypcję na stałe', + 'submit' => 'Usuń subskrypcję', ], 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', - 'editError' => 'Subscription could not be edited.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', - 'regenerateTokenError' => 'Token could not be regenerated.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + 'addSuccess' => 'Dodano nową subskrypcję! Wiadomość powitalna została wysłana na adres {subscriber}.', + 'addError' => 'Subskrypcja nie może zostać dodana.', + 'editSuccess' => 'Data wygaśnięcia subskrypcji została zaktualizowana! Wiadomość e-mail została wysłana do {subscriber}.', + 'editError' => 'Subskrypcja nie może być edytowana.', + 'regenerateTokenSuccess' => 'Token został odnowiony! Wiadomość e-mail została wysłana do {subscriber} z nowym tokenem.', + 'regenerateTokenError' => 'Token nie mógł zostać odnowiony.', + 'deleteSuccess' => 'Subskrypcja została usunięta! Wiadomość e-mail została wysłana do {subscriber}.', + 'deleteError' => 'Twoja subskrypcja nie mogła zostać anulowana.', + 'suspendSuccess' => 'Subskrypcja została zawieszona! Wiadomość e-mail została wysłana do {subscriber}.', + 'suspendError' => 'Twoja subskrypcja nie mogła zostać anulowana.', + 'resumeSuccess' => 'Subskrypcja została usunięta! Wiadomość e-mail została wysłana do {subscriber}.', + 'resumeError' => 'Subskrypcja nie może być wznowiona.', + 'linkSaveSuccess' => 'Link do subskrypcji został pomyślnie zapisany! Pojawi się na stronie internetowej jako wywołanie Akcji!', + 'linkRemoveSuccess' => 'Link do subskrypcji został pomyślnie usunięty!', ], 'emails' => [ - 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', - 'welcome_subject' => 'Welcome to {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', - 'edited_subject' => 'Your subscription has been updated!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', - 'suspended_subject' => 'Your subscription has been suspended!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', - 'suspended_reason' => 'That is for the following reason: {0}', - 'resumed_subject' => 'Your subscription has been resumed!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', - 'deleted_subject' => 'Your subscription has been removed!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', - 'footer' => '{castopod} hosted on {host}', + 'greeting' => 'Cześć,', + 'token' => 'Twój token: {0}', + 'unique_feed_link' => 'Twój unikalny link do kanału: {0}', + 'how_to_use' => 'Jak używać?', + 'two_ways' => 'Masz dwa sposoby odblokowania odcinków premium:', + 'import_into_app' => 'Skopiuj swój unikalny adres Url kanału w swojej ulubionej aplikacji podcastowej (zaimportuj go jako prywatny kanał, aby zapobiec ujawnianiu Twoich poświadczeń).', + 'go_to_website' => 'Przejdź do strony {podcastWebsite} i odblokuj podcast za pomocą swojego tokenu.', + 'welcome_subject' => 'Witaj w {podcastTitle}', + 'welcome' => 'Zasubskrybowałeś {podcastTitle}, dziękuję i witam serdecznie!', + 'welcome_token_title' => 'Oto twoje dane, aby odblokować odcinki premium podcastu:', + 'welcome_expires' => 'Twoja subskrypcja wygaśnie w dniu {0}.', + 'welcome_never_expires' => 'Twoja subskrypcja nigdy nie wygasa.', + 'reset_subject' => 'Twój token został zresetowany!', + 'reset_token' => 'Twój dostęp do {podcastTitle} został zresetowany!', + 'reset_token_title' => 'Nowe dane logowania zostały wygenerowane, aby odblokować odcinki premium podcastu:', + 'edited_subject' => 'Subskrypcja została aktywowana!', + 'edited_expires' => 'Twoja subskrypcja dla {podcastTitle} wygasa w dniu {expiresAt}.', + 'edited_never_expires' => 'Twoja subskrypcja dla {podcastTitle} nigdy nie wygasa!', + 'suspended_subject' => 'Twoja subskrypcja została zawieszona!', + 'suspended' => 'Twoja subskrypcja dla {podcastTitle} została zawieszona! Nie możesz już uzyskać dostępu do odcinków premium podcastu.', + 'suspended_reason' => 'Z następującego powodu: {0}', + 'resumed_subject' => 'Twoja subskrypcja została przywrócona!', + 'resumed' => 'Twoja subskrypcja dla {podcastTitle} została wznowiona! Masz ponownie dostęp do odcinków premium podcastu.', + 'deleted_subject' => 'Subskrypcja została usunięta!', + 'deleted' => 'Twoja subskrypcja dla {podcastTitle} została usunięta! Nie masz już dostępu do odcinków premium podcastu.', + 'footer' => '{castopod} hostowany na {host}', ], ]; diff --git a/modules/PremiumPodcasts/Language/uk/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/uk/PremiumPodcasts.php new file mode 100644 index 00000000..bd87ddae --- /dev/null +++ b/modules/PremiumPodcasts/Language/uk/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Подкаст містить преміум-епізоди', + 'episode_is_premium' => 'Цей подкаст містить преміум епізоди, тільки для преміум підписників', + 'unlock_episode' => 'Цей епізод призначений тільки для преміум підписників. Натисніть, щоб розблокувати його!', + 'banner_unlock' => 'Цей подкаст містить преміум епізоди, тільки для преміум підписників.', + 'banner_lock' => 'Подкаст був успішно розблокований! Насолоджуйтесь преміум епізодами!', + 'subscribe' => 'Підписатися', + 'lock' => 'Заблокувати', + 'unlock' => 'Розблокувати', + 'unlock_form' => [ + 'title' => 'Преміум контент', + 'subtitle' => 'Цей подкаст містить заблоковані преміум епізоди! Ви маєте ключ для їх розблокування?', + 'token' => 'Введіть ваш ключ', + 'token_hint' => 'Якщо ви підписані на {podcastTitle}, ви можете скопіювати ключ, відправлений вам на електрону пошту та вставити його тут.', + 'submit' => 'Розблокувати всі серії!', + 'call_to_action' => 'Розблокувати всі серії з {podcastTitle}:', + 'subscribe_cta' => 'Підписатися зараз!', + ], + 'messages' => [ + 'unlockSuccess' => 'Подкаст був успішно розблокований! Насолоджуйтесь преміум епізодами!', + 'unlockBadAttempt' => 'Здається, ваш ключ не працює…', + 'lockSuccess' => 'Подкаст успішно заблокований!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/uk/Subscription.php b/modules/PremiumPodcasts/Language/uk/Subscription.php new file mode 100644 index 00000000..f8af256f --- /dev/null +++ b/modules/PremiumPodcasts/Language/uk/Subscription.php @@ -0,0 +1,100 @@ + 'Podcast subscriptions', + 'add' => 'New subscription', + 'view' => 'View subscription', + 'edit' => 'Edit subscription', + 'regenerate_token' => 'Regenerate token', + 'suspend' => 'Suspend subscription', + 'resume' => 'Resume subscription', + 'delete' => 'Delete subscription', + 'status' => [ + 'active' => 'Active', + 'suspended' => 'Suspended', + 'expired' => 'Expired', + ], + 'list' => [ + 'number' => 'Number', + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'unlimited' => 'Unlimited', + 'downloads' => 'Downloads', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'submit_add' => 'Add subscription', + 'submit_edit' => 'Edit subscription', + ], + 'form_link_add' => [ + 'link' => 'Subscription page link', + 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'submit' => 'Save link', + ], + 'suspend_form' => [ + 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'reason' => 'Reason', + 'reason_placeholder' => 'Why are you suspending the subscription?', + "submit" => 'Suspend subscription', + ], + 'delete_form' => [ + 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'understand' => 'I understand, remove the subscription permanently', + 'submit' => 'Remove subscription', + ], + 'messages' => [ + 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', + 'addError' => 'Subscription could not be added.', + 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'editError' => 'Subscription could not be edited.', + 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenError' => 'Token could not be regenerated.', + 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', + 'deleteError' => 'Subscription could not be removed.', + 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', + 'suspendError' => 'Subscription could not be suspended.', + 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', + 'resumeError' => 'Subscription could not be resumed.', + 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', + 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + ], + 'emails' => [ + 'greeting' => 'Hey,', + 'token' => 'Your token: {0}', + 'unique_feed_link' => 'Your unique feed link: {0}', + 'how_to_use' => 'How to use?', + 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', + 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'welcome_subject' => 'Welcome to {podcastTitle}', + 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', + 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', + 'welcome_expires' => 'Your subscription was set to expire on {0}.', + 'welcome_never_expires' => 'Your subscription was set to never expire.', + 'reset_subject' => 'Your token was reset!', + 'reset_token' => 'Your access to {podcastTitle} has been reset!', + 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'edited_subject' => 'Your subscription has been updated!', + 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', + 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'suspended_subject' => 'Your subscription has been suspended!', + 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended_reason' => 'That is for the following reason: {0}', + 'resumed_subject' => 'Your subscription has been resumed!', + 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'deleted_subject' => 'Your subscription has been removed!', + 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'footer' => '{castopod} hosted on {host}', + ], +]; From e1b66ed7ed23029ba63fcf52ece129d17fef4df4 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 17 Mar 2023 09:59:10 +0000 Subject: [PATCH 079/477] ci: fix docs invalid tags and dead links --- docs/package-lock.json | 4 ++-- docs/package.json | 4 ++-- docs/src/ca/getting-started/docker.md | 4 ++-- docs/src/ca/index.md | 4 ++-- docs/src/es/getting-started/update.md | 3 +-- docs/src/fr/getting-started/update.md | 4 ++-- docs/src/fr_CA/index.md | 2 +- docs/src/fr_trad/index.md | 2 +- docs/src/gd/index.md | 2 +- docs/src/sv/index.md | 9 ++++----- docs/src/uk/index.md | 2 +- docs/src/zh-Hans/getting-started/update.md | 6 ++---- docs/src/zh-Hans/index.md | 2 +- 13 files changed, 22 insertions(+), 26 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index b61947e1..493eb496 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9,8 +9,8 @@ "version": "0.0.0-development", "license": "AGPL-3.0-or-later", "devDependencies": { - "tailwindcss": "^3.0.23", - "vitepress": "^0.22.3" + "tailwindcss": "^3.2.7", + "vitepress": "^0.22.4" } }, "node_modules/@algolia/autocomplete-core": { diff --git a/docs/package.json b/docs/package.json index da849551..06cafed3 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,7 +15,7 @@ }, "license": "AGPL-3.0-or-later", "devDependencies": { - "tailwindcss": "^3.0.23", - "vitepress": "^0.22.3" + "tailwindcss": "^3.2.7", + "vitepress": "^0.22.4" } } diff --git a/docs/src/ca/getting-started/docker.md b/docs/src/ca/getting-started/docker.md index 1134fd98..390be5b2 100644 --- a/docs/src/ca/getting-started/docker.md +++ b/docs/src/ca/getting-started/docker.md @@ -8,8 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: -- [** code>castopod/app**](https://hub.docker.com/r/castopod/app): el - paquet incloent Castopod i totes les dependències +- [**castopod/app**](https://hub.docker.com/r/castopod/app): el paquet incloent + Castopod i totes les dependències - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una configuració de Nginx per a Castopod - [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): diff --git a/docs/src/ca/index.md b/docs/src/ca/index.md index 8d017356..ae986868 100644 --- a/docs/src/ca/index.md +++ b/docs/src/ca/index.md @@ -141,7 +141,7 @@ són realment fantàstiques i [moltes](https://podcastindex.org/apps) s'estan incorporant al carro Podcasting 2.0. com Castopod! Cadascuna d'aquestes solucions difereix entre si, podeu comparar-les amb la -[llista de funcions](#features). +[llista de funcions](#característiques). Dit això, hi ha dues diferències principals amb altres solucions de podcasting: @@ -167,7 +167,7 @@ perquè pugueu entendre quines accions seran o no tolerades. ### Guia de col·laboració -Llegiu la nostra [guia de col·laboració](./contributing/guidelines.md) per +Llegiu la nostra [guia de col·laboració](../contributing/guidelines.md) per conèixer el nostre procés de desenvolupament, com proposar correccions d'errors i millores, i com construir i prova els teus canvis a Castopod. diff --git a/docs/src/es/getting-started/update.md b/docs/src/es/getting-started/update.md index d69fd09b..78d6c13d 100644 --- a/docs/src/es/getting-started/update.md +++ b/docs/src/es/getting-started/update.md @@ -62,8 +62,7 @@ la página de [lanzamientos](https://code.castopod.org/adaures/castopod/-/releases)). - cf. - -No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer? + [No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?](#no-he-actualizado-mi-instancia-en-mucho-tiempo-qué-debo-hacer) ::: diff --git a/docs/src/fr/getting-started/update.md b/docs/src/fr/getting-started/update.md index e7bc8e87..ef4f2fdb 100644 --- a/docs/src/fr/getting-started/update.md +++ b/docs/src/fr/getting-started/update.md @@ -61,8 +61,8 @@ Les versions peuvent être accompagnées d'instructions de mise à jour supplémentaires (cf. la [page des notes de versions](https://code.castopod.org/adaures/castopod/-/releases)). -- Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire - ? +- cf. + [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#je-nai-pas-mis-à-jour-mon-instance-depuis-longtemps-que-devrais-je-faire) ::: diff --git a/docs/src/fr_CA/index.md b/docs/src/fr_CA/index.md index 6e04835b..f01279e8 100644 --- a/docs/src/fr_CA/index.md +++ b/docs/src/fr_CA/index.md @@ -166,7 +166,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/fr_trad/index.md b/docs/src/fr_trad/index.md index 6e04835b..f01279e8 100644 --- a/docs/src/fr_trad/index.md +++ b/docs/src/fr_trad/index.md @@ -166,7 +166,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md index 4d37b867..a1e433ba 100644 --- a/docs/src/gd/index.md +++ b/docs/src/gd/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/sv/index.md b/docs/src/sv/index.md index b06aa6b7..21624079 100644 --- a/docs/src/sv/index.md +++ b/docs/src/sv/index.md @@ -22,7 +22,7 @@ mycket litet fotavtryck. - 🌱  Gratis & öppen källkod (AGPL v3-licens) - 🔐  Fokuserad på datasuveränitet: ditt innehåll, målgrupp och analys tillhör dig, och du bara --  Podcasting 2.0 funktioner: GUID, låst, avskrifter, finansiering, +- 🪄  Podcasting 2.0 funktioner: GUID, låst, avskrifter, finansiering, kapitel, plats, personer, ljud, … - 💬  Inbyggt socialt nätverk: - 🚀  Castopod är en del av Fediverse, ett decentraliserat socialt @@ -30,7 +30,7 @@ mycket litet fotavtryck. - ❤️  Skapa inlägg, dela, favorit och kommentera avsnitt - 📈  Inbyggd analys: - ⚖️  GDPR / CCPA / LGPD kompatibel - -  Standard IABv2 målgruppsmätning + - 🪙  Standard IABv2 målgruppsmätning - 🏡  Lokalanalys, ingen tredje part involverad - 📢  Inbyggda marknadsföringsverktyg: - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) @@ -38,8 +38,7 @@ mycket litet fotavtryck. - 🎨  Anpassningsbara temafärger - 🎬  Generera att dela videoklipp från avsnitt - 🔉  Generera ljudbitar - - \_button_selector:  Inbäddbar spelare, bädda in dina avsnitt på - valfri webbplats + - ▶️  Inbäddbar spelare, bädda in dina avsnitt på valfri webbplats - 💸  Monetization: - 🔗  Finansierar länkar - 📲  lista-att-klicka annonser @@ -51,7 +50,7 @@ mycket litet fotavtryck. - ⚡  Sänd dina avsnitt direkt med WebSub - 📥  Podcast import: flytta din befintliga podcast till Castopod - 📤  Flytta ut din podcast från Castopod -- :shuffle_tracks  Flera hyresgäst: värd så många podcasts du vill +- 🔀  Flera hyresgäst: värd så många podcasts du vill - 👥  Flera användare: lägg till bidragslämnare och ange roller - 🌎  i18n support: översatt till engelska, franska, polska, tyska, brasilianska portugisiska & spanska… med diff --git a/docs/src/uk/index.md b/docs/src/uk/index.md index 6e04835b..f01279e8 100644 --- a/docs/src/uk/index.md +++ b/docs/src/uk/index.md @@ -166,7 +166,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/zh-Hans/getting-started/update.md b/docs/src/zh-Hans/getting-started/update.md index f8f7c4ef..410d4193 100644 --- a/docs/src/zh-Hans/getting-started/update.md +++ b/docs/src/zh-Hans/getting-started/update.md @@ -53,10 +53,8 @@ sidebarDepth: 3 [发布页面](https://code.castopod.org/adaures/castopod/-/releases))。 - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) - 我该怎么办? - -::: + [我很长时间没有更新我的实例… 我该怎么办? 我该怎么办?](#我很长时间没有更新我的实例-我该怎么办-我该怎么办) + ::: ## 全自动更新 diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md index cb018368..f5889359 100644 --- a/docs/src/zh-Hans/index.md +++ b/docs/src/zh-Hans/index.md @@ -138,7 +138,7 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能 ### 贡献指南 -阅读我们的 [贡献指南](./contributing/guidelines.md) ,了解我们的开发过程。 提出 +阅读我们的 [贡献指南](../contributing/guidelines.md) ,了解我们的开发过程。 提出 错 误修正和改进想法,以及如何构建和测试 Castopod 。 ## 贡献者 ✨ From 1dde11f8e42b66684a956068f5347e9289f4918b Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 17 Mar 2023 14:51:43 +0000 Subject: [PATCH 080/477] feat: add health route to check if db, cache and file manager are ok --- app/Config/Routes.php | 5 +++ app/Controllers/HomeController.php | 42 +++++++++++++++++++ modules/Media/FileManagers/FS.php | 7 ++++ .../FileManagers/FileManagerInterface.php | 2 + modules/Media/FileManagers/S3.php | 34 +++++++++++---- 5 files changed, 82 insertions(+), 8 deletions(-) diff --git a/app/Config/Routes.php b/app/Config/Routes.php index f0dd58b0..cba9bf1a 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -60,6 +60,11 @@ $routes->get('themes/colors', 'ColorsController', [ 'as' => 'themes-colors-css', ]); +// health check +$routes->get('/health', 'HomeController::health', [ + 'as' => 'health', +]); + // We get a performance increase by specifying the default // route since we don't have to scan directories. $routes->get('/', 'HomeController', [ diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php index 68816c0c..130d1e3a 100644 --- a/app/Controllers/HomeController.php +++ b/app/Controllers/HomeController.php @@ -11,8 +11,11 @@ declare(strict_types=1); namespace App\Controllers; use App\Models\PodcastModel; +use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\HTTP\RedirectResponse; +use CodeIgniter\HTTP\ResponseInterface; use Config\Services; +use Modules\Media\FileManagers\FileManagerInterface; class HomeController extends BaseController { @@ -48,4 +51,43 @@ class HomeController extends BaseController return view('home', $data); } + + public function health(): ResponseInterface + { + $errors = []; + + try { + db_connect(); + } catch (DatabaseException) { + $errors[] = 'Unable to connect to the database.'; + } + + // --- Can Castopod connect to the cache handler + if (config('Cache')->handler !== 'dummy' && cache()->getCacheInfo() === null) { + $errors[] = 'Unable connect to the cache handler.'; + } + + // --- Can Castopod write to storage? + + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager', false); + + if (! $fileManager->isHealthy()) { + $errors[] = 'Problem with file manager.'; + } + + if ($errors !== []) { + return $this->response->setStatusCode(503, 'Problem with cache handler.') + ->setJSON([ + 'code' => 503, + 'errors' => $errors, + ]); + } + + return $this->response->setStatusCode(200) + ->setJSON([ + 'code' => 200, + 'message' => '✨ All good!', + ]); + } } diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index 80c03547..f37792a7 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -132,4 +132,11 @@ class FS implements FileManagerInterface return true; } + + public function isHealthy(): bool + { + helper('media'); + + return is_really_writable(ROOTPATH . 'public/' . media_path()); + } } diff --git a/modules/Media/FileManagers/FileManagerInterface.php b/modules/Media/FileManagers/FileManagerInterface.php index 3b53afa7..39093441 100644 --- a/modules/Media/FileManagers/FileManagerInterface.php +++ b/modules/Media/FileManagers/FileManagerInterface.php @@ -23,4 +23,6 @@ interface FileManagerInterface public function deletePodcastImageSizes(string $podcastHandle): bool; public function deletePersonImagesSizes(): bool; + + public function isHealthy(): bool; } diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index eef77fe1..d905945d 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -27,15 +27,19 @@ class S3 implements FileManagerInterface 'use_path_style_endpoint' => $config->s3['path_style_endpoint'], ]); - // create bucket if it does not already exist - if (! $this->s3->doesBucketExist((string) $this->config->s3['bucket'])) { - try { - $this->s3->createBucket([ - 'Bucket' => $this->config->s3['bucket'], - ]); - } catch (Exception $exception) { - log_message('critical', $exception->getMessage()); + try { + // create bucket if it does not already exist + if (! $this->s3->doesBucketExist((string) $this->config->s3['bucket'])) { + try { + $this->s3->createBucket([ + 'Bucket' => $this->config->s3['bucket'], + ]); + } catch (Exception $exception) { + log_message('critical', $exception->getMessage()); + } } + } catch (Exception $exception) { + throw new Exception($exception->getMessage(), $exception->getCode(), $exception); } } @@ -171,4 +175,18 @@ class S3 implements FileManagerInterface $podcastImageKeys = preg_grep("~^persons\/.*_.*.\.(jpg|png|webp)$~", $objectsKeys); return (bool) $podcastImageKeys; } + + public function isHealthy(): bool + { + try { + // ok if bucket exists and you have permission to access it + $this->s3->headBucket([ + 'Bucket' => $this->config->s3['bucket'], + ]); + } catch (Exception) { + return false; + } + + return true; + } } From 5d2a2d49c489cd98f9c9ecbca35fd5d21a9cadfb Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 17 Mar 2023 16:34:44 +0000 Subject: [PATCH 081/477] fix(contributors): add dash to prevent deleting permissions from other podcast fixes #310 --- modules/Auth/Helpers/auth_helper.php | 4 ++-- modules/Auth/Models/UserModel.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/Auth/Helpers/auth_helper.php b/modules/Auth/Helpers/auth_helper.php index d424ef77..67cd2df2 100644 --- a/modules/Auth/Helpers/auth_helper.php +++ b/modules/Auth/Helpers/auth_helper.php @@ -139,7 +139,7 @@ if (! function_exists('get_podcast_group')) { function get_podcast_group(User $user, int $podcastId, bool $removePrefix = true): ?string { $podcastGroups = array_filter($user->getGroups() ?? [], static function ($group) use ($podcastId): bool { - return str_starts_with($group, "podcast#{$podcastId}"); + return str_starts_with($group, "podcast#{$podcastId}-"); }); if ($podcastGroups === []) { @@ -155,7 +155,7 @@ if (! function_exists('get_podcast_group')) { } if ($removePrefix) { - // strip the `podcast#{id}.` prefix when returning group + // strip the `podcast#{id}-` prefix when returning group return substr((string) $podcastGroup, strlen('podcast#' . $podcastId . '-')); } diff --git a/modules/Auth/Models/UserModel.php b/modules/Auth/Models/UserModel.php index 82ba5177..2fbdbd07 100644 --- a/modules/Auth/Models/UserModel.php +++ b/modules/Auth/Models/UserModel.php @@ -35,7 +35,7 @@ class UserModel extends ShieldUserModel { return $this->select('users.*') ->join('auth_groups_users', 'users.id = auth_groups_users.user_id') - ->like('auth_groups_users.group', "podcast#{$podcastId}") + ->like('auth_groups_users.group', "podcast#{$podcastId}-") ->findAll(); } @@ -44,7 +44,7 @@ class UserModel extends ShieldUserModel return $this->select('users.*') ->join('auth_groups_users', 'users.id = auth_groups_users.user_id') ->where('users.id', $contributorId) - ->like('auth_groups_users.group', "podcast#{$podcastId}") + ->like('auth_groups_users.group', "podcast#{$podcastId}-") ->first(); } } From 729edc9afa5ab4690c688c0bf68a09febe0f014d Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 17 Mar 2023 17:08:19 +0000 Subject: [PATCH 082/477] build(ci): add npm to docker/ci image for semantic release --- docker/ci/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/ci/Dockerfile b/docker/ci/Dockerfile index f24e3689..a6ebf45f 100644 --- a/docker/ci/Dockerfile +++ b/docker/ci/Dockerfile @@ -14,6 +14,8 @@ RUN \ # install ci requirements && apk add --no-cache \ nodejs \ + # install npm for @semantic-release/npm + npm \ git \ unzip \ wget \ From 0cb2e99f032d04c1db551f53c6d563d966cceb4c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 17 Mar 2023 17:21:02 +0000 Subject: [PATCH 083/477] chore(release): 1.2.0 [skip ci] # [1.2.0](https://code.castopod.org/adaures/castopod/compare/v1.1.2...v1.2.0) (2023-03-17) ### Bug Fixes * **analytics:** check the x_forwarded_for client header ([1111177](https://code.castopod.org/adaures/castopod/commit/1111177eb7fea4eba6d119b17acdf3bf416492ef)) * **auth:** update podcast editors' permissions ([a9b6308](https://code.castopod.org/adaures/castopod/commit/a9b630884bc318499ea7f03862d5752dd5f178e1)) * **contributors:** add dash to prevent deleting permissions from other podcast ([5d2a2d4](https://code.castopod.org/adaures/castopod/commit/5d2a2d49c489cd98f9c9ecbca35fd5d21a9cadfb)), closes [#310](https://code.castopod.org/adaures/castopod/issues/310) * display bandwidth limit on dashboard when set in .env ([a2a87ab](https://code.castopod.org/adaures/castopod/commit/a2a87abf7caea3c87bcf2d0988610cc07782de9e)) * **docker:** update nginx configuration ([8884598](https://code.castopod.org/adaures/castopod/commit/8884598a56d0e2550776ef4cee5e53558c20e009)) * **platforms:** update 'submit_url' for Antennapod ([9fc49a7](https://code.castopod.org/adaures/castopod/commit/9fc49a7430406f50e68318c5fd7c577ae1ebd9df)) ### Features * add downloads count to episode list ([b63c1dc](https://code.castopod.org/adaures/castopod/commit/b63c1dc9b1ed41626b99ba852a9a00ed417059ba)) * add health route to check if db, cache and file manager are ok ([1dde11f](https://code.castopod.org/adaures/castopod/commit/1dde11f8e42b66684a956068f5347e9289f4918b)) * **media:** add s3 to manage media files ([d93fc98](https://code.castopod.org/adaures/castopod/commit/d93fc98469ffe93913b65e539dec396891708c70)) ### Reverts * **install:** reset condition to look for instance owner before continuing install ([fc009f3](https://code.castopod.org/adaures/castopod/commit/fc009f3d0058028bbbb6418603cf820c0f7cea80)) --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c72d47f0..8eca74df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,36 @@ +# [1.2.0](https://code.castopod.org/adaures/castopod/compare/v1.1.2...v1.2.0) (2023-03-17) + +### Bug Fixes + +- **analytics:** check the x_forwarded_for client header + ([1111177](https://code.castopod.org/adaures/castopod/commit/1111177eb7fea4eba6d119b17acdf3bf416492ef)) +- **auth:** update podcast editors' permissions + ([a9b6308](https://code.castopod.org/adaures/castopod/commit/a9b630884bc318499ea7f03862d5752dd5f178e1)) +- **contributors:** add dash to prevent deleting permissions from other podcast + ([5d2a2d4](https://code.castopod.org/adaures/castopod/commit/5d2a2d49c489cd98f9c9ecbca35fd5d21a9cadfb)), + closes [#310](https://code.castopod.org/adaures/castopod/issues/310) +- display bandwidth limit on dashboard when set in .env + ([a2a87ab](https://code.castopod.org/adaures/castopod/commit/a2a87abf7caea3c87bcf2d0988610cc07782de9e)) +- **docker:** update nginx configuration + ([8884598](https://code.castopod.org/adaures/castopod/commit/8884598a56d0e2550776ef4cee5e53558c20e009)) +- **platforms:** update 'submit_url' for Antennapod + ([9fc49a7](https://code.castopod.org/adaures/castopod/commit/9fc49a7430406f50e68318c5fd7c577ae1ebd9df)) + +### Features + +- add downloads count to episode list + ([b63c1dc](https://code.castopod.org/adaures/castopod/commit/b63c1dc9b1ed41626b99ba852a9a00ed417059ba)) +- add health route to check if db, cache and file manager are ok + ([1dde11f](https://code.castopod.org/adaures/castopod/commit/1dde11f8e42b66684a956068f5347e9289f4918b)) +- **media:** add s3 to manage media files + ([d93fc98](https://code.castopod.org/adaures/castopod/commit/d93fc98469ffe93913b65e539dec396891708c70)) + +### Reverts + +- **install:** reset condition to look for instance owner before continuing + install + ([fc009f3](https://code.castopod.org/adaures/castopod/commit/fc009f3d0058028bbbb6418603cf820c0f7cea80)) + ## [1.1.2](https://code.castopod.org/adaures/castopod/compare/v1.1.1...v1.1.2) (2022-12-14) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 57bde320..1cd442a9 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.1.2'); +defined('CP_VERSION') || define('CP_VERSION', '1.2.0'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index a04b3e3d..27af5c61 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.1.2", + "version": "1.2.0", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 5490d8c4..788d5d1f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.1.2", + "version": "1.2.0", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From b3c6e05e6fcd8a518eeedeefde28b61f879ba71d Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 17 Mar 2023 17:36:26 +0000 Subject: [PATCH 084/477] fix: change app.mediaBaseURL to media.baseURL in install, docker entrypoints and docs --- .env.example | 2 +- docker/production/app/entrypoint.sh | 2 +- docker/production/unit/entrypoint.sh | 2 +- docs/src/ar/contributing/setup-development.md | 2 +- docs/src/br/contributing/setup-development.md | 2 +- docs/src/de/contributing/setup-development.md | 2 +- docs/src/el/contributing/setup-development.md | 2 +- docs/src/es/contributing/setup-development.md | 2 +- docs/src/fr/contributing/setup-development.md | 2 +- docs/src/id/contributing/setup-development.md | 2 +- docs/src/it/contributing/setup-development.md | 2 +- docs/src/nl/contributing/setup-development.md | 2 +- docs/src/nn-NO/contributing/setup-development.md | 2 +- docs/src/oc/contributing/setup-development.md | 2 +- docs/src/pl/contributing/setup-development.md | 2 +- docs/src/pt-BR/contributing/setup-development.md | 2 +- docs/src/pt/contributing/setup-development.md | 2 +- docs/src/ru/contributing/setup-development.md | 2 +- docs/src/sv/contributing/setup-development.md | 2 +- modules/Install/Controllers/InstallController.php | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.env.example b/.env.example index 39f369d2..f01cd28a 100644 --- a/.env.example +++ b/.env.example @@ -14,7 +14,7 @@ # Instance configuration #-------------------------------------------------------------------- app.baseURL="https://YOUR_DOMAIN_NAME/" -app.mediaBaseURL="https://YOUR_MEDIA_DOMAIN_NAME/" +media.baseURL="https://YOUR_MEDIA_DOMAIN_NAME/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docker/production/app/entrypoint.sh b/docker/production/app/entrypoint.sh index b24dcab0..623ef13d 100644 --- a/docker/production/app/entrypoint.sh +++ b/docker/production/app/entrypoint.sh @@ -107,7 +107,7 @@ fi cat << EOF > /opt/castopod/.env app.baseURL="${CP_BASEURL}" -app.mediaBaseURL="${CP_MEDIA_BASEURL}" +media.baseURL="${CP_MEDIA_BASEURL}" EOF if [ "${CP_DISABLE_HTTPS}" == "1" ] diff --git a/docker/production/unit/entrypoint.sh b/docker/production/unit/entrypoint.sh index 62a1036e..01904073 100644 --- a/docker/production/unit/entrypoint.sh +++ b/docker/production/unit/entrypoint.sh @@ -107,7 +107,7 @@ fi cat << EOF > /var/www/castopod/.env app.baseURL="${CP_BASEURL}" -app.mediaBaseURL="${CP_MEDIA_BASEURL}" +media.baseURL="${CP_MEDIA_BASEURL}" EOF if [ "${CP_DISABLE_HTTPS}" = "1" ] diff --git a/docs/src/ar/contributing/setup-development.md b/docs/src/ar/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/ar/contributing/setup-development.md +++ b/docs/src/ar/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/br/contributing/setup-development.md b/docs/src/br/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/br/contributing/setup-development.md +++ b/docs/src/br/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/de/contributing/setup-development.md b/docs/src/de/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/de/contributing/setup-development.md +++ b/docs/src/de/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/el/contributing/setup-development.md b/docs/src/el/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/el/contributing/setup-development.md +++ b/docs/src/el/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/es/contributing/setup-development.md b/docs/src/es/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/es/contributing/setup-development.md +++ b/docs/src/es/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/fr/contributing/setup-development.md b/docs/src/fr/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/fr/contributing/setup-development.md +++ b/docs/src/fr/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/id/contributing/setup-development.md b/docs/src/id/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/id/contributing/setup-development.md +++ b/docs/src/id/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/it/contributing/setup-development.md b/docs/src/it/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/it/contributing/setup-development.md +++ b/docs/src/it/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/nl/contributing/setup-development.md b/docs/src/nl/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/nl/contributing/setup-development.md +++ b/docs/src/nl/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/nn-NO/contributing/setup-development.md b/docs/src/nn-NO/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/nn-NO/contributing/setup-development.md +++ b/docs/src/nn-NO/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/oc/contributing/setup-development.md b/docs/src/oc/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/oc/contributing/setup-development.md +++ b/docs/src/oc/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/pl/contributing/setup-development.md b/docs/src/pl/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/pl/contributing/setup-development.md +++ b/docs/src/pl/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/pt-BR/contributing/setup-development.md b/docs/src/pt-BR/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/pt-BR/contributing/setup-development.md +++ b/docs/src/pt-BR/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/pt/contributing/setup-development.md b/docs/src/pt/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/pt/contributing/setup-development.md +++ b/docs/src/pt/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/ru/contributing/setup-development.md b/docs/src/ru/contributing/setup-development.md index 6aafb50b..7e42892a 100644 --- a/docs/src/ru/contributing/setup-development.md +++ b/docs/src/ru/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/docs/src/sv/contributing/setup-development.md b/docs/src/sv/contributing/setup-development.md index 1970e01e..b8f87717 100644 --- a/docs/src/sv/contributing/setup-development.md +++ b/docs/src/sv/contributing/setup-development.md @@ -43,7 +43,7 @@ to help you kickstart your contribution. app.forceGlobalSecureRequests=false app.baseURL="http://localhost:8080/" - app.mediaBaseURL="http://localhost:8080/" + media.baseURL="http://localhost:8080/" admin.gateway="cp-admin" auth.gateway="cp-auth" diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index a6270afe..bc876d99 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -167,7 +167,7 @@ class InstallController extends Controller $mediaBaseUrl = $this->request->getPost('media_base_url'); self::writeEnv([ 'app.baseURL' => $baseUrl, - 'app.mediaBaseURL' => + 'media.baseURL' => $mediaBaseUrl === '' ? $baseUrl : $mediaBaseUrl, 'analytics.salt' => generate_random_salt(64), 'admin.gateway' => $this->request->getPost('admin_gateway'), From 08acfd593ce8c4ecf0bdafed5f8dea227df84ec8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 17 Mar 2023 17:46:20 +0000 Subject: [PATCH 085/477] chore(release): 1.2.1 [skip ci] ## [1.2.1](https://code.castopod.org/adaures/castopod/compare/v1.2.0...v1.2.1) (2023-03-17) ### Bug Fixes * change app.mediaBaseURL to media.baseURL in install, docker entrypoints and docs ([b3c6e05](https://code.castopod.org/adaures/castopod/commit/b3c6e05e6fcd8a518eeedeefde28b61f879ba71d)) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eca74df..68a29ac5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.2.1](https://code.castopod.org/adaures/castopod/compare/v1.2.0...v1.2.1) (2023-03-17) + +### Bug Fixes + +- change app.mediaBaseURL to media.baseURL in install, docker entrypoints and + docs + ([b3c6e05](https://code.castopod.org/adaures/castopod/commit/b3c6e05e6fcd8a518eeedeefde28b61f879ba71d)) + # [1.2.0](https://code.castopod.org/adaures/castopod/compare/v1.1.2...v1.2.0) (2023-03-17) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 1cd442a9..03fe92a8 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.2.0'); +defined('CP_VERSION') || define('CP_VERSION', '1.2.1'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 27af5c61..d5e93112 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.2.0", + "version": "1.2.1", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 788d5d1f..31ea4e04 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.2.0", + "version": "1.2.1", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From a4141421aa1d6e89742b390b042382f729f965a9 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 17 Mar 2023 18:04:04 +0000 Subject: [PATCH 086/477] fix(migration): change old media file_key to file_path fixes #314 --- docs/.gitlab-ci.yml | 2 ++ .../Media/Database/Migrations/2021-05-29-120000_add_media.php | 2 +- .../Migrations/2022-30-12-180000_rename_media_file_path.php | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/.gitlab-ci.yml b/docs/.gitlab-ci.yml index a594bd2a..72621c2c 100644 --- a/docs/.gitlab-ci.yml +++ b/docs/.gitlab-ci.yml @@ -59,6 +59,8 @@ deploy: SSH_PORT: 3242 SOURCE_FOLDER: "docs/.vitepress/dist/" before_script: + # install rsync for file transfers + - apt-get update && apt-get install rsync -y # Run ssh-agent (inside the build environment) - eval $(ssh-agent -s) # Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store diff --git a/modules/Media/Database/Migrations/2021-05-29-120000_add_media.php b/modules/Media/Database/Migrations/2021-05-29-120000_add_media.php index 9ddef693..c9763e7c 100644 --- a/modules/Media/Database/Migrations/2021-05-29-120000_add_media.php +++ b/modules/Media/Database/Migrations/2021-05-29-120000_add_media.php @@ -22,7 +22,7 @@ class AddMedia extends Migration 'unsigned' => true, 'auto_increment' => true, ], - 'file_key' => [ + 'file_path' => [ 'type' => 'VARCHAR', 'constraint' => 255, ], diff --git a/modules/Media/Database/Migrations/2022-30-12-180000_rename_media_file_path.php b/modules/Media/Database/Migrations/2022-30-12-180000_rename_media_file_path.php index 840b851f..2523a0bf 100644 --- a/modules/Media/Database/Migrations/2022-30-12-180000_rename_media_file_path.php +++ b/modules/Media/Database/Migrations/2022-30-12-180000_rename_media_file_path.php @@ -17,7 +17,7 @@ class RenameMediafileKey extends Migration public function up(): void { $fields = [ - 'file_key' => [ + 'file_path' => [ 'name' => 'file_key', 'type' => 'VARCHAR', 'constraint' => 255, @@ -30,7 +30,7 @@ class RenameMediafileKey extends Migration { $fields = [ 'file_key' => [ - 'name' => 'file_key', + 'name' => 'file_path', 'type' => 'VARCHAR', 'constraint' => 255, ], From 496c89a7e99cecd1e3e78589d3e5198a95aa5bbf Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 18 Mar 2023 10:23:39 +0000 Subject: [PATCH 087/477] chore(release): 1.2.2 [skip ci] ## [1.2.2](https://code.castopod.org/adaures/castopod/compare/v1.2.1...v1.2.2) (2023-03-18) ### Bug Fixes * **migration:** change old media file_key to file_path ([a414142](https://code.castopod.org/adaures/castopod/commit/a4141421aa1d6e89742b390b042382f729f965a9)), closes [#314](https://code.castopod.org/adaures/castopod/issues/314) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68a29ac5..69cbe133 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.2.2](https://code.castopod.org/adaures/castopod/compare/v1.2.1...v1.2.2) (2023-03-18) + +### Bug Fixes + +- **migration:** change old media file_key to file_path + ([a414142](https://code.castopod.org/adaures/castopod/commit/a4141421aa1d6e89742b390b042382f729f965a9)), + closes [#314](https://code.castopod.org/adaures/castopod/issues/314) + ## [1.2.1](https://code.castopod.org/adaures/castopod/compare/v1.2.0...v1.2.1) (2023-03-17) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 03fe92a8..51af4054 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.2.1'); +defined('CP_VERSION') || define('CP_VERSION', '1.2.2'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index d5e93112..c8236f5d 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.2.1", + "version": "1.2.2", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 31ea4e04..d192bc53 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.2.1", + "version": "1.2.2", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 2748f2313797e50d8a2a7b87df09c0bc6e64360a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 18 Mar 2023 12:18:08 +0000 Subject: [PATCH 088/477] fix(notifications): set mark-all-as-read parameter to be podcast_id instead of actor_id This fixes a permission error when clicking on mark all as read --- themes/cp_admin/podcast/notifications.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/cp_admin/podcast/notifications.php b/themes/cp_admin/podcast/notifications.php index 025d1a8c..5791fb49 100644 --- a/themes/cp_admin/podcast/notifications.php +++ b/themes/cp_admin/podcast/notifications.php @@ -9,7 +9,7 @@ endSection() ?> section('headerRight') ?> - + endSection() ?> section('content') ?> From a72eb0ba3ad9cd5fd1927c62938e63b3b459ab8b Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 18 Mar 2023 12:24:35 +0000 Subject: [PATCH 089/477] docs: add the all in one castopod image in the docs --- docs/src/getting-started/docker.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/getting-started/docker.md b/docs/src/getting-started/docker.md index 4f6f5751..7b8b8d49 100644 --- a/docs/src/getting-started/docker.md +++ b/docs/src/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an From 0a54b413b3bd8c34770bca1c805defca070f5dce Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 18 Mar 2023 12:41:10 +0000 Subject: [PATCH 090/477] chore(release): 1.2.3 [skip ci] ## [1.2.3](https://code.castopod.org/adaures/castopod/compare/v1.2.2...v1.2.3) (2023-03-18) ### Bug Fixes * **notifications:** set mark-all-as-read parameter to be podcast_id instead of actor_id ([2748f23](https://code.castopod.org/adaures/castopod/commit/2748f2313797e50d8a2a7b87df09c0bc6e64360a)) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69cbe133..0aaa9359 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.2.3](https://code.castopod.org/adaures/castopod/compare/v1.2.2...v1.2.3) (2023-03-18) + +### Bug Fixes + +- **notifications:** set mark-all-as-read parameter to be podcast_id instead of + actor_id + ([2748f23](https://code.castopod.org/adaures/castopod/commit/2748f2313797e50d8a2a7b87df09c0bc6e64360a)) + ## [1.2.2](https://code.castopod.org/adaures/castopod/compare/v1.2.1...v1.2.2) (2023-03-18) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 51af4054..e2ee1117 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.2.2'); +defined('CP_VERSION') || define('CP_VERSION', '1.2.3'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index c8236f5d..b78428bd 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.2.2", + "version": "1.2.3", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index d192bc53..34cef682 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.2.2", + "version": "1.2.3", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 208c2715f900371987c3b75a749fe937a3db1991 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 21 Mar 2023 17:08:42 +0000 Subject: [PATCH 091/477] fix(s3): delete persons image sizes from bucket + add keyPrefix to config --- docs/src/getting-started/install.md | 19 +++---- modules/Media/Config/Media.php | 3 +- modules/Media/FileManagers/S3.php | 78 ++++++++++++++++++++++------- 3 files changed, 71 insertions(+), 29 deletions(-) diff --git a/docs/src/getting-started/install.md b/docs/src/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/getting-started/install.md +++ b/docs/src/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/modules/Media/Config/Media.php b/modules/Media/Config/Media.php index 518b7b5b..43de0508 100644 --- a/modules/Media/Config/Media.php +++ b/modules/Media/Config/Media.php @@ -31,7 +31,8 @@ class Media extends BaseConfig 'protocol' => '', 'endpoint' => '', 'debug' => false, - 'path_style_endpoint' => false, + 'pathStyleEndpoint' => false, + 'keyPrefix' => '', ]; /** diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index d905945d..166d8922 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -24,7 +24,7 @@ class S3 implements FileManagerInterface 'endpoint' => $config->s3['endpoint'], 'credentials' => new Credentials((string) $config->s3['key'], (string) $config->s3['secret']), 'debug' => $config->s3['debug'], - 'use_path_style_endpoint' => $config->s3['path_style_endpoint'], + 'use_path_style_endpoint' => $config->s3['pathStyleEndpoint'], ]); try { @@ -48,7 +48,7 @@ class S3 implements FileManagerInterface try { $this->s3->putObject([ 'Bucket' => $this->config->s3['bucket'], - 'Key' => $key, + 'Key' => $this->prefixKey($key), 'SourceFile' => $file, ]); } catch (Exception) { @@ -66,7 +66,7 @@ class S3 implements FileManagerInterface try { $this->s3->deleteObject([ 'Bucket' => $this->config->s3['bucket'], - 'Key' => $key, + 'Key' => $this->prefixKey($key), ]); } catch (Exception) { return false; @@ -79,13 +79,13 @@ class S3 implements FileManagerInterface { $url = new URI((string) $this->config->s3['endpoint']); - if ($this->config->s3['path_style_endpoint'] === true) { - $url->setPath($this->config->s3['bucket'] . '/' . $key); + if ($this->config->s3['pathStyleEndpoint'] === true) { + $url->setPath($this->config->s3['bucket'] . '/' . $this->prefixKey($key)); return (string) $url; } $url->setHost($this->config->s3['bucket'] . '.' . $url->getHost()); - $url->setPath($key); + $url->setPath($this->prefixKey($key)); return (string) $url; } @@ -95,22 +95,22 @@ class S3 implements FileManagerInterface // copy old object with new key $this->s3->copyObject([ 'Bucket' => $this->config->s3['bucket'], - 'CopySource' => $this->config->s3['bucket'] . '/' . $oldKey, - 'Key' => $newKey, + 'CopySource' => $this->config->s3['bucket'] . '/' . $this->prefixKey($oldKey), + 'Key' => $this->prefixKey($newKey), ]); } catch (Exception) { return false; } // delete old object - return $this->delete($oldKey); + return $this->delete($this->prefixKey($oldKey)); } public function getFileContents(string $key): string { $result = $this->s3->getObject([ 'Bucket' => $this->config->s3['bucket'], - 'Key' => $key, + 'Key' => $this->prefixKey($key), ]); return (string) $result->get('Body'); @@ -125,7 +125,7 @@ class S3 implements FileManagerInterface { $results = $this->s3->getPaginator('ListObjectsV2', [ 'Bucket' => $this->config->s3['bucket'], - 'Prefix' => 'podcasts/' . $podcastHandle . '/', + 'Prefix' => $this->prefixKey('podcasts/' . $podcastHandle . '/'), ]); $keys = []; @@ -134,7 +134,9 @@ class S3 implements FileManagerInterface return $object['Key']; }, $result['Contents']); - array_push($keys, ...preg_grep("~^podcasts\/{$podcastHandle}\/.*_.*.\.(jpg|png|webp)$~", $key)); + $prefixedPodcasts = $this->prefixKey('podcasts'); + + array_push($keys, ...preg_grep("~^{$prefixedPodcasts}\/{$podcastHandle}\/.*_.*.\.(jpg|png|webp)$~", $key)); } $objectsToDelete = array_map(static function ($key): array { @@ -163,17 +165,44 @@ class S3 implements FileManagerInterface public function deletePersonImagesSizes(): bool { - $objects = $this->s3->getIterator('ListObjectsV2', [ + $results = $this->s3->getPaginator('ListObjectsV2', [ 'Bucket' => $this->config->s3['bucket'], - 'prefix' => 'persons/', + 'prefix' => $this->prefixKey('persons/'), ]); - $objectsKeys = array_map(static function ($object) { - return $object['Key']; - }, iterator_to_array($objects)); + $keys = []; + foreach ($results as $result) { + $key = array_map(static function ($object) { + return $object['Key']; + }, $result['Contents']); - $podcastImageKeys = preg_grep("~^persons\/.*_.*.\.(jpg|png|webp)$~", $objectsKeys); - return (bool) $podcastImageKeys; + $prefixedPersons = $this->prefixKey('persons'); + + array_push($keys, ...preg_grep("~^{$prefixedPersons}\/.*_.*.\.(jpg|png|webp)$~", $key)); + } + + $objectsToDelete = array_map(static function ($key): array { + return [ + 'Key' => $key, + ]; + }, $keys); + + if ($objectsToDelete === []) { + return true; + } + + try { + $this->s3->deleteObjects([ + 'Bucket' => $this->config->s3['bucket'], + 'Delete' => [ + 'Objects' => $objectsToDelete, + ], + ]); + } catch (Exception) { + return false; + } + + return true; } public function isHealthy(): bool @@ -189,4 +218,15 @@ class S3 implements FileManagerInterface return true; } + + private function prefixKey(string $key): string + { + if ($this->config->s3['keyPrefix'] === '') { + return $key; + } + + $keyPrefix = rtrim((string) $this->config->s3['keyPrefix']); + + return $keyPrefix . '/' . $key; + } } From ae5e12be3b15fe50cb2311abcbbc19ac23b592f6 Mon Sep 17 00:00:00 2001 From: Aonrud Date: Tue, 21 Mar 2023 18:06:54 +0000 Subject: [PATCH 092/477] fix: allow images to have .jpeg extension consistently --- modules/Admin/Controllers/EpisodeController.php | 4 ++-- modules/Admin/Controllers/PodcastController.php | 8 ++++---- modules/Media/FileManagers/FS.php | 4 ++-- modules/Media/FileManagers/S3.php | 7 +++++-- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 3e861715..9ea381bd 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -147,7 +147,7 @@ class EpisodeController extends BaseController 'slug' => 'max_length[128]', 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]', 'cover' => - 'is_image[cover]|ext_in[cover,jpg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', + 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', 'transcript_file' => 'ext_in[transcript,srt]|permit_empty', 'chapters_file' => 'ext_in[chapters,json]|permit_empty', @@ -286,7 +286,7 @@ class EpisodeController extends BaseController 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]|permit_empty', 'cover' => - 'is_image[cover]|ext_in[cover,jpg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', + 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', 'transcript_file' => 'ext_in[transcript_file,txt,html,srt,json]|permit_empty', 'chapters_file' => 'ext_in[chapters_file,json]|permit_empty', diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 2f57a233..35930b72 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -184,8 +184,8 @@ class PodcastController extends BaseController { $rules = [ 'cover' => - 'uploaded[cover]|is_image[cover]|ext_in[cover,jpg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', - 'banner' => 'is_image[banner]|ext_in[banner,jpg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]', + 'uploaded[cover]|is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', + 'banner' => 'is_image[banner]|ext_in[banner,jpg,jpeg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]', ]; if (! $this->validate($rules)) { @@ -299,8 +299,8 @@ class PodcastController extends BaseController { $rules = [ 'cover' => - 'is_image[cover]|ext_in[cover,jpg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', - 'banner' => 'is_image[banner]|ext_in[banner,jpg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]', + 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', + 'banner' => 'is_image[banner]|ext_in[banner,jpg,jpeg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]', ]; if (! $this->validate($rules)) { diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index f37792a7..e2d5ce06 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -90,7 +90,7 @@ class FS implements FileManagerInterface helper('media'); $allPodcastImagesPaths = []; - foreach (['jpg', 'png', 'webp'] as $ext) { + foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { $images = glob(media_path("/podcasts/{$podcastHandle}/*_*{$ext}")); if (! $images) { @@ -114,7 +114,7 @@ class FS implements FileManagerInterface helper('media'); $allPersonsImagesPaths = []; - foreach (['jpg', 'png', 'webp'] as $ext) { + foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { $images = glob(media_path("/persons/*_*{$ext}")); if (! $images) { diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index 166d8922..4c86ed64 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -136,7 +136,10 @@ class S3 implements FileManagerInterface $prefixedPodcasts = $this->prefixKey('podcasts'); - array_push($keys, ...preg_grep("~^{$prefixedPodcasts}\/{$podcastHandle}\/.*_.*.\.(jpg|png|webp)$~", $key)); + array_push( + $keys, + ...preg_grep("~^{$prefixedPodcasts}\/{$podcastHandle}\/.*_.*.\.(jpe?g|png|webp)$~", $key) + ); } $objectsToDelete = array_map(static function ($key): array { @@ -178,7 +181,7 @@ class S3 implements FileManagerInterface $prefixedPersons = $this->prefixKey('persons'); - array_push($keys, ...preg_grep("~^{$prefixedPersons}\/.*_.*.\.(jpg|png|webp)$~", $key)); + array_push($keys, ...preg_grep("~^{$prefixedPersons}\/.*_.*.\.(jpe?g|png|webp)$~", $key)); } $objectsToDelete = array_map(static function ($key): array { From 18f6b75dee94e0809682e5c622e954131ebb3d8f Mon Sep 17 00:00:00 2001 From: Romain de Laage Date: Wed, 22 Mar 2023 11:53:38 +0100 Subject: [PATCH 093/477] build(docker): use supervisord in unit image --- docker/production/unit/Dockerfile | 3 ++- docker/production/unit/entrypoint.sh | 9 +++++---- docker/production/unit/supervisord.conf | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 docker/production/unit/supervisord.conf diff --git a/docker/production/unit/Dockerfile b/docker/production/unit/Dockerfile index ab2cad76..8cf5d121 100644 --- a/docker/production/unit/Dockerfile +++ b/docker/production/unit/Dockerfile @@ -37,9 +37,10 @@ COPY docker/production/unit/entrypoint.sh /entrypoint.sh COPY castopod /var/www/castopod COPY docker/production/unit/config.json /config.json COPY docker/production/unit/crontab.txt /crontab.txt +COPY docker/production/unit/supervisord.conf /etc/supervisor/conf.d/supervisord.conf RUN apt-get update && \ - apt-get install -y ffmpeg curl libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev libpcre2-8-0 libicu-dev && \ + apt-get install -y supervisor ffmpeg curl libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev libpcre2-8-0 libicu-dev && \ rm -rf /var/lib/apt/lists/* && \ pecl install -o -f redis && \ rm -rf /tmp/pear && \ diff --git a/docker/production/unit/entrypoint.sh b/docker/production/unit/entrypoint.sh index 01904073..9526d7e1 100644 --- a/docker/production/unit/entrypoint.sh +++ b/docker/production/unit/entrypoint.sh @@ -191,7 +191,8 @@ EOF fi fi -unitd --no-daemon & -php spark castopod:database-update -sleep 2 && curl -X PUT --data-binary @/config.json --unix-socket /var/run/control.unit.sock http://localhost/config/ -supercronic /crontab.txt +#Run database migrations after 10 seconds (to wait for the database to be started) +(sleep 10 && php spark castopod:database-update) & +#Apply configuration after unit is started +(sleep 2 && curl -X PUT --data-binary @/config.json --unix-socket /var/run/control.unit.sock http://localhost/config/) & +supervisord diff --git a/docker/production/unit/supervisord.conf b/docker/production/unit/supervisord.conf new file mode 100644 index 00000000..fe2939be --- /dev/null +++ b/docker/production/unit/supervisord.conf @@ -0,0 +1,19 @@ +[supervisord] +nodaemon=true + +[program:supercronic] +command=supercronic /crontab.txt +autostart=true +autorestart=unexpected +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:unit] +command=unitd --no-daemon +autostart=true +autorestart=unexpected +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile_maxbytes=0 From da7076fc2d49d07708d5adaa99733487b7f52e20 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 23 Mar 2023 11:46:21 +0000 Subject: [PATCH 094/477] fix(s3): do not create bucket if not exists, check if healthy instead update php and js dependencies to latest --- composer.json | 12 +- composer.lock | 95 ++-- docker-compose.yml | 1 + docs/src/contributing/setup-development.md | 2 +- modules/Media/FileManagers/S3.php | 20 +- package.json | 36 +- pnpm-lock.yaml | 563 +++++++++++---------- 7 files changed, 385 insertions(+), 344 deletions(-) diff --git a/composer.json b/composer.json index b78428bd..612d4715 100644 --- a/composer.json +++ b/composer.json @@ -24,15 +24,15 @@ "chrisjean/php-ico": "^1.0.4", "melbahja/seo": "^v2.1.1", "codeigniter4/shield": "v1.0.0-beta.3", - "aws/aws-sdk-php": "^3.261.10" + "aws/aws-sdk-php": "^3.261.17" }, "require-dev": { "mikey179/vfsstream": "^v1.6.11", - "phpunit/phpunit": "^10.0.16", - "captainhook/captainhook": "^5.15.2", - "symplify/easy-coding-standard": "^11.2.10", - "phpstan/phpstan": "^1.10.6", - "rector/rector": "^0.15.21", + "phpunit/phpunit": "^10.0.18", + "captainhook/captainhook": "^5.15.5", + "symplify/easy-coding-standard": "^11.3.2", + "phpstan/phpstan": "^1.10.7", + "rector/rector": "^0.15.23", "symplify/coding-standard": "^11.3.0" }, "autoload": { diff --git a/composer.lock b/composer.lock index 21ca5638..857c87f6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "84568da2a8ddda6d9bcd8eb63ee83682", + "content-hash": "44b79ceee12a4fe0ce58763458036267", "packages": [ { "name": "adaures/ipcat-php", @@ -116,16 +116,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.261.10", + "version": "3.261.17", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "4889eff2b3fe35e878fbcaf8374d73f043609170" + "reference": "a8d2d89d79e912aa87bd2d381d34f47fbd08be65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4889eff2b3fe35e878fbcaf8374d73f043609170", - "reference": "4889eff2b3fe35e878fbcaf8374d73f043609170", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a8d2d89d79e912aa87bd2d381d34f47fbd08be65", + "reference": "a8d2d89d79e912aa87bd2d381d34f47fbd08be65", "shasum": "" }, "require": { @@ -200,9 +200,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.261.10" + "source": "https://github.com/aws/aws-sdk-php/tree/3.261.17" }, - "time": "2023-03-13T18:19:14+00:00" + "time": "2023-03-22T18:22:29+00:00" }, { "name": "brick/math", @@ -3176,16 +3176,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.15.2", + "version": "5.15.5", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "728fe3847c57f2d9cd4c53a8c26bc5522b42a1d0" + "reference": "7fb1c78586ea58ec4118c2d4db35c9d5da3fabb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/728fe3847c57f2d9cd4c53a8c26bc5522b42a1d0", - "reference": "728fe3847c57f2d9cd4c53a8c26bc5522b42a1d0", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/7fb1c78586ea58ec4118c2d4db35c9d5da3fabb0", + "reference": "7fb1c78586ea58ec4118c2d4db35c9d5da3fabb0", "shasum": "" }, "require": { @@ -3243,7 +3243,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.15.2" + "source": "https://github.com/captainhookphp/captainhook/tree/5.15.5" }, "funding": [ { @@ -3251,7 +3251,7 @@ "type": "github" } ], - "time": "2023-03-03T11:11:58+00:00" + "time": "2023-03-20T10:35:30+00:00" }, { "name": "composer/pcre", @@ -3935,16 +3935,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.6", + "version": "1.10.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a" + "reference": "b10ceb526d9607903c5b2673f1fc8775dbe48975" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", - "reference": "50d089a3e0904b0fe7e2cf2d4fd37d427d64235a", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b10ceb526d9607903c5b2673f1fc8775dbe48975", + "reference": "b10ceb526d9607903c5b2673f1fc8775dbe48975", "shasum": "" }, "require": { @@ -3963,8 +3963,11 @@ "description": "PHPStan - PHP Static Analysis Tool", "keywords": ["dev", "static analysis"], "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.10.6" + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" }, "funding": [ { @@ -3980,7 +3983,7 @@ "type": "tidelift" } ], - "time": "2023-03-09T16:55:12+00:00" + "time": "2023-03-16T15:24:20+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4269,16 +4272,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.0.16", + "version": "10.0.18", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "07d386a11ac7094032900f07cada1c8975d16607" + "reference": "582563ed2edc62d1455cdbe00ea49fe09428eef3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/07d386a11ac7094032900f07cada1c8975d16607", - "reference": "07d386a11ac7094032900f07cada1c8975d16607", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/582563ed2edc62d1455cdbe00ea49fe09428eef3", + "reference": "582563ed2edc62d1455cdbe00ea49fe09428eef3", "shasum": "" }, "require": { @@ -4337,7 +4340,8 @@ "keywords": ["phpunit", "testing", "xunit"], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.16" + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.18" }, "funding": [ { @@ -4353,7 +4357,7 @@ "type": "tidelift" } ], - "time": "2023-03-13T09:02:40+00:00" + "time": "2023-03-22T06:15:31+00:00" }, { "name": "psr/container", @@ -4408,16 +4412,16 @@ }, { "name": "rector/rector", - "version": "0.15.21", + "version": "0.15.23", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "1cee8cc5d6d836e1bf9a3006d7b062adde3a6022" + "reference": "f4984ebd62b3613002869b0ddd6868261d62819e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/1cee8cc5d6d836e1bf9a3006d7b062adde3a6022", - "reference": "1cee8cc5d6d836e1bf9a3006d7b062adde3a6022", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f4984ebd62b3613002869b0ddd6868261d62819e", + "reference": "f4984ebd62b3613002869b0ddd6868261d62819e", "shasum": "" }, "require": { @@ -4446,7 +4450,7 @@ "keywords": ["automation", "dev", "migration", "refactoring"], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.15.21" + "source": "https://github.com/rectorphp/rector/tree/0.15.23" }, "funding": [ { @@ -4454,7 +4458,7 @@ "type": "github" } ], - "time": "2023-03-06T11:44:29+00:00" + "time": "2023-03-22T15:22:45+00:00" }, { "name": "sebastian/cli-parser", @@ -4734,16 +4738,16 @@ }, { "name": "sebastian/diff", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "70dd1b20bc198da394ad542e988381b44e64e39f" + "reference": "aae9a0a43bff37bd5d8d0311426c87bf36153f02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f", - "reference": "70dd1b20bc198da394ad542e988381b44e64e39f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/aae9a0a43bff37bd5d8d0311426c87bf36153f02", + "reference": "aae9a0a43bff37bd5d8d0311426c87bf36153f02", "shasum": "" }, "require": { @@ -4779,7 +4783,8 @@ "keywords": ["diff", "udiff", "unidiff", "unified diff"], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.0.1" }, "funding": [ { @@ -4787,7 +4792,7 @@ "type": "github" } ], - "time": "2023-02-03T07:00:31+00:00" + "time": "2023-03-23T05:12:41+00:00" }, { "name": "sebastian/environment", @@ -6430,16 +6435,16 @@ }, { "name": "symplify/easy-coding-standard", - "version": "11.2.10", + "version": "11.3.2", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "5fc343df9b86e154516ddf506f7fe0b421d7d5ef" + "reference": "d4159e06c0970e71a2a58d350160241e7cb3994b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/5fc343df9b86e154516ddf506f7fe0b421d7d5ef", - "reference": "5fc343df9b86e154516ddf506f7fe0b421d7d5ef", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/d4159e06c0970e71a2a58d350160241e7cb3994b", + "reference": "d4159e06c0970e71a2a58d350160241e7cb3994b", "shasum": "" }, "require": { @@ -6447,7 +6452,8 @@ }, "conflict": { "friendsofphp/php-cs-fixer": "<3.0", - "squizlabs/php_codesniffer": "<3.6" + "squizlabs/php_codesniffer": "<3.6", + "symplify/coding-standard": "<11.3" }, "bin": ["bin/ecs"], "type": "library", @@ -6457,9 +6463,10 @@ "notification-url": "https://packagist.org/downloads/", "license": ["MIT"], "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer", + "keywords": ["Code style", "automation", "fixer", "static analysis"], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/11.2.10" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/11.3.2" }, "funding": [ { @@ -6471,7 +6478,7 @@ "type": "github" } ], - "time": "2023-02-27T10:00:30+00:00" + "time": "2023-03-22T15:28:51+00:00" }, { "name": "symplify/rule-doc-generator-contracts", diff --git a/docker-compose.yml b/docker-compose.yml index a1f5f79c..b40e9ce5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -72,6 +72,7 @@ services: image: adobe/s3mock:latest container_name: castopod_s3 environment: + - initialBuckets=castopod - debug=true - root=/data ports: diff --git a/docs/src/contributing/setup-development.md b/docs/src/contributing/setup-development.md index 7de2e408..27f68cab 100644 --- a/docs/src/contributing/setup-development.md +++ b/docs/src/contributing/setup-development.md @@ -75,7 +75,7 @@ to help you kickstart your contribution. #media.fileManager="s3" #media.s3.bucket="castopod" #media.s3.endpoint="http://172.20.0.6:9090/" - #media.s3.path_style_endpoint=true + #media.s3.pathStyleEndpoint=true ``` > _NB._ You can tweak your environment by setting more environment variables diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index 4c86ed64..d8d4704d 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -26,21 +26,6 @@ class S3 implements FileManagerInterface 'debug' => $config->s3['debug'], 'use_path_style_endpoint' => $config->s3['pathStyleEndpoint'], ]); - - try { - // create bucket if it does not already exist - if (! $this->s3->doesBucketExist((string) $this->config->s3['bucket'])) { - try { - $this->s3->createBucket([ - 'Bucket' => $this->config->s3['bucket'], - ]); - } catch (Exception $exception) { - log_message('critical', $exception->getMessage()); - } - } - } catch (Exception $exception) { - throw new Exception($exception->getMessage(), $exception->getCode(), $exception); - } } public function save(File $file, string $key): string|false @@ -210,6 +195,11 @@ class S3 implements FileManagerInterface public function isHealthy(): bool { + // check that bucket exists + if (! $this->s3->doesBucketExist((string) $this->config->s3['bucket'])) { + return false; + } + try { // ok if bucket exists and you have permission to access it $this->s3->headBucket([ diff --git a/package.json b/package.json index 34cef682..38386b43 100644 --- a/package.json +++ b/package.json @@ -27,14 +27,14 @@ "prepare": "is-ci || husky install" }, "dependencies": { - "@amcharts/amcharts4": "^4.10.34", + "@amcharts/amcharts4": "^4.10.35", "@amcharts/amcharts4-geodata": "^4.1.26", "@codemirror/commands": "^6.2.2", "@codemirror/lang-xml": "^6.0.2", "@codemirror/language": "^6.6.0", "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.9.2", - "@floating-ui/dom": "^1.2.4", + "@codemirror/view": "^6.9.3", + "@floating-ui/dom": "^1.2.5", "@github/clipboard-copy-element": "^1.1.2", "@github/hotkey": "^2.0.1", "@github/markdown-toolbar-element": "^2.1.1", @@ -46,13 +46,13 @@ "flatpickr": "^4.6.13", "leaflet": "^1.9.3", "leaflet.markercluster": "^1.5.3", - "lit": "^2.6.1", - "marked": "^4.2.12", - "wavesurfer.js": "^6.5.2", + "lit": "^2.7.0", + "marked": "^4.3.0", + "wavesurfer.js": "^6.6.1", "xml-formatter": "^3.3.2" }, "devDependencies": { - "@commitlint/cli": "^17.4.4", + "@commitlint/cli": "^17.5.0", "@commitlint/config-conventional": "^17.4.4", "@semantic-release/changelog": "^6.0.2", "@semantic-release/exec": "^6.0.3", @@ -61,18 +61,18 @@ "@tailwindcss/forms": "^0.5.3", "@tailwindcss/line-clamp": "^0.4.2", "@tailwindcss/typography": "^0.5.9", - "@types/leaflet": "^1.9.2", + "@types/leaflet": "^1.9.3", "@types/marked": "^4.0.8", "@types/wavesurfer.js": "^6.0.3", - "@typescript-eslint/eslint-plugin": "^5.55.0", - "@typescript-eslint/parser": "^5.55.0", + "@typescript-eslint/eslint-plugin": "^5.56.0", + "@typescript-eslint/parser": "^5.56.0", "all-contributors-cli": "^6.24.0", "commitizen": "^4.3.0", "cross-env": "^7.0.3", "cssnano": "^5.1.15", "cz-conventional-changelog": "^3.3.0", "eslint": "^8.36.0", - "eslint-config-prettier": "^8.7.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.3", "is-ci": "^3.0.1", @@ -82,16 +82,16 @@ "postcss-nesting": "^11.2.1", "postcss-preset-env": "^8.0.1", "postcss-reporter": "^7.0.5", - "prettier": "2.8.4", + "prettier": "2.8.6", "prettier-plugin-organize-imports": "^3.2.2", - "semantic-release": "^20.1.1", - "stylelint": "^15.2.0", - "stylelint-config-standard": "^30.0.1", + "semantic-release": "^20.1.3", + "stylelint": "^15.3.0", + "stylelint-config-standard": "^31.0.0", "svgo": "^3.0.2", "tailwindcss": "^3.2.7", - "typescript": "^4.9.5", - "vite": "^4.1.4", - "vite-plugin-pwa": "^0.14.4", + "typescript": "^5.0.2", + "vite": "^4.2.1", + "vite-plugin-pwa": "^0.14.5", "workbox-build": "^6.5.4", "workbox-core": "^6.5.4", "workbox-routing": "^6.5.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index abd13945..04693a05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,16 +1,16 @@ lockfileVersion: 5.4 specifiers: - "@amcharts/amcharts4": ^4.10.34 + "@amcharts/amcharts4": ^4.10.35 "@amcharts/amcharts4-geodata": ^4.1.26 "@codemirror/commands": ^6.2.2 "@codemirror/lang-xml": ^6.0.2 "@codemirror/language": ^6.6.0 "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.9.2 - "@commitlint/cli": ^17.4.4 + "@codemirror/view": ^6.9.3 + "@commitlint/cli": ^17.5.0 "@commitlint/config-conventional": ^17.4.4 - "@floating-ui/dom": ^1.2.4 + "@floating-ui/dom": ^1.2.5 "@github/clipboard-copy-element": ^1.1.2 "@github/hotkey": ^2.0.1 "@github/markdown-toolbar-element": ^2.1.1 @@ -23,11 +23,11 @@ specifiers: "@tailwindcss/line-clamp": ^0.4.2 "@tailwindcss/nesting": 0.0.0-insiders.565cd3e "@tailwindcss/typography": ^0.5.9 - "@types/leaflet": ^1.9.2 + "@types/leaflet": ^1.9.3 "@types/marked": ^4.0.8 "@types/wavesurfer.js": ^6.0.3 - "@typescript-eslint/eslint-plugin": ^5.55.0 - "@typescript-eslint/parser": ^5.55.0 + "@typescript-eslint/eslint-plugin": ^5.56.0 + "@typescript-eslint/parser": ^5.56.0 "@vime/core": ^5.4.0 all-contributors-cli: ^6.24.0 choices.js: ^10.2.0 @@ -37,7 +37,7 @@ specifiers: cssnano: ^5.1.15 cz-conventional-changelog: ^3.3.0 eslint: ^8.36.0 - eslint-config-prettier: ^8.7.0 + eslint-config-prettier: ^8.8.0 eslint-plugin-prettier: ^4.2.1 flatpickr: ^4.6.13 husky: ^8.0.3 @@ -45,24 +45,24 @@ specifiers: leaflet: ^1.9.3 leaflet.markercluster: ^1.5.3 lint-staged: ^13.2.0 - lit: ^2.6.1 - marked: ^4.2.12 + lit: ^2.7.0 + marked: ^4.3.0 postcss: ^8.4.21 postcss-import: ^15.1.0 postcss-nesting: ^11.2.1 postcss-preset-env: ^8.0.1 postcss-reporter: ^7.0.5 - prettier: 2.8.4 + prettier: 2.8.6 prettier-plugin-organize-imports: ^3.2.2 - semantic-release: ^20.1.1 - stylelint: ^15.2.0 - stylelint-config-standard: ^30.0.1 + semantic-release: ^20.1.3 + stylelint: ^15.3.0 + stylelint-config-standard: ^31.0.0 svgo: ^3.0.2 tailwindcss: ^3.2.7 - typescript: ^4.9.5 - vite: ^4.1.4 - vite-plugin-pwa: ^0.14.4 - wavesurfer.js: ^6.5.2 + typescript: ^5.0.2 + vite: ^4.2.1 + vite-plugin-pwa: ^0.14.5 + wavesurfer.js: ^6.6.1 workbox-build: ^6.5.4 workbox-core: ^6.5.4 workbox-routing: ^6.5.4 @@ -70,14 +70,14 @@ specifiers: xml-formatter: ^3.3.2 dependencies: - "@amcharts/amcharts4": 4.10.34 + "@amcharts/amcharts4": 4.10.35 "@amcharts/amcharts4-geodata": 4.1.26 "@codemirror/commands": 6.2.2 - "@codemirror/lang-xml": 6.0.2_@codemirror+view@6.9.2 + "@codemirror/lang-xml": 6.0.2_@codemirror+view@6.9.3 "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.2 - "@floating-ui/dom": 1.2.4 + "@codemirror/view": 6.9.3 + "@floating-ui/dom": 1.2.5 "@github/clipboard-copy-element": 1.1.2 "@github/hotkey": 2.0.1 "@github/markdown-toolbar-element": 2.1.1 @@ -89,34 +89,34 @@ dependencies: flatpickr: 4.6.13 leaflet: 1.9.3 leaflet.markercluster: 1.5.3_leaflet@1.9.3 - lit: 2.6.1 - marked: 4.2.12 - wavesurfer.js: 6.5.2 + lit: 2.7.0 + marked: 4.3.0 + wavesurfer.js: 6.6.1 xml-formatter: 3.3.2 devDependencies: - "@commitlint/cli": 17.4.4 + "@commitlint/cli": 17.5.0 "@commitlint/config-conventional": 17.4.4 - "@semantic-release/changelog": 6.0.2_semantic-release@20.1.1 - "@semantic-release/exec": 6.0.3_semantic-release@20.1.1 - "@semantic-release/git": 10.0.1_semantic-release@20.1.1 - "@semantic-release/gitlab": 11.0.1_semantic-release@20.1.1 + "@semantic-release/changelog": 6.0.2_semantic-release@20.1.3 + "@semantic-release/exec": 6.0.3_semantic-release@20.1.3 + "@semantic-release/git": 10.0.1_semantic-release@20.1.3 + "@semantic-release/gitlab": 11.0.1_semantic-release@20.1.3 "@tailwindcss/forms": 0.5.3_tailwindcss@3.2.7 "@tailwindcss/line-clamp": 0.4.2_tailwindcss@3.2.7 "@tailwindcss/typography": 0.5.9_tailwindcss@3.2.7 - "@types/leaflet": 1.9.2 + "@types/leaflet": 1.9.3 "@types/marked": 4.0.8 "@types/wavesurfer.js": 6.0.3 - "@typescript-eslint/eslint-plugin": 5.55.0_342y7v4tc7ytrrysmit6jo4wri - "@typescript-eslint/parser": 5.55.0_vgl77cfdswitgr47lm5swmv43m + "@typescript-eslint/eslint-plugin": 5.56.0_2hcjazgfnbtq42tcc73br2vup4 + "@typescript-eslint/parser": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu all-contributors-cli: 6.24.0 commitizen: 4.3.0 cross-env: 7.0.3 cssnano: 5.1.15_postcss@8.4.21 cz-conventional-changelog: 3.3.0 eslint: 8.36.0 - eslint-config-prettier: 8.7.0_eslint@8.36.0 - eslint-plugin-prettier: 4.2.1_eqzx3hpkgx5nnvxls3azrcc7dm + eslint-config-prettier: 8.8.0_eslint@8.36.0 + eslint-plugin-prettier: 4.2.1_ose2zoovovx4ulolhifz3tfzx4 husky: 8.0.3 is-ci: 3.0.1 lint-staged: 13.2.0 @@ -125,16 +125,16 @@ devDependencies: postcss-nesting: 11.2.1_postcss@8.4.21 postcss-preset-env: 8.0.1_postcss@8.4.21 postcss-reporter: 7.0.5_postcss@8.4.21 - prettier: 2.8.4 - prettier-plugin-organize-imports: 3.2.2_silln3pw57har7jydmecgzoypa - semantic-release: 20.1.1 - stylelint: 15.2.0 - stylelint-config-standard: 30.0.1_stylelint@15.2.0 + prettier: 2.8.6 + prettier-plugin-organize-imports: 3.2.2_tcllvk4eo3otqqvuorc2duftpy + semantic-release: 20.1.3 + stylelint: 15.3.0 + stylelint-config-standard: 31.0.0_stylelint@15.3.0 svgo: 3.0.2 tailwindcss: 3.2.7_postcss@8.4.21 - typescript: 4.9.5 - vite: 4.1.4 - vite-plugin-pwa: 0.14.4_vizhyq4kcdharmiplw7eejneda + typescript: 5.0.2 + vite: 4.2.1 + vite-plugin-pwa: 0.14.5_7pzn4vgxpc2rxxz25gxxv2wcqm workbox-build: 6.5.4 workbox-core: 6.5.4 workbox-routing: 6.5.4 @@ -148,10 +148,10 @@ packages: } dev: false - /@amcharts/amcharts4/4.10.34: + /@amcharts/amcharts4/4.10.35: resolution: { - integrity: sha512-v4y72nepV/GXEF0UaT7Yl3VuFCwRyCB72+Zo55UpnXCGGukH+hXwFDEBoFav+zF0BDna6/JrCp4S7OkoWRWgNQ==, + integrity: sha512-EeWD+4TAFUmto9+orao5W978cdidCuDl+ra2xKFjK6kmgIhWLCxPK08RnDSc/EhQBpMCZwowIQG4C2VbP5kZ/g==, } dependencies: "@babel/runtime": 7.21.0 @@ -1648,7 +1648,7 @@ packages: to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete/6.4.2_m2g2fjrvetqbsl7zxwctz5ljh4: + /@codemirror/autocomplete/6.4.2_ipi6fyicmvtccbdgcmxxogx7ni: resolution: { integrity: sha512-8WE2xp+D0MpWEv5lZ6zPW1/tf4AGb358T5GWYiKEuCP8MvFfT3tH2mIF9Y2yr2e3KbHuSvsVhosiEyqCpiJhZQ==, @@ -1660,7 +1660,7 @@ packages: dependencies: "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.2 + "@codemirror/view": 6.9.3 "@lezer/common": 1.0.2 dev: false @@ -1672,17 +1672,17 @@ packages: dependencies: "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.2 + "@codemirror/view": 6.9.3 "@lezer/common": 1.0.2 dev: false - /@codemirror/lang-xml/6.0.2_@codemirror+view@6.9.2: + /@codemirror/lang-xml/6.0.2_@codemirror+view@6.9.3: resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.4.2_m2g2fjrvetqbsl7zxwctz5ljh4 + "@codemirror/autocomplete": 6.4.2_ipi6fyicmvtccbdgcmxxogx7ni "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 "@lezer/common": 1.0.2 @@ -1698,7 +1698,7 @@ packages: } dependencies: "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.2 + "@codemirror/view": 6.9.3 "@lezer/common": 1.0.2 "@lezer/highlight": 1.1.3 "@lezer/lr": 1.3.3 @@ -1712,7 +1712,7 @@ packages: } dependencies: "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.2 + "@codemirror/view": 6.9.3 crelt: 1.0.5 dev: false @@ -1723,7 +1723,7 @@ packages: } dependencies: "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.2 + "@codemirror/view": 6.9.3 crelt: 1.0.5 dev: false @@ -1734,10 +1734,10 @@ packages: } dev: false - /@codemirror/view/6.9.2: + /@codemirror/view/6.9.3: resolution: { - integrity: sha512-ci0r/v6aKOSlzOs7/STMTYP3jX/+YMq2dAfAJcLIB6uom4ThtrUlzeuS7GTRGNqJJ+qAJR1vGWfXgu4CO/0myQ==, + integrity: sha512-BJ5mvEIhFM+SrNwc5X8pLIvMM9ffjkviVbxpg84Xk2OE8ZyKaEbId8kX+nAYEEso7+qnbwsXe1bkAHsasebMow==, } dependencies: "@codemirror/state": 6.2.0 @@ -1755,17 +1755,17 @@ packages: dev: true optional: true - /@commitlint/cli/17.4.4: + /@commitlint/cli/17.5.0: resolution: { - integrity: sha512-HwKlD7CPVMVGTAeFZylVNy14Vm5POVY0WxPkZr7EXLC/os0LH/obs6z4HRvJtH/nHCMYBvUBQhGwnufKfTjd5g==, + integrity: sha512-yNW3+M7UM1ioK28LKTrryIVB5qGpXlEv8+rJQiWPMZNayy9/1XR5+lL8qBTNlgopYtZWWnIm5RETcAN29ZTL/A==, } engines: { node: ">=v14" } hasBin: true dependencies: "@commitlint/format": 17.4.4 "@commitlint/lint": 17.4.4 - "@commitlint/load": 17.4.4 + "@commitlint/load": 17.5.0 "@commitlint/read": 17.4.4 "@commitlint/types": 17.4.4 execa: 5.1.1 @@ -1857,10 +1857,10 @@ packages: "@commitlint/types": 17.4.4 dev: true - /@commitlint/load/17.4.4: + /@commitlint/load/17.5.0: resolution: { - integrity: sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ==, + integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==, } engines: { node: ">=v14" } dependencies: @@ -1871,13 +1871,13 @@ packages: "@types/node": 18.14.0 chalk: 4.1.2 cosmiconfig: 8.0.0 - cosmiconfig-typescript-loader: 4.3.0_ipkhww4xc5z2tt2x53vp2mt2be + cosmiconfig-typescript-loader: 4.3.0_jg2fnlxwfckic3l2an3gqrza7i lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_tncu2ai53lzgmizdedur7lbibe - typescript: 4.9.5 + ts-node: 10.9.1_w3gialtd35h6ptuevfzy5ddjvu + typescript: 5.0.2 transitivePeerDependencies: - "@swc/core" - "@swc/wasm" @@ -2310,10 +2310,10 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /@esbuild/android-arm/0.16.17: + /@esbuild/android-arm/0.17.12: resolution: { - integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==, + integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==, } engines: { node: ">=12" } cpu: [arm] @@ -2322,10 +2322,10 @@ packages: dev: true optional: true - /@esbuild/android-arm64/0.16.17: + /@esbuild/android-arm64/0.17.12: resolution: { - integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==, + integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==, } engines: { node: ">=12" } cpu: [arm64] @@ -2334,10 +2334,10 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.16.17: + /@esbuild/android-x64/0.17.12: resolution: { - integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==, + integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==, } engines: { node: ">=12" } cpu: [x64] @@ -2346,10 +2346,10 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.16.17: + /@esbuild/darwin-arm64/0.17.12: resolution: { - integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==, + integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==, } engines: { node: ">=12" } cpu: [arm64] @@ -2358,10 +2358,10 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.16.17: + /@esbuild/darwin-x64/0.17.12: resolution: { - integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==, + integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==, } engines: { node: ">=12" } cpu: [x64] @@ -2370,10 +2370,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.16.17: + /@esbuild/freebsd-arm64/0.17.12: resolution: { - integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==, + integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==, } engines: { node: ">=12" } cpu: [arm64] @@ -2382,10 +2382,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.16.17: + /@esbuild/freebsd-x64/0.17.12: resolution: { - integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==, + integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==, } engines: { node: ">=12" } cpu: [x64] @@ -2394,10 +2394,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.16.17: + /@esbuild/linux-arm/0.17.12: resolution: { - integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==, + integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==, } engines: { node: ">=12" } cpu: [arm] @@ -2406,10 +2406,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm64/0.16.17: + /@esbuild/linux-arm64/0.17.12: resolution: { - integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==, + integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==, } engines: { node: ">=12" } cpu: [arm64] @@ -2418,10 +2418,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.16.17: + /@esbuild/linux-ia32/0.17.12: resolution: { - integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==, + integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==, } engines: { node: ">=12" } cpu: [ia32] @@ -2430,10 +2430,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.16.17: + /@esbuild/linux-loong64/0.17.12: resolution: { - integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==, + integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==, } engines: { node: ">=12" } cpu: [loong64] @@ -2442,10 +2442,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.16.17: + /@esbuild/linux-mips64el/0.17.12: resolution: { - integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==, + integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==, } engines: { node: ">=12" } cpu: [mips64el] @@ -2454,10 +2454,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.16.17: + /@esbuild/linux-ppc64/0.17.12: resolution: { - integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==, + integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==, } engines: { node: ">=12" } cpu: [ppc64] @@ -2466,10 +2466,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.16.17: + /@esbuild/linux-riscv64/0.17.12: resolution: { - integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==, + integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==, } engines: { node: ">=12" } cpu: [riscv64] @@ -2478,10 +2478,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.16.17: + /@esbuild/linux-s390x/0.17.12: resolution: { - integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==, + integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==, } engines: { node: ">=12" } cpu: [s390x] @@ -2490,10 +2490,10 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.16.17: + /@esbuild/linux-x64/0.17.12: resolution: { - integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==, + integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==, } engines: { node: ">=12" } cpu: [x64] @@ -2502,10 +2502,10 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.16.17: + /@esbuild/netbsd-x64/0.17.12: resolution: { - integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==, + integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==, } engines: { node: ">=12" } cpu: [x64] @@ -2514,10 +2514,10 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.16.17: + /@esbuild/openbsd-x64/0.17.12: resolution: { - integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==, + integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==, } engines: { node: ">=12" } cpu: [x64] @@ -2526,10 +2526,10 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.16.17: + /@esbuild/sunos-x64/0.17.12: resolution: { - integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==, + integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==, } engines: { node: ">=12" } cpu: [x64] @@ -2538,10 +2538,10 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.16.17: + /@esbuild/win32-arm64/0.17.12: resolution: { - integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==, + integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==, } engines: { node: ">=12" } cpu: [arm64] @@ -2550,10 +2550,10 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.16.17: + /@esbuild/win32-ia32/0.17.12: resolution: { - integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==, + integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==, } engines: { node: ">=12" } cpu: [ia32] @@ -2562,10 +2562,10 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.16.17: + /@esbuild/win32-x64/0.17.12: resolution: { - integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==, + integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==, } engines: { node: ">=12" } cpu: [x64] @@ -2630,10 +2630,10 @@ packages: } dev: false - /@floating-ui/dom/1.2.4: + /@floating-ui/dom/1.2.5: resolution: { - integrity: sha512-4+k+BLhtWj+peCU60gp0+rHeR8+Ohqx6kjJf/lHMnJ8JD5Qj6jytcq1+SZzRwD7rvHKRhR7TDiWWddrNrfwQLg==, + integrity: sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==, } dependencies: "@floating-ui/core": 1.2.4 @@ -2863,6 +2863,13 @@ packages: } dev: false + /@lit-labs/ssr-dom-shim/1.1.0: + resolution: + { + integrity: sha512-92uQ5ARf7UXYrzaFcAX3T2rTvaS9Z1//ukV+DqjACM4c8s0ZBQd7ayJU5Dh2AFLD/Ayuyz4uMmxQec8q3U4Ong==, + } + dev: false + /@lit/reactive-element/1.6.1: resolution: { @@ -3176,7 +3183,7 @@ packages: rollup: 3.17.2 dev: true - /@semantic-release/changelog/6.0.2_semantic-release@20.1.1: + /@semantic-release/changelog/6.0.2_semantic-release@20.1.3: resolution: { integrity: sha512-jHqfTkoPbDEOAgAP18mGP53IxeMwxTISN+GwTRy9uLu58UjARoZU8ScCgWGeO2WPkEsm57H8AkyY02W2ntIlIw==, @@ -3189,10 +3196,10 @@ packages: aggregate-error: 3.1.0 fs-extra: 11.1.0 lodash: 4.17.21 - semantic-release: 20.1.1 + semantic-release: 20.1.3 dev: true - /@semantic-release/commit-analyzer/9.0.2_semantic-release@20.1.1: + /@semantic-release/commit-analyzer/9.0.2_semantic-release@20.1.3: resolution: { integrity: sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==, @@ -3208,7 +3215,7 @@ packages: import-from: 4.0.0 lodash: 4.17.21 micromatch: 4.0.5 - semantic-release: 20.1.1 + semantic-release: 20.1.3 transitivePeerDependencies: - supports-color dev: true @@ -3221,7 +3228,7 @@ packages: engines: { node: ">=14.17" } dev: true - /@semantic-release/exec/6.0.3_semantic-release@20.1.1: + /@semantic-release/exec/6.0.3_semantic-release@20.1.3: resolution: { integrity: sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==, @@ -3236,12 +3243,12 @@ packages: execa: 5.1.1 lodash: 4.17.21 parse-json: 5.2.0 - semantic-release: 20.1.1 + semantic-release: 20.1.3 transitivePeerDependencies: - supports-color dev: true - /@semantic-release/git/10.0.1_semantic-release@20.1.1: + /@semantic-release/git/10.0.1_semantic-release@20.1.3: resolution: { integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==, @@ -3258,12 +3265,12 @@ packages: lodash: 4.17.21 micromatch: 4.0.5 p-reduce: 2.1.0 - semantic-release: 20.1.1 + semantic-release: 20.1.3 transitivePeerDependencies: - supports-color dev: true - /@semantic-release/github/8.0.7_semantic-release@20.1.1: + /@semantic-release/github/8.0.7_semantic-release@20.1.3: resolution: { integrity: sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==, @@ -3287,14 +3294,14 @@ packages: mime: 3.0.0 p-filter: 2.1.0 p-retry: 4.6.2 - semantic-release: 20.1.1 + semantic-release: 20.1.3 url-join: 4.0.1 transitivePeerDependencies: - encoding - supports-color dev: true - /@semantic-release/gitlab/11.0.1_semantic-release@20.1.1: + /@semantic-release/gitlab/11.0.1_semantic-release@20.1.3: resolution: { integrity: sha512-CWXHlLZonwrUR2pbYaoERVu1cDVsi5W4H0WXDDCcDwicMmizsTkKJlpP9CQowoluqHKIJYrLkr2b+lYXCnBJZw==, @@ -3315,13 +3322,13 @@ packages: hpagent: 1.2.0 lodash-es: 4.17.21 parse-url: 8.1.0 - semantic-release: 20.1.1 + semantic-release: 20.1.3 url-join: 4.0.1 transitivePeerDependencies: - supports-color dev: true - /@semantic-release/npm/9.0.2_semantic-release@20.1.1: + /@semantic-release/npm/9.0.2_semantic-release@20.1.3: resolution: { integrity: sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==, @@ -3341,12 +3348,12 @@ packages: rc: 1.2.8 read-pkg: 5.2.0 registry-auth-token: 5.0.1 - semantic-release: 20.1.1 + semantic-release: 20.1.3 semver: 7.3.8 tempy: 1.0.1 dev: true - /@semantic-release/release-notes-generator/10.0.3_semantic-release@20.1.1: + /@semantic-release/release-notes-generator/10.0.3_semantic-release@20.1.3: resolution: { integrity: sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==, @@ -3365,7 +3372,7 @@ packages: into-stream: 6.0.0 lodash: 4.17.21 read-pkg-up: 7.0.1 - semantic-release: 20.1.1 + semantic-release: 20.1.3 transitivePeerDependencies: - supports-color dev: true @@ -3552,10 +3559,10 @@ packages: } dev: true - /@types/leaflet/1.9.2: + /@types/leaflet/1.9.3: resolution: { - integrity: sha512-vrokGIGVO8RSNXQBcWdEJ4Xy6E9kLQHZfpxIkFjSD1OhqTKOjYLFJDG6JCoAWYm/n755fdNCyrpna6/00kVajw==, + integrity: sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==, } dependencies: "@types/geojson": 7946.0.10 @@ -3627,10 +3634,10 @@ packages: "@types/debounce": 1.2.1 dev: true - /@typescript-eslint/eslint-plugin/5.55.0_342y7v4tc7ytrrysmit6jo4wri: + /@typescript-eslint/eslint-plugin/5.56.0_2hcjazgfnbtq42tcc73br2vup4: resolution: { - integrity: sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==, + integrity: sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3642,26 +3649,26 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.4.0 - "@typescript-eslint/parser": 5.55.0_vgl77cfdswitgr47lm5swmv43m - "@typescript-eslint/scope-manager": 5.55.0 - "@typescript-eslint/type-utils": 5.55.0_vgl77cfdswitgr47lm5swmv43m - "@typescript-eslint/utils": 5.55.0_vgl77cfdswitgr47lm5swmv43m + "@typescript-eslint/parser": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu + "@typescript-eslint/scope-manager": 5.56.0 + "@typescript-eslint/type-utils": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu + "@typescript-eslint/utils": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu debug: 4.3.4 eslint: 8.36.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 + tsutils: 3.21.0_typescript@5.0.2 + typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.55.0_vgl77cfdswitgr47lm5swmv43m: + /@typescript-eslint/parser/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: resolution: { - integrity: sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==, + integrity: sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3671,31 +3678,31 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 5.55.0 - "@typescript-eslint/types": 5.55.0 - "@typescript-eslint/typescript-estree": 5.55.0_typescript@4.9.5 + "@typescript-eslint/scope-manager": 5.56.0 + "@typescript-eslint/types": 5.56.0 + "@typescript-eslint/typescript-estree": 5.56.0_typescript@5.0.2 debug: 4.3.4 eslint: 8.36.0 - typescript: 4.9.5 + typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.55.0: + /@typescript-eslint/scope-manager/5.56.0: resolution: { - integrity: sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==, + integrity: sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - "@typescript-eslint/types": 5.55.0 - "@typescript-eslint/visitor-keys": 5.55.0 + "@typescript-eslint/types": 5.56.0 + "@typescript-eslint/visitor-keys": 5.56.0 dev: true - /@typescript-eslint/type-utils/5.55.0_vgl77cfdswitgr47lm5swmv43m: + /@typescript-eslint/type-utils/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: resolution: { - integrity: sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==, + integrity: sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3705,28 +3712,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 5.55.0_typescript@4.9.5 - "@typescript-eslint/utils": 5.55.0_vgl77cfdswitgr47lm5swmv43m + "@typescript-eslint/typescript-estree": 5.56.0_typescript@5.0.2 + "@typescript-eslint/utils": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu debug: 4.3.4 eslint: 8.36.0 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 + tsutils: 3.21.0_typescript@5.0.2 + typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.55.0: + /@typescript-eslint/types/5.56.0: resolution: { - integrity: sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==, + integrity: sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /@typescript-eslint/typescript-estree/5.55.0_typescript@4.9.5: + /@typescript-eslint/typescript-estree/5.56.0_typescript@5.0.2: resolution: { - integrity: sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==, + integrity: sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3735,22 +3742,22 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 5.55.0 - "@typescript-eslint/visitor-keys": 5.55.0 + "@typescript-eslint/types": 5.56.0 + "@typescript-eslint/visitor-keys": 5.56.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 + tsutils: 3.21.0_typescript@5.0.2 + typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.55.0_vgl77cfdswitgr47lm5swmv43m: + /@typescript-eslint/utils/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: resolution: { - integrity: sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==, + integrity: sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: @@ -3759,9 +3766,9 @@ packages: "@eslint-community/eslint-utils": 4.2.0_eslint@8.36.0 "@types/json-schema": 7.0.11 "@types/semver": 7.3.13 - "@typescript-eslint/scope-manager": 5.55.0 - "@typescript-eslint/types": 5.55.0 - "@typescript-eslint/typescript-estree": 5.55.0_typescript@4.9.5 + "@typescript-eslint/scope-manager": 5.56.0 + "@typescript-eslint/types": 5.56.0 + "@typescript-eslint/typescript-estree": 5.56.0_typescript@5.0.2 eslint: 8.36.0 eslint-scope: 5.1.1 semver: 7.3.8 @@ -3770,14 +3777,14 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.55.0: + /@typescript-eslint/visitor-keys/5.56.0: resolution: { - integrity: sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==, + integrity: sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/types": 5.56.0 eslint-visitor-keys: 3.3.0 dev: true @@ -4707,13 +4714,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.4.2_m2g2fjrvetqbsl7zxwctz5ljh4 + "@codemirror/autocomplete": 6.4.2_ipi6fyicmvtccbdgcmxxogx7ni "@codemirror/commands": 6.2.2 "@codemirror/language": 6.6.0 "@codemirror/lint": 6.1.1 "@codemirror/search": 6.2.3 "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.2 + "@codemirror/view": 6.9.3 dev: false /codepage/1.15.0: @@ -4983,7 +4990,7 @@ packages: integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, } - /cosmiconfig-typescript-loader/4.3.0_ipkhww4xc5z2tt2x53vp2mt2be: + /cosmiconfig-typescript-loader/4.3.0_jg2fnlxwfckic3l2an3gqrza7i: resolution: { integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==, @@ -4997,8 +5004,8 @@ packages: dependencies: "@types/node": 18.14.0 cosmiconfig: 8.0.0 - ts-node: 10.9.1_tncu2ai53lzgmizdedur7lbibe - typescript: 4.9.5 + ts-node: 10.9.1_w3gialtd35h6ptuevfzy5ddjvu + typescript: 5.0.2 dev: true /cosmiconfig/8.0.0: @@ -5014,6 +5021,19 @@ packages: path-type: 4.0.0 dev: true + /cosmiconfig/8.1.3: + resolution: + { + integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==, + } + engines: { node: ">=14" } + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + /crc-32/1.2.2: resolution: { @@ -5319,7 +5339,7 @@ packages: longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - "@commitlint/load": 17.4.4 + "@commitlint/load": 17.5.0 transitivePeerDependencies: - "@swc/core" - "@swc/wasm" @@ -5999,37 +6019,37 @@ packages: ext: 1.7.0 dev: false - /esbuild/0.16.17: + /esbuild/0.17.12: resolution: { - integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==, + integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==, } engines: { node: ">=12" } hasBin: true requiresBuild: true optionalDependencies: - "@esbuild/android-arm": 0.16.17 - "@esbuild/android-arm64": 0.16.17 - "@esbuild/android-x64": 0.16.17 - "@esbuild/darwin-arm64": 0.16.17 - "@esbuild/darwin-x64": 0.16.17 - "@esbuild/freebsd-arm64": 0.16.17 - "@esbuild/freebsd-x64": 0.16.17 - "@esbuild/linux-arm": 0.16.17 - "@esbuild/linux-arm64": 0.16.17 - "@esbuild/linux-ia32": 0.16.17 - "@esbuild/linux-loong64": 0.16.17 - "@esbuild/linux-mips64el": 0.16.17 - "@esbuild/linux-ppc64": 0.16.17 - "@esbuild/linux-riscv64": 0.16.17 - "@esbuild/linux-s390x": 0.16.17 - "@esbuild/linux-x64": 0.16.17 - "@esbuild/netbsd-x64": 0.16.17 - "@esbuild/openbsd-x64": 0.16.17 - "@esbuild/sunos-x64": 0.16.17 - "@esbuild/win32-arm64": 0.16.17 - "@esbuild/win32-ia32": 0.16.17 - "@esbuild/win32-x64": 0.16.17 + "@esbuild/android-arm": 0.17.12 + "@esbuild/android-arm64": 0.17.12 + "@esbuild/android-x64": 0.17.12 + "@esbuild/darwin-arm64": 0.17.12 + "@esbuild/darwin-x64": 0.17.12 + "@esbuild/freebsd-arm64": 0.17.12 + "@esbuild/freebsd-x64": 0.17.12 + "@esbuild/linux-arm": 0.17.12 + "@esbuild/linux-arm64": 0.17.12 + "@esbuild/linux-ia32": 0.17.12 + "@esbuild/linux-loong64": 0.17.12 + "@esbuild/linux-mips64el": 0.17.12 + "@esbuild/linux-ppc64": 0.17.12 + "@esbuild/linux-riscv64": 0.17.12 + "@esbuild/linux-s390x": 0.17.12 + "@esbuild/linux-x64": 0.17.12 + "@esbuild/netbsd-x64": 0.17.12 + "@esbuild/openbsd-x64": 0.17.12 + "@esbuild/sunos-x64": 0.17.12 + "@esbuild/win32-arm64": 0.17.12 + "@esbuild/win32-ia32": 0.17.12 + "@esbuild/win32-x64": 0.17.12 dev: true /escalade/3.1.1: @@ -6095,10 +6115,10 @@ packages: source-map: 0.1.43 dev: false - /eslint-config-prettier/8.7.0_eslint@8.36.0: + /eslint-config-prettier/8.8.0_eslint@8.36.0: resolution: { - integrity: sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==, + integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==, } hasBin: true peerDependencies: @@ -6107,7 +6127,7 @@ packages: eslint: 8.36.0 dev: true - /eslint-plugin-prettier/4.2.1_eqzx3hpkgx5nnvxls3azrcc7dm: + /eslint-plugin-prettier/4.2.1_ose2zoovovx4ulolhifz3tfzx4: resolution: { integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, @@ -6122,8 +6142,8 @@ packages: optional: true dependencies: eslint: 8.36.0 - eslint-config-prettier: 8.7.0_eslint@8.36.0 - prettier: 2.8.4 + eslint-config-prettier: 8.8.0_eslint@8.36.0 + prettier: 2.8.6 prettier-linter-helpers: 1.0.0 dev: true @@ -8035,10 +8055,10 @@ packages: engines: { node: ">=0.10.0" } dev: true - /known-css-properties/0.26.0: + /known-css-properties/0.27.0: resolution: { - integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==, + integrity: sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==, } dev: true @@ -8161,34 +8181,35 @@ packages: wrap-ansi: 7.0.0 dev: true - /lit-element/3.2.2: + /lit-element/3.3.0: resolution: { - integrity: sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==, + integrity: sha512-M3OIoblNS7LZdRxOIk8g0wyLEA/lRw/UGJ1TX+767OpkuDsRdSoxBIvewpWqCo7sMd9xt1XedUNZIr9jUO1X3g==, } dependencies: + "@lit-labs/ssr-dom-shim": 1.1.0 "@lit/reactive-element": 1.6.1 - lit-html: 2.6.1 + lit-html: 2.7.0 dev: false - /lit-html/2.6.1: + /lit-html/2.7.0: resolution: { - integrity: sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==, + integrity: sha512-/zPOl8EfeB3HHpTzINSpnWgvgQ8N07g/j272EOAIyB0Ys2RzBqTVT23i+JZuUlNbB2WHHeSsTCFi92NtWrtpqQ==, } dependencies: "@types/trusted-types": 2.0.3 dev: false - /lit/2.6.1: + /lit/2.7.0: resolution: { - integrity: sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==, + integrity: sha512-qSy2BAVA+OiWtNptP404egcC/izDdNRw6iHGIbUmkZtbMJvPKfNsaoKrNs8Zmsbjmv5ZX2tur1l9TfzkSWWT4g==, } dependencies: "@lit/reactive-element": 1.6.1 - lit-element: 3.2.2 - lit-html: 2.6.1 + lit-element: 3.3.0 + lit-html: 2.7.0 dev: false /load-json-file/4.0.0: @@ -8524,7 +8545,7 @@ packages: engines: { node: ">=8" } dev: true - /marked-terminal/5.1.1_marked@4.2.12: + /marked-terminal/5.1.1_marked@4.3.0: resolution: { integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==, @@ -8537,15 +8558,15 @@ packages: cardinal: 2.1.1 chalk: 5.2.0 cli-table3: 0.6.3 - marked: 4.2.12 + marked: 4.3.0 node-emoji: 1.11.0 supports-hyperlinks: 2.3.0 dev: true - /marked/4.2.12: + /marked/4.3.0: resolution: { - integrity: sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==, + integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==, } engines: { node: ">= 12" } hasBin: true @@ -10564,7 +10585,7 @@ packages: fast-diff: 1.2.0 dev: true - /prettier-plugin-organize-imports/3.2.2_silln3pw57har7jydmecgzoypa: + /prettier-plugin-organize-imports/3.2.2_tcllvk4eo3otqqvuorc2duftpy: resolution: { integrity: sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==, @@ -10580,14 +10601,14 @@ packages: "@volar/vue-typescript": optional: true dependencies: - prettier: 2.8.4 - typescript: 4.9.5 + prettier: 2.8.6 + typescript: 5.0.2 dev: true - /prettier/2.8.4: + /prettier/2.8.6: resolution: { - integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==, + integrity: sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==, } engines: { node: ">=10.13.0" } hasBin: true @@ -11105,6 +11126,17 @@ packages: fsevents: 2.3.2 dev: true + /rollup/3.20.1: + resolution: + { + integrity: sha512-sz2w8cBJlWQ2E17RcpvHuf4sk2BQx4tfKDnjNPikEpLEevrbIAR7CH3PGa2hpPwWbNgPaA9yh9Jzljds5bc9zg==, + } + engines: { node: ">=14.18.0", npm: ">=8.0.0" } + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /run-async/2.4.1: resolution: { @@ -11193,19 +11225,19 @@ packages: get-assigned-identifiers: 1.2.0 dev: false - /semantic-release/20.1.1: + /semantic-release/20.1.3: resolution: { - integrity: sha512-jXDr8y7ozo42N4+G9m/P5Qyx5oQO4aOS66a+Up8XECzEOFIpEoo3ngnr4R5lSix/sVJW69/fgNkOUZhsGFiQ5g==, + integrity: sha512-sMIK9IaOdLP9hxzTxdTVHxINsazlDgv2gjZ1yeyRZXpIT3xAnuQUDEez8k+AC+lFUtGnfzA2Ct3V5lDyiMestw==, } engines: { node: ">=18" } hasBin: true dependencies: - "@semantic-release/commit-analyzer": 9.0.2_semantic-release@20.1.1 + "@semantic-release/commit-analyzer": 9.0.2_semantic-release@20.1.3 "@semantic-release/error": 3.0.0 - "@semantic-release/github": 8.0.7_semantic-release@20.1.1 - "@semantic-release/npm": 9.0.2_semantic-release@20.1.1 - "@semantic-release/release-notes-generator": 10.0.3_semantic-release@20.1.1 + "@semantic-release/github": 8.0.7_semantic-release@20.1.3 + "@semantic-release/npm": 9.0.2_semantic-release@20.1.3 + "@semantic-release/release-notes-generator": 10.0.3_semantic-release@20.1.3 aggregate-error: 4.0.1 cosmiconfig: 8.0.0 debug: 4.3.4 @@ -11218,8 +11250,8 @@ packages: hook-std: 3.0.0 hosted-git-info: 6.1.1 lodash-es: 4.17.21 - marked: 4.2.12 - marked-terminal: 5.1.1_marked@4.2.12 + marked: 4.3.0 + marked-terminal: 5.1.1_marked@4.3.0 micromatch: 4.0.5 p-each-series: 3.0.0 p-reduce: 3.0.0 @@ -11809,33 +11841,33 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /stylelint-config-recommended/10.0.1_stylelint@15.2.0: + /stylelint-config-recommended/11.0.0_stylelint@15.3.0: resolution: { - integrity: sha512-TQ4xQ48tW4QSlODcti7pgSRqBZcUaBzuh0jPpfiMhwJKBPkqzTIAU+IrSWL/7BgXlOM90DjB7YaNgFpx8QWhuA==, + integrity: sha512-SoGIHNI748OCZn6BxFYT83ytWoYETCINVHV3LKScVAWQQauWdvmdDqJC5YXWjpBbxg2E761Tg5aUGKLFOVhEkA==, } peerDependencies: - stylelint: ^15.0.0 + stylelint: ^15.3.0 dependencies: - stylelint: 15.2.0 + stylelint: 15.3.0 dev: true - /stylelint-config-standard/30.0.1_stylelint@15.2.0: + /stylelint-config-standard/31.0.0_stylelint@15.3.0: resolution: { - integrity: sha512-NbeHOmpRQhjZh5XB1B/S4MLRWvz4xxAxeDBjzl0tY2xEcayNhLbaRGF0ZQzq+DQZLCcPpOHeS2Ru1ydbkhkmLg==, + integrity: sha512-CUGAmtROCvX0YgMY2+6P9tqSkHj5z/75XxrQ8bGxvkCa1xYdGDx4poM0pa7cXc3s74/PZLJH/okxZZouRfOSGw==, } peerDependencies: - stylelint: ^15.0.0 + stylelint: ^15.3.0 dependencies: - stylelint: 15.2.0 - stylelint-config-recommended: 10.0.1_stylelint@15.2.0 + stylelint: 15.3.0 + stylelint-config-recommended: 11.0.0_stylelint@15.3.0 dev: true - /stylelint/15.2.0: + /stylelint/15.3.0: resolution: { - integrity: sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==, + integrity: sha512-9UYBYk7K9rtlKcTUDZrtntE840sZM00qyYBQHHe7tjwMNUsPsGvR6Fd43IxHEAhRrDLzpy3TVaHb6CReBB3eFg==, } engines: { node: ^14.13.1 || >=16.0.0 } hasBin: true @@ -11846,7 +11878,7 @@ packages: "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 8.0.0 + cosmiconfig: 8.1.3 css-functions-list: 3.1.0 css-tree: 2.3.1 debug: 4.3.4 @@ -11861,7 +11893,7 @@ packages: import-lazy: 4.0.0 imurmurhash: 0.1.4 is-plain-object: 5.0.0 - known-css-properties: 0.26.0 + known-css-properties: 0.27.0 mathml-tag-names: 2.1.3 meow: 9.0.0 micromatch: 4.0.5 @@ -11877,7 +11909,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 style-search: 0.1.0 - supports-hyperlinks: 2.3.0 + supports-hyperlinks: 3.0.0 svg-tags: 1.0.0 table: 6.8.1 v8-compile-cache: 2.3.0 @@ -11917,6 +11949,17 @@ packages: supports-color: 7.2.0 dev: true + /supports-hyperlinks/3.0.0: + resolution: + { + integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==, + } + engines: { node: ">=14.18" } + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + /supports-preserve-symlinks-flag/1.0.0: resolution: { @@ -12183,7 +12226,7 @@ packages: engines: { node: ">=8" } dev: true - /ts-node/10.9.1_tncu2ai53lzgmizdedur7lbibe: + /ts-node/10.9.1_w3gialtd35h6ptuevfzy5ddjvu: resolution: { integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, @@ -12212,7 +12255,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 5.0.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -12230,7 +12273,7 @@ packages: integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==, } - /tsutils/3.21.0_typescript@4.9.5: + /tsutils/3.21.0_typescript@5.0.2: resolution: { integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, @@ -12240,7 +12283,7 @@ packages: typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" dependencies: tslib: 1.14.1 - typescript: 4.9.5 + typescript: 5.0.2 dev: true /type-check/0.3.2: @@ -12359,12 +12402,12 @@ packages: } dev: false - /typescript/4.9.5: + /typescript/5.0.2: resolution: { - integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, + integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==, } - engines: { node: ">=4.2.0" } + engines: { node: ">=12.20" } hasBin: true dev: true @@ -12539,10 +12582,10 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-plugin-pwa/0.14.4_vizhyq4kcdharmiplw7eejneda: + /vite-plugin-pwa/0.14.5_7pzn4vgxpc2rxxz25gxxv2wcqm: resolution: { - integrity: sha512-M7Ct0so8OlouMkTWgXnl8W1xU95glITSKIe7qswZf1tniAstO2idElGCnsrTJ5NPNSx1XqfTCOUj8j94S6FD7Q==, + integrity: sha512-LH3VCtoWx0scfim8Ph+daVl45uVRyWzXn3C3GUq92uWUui1p8eh+DjTQ23Pvb7SJ0SJtxZ99LCpOLCkFkaxokg==, } peerDependencies: vite: ^3.1.0 || ^4.0.0 @@ -12553,17 +12596,17 @@ packages: fast-glob: 3.2.12 pretty-bytes: 6.1.0 rollup: 3.17.2 - vite: 4.1.4 + vite: 4.2.1 workbox-build: 6.5.4 workbox-window: 6.5.4 transitivePeerDependencies: - supports-color dev: true - /vite/4.1.4: + /vite/4.2.1: resolution: { - integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==, + integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==, } engines: { node: ^14.18.0 || >=16.0.0 } hasBin: true @@ -12588,10 +12631,10 @@ packages: terser: optional: true dependencies: - esbuild: 0.16.17 + esbuild: 0.17.12 postcss: 8.4.21 resolve: 1.22.1 - rollup: 3.17.2 + rollup: 3.20.1 optionalDependencies: fsevents: 2.3.2 dev: true @@ -12603,10 +12646,10 @@ packages: } dev: false - /wavesurfer.js/6.5.2: + /wavesurfer.js/6.6.1: resolution: { - integrity: sha512-1GfjeFlaaYnlOcwZ3M0MjYgmAVzL4dKARfJIlM9L/NVECFRwMsV7wtOWA1ZBukjFABt+DL+JiZOEIAtomqSMJg==, + integrity: sha512-J3Zxm9t6gOueHVH0/lToFyiEoWi7s5W1iUoS6GRJKQr7Jc/sE+2rfAYhdrmB1o+XI1eu4gl4KEicnCwm2z5W8g==, } dev: false From d4954e026d5e0d48c5f15ed69d1ce71abb34d1a1 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 23 Mar 2023 11:54:24 +0000 Subject: [PATCH 095/477] revert(homepage): remove redirect to install if database is not setup After install, the redirect condition is kept even though it would never be triggered again. --- app/Controllers/HomeController.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php index 130d1e3a..61b74a97 100644 --- a/app/Controllers/HomeController.php +++ b/app/Controllers/HomeController.php @@ -14,22 +14,12 @@ use App\Models\PodcastModel; use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\ResponseInterface; -use Config\Services; use Modules\Media\FileManagers\FileManagerInterface; class HomeController extends BaseController { public function index(): RedirectResponse | string { - $db = db_connect(); - if ($db->getDatabase() === '' || ! $db->tableExists('podcasts')) { - // Database has not been set or could not find the podcasts table - // Redirecting to install page because it is likely that Castopod has not been installed yet. - // NB: as base_url wouldn't have been defined here, redirect to install wizard manually - $route = Services::routes()->reverseRoute('install'); - return redirect()->to(rtrim(host_url(), '/') . $route); - } - $sortOptions = ['activity', 'created_desc', 'created_asc']; $sortBy = in_array($this->request->getGet('sort'), $sortOptions, true) ? $this->request->getGet( 'sort' From 4193946fe0e73f442b946c0ccb77e08482921a8c Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 23 Mar 2023 11:59:51 +0000 Subject: [PATCH 096/477] chore(health): remove returned 503 status code reason --- app/Controllers/HomeController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php index 61b74a97..b0f2b703 100644 --- a/app/Controllers/HomeController.php +++ b/app/Controllers/HomeController.php @@ -67,7 +67,7 @@ class HomeController extends BaseController } if ($errors !== []) { - return $this->response->setStatusCode(503, 'Problem with cache handler.') + return $this->response->setStatusCode(503) ->setJSON([ 'code' => 503, 'errors' => $errors, From 90f757dc93ed846b91e54ff2ca109de0d8234f31 Mon Sep 17 00:00:00 2001 From: crowdin Date: Thu, 23 Mar 2023 12:13:46 +0000 Subject: [PATCH 097/477] chore(i18n): new Crowdin updates --- docs/src/ar/getting-started/docker.md | 2 + docs/src/ar/getting-started/install.md | 19 +- docs/src/br/getting-started/docker.md | 2 + docs/src/br/getting-started/install.md | 19 +- docs/src/ca/getting-started/docker.md | 2 + docs/src/ca/getting-started/install.md | 19 +- docs/src/ca/index.md | 143 +++++----- docs/src/de/getting-started/docker.md | 2 + docs/src/de/getting-started/install.md | 19 +- docs/src/de/index.md | 79 +++--- docs/src/el/getting-started/docker.md | 2 + docs/src/el/getting-started/install.md | 19 +- docs/src/es/getting-started/docker.md | 2 + docs/src/es/getting-started/install.md | 19 +- docs/src/es/index.md | 152 +++++----- docs/src/fa/getting-started/docker.md | 2 + docs/src/fa/getting-started/install.md | 19 +- docs/src/fr/getting-started/docker.md | 2 + docs/src/fr/getting-started/install.md | 19 +- docs/src/fr/index.md | 153 +++++----- docs/src/fr2/getting-started/docker.md | 179 ++++++++++++ docs/src/fr2/getting-started/install.md | 19 +- docs/src/fr2/index.md | 296 ++++++++++++++++++++ docs/src/fr_CA/getting-started/docker.md | 2 + docs/src/fr_CA/getting-started/install.md | 19 +- docs/src/fr_CA/index.md | 7 - docs/src/gd/getting-started/docker.md | 2 + docs/src/gd/getting-started/install.md | 19 +- docs/src/gd/index.md | 5 - docs/src/gl/getting-started/docker.md | 2 + docs/src/gl/getting-started/install.md | 19 +- docs/src/id/getting-started/docker.md | 2 + docs/src/id/getting-started/install.md | 19 +- docs/src/id/index.md | 28 +- docs/src/it/getting-started/docker.md | 2 + docs/src/it/getting-started/install.md | 19 +- docs/src/ko/getting-started/docker.md | 2 + docs/src/ko/getting-started/install.md | 19 +- docs/src/nl/getting-started/docker.md | 2 + docs/src/nl/getting-started/install.md | 19 +- docs/src/nn-NO/getting-started/docker.md | 2 + docs/src/nn-NO/getting-started/install.md | 19 +- docs/src/nn-NO/index.md | 125 ++++----- docs/src/oc/getting-started/docker.md | 2 + docs/src/oc/getting-started/install.md | 19 +- docs/src/oc/index.md | 5 - docs/src/pl/getting-started/docker.md | 2 + docs/src/pl/getting-started/install.md | 19 +- docs/src/pt-BR/getting-started/docker.md | 2 + docs/src/pt-BR/getting-started/install.md | 19 +- docs/src/pt-BR/index.md | 148 +++++----- docs/src/pt/getting-started/docker.md | 2 + docs/src/pt/getting-started/install.md | 19 +- docs/src/ro/getting-started/docker.md | 2 + docs/src/ro/getting-started/install.md | 19 +- docs/src/ru/getting-started/docker.md | 2 + docs/src/ru/getting-started/install.md | 19 +- docs/src/sk/getting-started/docker.md | 2 + docs/src/sk/getting-started/install.md | 19 +- docs/src/sr_Latn/getting-started/docker.md | 2 + docs/src/sr_Latn/getting-started/install.md | 19 +- docs/src/sv/getting-started/docker.md | 2 + docs/src/sv/getting-started/install.md | 19 +- docs/src/sv/index.md | 156 +++++------ docs/src/uk/getting-started/docker.md | 2 + docs/src/uk/getting-started/install.md | 19 +- docs/src/uk/index.md | 7 - docs/src/zh-Hans/getting-started/docker.md | 2 + docs/src/zh-Hans/getting-started/install.md | 19 +- docs/src/zh-Hans/index.md | 122 ++++---- 70 files changed, 1357 insertions(+), 834 deletions(-) create mode 100644 docs/src/fr2/getting-started/docker.md create mode 100644 docs/src/fr2/index.md diff --git a/docs/src/ar/getting-started/docker.md b/docs/src/ar/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/ar/getting-started/docker.md +++ b/docs/src/ar/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/ar/getting-started/install.md b/docs/src/ar/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/ar/getting-started/install.md +++ b/docs/src/ar/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/br/getting-started/docker.md b/docs/src/br/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/br/getting-started/docker.md +++ b/docs/src/br/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/br/getting-started/install.md b/docs/src/br/getting-started/install.md index 39c53c32..5ce6df8d 100644 --- a/docs/src/br/getting-started/install.md +++ b/docs/src/br/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/ca/getting-started/docker.md b/docs/src/ca/getting-started/docker.md index 390be5b2..676a9f77 100644 --- a/docs/src/ca/getting-started/docker.md +++ b/docs/src/ca/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**castopod/app**](https://hub.docker.com/r/castopod/app): el paquet incloent Castopod i totes les dependències - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una diff --git a/docs/src/ca/getting-started/install.md b/docs/src/ca/getting-started/install.md index 63ceaa50..c2b1a87a 100644 --- a/docs/src/ca/getting-started/install.md +++ b/docs/src/ca/getting-started/install.md @@ -186,15 +186,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Paquets de la comunitat diff --git a/docs/src/ca/index.md b/docs/src/ca/index.md index ae986868..12326ac9 100644 --- a/docs/src/ca/index.md +++ b/docs/src/ca/index.md @@ -59,91 +59,85 @@ molt petita. ## Motivació -L'ecosistema de podcasting ès descentralitzat per naturalesa: podeu crear el -vostre podcast com a fitxer RSS, publicar-lo a la web i compartir-lo a tot arreu -en línia. +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. -De fet, és un dels únics mitjans que s'han mantingut durant molt de temps -(dècades!). +It is in fact one of the only media to have stayed this way for a long time. -A mesura que els usos evolucionen, cada vegada hi ha més gent que s'incorpora -als podcasts: ja siguin els creadors que troben noves maneres de compartir les -seves idees o els oients a la recerca de millors continguts. +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. -Essent el podcasting cada cop més utilitzat, algunes empreses intenten -canviar-lo cap a un mitjà més controlat i centralitzat, creant plataformes de -publicació sota el seu control. +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. -Castopod es va crear amb l'objectiu de proporcionar una alternativa oberta i -sostenible per a que allotjeu els vostres podcasts, promovent la -descentralització i així garantir que la creativitat dels podcasters pugui -expressar-se. +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. -Aquest projecte és impulsat per la comunitat de codi obert, i concretament pels -moviments [Fediverse](https://fediverse.party/en/fediverse/) i \[Podcasting -2.0\](https://podcastindex .org/). +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. ## Comparació amb altres solucions -Creiem que una mateixa solució no és necessàriament adequada per a tothom, depèn -molt de les vostres necessitats. Per tant, aquí us mostrem comparacions amb -altres eines per ajudar-vos a determinar si Castopod és l'adequat per a -vosaltres. +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod vs Wordpress -Casopod es coneix sovint com "el Wordpress per a podcasts" a causa de les -similituds entre els dos. D'alguna manera això és cert. I, de fet, Castopod es -va inspirar molt en l'ecosistema de Wordpress, veient la facilitat d'adopció per -part de la comunitat i el nombre de llocs web que l'executen. +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. -Igual que Wordpress, Castopod és gratuït i de codi obert, fet amb PHP amb una -base de dades MySQL i està empaquetat de manera que es pot instal·lar fàcilment -a la majoria del servidors web. +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. -Wordpress és una manera fantàstica de crear el vostre lloc web i ampliar-lo amb -complements per obtenir el que voleu. És un CMS complet que us ajuda a tenir -qualsevol tipus de lloc web en línia. +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. -D'altra banda, Castopod està pensat per atendre les necessitats dels podcasters -específicament, centrant-se en el podcasting i res més. No necessiteu cap -complement o connector per començar el vostre viatge de podcasting. +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. -Això permet optimitzar els processos específics del podcasting: des de la -creació dels teus podcasts i la publicació de nous episodis fins a la difusió, -el màrqueting i l'anàlisi estadística. +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. -Finalment, depenent de les vostres necessitats, Wordpress i Castopod poden -conviure fins i tot, ja que comparteixen els mateixos requisits! +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! ### Castopod vs Funkwhale -Funkwhale és un servidor de música de codi obert, modern i auto-allotjat. Igual -que Castopod, Funkwhale es troba al Fediverse, una xarxa social descentralitzada -que permet la interoperabilitat entre ambdues. +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. -Funkwhale es va construir inicialment al voltant de la música. I més tard, a -mesura que el projecte anava evolucionant, es va introduir la possibilitat -d'allotjar podcasts. +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. -A diferència de Funkwhale, Castopod ha estat dissenyat i construït exclusivament -al voltant del podcasting. Això permet una implementació més fàcil de funcions -relacionades amb l'ecosistema del podcasting, com ara les funcions del -podcasting 2.0 (transcripcions, capítols, geo-localitzacions, persones, ...). +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). -Per tant, probablement hauríeu d'utilitzar Funkwhale si voleu allotjar la vostra -música i utilitzar Castopod si voleu allotjar els vostres podcasts. +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. ### Castopod vs altres plataformes de podcast -Hi ha moltes solucions per allotjar els vostres podcasts, algunes de les quals -són realment fantàstiques i [moltes](https://podcastindex.org/apps) s'estan -incorporant al carro Podcasting 2.0. com Castopod! +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! Cadascuna d'aquestes solucions difereix entre si, podeu comparar-les amb la [llista de funcions](#característiques). -Dit això, hi ha dues diferències principals amb altres solucions de podcasting: +That being said, there are two main differences with other podcasting solutions: - Castopod es pot auto-allotjar i és la única solució que us permet mantenir el control total sobre el que produïu. A més, com que és de codi obert, fins i @@ -155,15 +149,15 @@ Dit això, hi ha dues diferències principals amb altres solucions de podcasting ## Col·laborar -Us agrada Castopod i voleu ajudar? Fes una ullada a la documentació següent per -començar. +Love Castopod and would like to help? Take a look at the following documentation +to get you started. ### Codi de conducta -Castopod ha adoptat un codi de conducta que esperem que els participants del -projecte compleixin. Si us plau, llegiu el -[manual CODE_OF_CONDUCT](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -perquè pugueu entendre quines accions seran o no tolerades. +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. ### Guia de col·laboració @@ -173,8 +167,8 @@ i millores, i com construir i prova els teus canvis a Castopod. ## Col·laboradors ✨ -Gràcies a aquestes persones meravelloses -([clau emoji](https://allcontributors.org/docs/en/emoji-key)): +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -252,22 +246,21 @@ Gràcies a aquestes persones meravelloses -Aquest projecte segueix l'especificació -[all-contributors](https://github.com/all-contributors/all-contributors). -Benvingudes les col·laboracions de qualsevol mena! +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! ## Contacte -Podeu contactar amb nosaltres per demanar ajuda o fer qualsevol pregunta que -tingueu via: +You may reach us for help or ask any question you have on: - [Discord](https://castopod.org/discord) (per a la interacció directa amb desenvolupadors i la comunitat) - [Seguiment d'incidències](https://code.castopod.org/adaures/castopod/-/issues) (per a sol·licituds de noves funcionalitats i informes d'errors) -Alternativament, podeu seguir-nos a les plataformes de xarxes socials per rebre -notícies sobre Castopod: +Alternatively, you can follow us on social media platforms to get news about +Castopod: - [podlibre.social](https://podlibre.social/@Castopod) (instància de Mastodon) - [Twitter](https://twitter.com/castopod) @@ -276,9 +269,9 @@ notícies sobre Castopod: ## Patrocinadors -El desenvolupament continu de Castopod és possible amb el suport dels seus -patrocinadors. Si voleu ajudar, considereu -[patrocinar el desenvolupament de Castopod](https://opencollective.com/castopod/contribute). +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
    Ad Aures Logo @@ -289,7 +282,7 @@ patrocinadors. Si voleu ajudar, considereu [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-avui, [Ad Aures](https://adaures.com/). +Copyright © 2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/docs/src/de/getting-started/docker.md b/docs/src/de/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/de/getting-started/docker.md +++ b/docs/src/de/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/de/getting-started/install.md b/docs/src/de/getting-started/install.md index b36473af..f59050e5 100644 --- a/docs/src/de/getting-started/install.md +++ b/docs/src/de/getting-started/install.md @@ -183,15 +183,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/de/index.md b/docs/src/de/index.md index 78767edd..283999ee 100644 --- a/docs/src/de/index.md +++ b/docs/src/de/index.md @@ -57,66 +57,63 @@ mit einem sehr kleinen Fußabdruck. ## Motivation -Das Podcasting-Ökosystem ist von Natur aus dezentralisiert: Du kannst deinen -Podcast als RSS-Datei erstellen, im Web publizieren und von dort aus überall -online teilen. +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. -Es ist in der Tat eines der einzigen Medien, die lange Zeit so geblieben sind. +It is in fact one of the only media to have stayed this way for a long time. -Da sich die Nutzungsmöglichkeiten weiterentwickeln, interessieren sich immer -mehr Menschen für Podcasts: seien es Schöpfer, die neue Wege finden, ihre Ideen -zu teilen, oder Zuhörer auf der Suche nach besseren Inhalten. +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. -Mit zunehmender Verbreitung des Podcasts versuchen einige Unternehmen, ihn auf -ein stärker kontrollierbares und zentralisiertes Medium zu verlagern. +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. -Castopod wurde in dem Bestreben erstellt, eine offene und nachhaltige -Alternative für das Hosting Ihrer Podcasts zu bieten. Die Förderung der -Dezentralisierung soll sicherstellen, dass sich Podcaster in ihrer Kreativität -frei entfalten können. +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. -Dieses Projekt wird von der Open-Source-Community und speziell von den -[Fediverse](https://fediverse.party/en/fediverse/) und -[Podcasting 2.0](https://podcastindex.org/) Bewegungen getragen. +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. ## Vergleiche mit anderen Lösungen -Wir glauben, dass es nicht die eine Lösung für jeden gibt, es ist sehr abhängig -von deinen Bedürfnissen. Also, hier sind Vergleiche mit anderen Tools, die Dir -helfen sollen herauszufinden, ob Castopod das richtige für Dich ist. +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod vs Wordpress -Castopod wird oft als "das Wordpress für Podcasts" bezeichnet, da die --Ähnlichkeiten zwischen den beiden übereinstimmen. In gewisser Hinsicht ist das -richtig. Und tatsächlich war Castopod stark vom Wordpress-Ökosystem inspiriert, -da es die einfache Übernahme durch die Community und die Anzahl der Websites, -auf denen es ausgeführt wird, sah. +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. -Genau wie Wordpress ist Castopod kostenlos; Open Source, erstellt mit PHP mit -einer MySQL-Datenbank und ist so verpackt, dass Du es auf den Servern der -meisten Websites problemlos installieren kannst. +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. -Wordpress ist ein großartiger Weg, um Deine Website zu erstellen und mit Plugins -zu erweitern, um das zu bekommen, was Du willst. Es ist ein vollwertiges CMS -welches dir hilft, jede Art von Webseite online zu bekommen. +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. -Auf der anderen Seite soll Castopod die Bedürfnisse von Podcastern erfüllen. -Konzentriere Dich ausschließlich aufs Podcasten und sonst nichts. Du benötigst -kein Plugin, um dein Podcasting zu beginnen. +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. -Dadurch lassen sich die Podcast-spezifischen Prozesse optimieren: von der -Erstellung Ihrer Podcasts und die Veröffentlichung neuer Folgen bis hin zu -Rundfunk, Marketing und Analytik. +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. -Schließlich können Wordpress und Castopod je nach Bedarf sogar nebeneinander -existieren, da sie die gleichen Anforderungen haben! +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! ### Castopod vs Funkwale -Funkwhale ist ein selbstgehosteter, moderner kostenloser und -Open-Source-Musikserver. Just as Castopod, Funkwhale is on the fediverse, a -decentralized social network allowing interoperability between the two. +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. Funkwhale was initially built around music. And later on, as the project evolved, the ability to host podcasts was introduced. diff --git a/docs/src/el/getting-started/docker.md b/docs/src/el/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/el/getting-started/docker.md +++ b/docs/src/el/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/el/getting-started/install.md b/docs/src/el/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/el/getting-started/install.md +++ b/docs/src/el/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/es/getting-started/docker.md b/docs/src/es/getting-started/docker.md index 0a7d3118..8cde56a3 100644 --- a/docs/src/es/getting-started/docker.md +++ b/docs/src/es/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod lanza 3 imágenes Docker al DockerHub durante su proceso de construcción automatizada: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el paquete completo de Castopod con todas las dependencias. - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una diff --git a/docs/src/es/getting-started/install.md b/docs/src/es/getting-started/install.md index 849fd917..cd0b29a2 100644 --- a/docs/src/es/getting-started/install.md +++ b/docs/src/es/getting-started/install.md @@ -188,15 +188,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Paquetes de la comunidad diff --git a/docs/src/es/index.md b/docs/src/es/index.md index b8b90aa8..aaa84a24 100644 --- a/docs/src/es/index.md +++ b/docs/src/es/index.md @@ -64,91 +64,85 @@ Castopod es fácil de instalar y se ha desarrollado sobre ## Motivación -El ecosistema de podcasting es descentralizado por naturaleza: puedes crear tu -podcast como un archivo RSS, publicarlo en la web y compartirlo en todas partes. +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. -De hecho, es uno de los únicos medios de comunicación que se han mantenido así -durante mucho tiempo. +It is in fact one of the only media to have stayed this way for a long time. -A medida que los usos evolucionan, más y más personas se introducen en el mundo -del podcast: ya sea que sean creadores que buscando nuevas formas de compartir -sus ideas, u oyentes en busca de mejores contenidos. +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. -A medida que aumenta el uso del podcast, algunas empresas están tratando de -convertirlo en un medio más controlado y centralizado. +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. -Castopod fue creado en un esfuerzo por aportar una alternativa abierta y -sostenible para alojar tus podcasts, promoviendo la descentralización y así -garantizar que los podcasters y su creatividad pueda expresarse sin -restricciones. +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. -Este proyecto goza del apoyo de la comunidad de código abierto, y -específicamente de los movimientos del -[Fediverso](https://fediverse.party/en/fediverse/) y el -[Podcasting 2.0](https://podcastindex.org/). +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. ## Comparación con otras soluciones -Creemos que una misma solución no es necesariamente adecuada para todos, ya que -depende de las necesidades de cada quien. Por lo tanto, vamos a comparar -Castopod con otras herramientas para ayudarte a medir si es el más adecuado para -ti. +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod vs. Wordpress -Castopod a menudo lo llaman "el Wordpress para podcasts" debido a las -similitudes entre ambos. En cierto modo es cierto. Y es que en realidad, -Castopod se inspiró en gran medida en el ecosistema de Wordpress, viendo la -facilidad de adopción de la comunidad y el número de sitios web que funcionan -con WP. +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. -Al igual que Wordpress, Castopod es software libre, gratuito y de código -abierto, construido con PHP y una base de datos MySQL, y empaquetado de una -manera que puede instalar fácilmente en la mayoría de los servidores web. +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. -Wordpress ofrece una buena manera de crear tu sitio web y extenderlo con plugins -para obtener lo que quieres. Es un CMS completo que te ayuda a tener en línea -cualquier tipo de sitio web. +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. -Por otro lado, Castopod está pensado para atender específicamente las -necesidades de los podcasters, centrándose en el podcasting y nada más. No -necesitas ningún plugin para empezar con tu viaje por el mundo del podcast. +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. -Esto permite optimizar los procesos específicos del podcasting: desde la -creación de tus podcasts y la publicación de nuevos episodios hasta la -transmisión, marketing y análisis estadístico. +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. -Por último, dependiendo de sus necesidades, Wordpress y Castopod incluso pueden -convivir codo con codo en el mismo servidor, ¡ya que comparten los mismos -requisitos! +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! ### Castopod vs. Funkwhale -Funkwhale es un servidor de música auto-hospedado, moderno y gratuito y de -código abierto. Igual que Castopod, Funkwhale está en el fediverso, una red -social descentralizada, permitiendo la interoperabilidad entre ambos. +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. -Funkwhale se desarrolló inicialmente en torno a la música. Y más adelante, al -evolucionar como proyecto, se introdujo la capacidad de alojar podcasts. +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. -A diferencia de Funkwhale, Castopod ha sido diseñado y desarrollado -exclusivamente para el podcasting. Esto permite una implementación más fácil -para funciones relacionadas con el ecosistema del podcasting, tales como las del -podcasting 2.0 (transcripciones, episodios, geo-localizaciones, personas, …). +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). -Por lo tanto, probablemente deberías usar Funkwhale si quieres alojar tu música -y usar Castopod si quieres alojar tus podcasts. +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. ### Castopod vs. otras plataformas de podcast -Hay muchas soluciones para alojar tus podcasts, algunas de las cuales son -realmente geniales y \[muchas de ellas\](https://podcastindex. org/apps) están -dando el salto al tren del Podcasting 2.0, ¡como ya ha hecho Castopod! +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! -Cada una de estas soluciones difiere entre sí, puedes compararlas en esta -[lista de características](#features). +Each of these solutions differ from one another, you may compare with the +[list of features](#features). -Dicho esto, hay dos diferencias principales con otras soluciones de podcasting: +That being said, there are two main differences with other podcasting solutions: - Castopod puede ser auto-hospedado en tu propio servidor y es la única solución que te permite mantener un control completo sobre los contenidos que produces. @@ -161,26 +155,26 @@ Dicho esto, hay dos diferencias principales con otras soluciones de podcasting: ## Cómo colaborar -¿Te encanta Castopod y te gustaría ayudar? Echa un vistazo a la siguiente -documentación para que puedas empezar. +Love Castopod and would like to help? Take a look at the following documentation +to get you started. ### Código de conducta -Castopod ha adoptado un Código de Conducta al que esperamos que los -participantes del proyecto se adhieran. Por favor, lea el -[manual del CÓDIGO DE CONDUCTA](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -para que pueda entender qué acciones serán y no serán toleradas. +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. ### Guía para colaborar -Lee nuestra [guía para colaborar](./contributing/guidelines.md) para aprender -más sobre nuestro proceso de desarrollo, cómo proponer correcciones de errores y -sugerir mejoras, y cómo compilar y probar tus cambios en Castopod. +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. ## Colaboradores ✨ -Los agradecimientos van a estas estupendas personas -([clave emoji](https://allcontributors.org/docs/en/emoji-key)): +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -258,20 +252,21 @@ Los agradecimientos van a estas estupendas personas -Este proyecto sigue la especificación -[all-contributors](https://github.com/all-contributors/all-contributors). ¡Son -bienvenidas colaboraciones de cualquier tipo! +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! ## Contacto -Puedes contactarnos para ayuda o hacer cualquier pregunta que tengas en: +You may reach us for help or ask any question you have on: - [Discord](https://castopod.org/discord) (para interacción directa con desarrolladores y la comunidad) - [Seguimiento de incidencias](https://code.castopod.org/adaures/castopod/-/issues) (para informar de errores y solicitar nuevas funcionalidades) -También puedes seguirnos en redes sociales para obtener noticias sobre Castopod: +Alternatively, you can follow us on social media platforms to get news about +Castopod: - [podlibre.social](https://podlibre.social/@castopod) (instancia de Mastodon) - [[Twitter](https://twitter.com/castopod)](https://twitter.com/castopod) @@ -280,10 +275,9 @@ También puedes seguirnos en redes sociales para obtener noticias sobre Castopod ## Patrocinadores -El desarrollo en curso de Castopod es posible gracias al apoyo de sus -patrocinadores. Si quieres ayudar, por favor considera -[cooperar económicamente](https://opencollective.com/castopod/contribute) con el -desarrollo de Castopod. +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
    Logo de Ad Aures @@ -294,7 +288,7 @@ desarrollo de Castopod. [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-presente, [Ad Aures](https://adaures.com/). +Copyright © 2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/docs/src/fa/getting-started/docker.md b/docs/src/fa/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/fa/getting-started/docker.md +++ b/docs/src/fa/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/fa/getting-started/install.md b/docs/src/fa/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/fa/getting-started/install.md +++ b/docs/src/fa/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/fr/getting-started/docker.md b/docs/src/fr/getting-started/docker.md index e6738874..5f2897f9 100644 --- a/docs/src/fr/getting-started/docker.md +++ b/docs/src/fr/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod envoie 3 images Docker au Hub Docker pendant son processus de construction automatisée : +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/fr/getting-started/install.md b/docs/src/fr/getting-started/install.md index 47507809..4d189246 100644 --- a/docs/src/fr/getting-started/install.md +++ b/docs/src/fr/getting-started/install.md @@ -188,15 +188,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Paquets fournis par la communauté diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md index 41472a4c..4bda8707 100644 --- a/docs/src/fr/index.md +++ b/docs/src/fr/index.md @@ -61,88 +61,85 @@ petite taille. ## Pourquoi Castopod ? -L'écosystème du podcast est décentralisé par nature : vous pouvez créer votre -podcast grâce au fichier RSS, le publier sur Internet et le rendre disponible -partout dans le monde. +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. -C'est en fait l'un des seuls médias à être encore décentralisé aujourd'hui. +It is in fact one of the only media to have stayed this way for a long time. -À mesure que les usages évoluent, de plus en plus de gens se retrouvent autour -du podcast : qu'il s'agisse de créateurs qui y trouvent de nouvelles façons de -partager leurs idées ou d'auditeurs à la recherche de contenus de qualité. +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. -Avec l'avènement du podcast, certaines entreprises se dirigent vers un medium -plus centralisé et plus contrôlé. +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. -Castopod a été créé dans le but de fournir une alternative ouverte et durable -pour l'hébergement de vos podcasts, de promouvoir la décentralisation et ainsi -de s'assurer que la créativité des podcasteurs puisse rester libre. +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. -Ce projet s'appuie sur la communauté open-source, plus spécifiquement sur le -[Fédiverse](https://fediverse.party/en/fediverse/) et sur -[Podcasting 2.0](https://podcastindex.org/). +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. ## Comparaison avec d'autres solutions -Nous pensons qu'une solution n'est pas adaptée à tous, tout dépend vos besoins. -Voici donc un comparatif avec d'autres outils qui vous aidera à juger si -Castopod est fait pour vous. +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod vs Wordpress -Castopod est souvent appelé "Wordpress pour les podcasts" en raison des points -communs entre les deux. D'une certaine manière, c'est vrai. Castopod a -d'ailleurs été inspiré par l'écosystème de Wordpress, en raison de la facilité -grâce à laquelle sa communauté l'a adopté et du nombre de sites Web qui -l'utilisent. +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. -Tout comme Wordpress, Castopod est gratuit & open source, utilise PHP et une -base de données MySQL et est fourni en paquet facilement installable sur la -plupart des serveurs web. +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. -Wordpress est un excellent outil pour créer votre site web et de l'étendre avec -des plugins pour faire ce que vous souhaitez. C'est un CMS à part entière qui -vous permet de mettre en line tout type de site web. +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. -Castopod quant à lui est destiné à répondre aux besoins spécifiques des -podcasteurs, en se concentrant sur les podcasts et rien d'autre. Vous n'avez -besoin d'installer aucun plugin pour démarrer votre aventure baladodiffusée. +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. -Cela permet d'optimiser tout ce qui est spécifique aux podcasts : de la création -de vos podcasts et la publication de nouveaux épisodes jusqu'à la diffusion, le -marketing et la mesure d'audience. +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. -Enfin, en fonction de vos besoins, Wordpress et Castopod peuvent même cohabiter -car ils partagent les mêmes pré-requis techniques ! +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! ### Castopod vs Funkwhale -Funkwhale est un serveur autohébergé, moderne, libre et open-source, dédié à la -musique. Tout comme Castopod, Funkwhale est sur le Fédivers, un réseau social -décentralisé, ce qui offre une interopérabilité entre eux. +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. -Funkwhale a été initialement conçu pour la musique. Et plus tard, à mesure que -le projet a évolué, la capacité d'héberger des podcasts a été introduite. +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. -Contrairement à Funkwhale, Castopod a été pensé et conçu exclusivement pour les -podcasts. Cela permet une implémentation plus naturelle des fonctionnalités -propres à l'écosystème du podcast, comme celles de Podcasting 2.0 -(transcriptions, chapitres, géo-localisation, intervenants …). +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). -Vous devriez ainsi probablement utiliser Funkwhale si vous souhaitez héberger -votre musique et vous tourner vers Castopod si vous souhaitez héberger des -podcasts. +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. ### Castopod vs Autres hébergeurs de podcasts -Il existe de nombreuses solutions pour héberger vos podcasts, dont certaines -excellentes et [de nombreuses](https://podcastindex.org/apps) ont rejoint -Castopod dans le train « Podcasting 2.0 » ! +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! -Chacune de ces solutions a ses particularités, vous pouvez comparer grâce à la -[liste des fonctionnalités](#features). +Each of these solutions differ from one another, you may compare with the +[list of features](#features). -Cela étant, on notera deux différences principales avec les autres solutions : +That being said, there are two main differences with other podcasting solutions: - Castopod peut être auto-hébergé et est la seule solution qui vous permet de garder le contrôle total sur ce que vous produisez. D'autre part, comme il est @@ -154,27 +151,26 @@ Cela étant, on notera deux différences principales avec les autres solutions ## Contribuer -Vous appréciez Castopod et aimeriez donner un coup de main ? Jetez un œil à la -documentation suivante pour démarrer. +Love Castopod and would like to help? Take a look at the following documentation +to get you started. ### Code de conduite -Castopod a mis en place un Code de Conduite destiné aux personnes souhaitant -participer au projet. Veuillez lire le manuel -[CODE_OF_CONDUCT](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -afin de connaitre quelles actions seront et ne seront pas tolérées. +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. ### Guide de contribution -Lisez notre [guide de contribution](./contributing/guidelines.md) pour en savoir -plus sur notre processus de développement et comprendre comment proposer des -corrections de bogues et des améliorations, et comment compiler et tester vos -modifications sur Castopod. +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. ## Contributeurs ✨ -Merci à toutes ces personnes merveilleuses -([touche emoji](https://allcontributors.org/docs/en/emoji-key) ) : +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -252,22 +248,21 @@ Merci à toutes ces personnes merveilleuses -Ce projet suit la spécification -[all-contributors](https://github.com/all-contributors/all-contributors) . -Toutes les contributions sont bienvenues ! +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! ## Contact -Vous pouvez nous joindre pour obtenir de l'aide ou poser toute question que vous -avez sur : +You may reach us for help or ask any question you have on: - [Discord](https://castopod.org/discord) (pour dialoguer en temps réel avec les développeurs et la communauté) - [Suivi de problèmes](https://code.castopod.org/adaures/castopod/-/issues) (pour toute demande de nouvelle fonctionnalité ou rapport de bug) -Autrement, vous pouvez nous suivre sur les réseaux sociaux pour obtenir des -informations à propos de Castopod : +Alternatively, you can follow us on social media platforms to get news about +Castopod: - [podlibre.social](https://podlibre.social/@Castopod) (Instance Mastodon) - [Twitter](https://twitter.com/castopod) @@ -276,9 +271,9 @@ informations à propos de Castopod : ## Sponsors -Le développement de Castopod est rendu possible grâce au soutien de ses -parrains. Si vous souhaitez aider, n'hésitez pas à -[parrainer le développement de Castopod](https://opencollective.com/castopod/contribute). +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
    Logo d'Ad Aures @@ -287,9 +282,9 @@ parrains. Si vous souhaitez aider, n'hésitez pas à ## Licence -[Licence publique générale GNU Affero v3](https://choosealicense.com/licenses/agpl-3.0/) +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-aujourd'hui, [Ad Aures](https://adaures.com/). +Copyright © 2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/docs/src/fr2/getting-started/docker.md b/docs/src/fr2/getting-started/docker.md new file mode 100644 index 00000000..91b2ba8f --- /dev/null +++ b/docs/src/fr2/getting-started/docker.md @@ -0,0 +1,179 @@ +--- +title: Official Docker images +sidebarDepth: 3 +--- + +# Official Docker images + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle + with all of Castopod dependencies +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an + Nginx configuration for Castopod +- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper): + an optional image building videoclips thanks to ffmpeg + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +1. Install [docker](https://docs.docker.com/get-docker/) and + [docker-compose](https://docs.docker.com/compose/install/) +2. Create a `docker-compose.yml` file with the following: + + ```yml + version: "3.7" + + services: + app: + image: castopod/app:latest + container_name: "castopod-app" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "http://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + networks: + - castopod-app + - castopod-db + restart: unless-stopped + + web-server: + image: castopod/web-server:latest + container_name: "castopod-web-server" + volumes: + - castopod-media:/var/www/html/media + networks: + - castopod-app + ports: + - 8080:80 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + volumes: + - castopod-cache:/data + networks: + - castopod-app + + # this container is optional + # add this if you want to use the videoclips feature + video-clipper: + image: castopod/video-clipper:latest + container_name: "castopod-video-clipper" + volumes: + - castopod-media:/opt/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + networks: + - castopod-db + restart: unless-stopped + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for TLS (SSL/HTTPS) + + TLS is mandatory for ActivityPub to work. This job can easily be handled by + a reverse proxy, for example with [Caddy](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8080 + } + ``` + +4. Run `docker-compose up -d`, wait for it to initialize and head on to + `https://castopod.example.com/cp-install` to finish setting up Castopod! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/video-clipper** + + | Variable name | Type (`default`) | Default | + | -------------------------- | ---------------- | ---------------- | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + +- **castopod/app** + + | Variable name | Type (`default`) | Default | + | ---------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | --------------------- | ------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/fr2/getting-started/install.md b/docs/src/fr2/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/fr2/getting-started/install.md +++ b/docs/src/fr2/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/fr2/index.md b/docs/src/fr2/index.md new file mode 100644 index 00000000..08b037f5 --- /dev/null +++ b/docs/src/fr2/index.md @@ -0,0 +1,296 @@ +--- +sidebarDepth: 2 +--- + +# Welcome 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + +
    + Install +
    + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivation + +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. + +It is in fact one of the only media to have stayed this way for a long time. + +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. + +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. + +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. + +## Comparison with other solutions + +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. + +### Castopod vs Wordpress + +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. + +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. + +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. + +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. + +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwhale + +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. + +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod can be self-hosted and is the only solution that allows you to keep + full control over what you produce. Also, as it is open-source, you can even + customize it as you wish. + +- Castopod is the only solution that currently integrates both a decentralized + social network with ActivityPub as well as many of the podcasting 2.0 + features, hoping to bridge the gap between the two. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. + +### Contributing guide + +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔
    Bastien Luneteau
    Bastien Luneteau

    💻 🐛
    Cécile Ricordeau
    Cécile Ricordeau

    🎨
    Patryk Miś
    Patryk Miś

    🌍
    Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔
    Sebastian Janik
    Sebastian Janik

    💻
    Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻
    denis d
    denis d

    🐛 🤔
    Douglas Kastle
    Douglas Kastle

    🐛 🤔
    cExplorer
    cExplorer

    🐛 🌍
    ImaCrea
    ImaCrea

    🐛 🤔
    Jonas S
    Jonas S

    💻
    LEFEBVRE Yann
    LEFEBVRE Yann

    🐛
    Sebastian Späth
    Sebastian Späth

    🐛 🤔
    rocky III
    rocky III

    🐛
    Hermann Josef Eckl
    Hermann Josef Eckl

    🐛
    Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔
    João Leandro
    João Leandro

    🌍 🤔
    Angelos Chouvardas
    Angelos Chouvardas

    🌍
    Eivind
    Eivind

    🌍
    Ewen
    Ewen

    🌍 🤔
    forght
    forght

    🌍
    glottis0q
    glottis0q

    🌍
    ButterflyOfFire
    ButterflyOfFire

    🌍
    Lucian I. Last
    Lucian I. Last

    🌍
    LuuzViir
    LuuzViir

    🌍
    CTHTC
    CTHTC

    🌍
    Russian Retro
    Russian Retro

    🌍
    Marek L'ach
    Marek L'ach

    🌍
    GunChleoc
    GunChleoc

    🌍
    GabiSnow
    GabiSnow

    🌍
    bendaha
    bendaha

    🌍
    Samuel Roland
    Samuel Roland

    🌍
    Dimitri Regnier
    Dimitri Regnier

    🤔
    irithys
    irithys

    🌍
    Sergi
    Sergi

    🌍
    ghose (XoseM)
    ghose (XoseM)

    🌍
    Andreas Olsson
    Andreas Olsson

    🌍
    leonfrom
    leonfrom

    🌍
    agentcobra
    agentcobra

    🌍
    Alessandro
    Alessandro

    🌍
    liimee
    liimee

    🌍
    Ahmed Sabouni
    Ahmed Sabouni

    🌍
    + + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
    + Ad Aures Logo + NLnet Logo +
    + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/fr_CA/getting-started/docker.md b/docs/src/fr_CA/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/fr_CA/getting-started/docker.md +++ b/docs/src/fr_CA/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/fr_CA/getting-started/install.md b/docs/src/fr_CA/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/fr_CA/getting-started/install.md +++ b/docs/src/fr_CA/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/fr_CA/index.md b/docs/src/fr_CA/index.md index f01279e8..e17afd73 100644 --- a/docs/src/fr_CA/index.md +++ b/docs/src/fr_CA/index.md @@ -13,13 +13,6 @@ Castopod is easy to install and was built on top of [CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very small footprint. -::: info Status - -Castopod is currently in **beta** but already quite stable and used by -podcasters around the world! - -::: - diff --git a/docs/src/gd/getting-started/docker.md b/docs/src/gd/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/gd/getting-started/docker.md +++ b/docs/src/gd/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/gd/getting-started/install.md b/docs/src/gd/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/gd/getting-started/install.md +++ b/docs/src/gd/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md index a1e433ba..e17afd73 100644 --- a/docs/src/gd/index.md +++ b/docs/src/gd/index.md @@ -286,11 +286,6 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/github/stars/ad-aures/castopod?style=social -https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release -https://img.shields.io/github/license/ad-aures/castopod?color=blue -https://img.shields.io/badge/contributions-welcome-brightgreen.svg -https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg -https://img.shields.io/github/stars/ad-aures/castopod?style=social [release]: https://code.castopod.org/adaures/castopod/-/releases [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md diff --git a/docs/src/gl/getting-started/docker.md b/docs/src/gl/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/gl/getting-started/docker.md +++ b/docs/src/gl/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/gl/getting-started/install.md b/docs/src/gl/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/gl/getting-started/install.md +++ b/docs/src/gl/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/id/getting-started/docker.md b/docs/src/id/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/id/getting-started/docker.md +++ b/docs/src/id/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/id/getting-started/install.md b/docs/src/id/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/id/getting-started/install.md +++ b/docs/src/id/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/id/index.md b/docs/src/id/index.md index 9375ab15..c9fd78e5 100644 --- a/docs/src/id/index.md +++ b/docs/src/id/index.md @@ -80,16 +80,16 @@ This project is pushed by the open-source community, and specifically by the ## Perbandingan dengan solusi lain -Kami percaya bahwa tidak semua solusi sesuai untuk semua orang, ini sangat -bergantung pada kebutuhan Anda. Jadi, inilah perbandingan dengan alat-alat lain -untuk membantu Anda untuk mengetahui apa Castopod sesuai untuk Anda. +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod vs Wordpress -Castopod sering disebut sebagai "Wordpress-nya siniar" karena kemiripan antara -Castopod dan Wordpress. In some ways this is true. And actually, Castopod was -greatly inspired by the Wordpress ecosystem, seeing the ease of adoption from -the community and the number of websites running it. +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. Just like Wordpress, Castopod is free & open source, built using PHP with a MySQL database and is packaged in a way that you can easily install on most web @@ -112,9 +112,9 @@ side as they share the same requirements! ### Castopod vs Funkwhale -Funkwhale adalah server musik modern yang dihosting sendiri, gratis dan sumber -terbuka. Just as Castopod, Funkwhale is on the fediverse, a decentralized social -network allowing interoperability between the two. +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. Funkwhale was initially built around music. And later on, as the project evolved, the ability to host podcasts was introduced. @@ -148,7 +148,8 @@ That being said, there are two main differences with other podcasting solutions: ## Berkontribusi -Suka Castopod dan ingin membantu? Lihat dokumentasi berikut untuk mulai. +Love Castopod and would like to help? Take a look at the following documentation +to get you started. ### Code of conduct @@ -250,8 +251,7 @@ specification. Contributions of any kind welcome! ## Kontak -Anda dapat menghubungi kami untuk mendapatkan bantuan atau untuk menanyakan -pertanyaan di: +You may reach us for help or ask any question you have on: - [Discord](https://castopod.org/discord) (for direct interaction with developers and the community) @@ -281,7 +281,7 @@ backers. If you'd like to help, please consider [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Hak Cipta © 2020-sekarang, [Ad Aures](https://adaures.com/). +Copyright © 2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/docs/src/it/getting-started/docker.md b/docs/src/it/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/it/getting-started/docker.md +++ b/docs/src/it/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/it/getting-started/install.md b/docs/src/it/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/it/getting-started/install.md +++ b/docs/src/it/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/ko/getting-started/docker.md b/docs/src/ko/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/ko/getting-started/docker.md +++ b/docs/src/ko/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/ko/getting-started/install.md b/docs/src/ko/getting-started/install.md index 4cad016e..d204abf9 100644 --- a/docs/src/ko/getting-started/install.md +++ b/docs/src/ko/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/nl/getting-started/docker.md b/docs/src/nl/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/nl/getting-started/docker.md +++ b/docs/src/nl/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/nl/getting-started/install.md +++ b/docs/src/nl/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/nn-NO/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/nn-NO/getting-started/docker.md +++ b/docs/src/nn-NO/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md index 4425c486..50438637 100644 --- a/docs/src/nn-NO/getting-started/install.md +++ b/docs/src/nn-NO/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Pakker frå brukarsamfunnet diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md index a87d29b6..68deed07 100644 --- a/docs/src/nn-NO/index.md +++ b/docs/src/nn-NO/index.md @@ -60,84 +60,85 @@ systemkrav. ## Kvifor Castopod? -Podkasting er i utgangspunktet desentralt: Du kan laga din eigen podkast som ei -RSS-fil, leggja han ut på nettet og dela han kvar som helst. +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. -Faktisk var podkasting lenge eit av få medium som fungerte på denne måten. +It is in fact one of the only media to have stayed this way for a long time. -Etter som bruken endra seg, vart podkastar vanlegare - anten det var folk som -brukte podkasting til å uttrykkja seg og dela tankane sine, eller lyttarar som -såg etter betre innhald. +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. -Når podkasting blir vanlegare, prøver fleire firma å driva podkasting i retning -meir sentralisering og kontroll. +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. -Castopod vart til for å tilby eit ope og framtidsretta alternativ for å -publisera podkastar, med vekt på desentralisering for å tryggja at podkastar kan -uttrykkja kreativiteten sin. +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. -Miljøa for open kjeldekode står bak dette prosjektetet, og særleg rørslene bak -[fødiverset](https://fediverse.party/en/fediverse/) og -[Podcasting 2.0](https://podcastindex.org/). +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. ## Samanlikning med andre løysingar -Me trur ikkje at ei spesiell løysing er best for alle, det kjem an på kva du -treng. Difor kjem me med ei samanlikning med andre verkty, slik at du kan finna -ut om Castopod er rett for deg. +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod og Wordpress -Castopod blir ofte omtala som "Wordpress for podkastar", fordi løysingane er -ganske like. Det stemmer i grunnen. Castopod har fått mykje inspirasjon frå -Wordpress-økosystemet, fordi me såg kor lett det var å ta i bruk og kor mange -nettstader som køyrer det. +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. -Nett som Wordpress er Castopod fri og open, bygd med PHP på ein MySQL-database -og pakka slik at du lett kan installera han på dei fleste vevtenarar. +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. -Wordpress er ein fin måte å laga ei nettside på, og utvida ho med tillegg som -inneheld dei funksjonane du treng. Det er eit fullstendig innhaldssystem som kan -laga ei kva som helst nettside. +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. -På andre sida er Castopod laga spesifikt for podkastarar, og legg vekt på -podkasting og ingenting anna. Du treng ingen ekstra programtillegg for å starta -med podkasting. +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. -På denne måten kan me tilpassa programmet spesielt til podkasting, anten det -gjeld å laga nye podkastar og episodar eller å kringkasta, marknadsføra og -analysera dei. +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. -Til slutt: Wordpress og Castopod kan fint bu saman på same nettverten, etter som -dei har same systemkrava! +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! ### Castopod og Funkwhale -Funkwhale er ein open og moderne musikktenar du kan køyra sjølv. Nett som -Castopod er Funkwhale på fødiverset, som er eit desentralt sosialt nettverk. -Dermed kan dei prata saman. +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. -Funkwhale vart i utgangspunktet laga for musikk. Seinare, etter som prosjektet -utvikla seg, vart det mogleg å leggja ut podkastar der. +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. -Ulikt Funkwhale er Castopod utforma og bygd berre for podkastar. Det gjer det -lettare å leggja til funksjonar knytt til økosystemet rundt podkastar, slik som -podkasting 2.0-funksjonane (transkribering, kapittel, stader, personar…). +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). -For å oppsummera bør du truleg bruka Funkwhale om du vil leggja ut musikk, og -Castopod om du vil leggja ut podkastar. +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. ### Castopod og andre podkastvertar -Det finst mange løysingar for å leggja ut podkastar. Nokre av dei er verkeleg -flotte, og [mange av dei](https://podcastindex.org/apps) tek i bruk podkasting -2.0-funksjonar, nett som Castopod! +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! -Kvar av desse løysingane er ulike, og du kan samanlikna dei ved hjelp av -[lista over funksjonar](#features). +Each of these solutions differ from one another, you may compare with the +[list of features](#features). -Når det er sagt, er det to hovudpunkt som skil Castopod frå andre -podkastløysingar: +That being said, there are two main differences with other podcasting solutions: - Du kan køyra Castopod på di eiga tenarmaskin, og det er den einaste løysinga som gjev deg full kontroll over det du lagar. Og fordi Castopod er open @@ -149,20 +150,21 @@ podkastløysingar: ## Bidra til Castopod -Likar du Castopod og vil bidra? Sjå på dokumentasjonen nedanfor for å koma -i gang. +Love Castopod and would like to help? Take a look at the following documentation +to get you started. ### Ordensreglar -Castopod har laga ordensreglar som me ventar at bidragsytarar fylgjer. Les -[CODE_OF_CONDUCT-dokumentet](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -for å sjå kva åtferd me godtek og ikkje. +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. ### Korleis bidra -Les [korleis du bidreg](./contributing/guidelines.md) for å lære korleis me -utviklar, korleis du melder inn feil og framlegg til forbetringar, og korleis du -byggjer og prøver ut endringar i Castopod. +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. ## Contributors ✨ @@ -287,11 +289,6 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/github/stars/ad-aures/castopod?style=social -https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release -https://img.shields.io/github/license/ad-aures/castopod?color=blue -https://img.shields.io/badge/contributions-welcome-brightgreen.svg -https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg -https://img.shields.io/github/stars/ad-aures/castopod?style=social [release]: https://code.castopod.org/adaures/castopod/-/releases [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md diff --git a/docs/src/oc/getting-started/docker.md b/docs/src/oc/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/oc/getting-started/docker.md +++ b/docs/src/oc/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/oc/getting-started/install.md +++ b/docs/src/oc/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/oc/index.md b/docs/src/oc/index.md index 4d37b867..08b037f5 100644 --- a/docs/src/oc/index.md +++ b/docs/src/oc/index.md @@ -286,11 +286,6 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/github/stars/ad-aures/castopod?style=social -https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release -https://img.shields.io/github/license/ad-aures/castopod?color=blue -https://img.shields.io/badge/contributions-welcome-brightgreen.svg -https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg -https://img.shields.io/github/stars/ad-aures/castopod?style=social [release]: https://code.castopod.org/adaures/castopod/-/releases [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md diff --git a/docs/src/pl/getting-started/docker.md b/docs/src/pl/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/pl/getting-started/docker.md +++ b/docs/src/pl/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/pl/getting-started/install.md +++ b/docs/src/pl/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/pt-BR/getting-started/docker.md b/docs/src/pt-BR/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/pt-BR/getting-started/docker.md +++ b/docs/src/pt-BR/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md index 9f96b150..0593645b 100644 --- a/docs/src/pt-BR/getting-started/install.md +++ b/docs/src/pt-BR/getting-started/install.md @@ -186,15 +186,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Pacotes comunitários diff --git a/docs/src/pt-BR/index.md b/docs/src/pt-BR/index.md index 47cb1fcb..eef73352 100644 --- a/docs/src/pt-BR/index.md +++ b/docs/src/pt-BR/index.md @@ -58,87 +58,85 @@ pegada muito pequena. ## Motivação -O ecossistema de podcasting é descentralizado por natureza: você pode criar seu -podcast como um arquivo RSS, publicar na web e compartilhar em qualquer lugar -online. +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. -Na verdade, é um dos únicos meios de comunicação que permaneceram assim por -muito tempo. +It is in fact one of the only media to have stayed this way for a long time. -À medida que os usos estão evoluindo, mais e mais pessoas estão entrando em -podcasts: sejam criadores encontrando novas maneiras de compartilhar suas ideias -ou então ouvintes em busca de melhor conteúdo. +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. -Com a mídia podcast se tornando mais amplamente utilizada, algumas empresas -estão tentando mudá-la para um meio mais controlado e centralizado. +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. -O Castopod foi criado em um esforço para fornecer uma alternativa aberta e -sustentável para hospedar seus podcasts, promovendo a descentralização para -garantir que a criatividade dos podcasters possa se expressar. +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. -Este projeto é impulsionado pela comunidade de código aberto e, especificamente, -pelo [Fediverso](https://fediverse.party/en/fediverse/) e movimentos -[Podcasting 2.0](https://podcastindex.org/). +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. ## Comparação com outras soluções -Acreditamos que uma solução não é necessariamente certa para todos, depende -muito de suas necessidades. Então, aqui estão comparações com outras ferramentas -para ajudá-lo a avaliar se o Castopod é o ideal para você. +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod vs Wordpress -Castopod é frequentemente referido como "o Wordpress para podcasts" por causa -das semelhanças entre os dois. De certa forma, isso é verdade. E, na verdade, o -Castopod foi muito inspirado no ecossistema do Wordpress, vendo a facilidade de -adoção da comunidade e o número de sites rodando ele. +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. -Assim como o Wordpress, o Castopod é livre e de código aberto, compilado -utilizando PHP com um banco de dados MySQL e é empacotado de uma forma que você -pode facilmente instalar na maioria dos servidores. +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. -Wordpress é uma ótima maneira de criar seu site e expandi-lo com plugins para -obter o que você quer. É um CMS completo que ajuda você a ter qualquer tipo de -site online. +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. -Por outro lado, o Castopod destina-se a atender especificamente às necessidades -dos podcasters, concentrando-se em podcasting e nada mais. Você não precisa de -nenhum plug-in para começar sua jornada podcastal. +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. -Isso permite otimizar os processos específicos do podcasting: desde a criação de -seus podcasts e a publicação de novos episódios até a transmissão, marketing e -estatísticas. +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. -Finalmente, dependendo de suas necessidades, Wordpress e Castopod podem até -conviver lado a lado, pois compartilham os mesmos requisitos! +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! ### Castopod vs Funkwhale -Funkwhale é um servidor de música auto-hospedado, moderno, livre e de código -aberto. Assim como o Castopod, o Funkwhale está no fediverso, uma rede social -descentralizada que permite a interoperabilidade entre os dois. +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. -Funkwhale foi inicialmente construído em torno da música. E mais tarde, à medida -que o projeto evoluiu, a capacidade de hospedar podcasts foi introduzida. +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. -Ao contrário do Funkwhale, o Castopod foi projetado e construído exclusivamente -para podcasting. Isso permite uma implementação mais fácil para recursos -relacionados ao ecossistema de podcasting, como os recursos de podcasting 2.0 -(transcrições, capítulos, locais, pessoas, …). +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). -Portanto, você provavelmente deve usar o Funkwhale se quiser hospedar sua música -e usar o Castopod se quiser hospedar seus podcasts. +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. ### Castopod vs outras hospedagens de podcast -Existem muitas soluções para você hospedar seus podcasts, alguns dos quais são -realmente ótimas e [muitas delas](https://podcastindex.org/apps) estão entrando -na onda do Podcasting 2.0 assim como o Castopod! +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! -Cada uma dessas soluções difere uma da outra, você pode comparar com a -[lista de recursos](#features). +Each of these solutions differ from one another, you may compare with the +[list of features](#features). -Dito isto, existem duas diferenças principais com outras soluções de podcasting: +That being said, there are two main differences with other podcasting solutions: - Castopod pode ser auto-hospedado e é a única solução que permite manter o controle total sobre o que você produz. Além disso, como é de código aberto, @@ -150,25 +148,25 @@ Dito isto, existem duas diferenças principais com outras soluções de podcasti ## Contribuir -Gostou do Castopod e gostaria de ajudar? Dê uma olhada na seguinte documentação -para você começar. +Love Castopod and would like to help? Take a look at the following documentation +to get you started. ### Código de conduta -Castopod adotou um Código de Conduta que esperamos que os participantes do -projeto sigam. Por favor, leia o -[manual CODE_OF_CONDUCT](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -para que você possa entender quais ações serão e não serão toleradas. +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. ### Guia de contribuição -Leia nosso [guia de contribuição](./contributing/guidelines.md) para saber mais -sobre nosso processo de desenvolvimento, como propor correções de bugs e -melhorias e como compilar e testar suas alterações no Castopod. +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. ## Contribuidores ✨ -Agradecimento vai para essas pessoas maravilhosas +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -247,21 +245,21 @@ Agradecimento vai para essas pessoas maravilhosas -Este projeto segue a especificação -[all-contributors](https://github.com/all-contributors/all-contributors). -Contribuições de qualquer tipo bem-vindas! +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! ## Contato -Você pode nos contatar para obter ajuda ou fazer qualquer pergunta que tenha em: +You may reach us for help or ask any question you have on: - [Discord](https://castopod.org/discord) (para interação direta com desenvolvedores e a comunidade) - [Rastreador de problemas](https://code.castopod.org/adaures/castopod/-/issues) (para solicitações de recursos e relatos de bugs) -Como alternativa, você pode nos seguir nas redes sociais para obter notícias -sobre o Castopod: +Alternatively, you can follow us on social media platforms to get news about +Castopod: - [podlibre.social](https://podlibre.social/@Castopod) (instância do Mastodon) - [Twitter](https://twitter.com/castopod) @@ -270,9 +268,9 @@ sobre o Castopod: ## Apoiadores -O desenvolvimento contínuo do Castopod é possível com o apoio de seus -apoiadores. Se você quiser ajudar, por favor considere -[apoiar o desenvolvimento do Castopod](https://opencollective.com/castopod/contribute). +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
    Logo de Ad Aures @@ -281,9 +279,9 @@ apoiadores. Se você quiser ajudar, por favor considere ## Licença -[Licença Pública Geral GNU Affero v3.0](https://choosealicense.com/licenses/agpl-3.0/) +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-presente, [Ad Aures](https://adaures.com/). +Copyright © 2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/docs/src/pt/getting-started/docker.md b/docs/src/pt/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/pt/getting-started/docker.md +++ b/docs/src/pt/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md index d85df8c0..dc19943d 100644 --- a/docs/src/pt/getting-started/install.md +++ b/docs/src/pt/getting-started/install.md @@ -183,15 +183,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/ro/getting-started/docker.md b/docs/src/ro/getting-started/docker.md index 68557942..bd2dcd05 100644 --- a/docs/src/ro/getting-started/docker.md +++ b/docs/src/ro/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod dă push la 3 imagini Docker pe Docker Hub pe parcursul procesului de compilare automată +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): pachetul aplicației cu toate dependințele Castopod - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): o diff --git a/docs/src/ro/getting-started/install.md b/docs/src/ro/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/ro/getting-started/install.md +++ b/docs/src/ro/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/ru/getting-started/docker.md b/docs/src/ru/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/ru/getting-started/docker.md +++ b/docs/src/ru/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md index d85df8c0..dc19943d 100644 --- a/docs/src/ru/getting-started/install.md +++ b/docs/src/ru/getting-started/install.md @@ -183,15 +183,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/sk/getting-started/docker.md b/docs/src/sk/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/sk/getting-started/docker.md +++ b/docs/src/sk/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/sk/getting-started/install.md +++ b/docs/src/sk/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/sr_Latn/getting-started/docker.md b/docs/src/sr_Latn/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/sr_Latn/getting-started/docker.md +++ b/docs/src/sr_Latn/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/sr_Latn/getting-started/install.md b/docs/src/sr_Latn/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/sr_Latn/getting-started/install.md +++ b/docs/src/sr_Latn/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/sv/getting-started/docker.md b/docs/src/sv/getting-started/docker.md index 4b2f94cf..819562bd 100644 --- a/docs/src/sv/getting-started/docker.md +++ b/docs/src/sv/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): apppaketet med alla Castopod-beroenden - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): en diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md index d326defd..4e19c761 100644 --- a/docs/src/sv/getting-started/install.md +++ b/docs/src/sv/getting-started/install.md @@ -182,15 +182,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Gemenskapspaket diff --git a/docs/src/sv/index.md b/docs/src/sv/index.md index 21624079..9e2555f8 100644 --- a/docs/src/sv/index.md +++ b/docs/src/sv/index.md @@ -58,87 +58,85 @@ mycket litet fotavtryck. ## Motivation -Den podcasting ekosystem är decentraliserad av naturen: du kan skapa din podcast -som en RSS-fil, publicera den på webben och få den delad överallt på nätet. +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. -Det är i själva verket en av de enda medierna som har stannat kvar på detta sätt -under en lång tid. +It is in fact one of the only media to have stayed this way for a long time. -I takt med att användningsområden utvecklas kommer fler och fler människor in i -podcasts: om det är skapare att hitta nya sätt att dela sina idéer, eller -lyssnare i sökningen för bättre innehåll. +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. -När podcasting blir mer allmänt använd försöker vissa företag flytta den till -ett mer kontrollerat och centraliserat medium. +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. -Castopod skapades i ett försök att ge ett öppet och hållbart alternativ för att -vara värd för dina podcasts, främja decentralisering för att säkerställa att -podcastare kreativitet kan uttrycka sig. +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. -Detta projekt drivs av open source-communityn och specifikt av -[Fediverse](https://fediverse.party/en/fediverse/) och -[Podcasting 2.0](https://podcastindex.org/) rörelser. +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. ## Jämförelse med andra lösningar -Vi tror att en lösning inte nödvändigtvis är rätt för alla, det mycket beror på -dina behov. Så, här är jämförelser med andra verktyg för att hjälpa dig att mäta -om Castopod är rätt passform för du. +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod vs Wordpress -Castopod kallas ofta för "Wordpress för podcasts" på grund av de likheter mellan -de två. På vissa sätt är detta sant. Och faktiskt, Castopod var mycket -inspirerad av Wordpress ekosystem, se lätthet att adoptera från gemenskapen och -antalet webbplatser som kör den. +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. -Precis som Wordpress är Castopod gratis & öppen källkod, byggd med PHP med en -MySQL-databas och är paketerad på ett sätt som du enkelt kan installera på de -flesta webb -servrar. +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. -Wordpress är ett bra sätt att skapa din webbplats och utöka den med plugins för -att få vad du vill. Det är en fullfjädrad CMS som hjälper dig att få någon typ -av webbplats online. +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. -Å andra sidan, Castopod är tänkt att ta itu med podcasters behöver specifikt, -med fokus på podcasting, och inget annat. Du behöver inte någon plugin för att -komma igång med din podcasting resa. +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. -Detta gör det möjligt att optimera de processer som är specifika för podcasting: -allt från skapandet av dina podcasts och publiceringen av nya avsnitt hela vägen -till sändning, marknadsföring och analys. +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. -Slutligen, beroende på dina behov, Wordpress och Castopod kan även leva sida vid -sida eftersom de delar samma krav! +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! ### Castopod vs Funkwhale -Funkwhale är en självvärd, modern gratis och öppen källkod musikserver. Precis -som Castopod, Funkwhale är på fediverse, ett decentraliserat socialt nätverk som -möjliggör interoperabilitet mellan de två. +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. -Funkwhale byggdes ursprungligen runt musik. Och senare när projektet utvecklades -introducerades förmågan att vara värd för podcasts. +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. -Till skillnad från Funkwhale har Castopod designats och byggts kring podcasting -exklusivt. Detta möjliggör enklare implementering av funktioner relaterade till -podcasting ekosystem, såsom podcasting 2.0 funktioner (transkript, kapitel, -platser, personer, …). +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). -Så, du bör förmodligen använda Funkwhale om du vill vara värd för din musik, och -använda Castopod om du vill vara värd för dina podcasts. +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. ### Castopod vs andra podcast värdar -Det finns många lösningar för dig att vara värd för dina podcasts, några av dem -är verkligen bra och [en hel del av dem](https://podcastindex.org/apps) hoppar -in i Podcasting 2. vagn precis som Castopod! +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! -Var och en av dessa lösningar skiljer sig från varandra, kan du jämföra med -[listan över funktioner](#features). +Each of these solutions differ from one another, you may compare with the +[list of features](#features). -Med detta sagt, det finns två huvudsakliga skillnader med andra podcasting -lösningar: +That being said, there are two main differences with other podcasting solutions: - Castopod kan vara själv värd och är den enda lösningen som gör att du kan hålla full kontroll över vad du producerar. Dessutom, eftersom det är öppen @@ -150,27 +148,26 @@ lösningar: ## Hjälp till -Älskar du Castopod och vill hjälpa till? Ta en titt på följande dokumentation -för att få dig igång. +Love Castopod and would like to help? Take a look at the following documentation +to get you started. ### Uppförandekod -Castopod har antagit en uppförandekod som vi förväntar oss projektdeltagare att -hålla sig till. Läs -[CODE_OF_CONDUCT manualen](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -så att du kan förstå vilka åtgärder som kommer och inte kommer -att tolereras. +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. ### Bidragande guide -Läs vår [bidragande guide](./contributing/guidelines.md) för att lära dig om vår -utvecklingsprocess, hur du föreslår buggfixar och förbättringar, och hur du -bygger och testar dina ändringar till Castopod. +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. ## Alla bidragsgivare ✨ -Tack går till dessa underbara människor -([emoji nyckel](https://allcontributors.org/docs/en/emoji-key)): +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -248,20 +245,21 @@ Tack går till dessa underbara människor -Detta projekt följer specifikationen -[för alla bidragsgivare](https://github.com/all-contributors/all-contributors) . -Bidrag av något slag välkomna! +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! ## Kontakt -Du kan nå oss för hjälp eller ställa någon fråga du har på: +You may reach us for help or ask any question you have on: - [Discord](https://castopod.org/discord) (för direkt interaktion med -utvecklare och gemenskapen) - [Ärendespårare](https://code.castopod.org/adaures/castopod/-/issues) (för funktionsförfrågningar & felrapporter) -Alternativt kan du följa oss på sociala medier för att få nyheter om Castopod: +Alternatively, you can follow us on social media platforms to get news about +Castopod: - [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) - [Twitter](https://twitter.com/castopod) @@ -270,9 +268,9 @@ Alternativt kan du följa oss på sociala medier för att få nyheter om Castopo ## Sponsorer -Den pågående utvecklingen av Castopod möjliggörs med stöd av sina backers. Om du -vill hjälpa till, överväg -[sponsra Castopods utveckling](https://opencollective.com/castopod/contribute). +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
    Ad Aures Logo @@ -281,14 +279,14 @@ vill hjälpa till, överväg ## Licens -[GNU Lesser General Public License](https://choosealicense.com/licenses/agpl-3.0/) +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) Copyright © 2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release -https://img.shields.io/github/license/ad-aures/castopod?color=blå -https://img.shields. o/badge/contributions-welcome-brightgreen.svg -https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantik--release-e10079. -vg https://img.shields.io/github/stars/ad-aures/castopod?style=sociala +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social [release]: https://code.castopod.org/adaures/castopod/-/releases [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md diff --git a/docs/src/uk/getting-started/docker.md b/docs/src/uk/getting-started/docker.md index c6e6cb7e..91b2ba8f 100644 --- a/docs/src/uk/getting-started/docker.md +++ b/docs/src/uk/getting-started/docker.md @@ -8,6 +8,8 @@ sidebarDepth: 3 Castopod pushes 3 Docker images to the Docker Hub during its automated build process: +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle with all of Castopod dependencies - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an diff --git a/docs/src/uk/getting-started/install.md b/docs/src/uk/getting-started/install.md index 41b5153c..92537f82 100644 --- a/docs/src/uk/getting-started/install.md +++ b/docs/src/uk/getting-started/install.md @@ -181,15 +181,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## Community packages diff --git a/docs/src/uk/index.md b/docs/src/uk/index.md index f01279e8..e17afd73 100644 --- a/docs/src/uk/index.md +++ b/docs/src/uk/index.md @@ -13,13 +13,6 @@ Castopod is easy to install and was built on top of [CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very small footprint. -::: info Status - -Castopod is currently in **beta** but already quite stable and used by -podcasters around the world! - -::: - diff --git a/docs/src/zh-Hans/getting-started/docker.md b/docs/src/zh-Hans/getting-started/docker.md index 9e5d20ad..4de7be14 100644 --- a/docs/src/zh-Hans/getting-started/docker.md +++ b/docs/src/zh-Hans/getting-started/docker.md @@ -7,6 +7,8 @@ sidebarDepth: 3 Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub : +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit - [**`castopod/app`**](https://hub.docker.com/r/castopod/app):应用程序包,包含 所有 Castopod 依赖关系 - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server):Castopod diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md index 8e445b75..079a117e 100644 --- a/docs/src/zh-Hans/getting-started/install.md +++ b/docs/src/zh-Hans/getting-started/install.md @@ -173,15 +173,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ------------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`path_style_endpoint`** | boolean | `false` | +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | ## 社区套餐 diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md index f5889359..3df13512 100644 --- a/docs/src/zh-Hans/index.md +++ b/docs/src/zh-Hans/index.md @@ -54,70 +54,85 @@ Castopod 易于安装,并使用 [CodeIgniter4](https://codeigniter.com/) 构 ## 创作动机 -播客生态系统本质上是去中心化的:你可以创建自己的播客订阅源,将其发布到网络上并在 -线共享。 +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. -事实上,它是唯一长期保持这种状态的媒体之一。 +It is in fact one of the only media to have stayed this way for a long time. -随着习惯的发展,越来越多的人开始接触播客:允许创作者寻找新的方式来分享他们的想法 -,或是让听众获得更好的内容。 +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. -随着播客的使用越来越广泛,一些公司正试图控制播客与集中化。 +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. -Castopod 的创建旨在提供一种开放且可持续的替代方案来托管你的播客,促进权力下放, -确保播客可以用创造力表达自己。 +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. -此项目由开源社区推动的,特别是 -由[联邦宇宙](https://fediverse.party/en/fediverse/) 和 -[播客 2.0](https://podcastindex.org/) 推动。 +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. ## 与其他解决方案的对比 -我们相信此解决方案不一定适合所有人,它只取决于你是否需要。 因此,下面是与其他解 -决方案的比较,可帮助判断 Castopod 是否适合你。 +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. ### Castopod 对比 Wordpress -Castopod 经常被称为 “播客中的 Wordpress”,因为两者有很多相似之处。 在某些方面, -确实如此。 实际上,Castopod 受到 WordPress 生态的极大启发,看到了采用社区的易用 -性 以及运行它的网站数量。 +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. -就像 Wordpress 一样,Castopod 是免费且开源的,PHP 构建并使用 MySQL 数据库,可以 -在大多数 Web 服务器上轻松安装。 +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. -Wordpress 是创建你的网站,并使用插件扩展以获得想要内容的好办法。 这是一个成熟的 -CMS,可以帮助你在线访问任何类型的网站。 +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. -另一方面,Castopod 旨在专门满足播客的需求,专注于播客,而不是其他。 你不需要任何 -插件即可轻松开始播客之旅。 +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. -还拥有对播客的独特优化:从播客的创建和新剧集的发布一直到广播,营销和分析。 +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. -最后,根据你的需要,Wordpress 和 Castopod 甚至可以共存,因为他们有相同的配置环境 -! +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! ### Castopod 对比 Funkwhale -Funkwhale 是一个自托管、现代界面、免费开源的音乐服务器。 就像 Castopod 一样 -,Funkwhale 也位于联邦宇宙中,这是一个去中心化的社交网络,允许两者的互联。 +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. -Funkwhale 最初是围绕音乐制作的。 后来,随着项目的发展,引入了托管播客的能力。 +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. -与 Funkwhale 不同,Castopod 是只围绕播客设计和构建的。 这样可以更简单地实现与播 -客相关的生态系统,例如播客 2.0 功能(报表、 章节、地点、人员…)。 +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). -因此,如果你想托管你的音乐库,你可能应该使用 Funkwhale,如果您想主持一个播客,请 -使用 Castopod。 +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. ### Castopod 与其他播客 -有许多非常棒的解决方案可供你托管播客,并 -且[很多](https://podcastindex.org/apps)正在搭上播客 2.0 的便车,就像 Castopod 一 -样! +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! -这些解决方案各不相同,你可以对比 [功能列表](#features)。 +Each of these solutions differ from one another, you may compare with the +[list of features](#features). -话虽如此,Castopod 与其他播客解决方案有两个主要区别: +That being said, there are two main differences with other podcasting solutions: - Castopod 是自托管的,唯一允许你控制所有数据的方案。 并且,由于是开源的,甚至可 以按自己的想法修改。 @@ -127,14 +142,15 @@ Funkwhale 最初是围绕音乐制作的。 后来,随着项目的发展,引 ## 贡献 -喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你 -入门。 +Love Castopod and would like to help? Take a look at the following documentation +to get you started. ### 行为准则 -Castopod 已经通过了一项行为准则,并希望所有的参与者都能够遵循本行为准则。 请阅 -读[行为准则](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -以便了解哪些行为被允许,哪些行为不会被容忍。 +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. ### 贡献指南 @@ -143,8 +159,8 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能 ## 贡献者 ✨ -感谢这些了不起的人 -([表情符号键](https://allcontributors.org/docs/en/emoji-key)): +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -222,18 +238,20 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能 -此项目遵循 [所有贡献者](https://github.com/all-contributors/all-contributors) 规 -范。 欢迎任何形式的贡献! +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! ## 联系 -你可以联系我们寻求帮助或提出任何问题: +You may reach us for help or ask any question you have on: - [Discord](https://castopod.org/discord) (用于与开发人员和社区直接互动) - [问题跟踪器](https://code.castopod.org/adaures/castopod/-/issues)(用于功能请 求和错误报告) -或者,你可以在社交媒体上关注我们,以获取有关 Castopod 的新闻: +Alternatively, you can follow us on social media platforms to get news about +Castopod: - [podlibre.social](https://podlibre.social/@Castopod) (Mastodon 实例) - [推特](https://twitter.com/castopod) @@ -242,8 +260,9 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能 ## 赞助商 -Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们,请考 -虑[赞助 Castopod 的开发](https://opencollective.com/castopod/contribute). +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
    Ad Aures Logo @@ -254,8 +273,7 @@ Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们, [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-present, [Ad Aures](https://adaures.com/). Copyright © -2020-present, [Ad Aures](https://adaures.com/). +Copyright © 2020-present, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg From 4503b05a8abad441f13f470c9523dbad64bd78fc Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 23 Mar 2023 12:48:05 +0000 Subject: [PATCH 098/477] chore(release): 1.2.4 [skip ci] ## [1.2.4](https://code.castopod.org/adaures/castopod/compare/v1.2.3...v1.2.4) (2023-03-23) ### Bug Fixes * allow images to have .jpeg extension consistently ([ae5e12b](https://code.castopod.org/adaures/castopod/commit/ae5e12be3b15fe50cb2311abcbbc19ac23b592f6)) * **s3:** delete persons image sizes from bucket + add keyPrefix to config ([208c271](https://code.castopod.org/adaures/castopod/commit/208c2715f900371987c3b75a749fe937a3db1991)) * **s3:** do not create bucket if not exists, check if healthy instead ([da7076f](https://code.castopod.org/adaures/castopod/commit/da7076fc2d49d07708d5adaa99733487b7f52e20)) ### Reverts * **homepage:** remove redirect to install if database is not setup ([d4954e0](https://code.castopod.org/adaures/castopod/commit/d4954e026d5e0d48c5f15ed69d1ce71abb34d1a1)) --- CHANGELOG.md | 16 ++++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aaa9359..45f2d4cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## [1.2.4](https://code.castopod.org/adaures/castopod/compare/v1.2.3...v1.2.4) (2023-03-23) + +### Bug Fixes + +- allow images to have .jpeg extension consistently + ([ae5e12b](https://code.castopod.org/adaures/castopod/commit/ae5e12be3b15fe50cb2311abcbbc19ac23b592f6)) +- **s3:** delete persons image sizes from bucket + add keyPrefix to config + ([208c271](https://code.castopod.org/adaures/castopod/commit/208c2715f900371987c3b75a749fe937a3db1991)) +- **s3:** do not create bucket if not exists, check if healthy instead + ([da7076f](https://code.castopod.org/adaures/castopod/commit/da7076fc2d49d07708d5adaa99733487b7f52e20)) + +### Reverts + +- **homepage:** remove redirect to install if database is not setup + ([d4954e0](https://code.castopod.org/adaures/castopod/commit/d4954e026d5e0d48c5f15ed69d1ce71abb34d1a1)) + ## [1.2.3](https://code.castopod.org/adaures/castopod/compare/v1.2.2...v1.2.3) (2023-03-18) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index e2ee1117..241a554a 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.2.3'); +defined('CP_VERSION') || define('CP_VERSION', '1.2.4'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 612d4715..3ac0ae0b 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.2.3", + "version": "1.2.4", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 38386b43..faff06d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.2.3", + "version": "1.2.4", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 7e1a470ba42172eb4c3864ab3652e9f8b55d1ba8 Mon Sep 17 00:00:00 2001 From: misuzu Date: Tue, 28 Mar 2023 16:13:04 +0000 Subject: [PATCH 099/477] feat(media): set media storage directory as configurable --- docs/src/getting-started/install.md | 18 ++++++++++++++++-- .../Admin/Controllers/SettingsController.php | 16 ++++++++-------- modules/Media/Config/Media.php | 8 ++++++++ modules/Media/FileManagers/FS.php | 18 ++++++++++-------- modules/Media/Helpers/media_helper.php | 12 ++++++++++++ 5 files changed, 54 insertions(+), 18 deletions(-) diff --git a/docs/src/getting-started/install.md b/docs/src/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/getting-started/install.md +++ b/docs/src/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/modules/Admin/Controllers/SettingsController.php b/modules/Admin/Controllers/SettingsController.php index f089a4d2..d68e3394 100644 --- a/modules/Admin/Controllers/SettingsController.php +++ b/modules/Admin/Controllers/SettingsController.php @@ -61,7 +61,7 @@ class SettingsController extends BaseController helper(['filesystem', 'media']); // delete site folder in media before repopulating it - delete_files(media_path('/site')); + delete_files(media_path_absolute('/site')); // save original in disk $originalFilename = (new FS(config('Media')))->save( @@ -71,9 +71,9 @@ class SettingsController extends BaseController // convert jpeg image to png if not if ($siteIconFile->getClientMimeType() !== 'image/png') { - service('image')->withFile(media_path($originalFilename)) + service('image')->withFile(media_path_absolute($originalFilename)) ->convert(IMAGETYPE_JPEG) - ->save(media_path('/site/icon.png')); + ->save(media_path_absolute('/site/icon.png')); } // generate random hash to use as a suffix to renew browser cache @@ -81,15 +81,15 @@ class SettingsController extends BaseController // generate ico $ico_lib = new PHP_ICO(); - $ico_lib->add_image(media_path('/site/icon.png'), [[32, 32], [64, 64]]); - $ico_lib->save_ico(media_path("/site/favicon.{$randomHash}.ico")); + $ico_lib->add_image(media_path_absolute('/site/icon.png'), [[32, 32], [64, 64]]); + $ico_lib->save_ico(media_path_absolute("/site/favicon.{$randomHash}.ico")); // resize original to needed sizes foreach ([64, 180, 192, 512] as $size) { service('image') - ->withFile(media_path('/site/icon.png')) + ->withFile(media_path_absolute('/site/icon.png')) ->resize($size, $size) - ->save(media_path("/site/icon-{$size}.{$randomHash}.png")); + ->save(media_path_absolute("/site/icon-{$size}.{$randomHash}.png")); } service('settings') @@ -109,7 +109,7 @@ class SettingsController extends BaseController { helper(['filesystem', 'media']); // delete site folder in media - delete_files(media_path('/site')); + delete_files(media_path_absolute('/site')); service('settings') ->forget('App.siteIcon'); diff --git a/modules/Media/Config/Media.php b/modules/Media/Config/Media.php index 43de0508..af4ca200 100644 --- a/modules/Media/Config/Media.php +++ b/modules/Media/Config/Media.php @@ -55,6 +55,14 @@ class Media extends BaseConfig */ public string $root = 'media'; + /** + * -------------------------------------------------------------------------- + * Media storage folder + * -------------------------------------------------------------------------- + * Defines the folder used to store the media root folder + */ + public string $storage = ROOTPATH . 'public'; + /** * @var array */ diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index e2d5ce06..71fd803f 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -21,11 +21,13 @@ class FS implements FileManagerInterface */ public function save(File $file, string $path): string | false { + helper('media'); + if ((pathinfo($path, PATHINFO_EXTENSION) === '') && (($extension = $file->getExtension()) !== '')) { $path = $path . '.' . $extension; } - $mediaRoot = $this->config->root; + $mediaRoot = media_path_absolute(); if (! file_exists(dirname($mediaRoot . '/' . $path))) { mkdir(dirname($mediaRoot . '/' . $path), 0777, true); @@ -49,7 +51,7 @@ class FS implements FileManagerInterface { helper('media'); - return unlink(media_path($key)); + return unlink(media_path_absolute($key)); } public function getUrl(string $key): string @@ -68,21 +70,21 @@ class FS implements FileManagerInterface { helper('media'); - return rename(media_path($oldKey), media_path($newKey)); + return rename(media_path_absolute($oldKey), media_path_absolute($newKey)); } public function getFileContents(string $key): string { helper('media'); - return (string) file_get_contents(media_path($key)); + return (string) file_get_contents(media_path_absolute($key)); } public function getFileInput(string $key): string { helper('media'); - return media_path($key); + return media_path_absolute($key); } public function deletePodcastImageSizes(string $podcastHandle): bool @@ -91,7 +93,7 @@ class FS implements FileManagerInterface $allPodcastImagesPaths = []; foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { - $images = glob(media_path("/podcasts/{$podcastHandle}/*_*{$ext}")); + $images = glob(media_path_absolute("/podcasts/{$podcastHandle}/*_*{$ext}")); if (! $images) { return false; @@ -115,7 +117,7 @@ class FS implements FileManagerInterface $allPersonsImagesPaths = []; foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { - $images = glob(media_path("/persons/*_*{$ext}")); + $images = glob(media_path_absolute("/persons/*_*{$ext}")); if (! $images) { return false; @@ -137,6 +139,6 @@ class FS implements FileManagerInterface { helper('media'); - return is_really_writable(ROOTPATH . 'public/' . media_path()); + return is_really_writable(media_path_absolute()); } } diff --git a/modules/Media/Helpers/media_helper.php b/modules/Media/Helpers/media_helper.php index e871c804..fab6123d 100644 --- a/modules/Media/Helpers/media_helper.php +++ b/modules/Media/Helpers/media_helper.php @@ -82,3 +82,15 @@ if (! function_exists('media_path')) { return config('Media')->root . '/' . $uri; } } + +if (! function_exists('media_path_absolute')) { + /** + * Prefixes the absolute storage directory to the media path of a given uri + * + * @param string|string[] $uri URI string or array of URI segments + */ + function media_path_absolute(string | array $uri = ''): string + { + return config('Media')->storage . '/' . media_path($uri); + } +} From 41d8efe6e71566eba44bfdfd00d1708ac4338366 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 30 Mar 2023 13:23:10 +0000 Subject: [PATCH 100/477] fix: delete files using file_manager when deleting episode and podcast - add deleteAll method to file manager - refactor deletePodcastImageSizes and deletePersonImagesSizes implementations --- .../Admin/Controllers/EpisodeController.php | 4 +- .../Admin/Controllers/PodcastController.php | 20 +- modules/Media/FileManagers/FS.php | 58 +- .../FileManagers/FileManagerInterface.php | 2 + modules/Media/FileManagers/S3.php | 90 +- pnpm-lock.yaml | 3369 +++++++++-------- 6 files changed, 1795 insertions(+), 1748 deletions(-) diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 9ea381bd..9f655971 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -911,9 +911,11 @@ class EpisodeController extends BaseController $episodeMediaList[] = $this->episode->cover; } + $mediaModel = new MediaModel(); + //delete episode media records from database foreach ($episodeMediaList as $episodeMedia) { - if ($episodeMedia !== null && ! $episodeMedia->delete()) { + if ($episodeMedia !== null && ! $mediaModel->delete($episodeMedia->id)) { $db->transRollback(); return redirect() ->back() diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 35930b72..141b36c9 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -31,6 +31,7 @@ use Modules\Analytics\Models\AnalyticsPodcastModel; use Modules\Analytics\Models\AnalyticsWebsiteByBrowserModel; use Modules\Analytics\Models\AnalyticsWebsiteByEntryPageModel; use Modules\Analytics\Models\AnalyticsWebsiteByRefererModel; +use Modules\Media\FileManagers\FileManagerInterface; use Modules\Media\Models\MediaModel; class PodcastController extends BaseController @@ -497,8 +498,10 @@ class PodcastController extends BaseController $episodeMediaList[] = $podcastEpisode->cover; } + $mediaModel = new MediaModel(); + foreach ($episodeMediaList as $episodeMedia) { - if ($episodeMedia !== null && ! $episodeMedia->delete()) { + if ($episodeMedia !== null && ! $mediaModel->delete($episodeMedia->id)) { $db->transRollback(); return redirect() ->back() @@ -538,8 +541,10 @@ class PodcastController extends BaseController ]; } + $mediaModel = new MediaModel(); + foreach ($podcastMediaList as $podcastMedia) { - if ($podcastMedia['file'] !== null && ! $podcastMedia['file']->delete()) { + if ($podcastMedia['file'] !== null && ! $mediaModel->delete($podcastMedia['file']->id)) { $db->transRollback(); return redirect() ->back() @@ -587,15 +592,12 @@ class PodcastController extends BaseController $db->transComplete(); + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); + //delete podcast media files and folder $folder = 'podcasts/' . $this->podcast->handle; - - $mediaRoot = config('App') - ->mediaRoot . '/' . $folder; - - helper('filesystem'); - - if (! delete_files($mediaRoot) || ! rmdir($mediaRoot)) { + if (! $fileManager->deleteAll($folder)) { return redirect()->route('podcast-list') ->with('message', lang('Podcast.messages.deleteSuccess', [ 'podcast_handle' => $this->podcast->handle, diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index 71fd803f..141f690d 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -51,7 +51,7 @@ class FS implements FileManagerInterface { helper('media'); - return unlink(media_path_absolute($key)); + return @unlink(media_path_absolute($key)); } public function getUrl(string $key): string @@ -89,23 +89,8 @@ class FS implements FileManagerInterface public function deletePodcastImageSizes(string $podcastHandle): bool { - helper('media'); - - $allPodcastImagesPaths = []; foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { - $images = glob(media_path_absolute("/podcasts/{$podcastHandle}/*_*{$ext}")); - - if (! $images) { - return false; - } - - array_push($allPodcastImagesPaths, ...$images); - } - - foreach ($allPodcastImagesPaths as $podcastImagePath) { - if (is_file($podcastImagePath)) { - unlink($podcastImagePath); - } + $this->deleteAll("podcasts/{$podcastHandle}", "*_*{$ext}"); } return true; @@ -113,23 +98,34 @@ class FS implements FileManagerInterface public function deletePersonImagesSizes(): bool { - helper('media'); - - $allPersonsImagesPaths = []; foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { - $images = glob(media_path_absolute("/persons/*_*{$ext}")); - - if (! $images) { - return false; - } - - array_push($allPersonsImagesPaths, ...$images); + $this->deleteAll('persons', "*_*{$ext}"); } - foreach ($allPersonsImagesPaths as $personImagePath) { - if (is_file($personImagePath)) { - unlink($personImagePath); - } + return true; + } + + public function deleteAll(string $prefix, string $pattern = '*'): bool + { + helper('media'); + + // delete all in folder? + if ($pattern === '*') { + helper('filesystem'); + + return delete_files(media_path_absolute($prefix), true); + } + + $prefix = rtrim($prefix, '/') . '/'; + + $imagePaths = glob(media_path_absolute($prefix . $pattern)); + + if (! $imagePaths) { + return true; + } + + foreach ($imagePaths as $imagePath) { + @unlink($imagePath); } return true; diff --git a/modules/Media/FileManagers/FileManagerInterface.php b/modules/Media/FileManagers/FileManagerInterface.php index 39093441..3d1d2ac4 100644 --- a/modules/Media/FileManagers/FileManagerInterface.php +++ b/modules/Media/FileManagers/FileManagerInterface.php @@ -24,5 +24,7 @@ interface FileManagerInterface public function deletePersonImagesSizes(): bool; + public function deleteAll(string $prefix, string $pattern = '*'): bool; + public function isHealthy(): bool; } diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index d8d4704d..b5856faf 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -88,7 +88,7 @@ class S3 implements FileManagerInterface } // delete old object - return $this->delete($this->prefixKey($oldKey)); + return $this->delete($oldKey); } public function getFileContents(string $key): string @@ -108,44 +108,8 @@ class S3 implements FileManagerInterface public function deletePodcastImageSizes(string $podcastHandle): bool { - $results = $this->s3->getPaginator('ListObjectsV2', [ - 'Bucket' => $this->config->s3['bucket'], - 'Prefix' => $this->prefixKey('podcasts/' . $podcastHandle . '/'), - ]); - - $keys = []; - foreach ($results as $result) { - $key = array_map(static function ($object) { - return $object['Key']; - }, $result['Contents']); - - $prefixedPodcasts = $this->prefixKey('podcasts'); - - array_push( - $keys, - ...preg_grep("~^{$prefixedPodcasts}\/{$podcastHandle}\/.*_.*.\.(jpe?g|png|webp)$~", $key) - ); - } - - $objectsToDelete = array_map(static function ($key): array { - return [ - 'Key' => $key, - ]; - }, $keys); - - if ($objectsToDelete === []) { - return true; - } - - try { - $this->s3->deleteObjects([ - 'Bucket' => $this->config->s3['bucket'], - 'Delete' => [ - 'Objects' => $objectsToDelete, - ], - ]); - } catch (Exception) { - return false; + foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { + $this->deleteAll('podcasts/' . $podcastHandle, "*_*{$ext}"); } return true; @@ -153,27 +117,37 @@ class S3 implements FileManagerInterface public function deletePersonImagesSizes(): bool { - $results = $this->s3->getPaginator('ListObjectsV2', [ - 'Bucket' => $this->config->s3['bucket'], - 'prefix' => $this->prefixKey('persons/'), - ]); - - $keys = []; - foreach ($results as $result) { - $key = array_map(static function ($object) { - return $object['Key']; - }, $result['Contents']); - - $prefixedPersons = $this->prefixKey('persons'); - - array_push($keys, ...preg_grep("~^{$prefixedPersons}\/.*_.*.\.(jpe?g|png|webp)$~", $key)); + foreach (['jpg', 'jpeg', 'png', 'webp'] as $ext) { + $this->deleteAll('persons', "*_*{$ext}"); } - $objectsToDelete = array_map(static function ($key): array { - return [ - 'Key' => $key, - ]; - }, $keys); + return true; + } + + public function deleteAll(string $prefix, ?string $pattern = '*'): bool + { + $prefix = rtrim($this->prefixKey($prefix), '/') . '/'; // make sure that there is a trailing slash + $pattern = $prefix . $pattern; + + $results = $this->s3->getPaginator('ListObjectsV2', [ + 'Bucket' => $this->config->s3['bucket'], + 'prefix' => $prefix, + ]); + + $objectsToDelete = []; + foreach ($results as $result) { + if ($result['Contents'] === null) { + continue; + } + + foreach ($result['Contents'] as $object) { + if (fnmatch($pattern, $object['Key'])) { + $objectsToDelete[] = [ + 'Key' => $object['Key'], + ]; + } + } + } if ($objectsToDelete === []) { return true; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04693a05..bf7522f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,154 +1,219 @@ -lockfileVersion: 5.4 - -specifiers: - "@amcharts/amcharts4": ^4.10.35 - "@amcharts/amcharts4-geodata": ^4.1.26 - "@codemirror/commands": ^6.2.2 - "@codemirror/lang-xml": ^6.0.2 - "@codemirror/language": ^6.6.0 - "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.9.3 - "@commitlint/cli": ^17.5.0 - "@commitlint/config-conventional": ^17.4.4 - "@floating-ui/dom": ^1.2.5 - "@github/clipboard-copy-element": ^1.1.2 - "@github/hotkey": ^2.0.1 - "@github/markdown-toolbar-element": ^2.1.1 - "@github/time-elements": ^4.0.0 - "@semantic-release/changelog": ^6.0.2 - "@semantic-release/exec": ^6.0.3 - "@semantic-release/git": ^10.0.1 - "@semantic-release/gitlab": ^11.0.1 - "@tailwindcss/forms": ^0.5.3 - "@tailwindcss/line-clamp": ^0.4.2 - "@tailwindcss/nesting": 0.0.0-insiders.565cd3e - "@tailwindcss/typography": ^0.5.9 - "@types/leaflet": ^1.9.3 - "@types/marked": ^4.0.8 - "@types/wavesurfer.js": ^6.0.3 - "@typescript-eslint/eslint-plugin": ^5.56.0 - "@typescript-eslint/parser": ^5.56.0 - "@vime/core": ^5.4.0 - all-contributors-cli: ^6.24.0 - choices.js: ^10.2.0 - codemirror: ^6.0.1 - commitizen: ^4.3.0 - cross-env: ^7.0.3 - cssnano: ^5.1.15 - cz-conventional-changelog: ^3.3.0 - eslint: ^8.36.0 - eslint-config-prettier: ^8.8.0 - eslint-plugin-prettier: ^4.2.1 - flatpickr: ^4.6.13 - husky: ^8.0.3 - is-ci: ^3.0.1 - leaflet: ^1.9.3 - leaflet.markercluster: ^1.5.3 - lint-staged: ^13.2.0 - lit: ^2.7.0 - marked: ^4.3.0 - postcss: ^8.4.21 - postcss-import: ^15.1.0 - postcss-nesting: ^11.2.1 - postcss-preset-env: ^8.0.1 - postcss-reporter: ^7.0.5 - prettier: 2.8.6 - prettier-plugin-organize-imports: ^3.2.2 - semantic-release: ^20.1.3 - stylelint: ^15.3.0 - stylelint-config-standard: ^31.0.0 - svgo: ^3.0.2 - tailwindcss: ^3.2.7 - typescript: ^5.0.2 - vite: ^4.2.1 - vite-plugin-pwa: ^0.14.5 - wavesurfer.js: ^6.6.1 - workbox-build: ^6.5.4 - workbox-core: ^6.5.4 - workbox-routing: ^6.5.4 - workbox-strategies: ^6.5.4 - xml-formatter: ^3.3.2 +lockfileVersion: "6.0" dependencies: - "@amcharts/amcharts4": 4.10.35 - "@amcharts/amcharts4-geodata": 4.1.26 - "@codemirror/commands": 6.2.2 - "@codemirror/lang-xml": 6.0.2_@codemirror+view@6.9.3 - "@codemirror/language": 6.6.0 - "@codemirror/state": 6.2.0 - "@codemirror/view": 6.9.3 - "@floating-ui/dom": 1.2.5 - "@github/clipboard-copy-element": 1.1.2 - "@github/hotkey": 2.0.1 - "@github/markdown-toolbar-element": 2.1.1 - "@github/time-elements": 4.0.0 - "@tailwindcss/nesting": 0.0.0-insiders.565cd3e_postcss@8.4.21 - "@vime/core": 5.4.0 - choices.js: 10.2.0 - codemirror: 6.0.1 - flatpickr: 4.6.13 - leaflet: 1.9.3 - leaflet.markercluster: 1.5.3_leaflet@1.9.3 - lit: 2.7.0 - marked: 4.3.0 - wavesurfer.js: 6.6.1 - xml-formatter: 3.3.2 + "@amcharts/amcharts4": + specifier: ^4.10.35 + version: 4.10.35 + "@amcharts/amcharts4-geodata": + specifier: ^4.1.26 + version: 4.1.26 + "@codemirror/commands": + specifier: ^6.2.2 + version: 6.2.2 + "@codemirror/lang-xml": + specifier: ^6.0.2 + version: 6.0.2(@codemirror/view@6.9.3) + "@codemirror/language": + specifier: ^6.6.0 + version: 6.6.0 + "@codemirror/state": + specifier: ^6.2.0 + version: 6.2.0 + "@codemirror/view": + specifier: ^6.9.3 + version: 6.9.3 + "@floating-ui/dom": + specifier: ^1.2.5 + version: 1.2.5 + "@github/clipboard-copy-element": + specifier: ^1.1.2 + version: 1.1.2 + "@github/hotkey": + specifier: ^2.0.1 + version: 2.0.1 + "@github/markdown-toolbar-element": + specifier: ^2.1.1 + version: 2.1.1 + "@github/time-elements": + specifier: ^4.0.0 + version: 4.0.0 + "@tailwindcss/nesting": + specifier: 0.0.0-insiders.565cd3e + version: 0.0.0-insiders.565cd3e(postcss@8.4.21) + "@vime/core": + specifier: ^5.4.0 + version: 5.4.0 + choices.js: + specifier: ^10.2.0 + version: 10.2.0 + codemirror: + specifier: ^6.0.1 + version: 6.0.1(@lezer/common@1.0.2) + flatpickr: + specifier: ^4.6.13 + version: 4.6.13 + leaflet: + specifier: ^1.9.3 + version: 1.9.3 + leaflet.markercluster: + specifier: ^1.5.3 + version: 1.5.3(leaflet@1.9.3) + lit: + specifier: ^2.7.0 + version: 2.7.0 + marked: + specifier: ^4.3.0 + version: 4.3.0 + wavesurfer.js: + specifier: ^6.6.1 + version: 6.6.1 + xml-formatter: + specifier: ^3.3.2 + version: 3.3.2 devDependencies: - "@commitlint/cli": 17.5.0 - "@commitlint/config-conventional": 17.4.4 - "@semantic-release/changelog": 6.0.2_semantic-release@20.1.3 - "@semantic-release/exec": 6.0.3_semantic-release@20.1.3 - "@semantic-release/git": 10.0.1_semantic-release@20.1.3 - "@semantic-release/gitlab": 11.0.1_semantic-release@20.1.3 - "@tailwindcss/forms": 0.5.3_tailwindcss@3.2.7 - "@tailwindcss/line-clamp": 0.4.2_tailwindcss@3.2.7 - "@tailwindcss/typography": 0.5.9_tailwindcss@3.2.7 - "@types/leaflet": 1.9.3 - "@types/marked": 4.0.8 - "@types/wavesurfer.js": 6.0.3 - "@typescript-eslint/eslint-plugin": 5.56.0_2hcjazgfnbtq42tcc73br2vup4 - "@typescript-eslint/parser": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu - all-contributors-cli: 6.24.0 - commitizen: 4.3.0 - cross-env: 7.0.3 - cssnano: 5.1.15_postcss@8.4.21 - cz-conventional-changelog: 3.3.0 - eslint: 8.36.0 - eslint-config-prettier: 8.8.0_eslint@8.36.0 - eslint-plugin-prettier: 4.2.1_ose2zoovovx4ulolhifz3tfzx4 - husky: 8.0.3 - is-ci: 3.0.1 - lint-staged: 13.2.0 - postcss: 8.4.21 - postcss-import: 15.1.0_postcss@8.4.21 - postcss-nesting: 11.2.1_postcss@8.4.21 - postcss-preset-env: 8.0.1_postcss@8.4.21 - postcss-reporter: 7.0.5_postcss@8.4.21 - prettier: 2.8.6 - prettier-plugin-organize-imports: 3.2.2_tcllvk4eo3otqqvuorc2duftpy - semantic-release: 20.1.3 - stylelint: 15.3.0 - stylelint-config-standard: 31.0.0_stylelint@15.3.0 - svgo: 3.0.2 - tailwindcss: 3.2.7_postcss@8.4.21 - typescript: 5.0.2 - vite: 4.2.1 - vite-plugin-pwa: 0.14.5_7pzn4vgxpc2rxxz25gxxv2wcqm - workbox-build: 6.5.4 - workbox-core: 6.5.4 - workbox-routing: 6.5.4 - workbox-strategies: 6.5.4 + "@commitlint/cli": + specifier: ^17.5.0 + version: 17.5.0 + "@commitlint/config-conventional": + specifier: ^17.4.4 + version: 17.4.4 + "@semantic-release/changelog": + specifier: ^6.0.2 + version: 6.0.2(semantic-release@20.1.3) + "@semantic-release/exec": + specifier: ^6.0.3 + version: 6.0.3(semantic-release@20.1.3) + "@semantic-release/git": + specifier: ^10.0.1 + version: 10.0.1(semantic-release@20.1.3) + "@semantic-release/gitlab": + specifier: ^11.0.1 + version: 11.0.1(semantic-release@20.1.3) + "@tailwindcss/forms": + specifier: ^0.5.3 + version: 0.5.3(tailwindcss@3.2.7) + "@tailwindcss/line-clamp": + specifier: ^0.4.2 + version: 0.4.2(tailwindcss@3.2.7) + "@tailwindcss/typography": + specifier: ^0.5.9 + version: 0.5.9(tailwindcss@3.2.7) + "@types/leaflet": + specifier: ^1.9.3 + version: 1.9.3 + "@types/marked": + specifier: ^4.0.8 + version: 4.0.8 + "@types/wavesurfer.js": + specifier: ^6.0.3 + version: 6.0.3 + "@typescript-eslint/eslint-plugin": + specifier: ^5.56.0 + version: 5.56.0(@typescript-eslint/parser@5.56.0)(eslint@8.36.0)(typescript@5.0.2) + "@typescript-eslint/parser": + specifier: ^5.56.0 + version: 5.56.0(eslint@8.36.0)(typescript@5.0.2) + all-contributors-cli: + specifier: ^6.24.0 + version: 6.24.0 + commitizen: + specifier: ^4.3.0 + version: 4.3.0 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cssnano: + specifier: ^5.1.15 + version: 5.1.15(postcss@8.4.21) + cz-conventional-changelog: + specifier: ^3.3.0 + version: 3.3.0 + eslint: + specifier: ^8.36.0 + version: 8.36.0 + eslint-config-prettier: + specifier: ^8.8.0 + version: 8.8.0(eslint@8.36.0) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.36.0)(prettier@2.8.6) + husky: + specifier: ^8.0.3 + version: 8.0.3 + is-ci: + specifier: ^3.0.1 + version: 3.0.1 + lint-staged: + specifier: ^13.2.0 + version: 13.2.0 + postcss: + specifier: ^8.4.21 + version: 8.4.21 + postcss-import: + specifier: ^15.1.0 + version: 15.1.0(postcss@8.4.21) + postcss-nesting: + specifier: ^11.2.1 + version: 11.2.1(postcss@8.4.21) + postcss-preset-env: + specifier: ^8.0.1 + version: 8.0.1(postcss@8.4.21) + postcss-reporter: + specifier: ^7.0.5 + version: 7.0.5(postcss@8.4.21) + prettier: + specifier: 2.8.6 + version: 2.8.6 + prettier-plugin-organize-imports: + specifier: ^3.2.2 + version: 3.2.2(prettier@2.8.6)(typescript@5.0.2) + semantic-release: + specifier: ^20.1.3 + version: 20.1.3 + stylelint: + specifier: ^15.3.0 + version: 15.3.0 + stylelint-config-standard: + specifier: ^31.0.0 + version: 31.0.0(stylelint@15.3.0) + svgo: + specifier: ^3.0.2 + version: 3.0.2 + tailwindcss: + specifier: ^3.2.7 + version: 3.2.7(postcss@8.4.21)(ts-node@10.9.1) + typescript: + specifier: ^5.0.2 + version: 5.0.2 + vite: + specifier: ^4.2.1 + version: 4.2.1(@types/node@18.14.0) + vite-plugin-pwa: + specifier: ^0.14.5 + version: 0.14.5(vite@4.2.1)(workbox-build@6.5.4)(workbox-window@6.5.4) + workbox-build: + specifier: ^6.5.4 + version: 6.5.4 + workbox-core: + specifier: ^6.5.4 + version: 6.5.4 + workbox-routing: + specifier: ^6.5.4 + version: 6.5.4 + workbox-strategies: + specifier: ^6.5.4 + version: 6.5.4 packages: - /@amcharts/amcharts4-geodata/4.1.26: + /@amcharts/amcharts4-geodata@4.1.26: resolution: { integrity: sha512-QbApahAJyKnt4kBfg93gmi4IIwV+B0ZITBL+e0X1vCYC/r2WrRTzojzUlbhihn0r5VI7tNqswvfWRms5jTfrxQ==, } dev: false - /@amcharts/amcharts4/4.10.35: + /@amcharts/amcharts4@4.10.35: resolution: { integrity: sha512-EeWD+4TAFUmto9+orao5W978cdidCuDl+ra2xKFjK6kmgIhWLCxPK08RnDSc/EhQBpMCZwowIQG4C2VbP5kZ/g==, @@ -160,7 +225,7 @@ packages: d3-geo: 3.1.0 d3-geo-projection: 4.0.0 d3-selection: 3.0.0 - d3-transition: 3.0.1_d3-selection@3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) pdfmake: 0.2.7 polylabel: 1.1.0 raf: 3.4.1 @@ -171,7 +236,7 @@ packages: xlsx: 0.18.5 dev: false - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: { integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==, @@ -182,7 +247,7 @@ packages: "@jridgewell/trace-mapping": 0.3.17 dev: true - /@apideck/better-ajv-errors/0.3.6_ajv@8.12.0: + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): resolution: { integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==, @@ -197,7 +262,7 @@ packages: leven: 3.1.0 dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: { integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==, @@ -207,7 +272,7 @@ packages: "@babel/highlight": 7.18.6 dev: true - /@babel/compat-data/7.21.0: + /@babel/compat-data@7.21.0: resolution: { integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==, @@ -215,7 +280,7 @@ packages: engines: { node: ">=6.9.0" } dev: true - /@babel/core/7.21.0: + /@babel/core@7.21.0: resolution: { integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==, @@ -225,7 +290,7 @@ packages: "@ampproject/remapping": 2.2.0 "@babel/code-frame": 7.18.6 "@babel/generator": 7.21.1 - "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-compilation-targets": 7.20.7(@babel/core@7.21.0) "@babel/helper-module-transforms": 7.21.0 "@babel/helpers": 7.21.0 "@babel/parser": 7.21.1 @@ -241,7 +306,7 @@ packages: - supports-color dev: true - /@babel/generator/7.21.1: + /@babel/generator@7.21.1: resolution: { integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==, @@ -254,7 +319,7 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-annotate-as-pure/7.18.6: + /@babel/helper-annotate-as-pure@7.18.6: resolution: { integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==, @@ -264,7 +329,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: resolution: { integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==, @@ -275,7 +340,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0: + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==, @@ -292,7 +357,7 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.0: + /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.21.0): resolution: { integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==, @@ -314,7 +379,7 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.0: + /@babel/helper-create-regexp-features-plugin@7.21.0(@babel/core@7.21.0): resolution: { integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==, @@ -328,7 +393,7 @@ packages: regexpu-core: 5.3.1 dev: true - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.0: + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.0): resolution: { integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==, @@ -337,7 +402,7 @@ packages: "@babel/core": ^7.4.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-compilation-targets": 7.20.7(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -347,7 +412,7 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: { integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==, @@ -355,7 +420,7 @@ packages: engines: { node: ">=6.9.0" } dev: true - /@babel/helper-explode-assignable-expression/7.18.6: + /@babel/helper-explode-assignable-expression@7.18.6: resolution: { integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==, @@ -365,7 +430,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-function-name/7.21.0: + /@babel/helper-function-name@7.21.0: resolution: { integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==, @@ -376,7 +441,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: { integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==, @@ -386,7 +451,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-member-expression-to-functions/7.21.0: + /@babel/helper-member-expression-to-functions@7.21.0: resolution: { integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==, @@ -396,7 +461,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: { integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==, @@ -406,7 +471,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-module-transforms/7.21.0: + /@babel/helper-module-transforms@7.21.0: resolution: { integrity: sha512-eD/JQ21IG2i1FraJnTMbUarAUkA7G988ofehG5MDCRXaUU91rEBJuCeSoou2Sk1y4RbLYXzqEg1QLwEmRU4qcQ==, @@ -425,7 +490,7 @@ packages: - supports-color dev: true - /@babel/helper-optimise-call-expression/7.18.6: + /@babel/helper-optimise-call-expression@7.18.6: resolution: { integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==, @@ -435,7 +500,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-plugin-utils/7.20.2: + /@babel/helper-plugin-utils@7.20.2: resolution: { integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==, @@ -443,7 +508,7 @@ packages: engines: { node: ">=6.9.0" } dev: true - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.0: + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.0): resolution: { integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==, @@ -461,7 +526,7 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers/7.20.7: + /@babel/helper-replace-supers@7.20.7: resolution: { integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==, @@ -478,7 +543,7 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: { integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==, @@ -488,7 +553,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: { integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==, @@ -498,7 +563,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: { integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==, @@ -508,7 +573,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: { integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, @@ -516,7 +581,7 @@ packages: engines: { node: ">=6.9.0" } dev: true - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: { integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, @@ -524,7 +589,7 @@ packages: engines: { node: ">=6.9.0" } dev: true - /@babel/helper-validator-option/7.21.0: + /@babel/helper-validator-option@7.21.0: resolution: { integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==, @@ -532,7 +597,7 @@ packages: engines: { node: ">=6.9.0" } dev: true - /@babel/helper-wrap-function/7.20.5: + /@babel/helper-wrap-function@7.20.5: resolution: { integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==, @@ -547,7 +612,7 @@ packages: - supports-color dev: true - /@babel/helpers/7.21.0: + /@babel/helpers@7.21.0: resolution: { integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==, @@ -561,7 +626,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: { integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==, @@ -573,7 +638,7 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.21.1: + /@babel/parser@7.21.1: resolution: { integrity: sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==, @@ -584,7 +649,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.0: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==, @@ -597,7 +662,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.0: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==, @@ -609,10 +674,10 @@ packages: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 "@babel/helper-skip-transparent-expression-wrappers": 7.20.0 - "@babel/plugin-proposal-optional-chaining": 7.21.0_@babel+core@7.21.0 + "@babel/plugin-proposal-optional-chaining": 7.21.0(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.0: + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==, @@ -624,13 +689,13 @@ packages: "@babel/core": 7.21.0 "@babel/helper-environment-visitor": 7.18.9 "@babel/helper-plugin-utils": 7.20.2 - "@babel/helper-remap-async-to-generator": 7.18.9_@babel+core@7.21.0 - "@babel/plugin-syntax-async-generators": 7.8.4_@babel+core@7.21.0 + "@babel/helper-remap-async-to-generator": 7.18.9(@babel/core@7.21.0) + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.21.0) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.0: + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==, @@ -640,13 +705,13 @@ packages: "@babel/core": ^7.0.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-create-class-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-create-class-features-plugin": 7.21.0(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.0: + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.21.0): resolution: { integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==, @@ -656,14 +721,14 @@ packages: "@babel/core": ^7.12.0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-create-class-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-create-class-features-plugin": 7.21.0(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-class-static-block": 7.14.5_@babel+core@7.21.0 + "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.21.0) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.0: + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==, @@ -674,10 +739,10 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-dynamic-import": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.0: + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.0): resolution: { integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==, @@ -688,10 +753,10 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-export-namespace-from": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.0: + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==, @@ -702,10 +767,10 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-json-strings": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.0: + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==, @@ -716,10 +781,10 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4_@babel+core@7.21.0 + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.0: + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==, @@ -730,10 +795,10 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.0: + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==, @@ -744,10 +809,10 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-numeric-separator": 7.10.4_@babel+core@7.21.0 + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.0: + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==, @@ -758,13 +823,13 @@ packages: dependencies: "@babel/compat-data": 7.21.0 "@babel/core": 7.21.0 - "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-compilation-targets": 7.20.7(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-object-rest-spread": 7.8.3_@babel+core@7.21.0 - "@babel/plugin-transform-parameters": 7.20.7_@babel+core@7.21.0 + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.21.0) + "@babel/plugin-transform-parameters": 7.20.7(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.0: + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==, @@ -775,10 +840,10 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-optional-catch-binding": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.0: + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.0): resolution: { integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==, @@ -790,10 +855,10 @@ packages: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 "@babel/helper-skip-transparent-expression-wrappers": 7.20.0 - "@babel/plugin-syntax-optional-chaining": 7.8.3_@babel+core@7.21.0 + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.21.0) dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.0: + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==, @@ -803,13 +868,13 @@ packages: "@babel/core": ^7.0.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-create-class-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-create-class-features-plugin": 7.21.0(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.0: + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.21.0): resolution: { integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==, @@ -820,14 +885,14 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-annotate-as-pure": 7.18.6 - "@babel/helper-create-class-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-create-class-features-plugin": 7.21.0(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-syntax-private-property-in-object": 7.14.5_@babel+core@7.21.0 + "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.21.0) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.0: + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==, @@ -837,11 +902,11 @@ packages: "@babel/core": ^7.0.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-create-regexp-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-create-regexp-features-plugin": 7.21.0(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.0: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.0): resolution: { integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, @@ -853,7 +918,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.0: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.0): resolution: { integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, @@ -865,7 +930,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.0: + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.0): resolution: { integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, @@ -878,7 +943,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.0: + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.0): resolution: { integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, @@ -890,7 +955,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.0: + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.0): resolution: { integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, @@ -902,7 +967,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.0: + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.0): resolution: { integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==, @@ -915,7 +980,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.0: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.0): resolution: { integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, @@ -927,7 +992,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.0: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.0): resolution: { integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, @@ -939,7 +1004,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.0: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.0): resolution: { integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, @@ -951,7 +1016,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.0: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.0): resolution: { integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, @@ -963,7 +1028,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.0: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.0): resolution: { integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, @@ -975,7 +1040,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.0: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.0): resolution: { integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, @@ -987,7 +1052,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.0: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.0): resolution: { integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, @@ -999,7 +1064,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.0: + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.0): resolution: { integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, @@ -1012,7 +1077,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.0: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.0): resolution: { integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, @@ -1025,7 +1090,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.0: + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==, @@ -1038,7 +1103,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.0: + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==, @@ -1050,12 +1115,12 @@ packages: "@babel/core": 7.21.0 "@babel/helper-module-imports": 7.18.6 "@babel/helper-plugin-utils": 7.20.2 - "@babel/helper-remap-async-to-generator": 7.18.9_@babel+core@7.21.0 + "@babel/helper-remap-async-to-generator": 7.18.9(@babel/core@7.21.0) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==, @@ -1068,7 +1133,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.0: + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.21.0): resolution: { integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==, @@ -1081,7 +1146,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.0: + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.21.0): resolution: { integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==, @@ -1092,7 +1157,7 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-annotate-as-pure": 7.18.6 - "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-compilation-targets": 7.20.7(@babel/core@7.21.0) "@babel/helper-environment-visitor": 7.18.9 "@babel/helper-function-name": 7.21.0 "@babel/helper-optimise-call-expression": 7.18.6 @@ -1104,7 +1169,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.0: + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==, @@ -1118,7 +1183,7 @@ packages: "@babel/template": 7.20.7 dev: true - /@babel/plugin-transform-destructuring/7.20.7_@babel+core@7.21.0: + /@babel/plugin-transform-destructuring@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==, @@ -1131,7 +1196,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==, @@ -1141,11 +1206,11 @@ packages: "@babel/core": ^7.0.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-create-regexp-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-create-regexp-features-plugin": 7.21.0(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.0: + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.0): resolution: { integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==, @@ -1158,7 +1223,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==, @@ -1172,7 +1237,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.0: + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.21.0): resolution: { integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==, @@ -1185,7 +1250,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.0: + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.0): resolution: { integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==, @@ -1195,12 +1260,12 @@ packages: "@babel/core": ^7.0.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-compilation-targets": 7.20.7(@babel/core@7.21.0) "@babel/helper-function-name": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.0: + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.0): resolution: { integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==, @@ -1213,7 +1278,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==, @@ -1226,7 +1291,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.0: + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.21.0): resolution: { integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==, @@ -1242,7 +1307,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.20.11_@babel+core@7.21.0: + /@babel/plugin-transform-modules-commonjs@7.20.11(@babel/core@7.21.0): resolution: { integrity: sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==, @@ -1259,7 +1324,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.0: + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.21.0): resolution: { integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==, @@ -1277,7 +1342,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==, @@ -1293,7 +1358,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.0: + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.21.0): resolution: { integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==, @@ -1303,11 +1368,11 @@ packages: "@babel/core": ^7.0.0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-create-regexp-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-create-regexp-features-plugin": 7.21.0(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==, @@ -1320,7 +1385,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==, @@ -1336,7 +1401,7 @@ packages: - supports-color dev: true - /@babel/plugin-transform-parameters/7.20.7_@babel+core@7.21.0: + /@babel/plugin-transform-parameters@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==, @@ -1349,7 +1414,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==, @@ -1362,7 +1427,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.0: + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.21.0): resolution: { integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==, @@ -1376,7 +1441,7 @@ packages: regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==, @@ -1389,7 +1454,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==, @@ -1402,7 +1467,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.0: + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.21.0): resolution: { integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==, @@ -1416,7 +1481,7 @@ packages: "@babel/helper-skip-transparent-expression-wrappers": 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==, @@ -1429,7 +1494,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.0: + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.0): resolution: { integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==, @@ -1442,7 +1507,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.0: + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.0): resolution: { integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==, @@ -1455,7 +1520,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.0: + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.0): resolution: { integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==, @@ -1468,7 +1533,7 @@ packages: "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.0: + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.0): resolution: { integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==, @@ -1478,11 +1543,11 @@ packages: "@babel/core": ^7.0.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-create-regexp-features-plugin": 7.21.0_@babel+core@7.21.0 + "@babel/helper-create-regexp-features-plugin": 7.21.0(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 dev: true - /@babel/preset-env/7.20.2_@babel+core@7.21.0: + /@babel/preset-env@7.20.2(@babel/core@7.21.0): resolution: { integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==, @@ -1493,85 +1558,85 @@ packages: dependencies: "@babel/compat-data": 7.21.0 "@babel/core": 7.21.0 - "@babel/helper-compilation-targets": 7.20.7_@babel+core@7.21.0 + "@babel/helper-compilation-targets": 7.20.7(@babel/core@7.21.0) "@babel/helper-plugin-utils": 7.20.2 "@babel/helper-validator-option": 7.21.0 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-proposal-async-generator-functions": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-proposal-class-properties": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-proposal-class-static-block": 7.21.0_@babel+core@7.21.0 - "@babel/plugin-proposal-dynamic-import": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-proposal-export-namespace-from": 7.18.9_@babel+core@7.21.0 - "@babel/plugin-proposal-json-strings": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-proposal-logical-assignment-operators": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-proposal-nullish-coalescing-operator": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-proposal-numeric-separator": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-proposal-object-rest-spread": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-proposal-optional-catch-binding": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-proposal-optional-chaining": 7.21.0_@babel+core@7.21.0 - "@babel/plugin-proposal-private-methods": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-proposal-private-property-in-object": 7.21.0_@babel+core@7.21.0 - "@babel/plugin-proposal-unicode-property-regex": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-syntax-async-generators": 7.8.4_@babel+core@7.21.0 - "@babel/plugin-syntax-class-properties": 7.12.13_@babel+core@7.21.0 - "@babel/plugin-syntax-class-static-block": 7.14.5_@babel+core@7.21.0 - "@babel/plugin-syntax-dynamic-import": 7.8.3_@babel+core@7.21.0 - "@babel/plugin-syntax-export-namespace-from": 7.8.3_@babel+core@7.21.0 - "@babel/plugin-syntax-import-assertions": 7.20.0_@babel+core@7.21.0 - "@babel/plugin-syntax-json-strings": 7.8.3_@babel+core@7.21.0 - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4_@babel+core@7.21.0 - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3_@babel+core@7.21.0 - "@babel/plugin-syntax-numeric-separator": 7.10.4_@babel+core@7.21.0 - "@babel/plugin-syntax-object-rest-spread": 7.8.3_@babel+core@7.21.0 - "@babel/plugin-syntax-optional-catch-binding": 7.8.3_@babel+core@7.21.0 - "@babel/plugin-syntax-optional-chaining": 7.8.3_@babel+core@7.21.0 - "@babel/plugin-syntax-private-property-in-object": 7.14.5_@babel+core@7.21.0 - "@babel/plugin-syntax-top-level-await": 7.14.5_@babel+core@7.21.0 - "@babel/plugin-transform-arrow-functions": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-transform-async-to-generator": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-transform-block-scoped-functions": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-block-scoping": 7.21.0_@babel+core@7.21.0 - "@babel/plugin-transform-classes": 7.21.0_@babel+core@7.21.0 - "@babel/plugin-transform-computed-properties": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-transform-destructuring": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-transform-dotall-regex": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-duplicate-keys": 7.18.9_@babel+core@7.21.0 - "@babel/plugin-transform-exponentiation-operator": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-for-of": 7.21.0_@babel+core@7.21.0 - "@babel/plugin-transform-function-name": 7.18.9_@babel+core@7.21.0 - "@babel/plugin-transform-literals": 7.18.9_@babel+core@7.21.0 - "@babel/plugin-transform-member-expression-literals": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-modules-amd": 7.20.11_@babel+core@7.21.0 - "@babel/plugin-transform-modules-commonjs": 7.20.11_@babel+core@7.21.0 - "@babel/plugin-transform-modules-systemjs": 7.20.11_@babel+core@7.21.0 - "@babel/plugin-transform-modules-umd": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-named-capturing-groups-regex": 7.20.5_@babel+core@7.21.0 - "@babel/plugin-transform-new-target": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-object-super": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-parameters": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-transform-property-literals": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-regenerator": 7.20.5_@babel+core@7.21.0 - "@babel/plugin-transform-reserved-words": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-shorthand-properties": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-spread": 7.20.7_@babel+core@7.21.0 - "@babel/plugin-transform-sticky-regex": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-template-literals": 7.18.9_@babel+core@7.21.0 - "@babel/plugin-transform-typeof-symbol": 7.18.9_@babel+core@7.21.0 - "@babel/plugin-transform-unicode-escapes": 7.18.10_@babel+core@7.21.0 - "@babel/plugin-transform-unicode-regex": 7.18.6_@babel+core@7.21.0 - "@babel/preset-modules": 0.1.5_@babel+core@7.21.0 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-proposal-async-generator-functions": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-proposal-class-properties": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-proposal-class-static-block": 7.21.0(@babel/core@7.21.0) + "@babel/plugin-proposal-dynamic-import": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-proposal-export-namespace-from": 7.18.9(@babel/core@7.21.0) + "@babel/plugin-proposal-json-strings": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-proposal-logical-assignment-operators": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-proposal-nullish-coalescing-operator": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-proposal-numeric-separator": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-proposal-object-rest-spread": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-proposal-optional-catch-binding": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-proposal-optional-chaining": 7.21.0(@babel/core@7.21.0) + "@babel/plugin-proposal-private-methods": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-proposal-private-property-in-object": 7.21.0(@babel/core@7.21.0) + "@babel/plugin-proposal-unicode-property-regex": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.21.0) + "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.21.0) + "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.21.0) + "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.21.0) + "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.21.0) + "@babel/plugin-syntax-import-assertions": 7.20.0(@babel/core@7.21.0) + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.21.0) + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.21.0) + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.21.0) + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.21.0) + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.21.0) + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.21.0) + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.21.0) + "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.21.0) + "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.21.0) + "@babel/plugin-transform-arrow-functions": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-transform-async-to-generator": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-transform-block-scoped-functions": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-block-scoping": 7.21.0(@babel/core@7.21.0) + "@babel/plugin-transform-classes": 7.21.0(@babel/core@7.21.0) + "@babel/plugin-transform-computed-properties": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-transform-destructuring": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-transform-dotall-regex": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-duplicate-keys": 7.18.9(@babel/core@7.21.0) + "@babel/plugin-transform-exponentiation-operator": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-for-of": 7.21.0(@babel/core@7.21.0) + "@babel/plugin-transform-function-name": 7.18.9(@babel/core@7.21.0) + "@babel/plugin-transform-literals": 7.18.9(@babel/core@7.21.0) + "@babel/plugin-transform-member-expression-literals": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-modules-amd": 7.20.11(@babel/core@7.21.0) + "@babel/plugin-transform-modules-commonjs": 7.20.11(@babel/core@7.21.0) + "@babel/plugin-transform-modules-systemjs": 7.20.11(@babel/core@7.21.0) + "@babel/plugin-transform-modules-umd": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-named-capturing-groups-regex": 7.20.5(@babel/core@7.21.0) + "@babel/plugin-transform-new-target": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-object-super": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-parameters": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-transform-property-literals": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-regenerator": 7.20.5(@babel/core@7.21.0) + "@babel/plugin-transform-reserved-words": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-shorthand-properties": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-spread": 7.20.7(@babel/core@7.21.0) + "@babel/plugin-transform-sticky-regex": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-template-literals": 7.18.9(@babel/core@7.21.0) + "@babel/plugin-transform-typeof-symbol": 7.18.9(@babel/core@7.21.0) + "@babel/plugin-transform-unicode-escapes": 7.18.10(@babel/core@7.21.0) + "@babel/plugin-transform-unicode-regex": 7.18.6(@babel/core@7.21.0) + "@babel/preset-modules": 0.1.5(@babel/core@7.21.0) "@babel/types": 7.21.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.0 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.0 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.0 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.0) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.0) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.0) core-js-compat: 3.28.0 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.21.0: + /@babel/preset-modules@0.1.5(@babel/core@7.21.0): resolution: { integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==, @@ -1581,20 +1646,20 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-plugin-utils": 7.20.2 - "@babel/plugin-proposal-unicode-property-regex": 7.18.6_@babel+core@7.21.0 - "@babel/plugin-transform-dotall-regex": 7.18.6_@babel+core@7.21.0 + "@babel/plugin-proposal-unicode-property-regex": 7.18.6(@babel/core@7.21.0) + "@babel/plugin-transform-dotall-regex": 7.18.6(@babel/core@7.21.0) "@babel/types": 7.21.0 esutils: 2.0.3 dev: true - /@babel/regjsgen/0.8.0: + /@babel/regjsgen@0.8.0: resolution: { integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==, } dev: true - /@babel/runtime/7.21.0: + /@babel/runtime@7.21.0: resolution: { integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==, @@ -1603,7 +1668,7 @@ packages: dependencies: regenerator-runtime: 0.13.11 - /@babel/template/7.20.7: + /@babel/template@7.20.7: resolution: { integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==, @@ -1615,7 +1680,7 @@ packages: "@babel/types": 7.21.0 dev: true - /@babel/traverse/7.21.0: + /@babel/traverse@7.21.0: resolution: { integrity: sha512-Xdt2P1H4LKTO8ApPfnO1KmzYMFpp7D/EinoXzLYN/cHcBNrVCAkAtGUcXnHXrl/VGktureU6fkQrHSBE2URfoA==, @@ -1636,7 +1701,7 @@ packages: - supports-color dev: true - /@babel/types/7.21.0: + /@babel/types@7.21.0: resolution: { integrity: sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==, @@ -1648,7 +1713,7 @@ packages: to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete/6.4.2_ipi6fyicmvtccbdgcmxxogx7ni: + /@codemirror/autocomplete@6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.3)(@lezer/common@1.0.2): resolution: { integrity: sha512-8WE2xp+D0MpWEv5lZ6zPW1/tf4AGb358T5GWYiKEuCP8MvFfT3tH2mIF9Y2yr2e3KbHuSvsVhosiEyqCpiJhZQ==, @@ -1657,6 +1722,7 @@ packages: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 dependencies: "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 @@ -1664,7 +1730,7 @@ packages: "@lezer/common": 1.0.2 dev: false - /@codemirror/commands/6.2.2: + /@codemirror/commands@6.2.2: resolution: { integrity: sha512-s9lPVW7TxXrI/7voZ+HmD/yiAlwAYn9PH5SUVSUhsxXHhv4yl5eZ3KLntSoTynfdgVYM0oIpccQEWRBQgmNZyw==, @@ -1676,13 +1742,13 @@ packages: "@lezer/common": 1.0.2 dev: false - /@codemirror/lang-xml/6.0.2_@codemirror+view@6.9.3: + /@codemirror/lang-xml@6.0.2(@codemirror/view@6.9.3): resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.4.2_ipi6fyicmvtccbdgcmxxogx7ni + "@codemirror/autocomplete": 6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.3)(@lezer/common@1.0.2) "@codemirror/language": 6.6.0 "@codemirror/state": 6.2.0 "@lezer/common": 1.0.2 @@ -1691,7 +1757,7 @@ packages: - "@codemirror/view" dev: false - /@codemirror/language/6.6.0: + /@codemirror/language@6.6.0: resolution: { integrity: sha512-cwUd6lzt3MfNYOobdjf14ZkLbJcnv4WtndYaoBkbor/vF+rCNguMPK0IRtvZJG4dsWiaWPcK8x1VijhvSxnstg==, @@ -1705,7 +1771,7 @@ packages: style-mod: 4.0.0 dev: false - /@codemirror/lint/6.1.1: + /@codemirror/lint@6.1.1: resolution: { integrity: sha512-e+M543x0NVHGayNHQzLP4XByJsvbu/ojY6+0VF2Y4Uu66Rt1nADuxNflZwECLf7gS009smIsptSUa6bUj/U/rw==, @@ -1716,7 +1782,7 @@ packages: crelt: 1.0.5 dev: false - /@codemirror/search/6.2.3: + /@codemirror/search@6.2.3: resolution: { integrity: sha512-V9n9233lopQhB1dyjsBK2Wc1i+8hcCqxl1wQ46c5HWWLePoe4FluV3TGHoZ04rBRlGjNyz9DTmpJErig8UE4jw==, @@ -1727,14 +1793,14 @@ packages: crelt: 1.0.5 dev: false - /@codemirror/state/6.2.0: + /@codemirror/state@6.2.0: resolution: { integrity: sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==, } dev: false - /@codemirror/view/6.9.3: + /@codemirror/view@6.9.3: resolution: { integrity: sha512-BJ5mvEIhFM+SrNwc5X8pLIvMM9ffjkviVbxpg84Xk2OE8ZyKaEbId8kX+nAYEEso7+qnbwsXe1bkAHsasebMow==, @@ -1745,7 +1811,7 @@ packages: w3c-keyname: 2.2.6 dev: false - /@colors/colors/1.5.0: + /@colors/colors@1.5.0: resolution: { integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, @@ -1755,7 +1821,7 @@ packages: dev: true optional: true - /@commitlint/cli/17.5.0: + /@commitlint/cli@17.5.0: resolution: { integrity: sha512-yNW3+M7UM1ioK28LKTrryIVB5qGpXlEv8+rJQiWPMZNayy9/1XR5+lL8qBTNlgopYtZWWnIm5RETcAN29ZTL/A==, @@ -1778,7 +1844,7 @@ packages: - "@swc/wasm" dev: true - /@commitlint/config-conventional/17.4.4: + /@commitlint/config-conventional@17.4.4: resolution: { integrity: sha512-u6ztvxqzi6NuhrcEDR7a+z0yrh11elY66nRrQIpqsqW6sZmpxYkDLtpRH8jRML+mmxYQ8s4qqF06Q/IQx5aJeQ==, @@ -1788,7 +1854,7 @@ packages: conventional-changelog-conventionalcommits: 5.0.0 dev: true - /@commitlint/config-validator/17.4.4: + /@commitlint/config-validator@17.4.4: resolution: { integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==, @@ -1799,7 +1865,7 @@ packages: ajv: 8.12.0 dev: true - /@commitlint/ensure/17.4.4: + /@commitlint/ensure@17.4.4: resolution: { integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==, @@ -1814,7 +1880,7 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule/17.4.0: + /@commitlint/execute-rule@17.4.0: resolution: { integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==, @@ -1822,7 +1888,7 @@ packages: engines: { node: ">=v14" } dev: true - /@commitlint/format/17.4.4: + /@commitlint/format@17.4.4: resolution: { integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==, @@ -1833,7 +1899,7 @@ packages: chalk: 4.1.2 dev: true - /@commitlint/is-ignored/17.4.4: + /@commitlint/is-ignored@17.4.4: resolution: { integrity: sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw==, @@ -1844,7 +1910,7 @@ packages: semver: 7.3.8 dev: true - /@commitlint/lint/17.4.4: + /@commitlint/lint@17.4.4: resolution: { integrity: sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw==, @@ -1857,7 +1923,7 @@ packages: "@commitlint/types": 17.4.4 dev: true - /@commitlint/load/17.5.0: + /@commitlint/load@17.5.0: resolution: { integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==, @@ -1871,19 +1937,19 @@ packages: "@types/node": 18.14.0 chalk: 4.1.2 cosmiconfig: 8.0.0 - cosmiconfig-typescript-loader: 4.3.0_jg2fnlxwfckic3l2an3gqrza7i + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.14.0)(cosmiconfig@8.0.0)(ts-node@10.9.1)(typescript@5.0.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_w3gialtd35h6ptuevfzy5ddjvu + ts-node: 10.9.1(@types/node@18.14.0)(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - "@swc/core" - "@swc/wasm" dev: true - /@commitlint/message/17.4.2: + /@commitlint/message@17.4.2: resolution: { integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==, @@ -1891,7 +1957,7 @@ packages: engines: { node: ">=v14" } dev: true - /@commitlint/parse/17.4.4: + /@commitlint/parse@17.4.4: resolution: { integrity: sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==, @@ -1903,7 +1969,7 @@ packages: conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read/17.4.4: + /@commitlint/read@17.4.4: resolution: { integrity: sha512-B2TvUMJKK+Svzs6eji23WXsRJ8PAD+orI44lVuVNsm5zmI7O8RSGJMvdEZEikiA4Vohfb+HevaPoWZ7PiFZ3zA==, @@ -1917,7 +1983,7 @@ packages: minimist: 1.2.8 dev: true - /@commitlint/resolve-extends/17.4.4: + /@commitlint/resolve-extends@17.4.4: resolution: { integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==, @@ -1932,7 +1998,7 @@ packages: resolve-global: 1.0.0 dev: true - /@commitlint/rules/17.4.4: + /@commitlint/rules@17.4.4: resolution: { integrity: sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ==, @@ -1946,7 +2012,7 @@ packages: execa: 5.1.1 dev: true - /@commitlint/to-lines/17.4.0: + /@commitlint/to-lines@17.4.0: resolution: { integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==, @@ -1954,7 +2020,7 @@ packages: engines: { node: ">=v14" } dev: true - /@commitlint/top-level/17.4.0: + /@commitlint/top-level@17.4.0: resolution: { integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==, @@ -1964,7 +2030,7 @@ packages: find-up: 5.0.0 dev: true - /@commitlint/types/17.4.4: + /@commitlint/types@17.4.4: resolution: { integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==, @@ -1974,7 +2040,7 @@ packages: chalk: 4.1.2 dev: true - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: { integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, @@ -1984,7 +2050,7 @@ packages: "@jridgewell/trace-mapping": 0.3.9 dev: true - /@csstools/cascade-layer-name-parser/1.0.1_ppok7cytzjc65mcyxmtit3wdyi: + /@csstools/cascade-layer-name-parser@1.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0): resolution: { integrity: sha512-SAAi5DpgJJWkfTvWSaqkgyIsTawa83hMwKrktkj6ra2h+q6ZN57vOGZ6ySHq6RSo+CbP64fA3aPChPBRDDUgtw==, @@ -1994,11 +2060,11 @@ packages: "@csstools/css-parser-algorithms": ^2.0.0 "@csstools/css-tokenizer": ^2.0.0 dependencies: - "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-parser-algorithms": 2.0.1(@csstools/css-tokenizer@2.1.0) "@csstools/css-tokenizer": 2.1.0 dev: true - /@csstools/color-helpers/1.0.0: + /@csstools/color-helpers@1.0.0: resolution: { integrity: sha512-tgqtiV8sU/VaWYjOB3O7PWs7HR/MmOLl2kTYRW2qSsTSEniJq7xmyAYFB1LPpXvvQcE5u2ih2dK9fyc8BnrAGQ==, @@ -2006,7 +2072,7 @@ packages: engines: { node: ^14 || ^16 || >=18 } dev: true - /@csstools/css-parser-algorithms/2.0.1_5vzy4lghjvuzkedkkk4tqwjftm: + /@csstools/css-parser-algorithms@2.0.1(@csstools/css-tokenizer@2.1.0): resolution: { integrity: sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==, @@ -2018,7 +2084,7 @@ packages: "@csstools/css-tokenizer": 2.1.0 dev: true - /@csstools/css-tokenizer/2.1.0: + /@csstools/css-tokenizer@2.1.0: resolution: { integrity: sha512-dtqFyoJBHUxGi9zPZdpCKP1xk8tq6KPHJ/NY4qWXiYo6IcSGwzk3L8x2XzZbbyOyBs9xQARoGveU2AsgLj6D2A==, @@ -2026,7 +2092,7 @@ packages: engines: { node: ^14 || ^16 || >=18 } dev: true - /@csstools/media-query-list-parser/2.0.1_ppok7cytzjc65mcyxmtit3wdyi: + /@csstools/media-query-list-parser@2.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0): resolution: { integrity: sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==, @@ -2036,11 +2102,11 @@ packages: "@csstools/css-parser-algorithms": ^2.0.0 "@csstools/css-tokenizer": ^2.0.0 dependencies: - "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-parser-algorithms": 2.0.1(@csstools/css-tokenizer@2.1.0) "@csstools/css-tokenizer": 2.1.0 dev: true - /@csstools/postcss-cascade-layers/3.0.1_postcss@8.4.21: + /@csstools/postcss-cascade-layers@3.0.1(postcss@8.4.21): resolution: { integrity: sha512-dD8W98dOYNOH/yX4V4HXOhfCOnvVAg8TtsL+qCGNoKXuq5z2C/d026wGWgySgC8cajXXo/wNezS31Glj5GcqrA==, @@ -2049,12 +2115,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + "@csstools/selector-specificity": 2.1.1(postcss-selector-parser@6.0.11)(postcss@8.4.21) postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /@csstools/postcss-color-function/2.1.0_postcss@8.4.21: + /@csstools/postcss-color-function@2.1.0(postcss@8.4.21): resolution: { integrity: sha512-XBoCClLyWchlYGHGlmMOa6M2UXZNrZm63HVfsvgD/z1RPm/s3+FhHyT6VkDo+OvEBPhCgn6xz4IeCu4pRctKDQ==, @@ -2064,12 +2130,12 @@ packages: postcss: ^8.4 dependencies: "@csstools/color-helpers": 1.0.0 - "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + "@csstools/postcss-progressive-custom-properties": 2.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-font-format-keywords/2.0.2_postcss@8.4.21: + /@csstools/postcss-font-format-keywords@2.0.2(postcss@8.4.21): resolution: { integrity: sha512-iKYZlIs6JsNT7NKyRjyIyezTCHLh4L4BBB3F5Nx7Dc4Z/QmBgX+YJFuUSar8IM6KclGiAUFGomXFdYxAwJydlA==, @@ -2082,7 +2148,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-hwb-function/2.1.1_postcss@8.4.21: + /@csstools/postcss-hwb-function@2.1.1(postcss@8.4.21): resolution: { integrity: sha512-XijKzdxBdH2hU6IcPWmnaU85FKEF1XE5hGy0d6dQC6XznFUIRu1T4uebL3krayX40m4xIcxfCBsQm5zphzVrtg==, @@ -2096,7 +2162,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-ic-unit/2.0.2_postcss@8.4.21: + /@csstools/postcss-ic-unit@2.0.2(postcss@8.4.21): resolution: { integrity: sha512-N84qGTJkfLTPj2qOG5P4CIqGjpZBbjOEMKMn+UjO5wlb9lcBTfBsxCF0lQsFdWJUzBHYFOz19dL66v71WF3Pig==, @@ -2105,12 +2171,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + "@csstools/postcss-progressive-custom-properties": 2.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-is-pseudo-class/3.1.1_postcss@8.4.21: + /@csstools/postcss-is-pseudo-class@3.1.1(postcss@8.4.21): resolution: { integrity: sha512-hhiacuby4YdUnnxfCYCRMBIobyJImozf0u+gHSbQ/tNOdwvmrZtVROvgW7zmfYuRkHVDNZJWZslq2v5jOU+j/A==, @@ -2119,12 +2185,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + "@csstools/selector-specificity": 2.1.1(postcss-selector-parser@6.0.11)(postcss@8.4.21) postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /@csstools/postcss-logical-float-and-clear/1.0.1_postcss@8.4.21: + /@csstools/postcss-logical-float-and-clear@1.0.1(postcss@8.4.21): resolution: { integrity: sha512-eO9z2sMLddvlfFEW5Fxbjyd03zaO7cJafDurK4rCqyRt9P7aaWwha0LcSzoROlcZrw1NBV2JAp2vMKfPMQO1xw==, @@ -2136,7 +2202,7 @@ packages: postcss: 8.4.21 dev: true - /@csstools/postcss-logical-resize/1.0.1_postcss@8.4.21: + /@csstools/postcss-logical-resize@1.0.1(postcss@8.4.21): resolution: { integrity: sha512-x1ge74eCSvpBkDDWppl+7FuD2dL68WP+wwP2qvdUcKY17vJksz+XoE1ZRV38uJgS6FNUwC0AxrPW5gy3MxsDHQ==, @@ -2149,7 +2215,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units/1.0.2_postcss@8.4.21: + /@csstools/postcss-logical-viewport-units@1.0.2(postcss@8.4.21): resolution: { integrity: sha512-nnKFywBqRMYjv5jyjSplD/nbAnboUEGFfdxKw1o34Y1nvycgqjQavhKkmxbORxroBBIDwC5y6SfgENcPPUcOxQ==, @@ -2162,7 +2228,7 @@ packages: postcss: 8.4.21 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values/1.0.1_postcss@8.4.21: + /@csstools/postcss-media-queries-aspect-ratio-number-values@1.0.1(postcss@8.4.21): resolution: { integrity: sha512-V9yQqXdje6OfqDf6EL5iGOpi6N0OEczwYK83rql9UapQwFEryXlAehR5AqH8QqLYb6+y31wUXK6vMxCp0920Zg==, @@ -2171,13 +2237,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-parser-algorithms": 2.0.1(@csstools/css-tokenizer@2.1.0) "@csstools/css-tokenizer": 2.1.0 - "@csstools/media-query-list-parser": 2.0.1_ppok7cytzjc65mcyxmtit3wdyi + "@csstools/media-query-list-parser": 2.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0) postcss: 8.4.21 dev: true - /@csstools/postcss-nested-calc/2.0.2_postcss@8.4.21: + /@csstools/postcss-nested-calc@2.0.2(postcss@8.4.21): resolution: { integrity: sha512-jbwrP8rN4e7LNaRcpx3xpMUjhtt34I9OV+zgbcsYAAk6k1+3kODXJBf95/JMYWhu9g1oif7r06QVUgfWsKxCFw==, @@ -2190,7 +2256,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values/2.0.1_postcss@8.4.21: + /@csstools/postcss-normalize-display-values@2.0.1(postcss@8.4.21): resolution: { integrity: sha512-TQT5g3JQ5gPXC239YuRK8jFceXF9d25ZvBkyjzBGGoW5st5sPXFVQS8OjYb9IJ/K3CdfK4528y483cgS2DJR/w==, @@ -2203,7 +2269,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function/2.1.0_postcss@8.4.21: + /@csstools/postcss-oklab-function@2.1.0(postcss@8.4.21): resolution: { integrity: sha512-U/odSNjOVhagNRu+RDaNVbn8vaqA9GyCOoneQA2je7697KOrtRDc7/POrYsP7QioO2aaezDzKNX02wBzc99fkQ==, @@ -2213,12 +2279,12 @@ packages: postcss: ^8.4 dependencies: "@csstools/color-helpers": 1.0.0 - "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + "@csstools/postcss-progressive-custom-properties": 2.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-progressive-custom-properties/2.1.0_postcss@8.4.21: + /@csstools/postcss-progressive-custom-properties@2.1.0(postcss@8.4.21): resolution: { integrity: sha512-tRX1rinsXajZlc4WiU7s9Y6O9EdSHScT997zDsvDUjQ1oZL2nvnL6Bt0s9KyQZZTdC3lrG2PIdBqdOIWXSEPlQ==, @@ -2231,7 +2297,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-scope-pseudo-class/2.0.2_postcss@8.4.21: + /@csstools/postcss-scope-pseudo-class@2.0.2(postcss@8.4.21): resolution: { integrity: sha512-6Pvo4uexUCXt+Hz5iUtemQAcIuCYnL+ePs1khFR6/xPgC92aQLJ0zGHonWoewiBE+I++4gXK3pr+R1rlOFHe5w==, @@ -2244,7 +2310,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /@csstools/postcss-stepped-value-functions/2.0.1_postcss@8.4.21: + /@csstools/postcss-stepped-value-functions@2.0.1(postcss@8.4.21): resolution: { integrity: sha512-VimD+M69GsZF/XssivjUwo6jXLgi86ar/gRSH7bautnCULSLxCr/HuY32N4rLRUr7qWF8oF/JTv06ceb66Q1jA==, @@ -2257,7 +2323,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-text-decoration-shorthand/2.2.1_postcss@8.4.21: + /@csstools/postcss-text-decoration-shorthand@2.2.1(postcss@8.4.21): resolution: { integrity: sha512-Ow6/cWWdjjVvA83mkm3kLRvvWsbzoe1AbJCxkpC+c9ibUjyS8pifm+LpZslQUKcxRVQ69ztKHDBEbFGTDhNeUw==, @@ -2271,7 +2337,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-trigonometric-functions/2.0.1_postcss@8.4.21: + /@csstools/postcss-trigonometric-functions@2.0.1(postcss@8.4.21): resolution: { integrity: sha512-uGmmVWGHozyWe6+I4w321fKUC034OB1OYW0ZP4ySHA23n+r9y93K+1yrmW+hThpSfApKhaWySoD4I71LLlFUYQ==, @@ -2284,7 +2350,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-unset-value/2.0.1_postcss@8.4.21: + /@csstools/postcss-unset-value@2.0.1(postcss@8.4.21): resolution: { integrity: sha512-oJ9Xl29/yU8U7/pnMJRqAZd4YXNCfGEdcP4ywREuqm/xMqcgDNDppYRoCGDt40aaZQIEKBS79LytUDN/DHf0Ew==, @@ -2296,7 +2362,7 @@ packages: postcss: 8.4.21 dev: true - /@csstools/selector-specificity/2.1.1_wajs5nedgkikc5pcuwett7legi: + /@csstools/selector-specificity@2.1.1(postcss-selector-parser@6.0.11)(postcss@8.4.21): resolution: { integrity: sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==, @@ -2310,19 +2376,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /@esbuild/android-arm/0.17.12: - resolution: - { - integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64/0.17.12: + /@esbuild/android-arm64@0.17.12: resolution: { integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==, @@ -2334,7 +2388,19 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.12: + /@esbuild/android-arm@0.17.12: + resolution: + { + integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.12: resolution: { integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==, @@ -2346,7 +2412,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.12: + /@esbuild/darwin-arm64@0.17.12: resolution: { integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==, @@ -2358,7 +2424,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.12: + /@esbuild/darwin-x64@0.17.12: resolution: { integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==, @@ -2370,7 +2436,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.12: + /@esbuild/freebsd-arm64@0.17.12: resolution: { integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==, @@ -2382,7 +2448,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.12: + /@esbuild/freebsd-x64@0.17.12: resolution: { integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==, @@ -2394,19 +2460,7 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.17.12: - resolution: - { - integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64/0.17.12: + /@esbuild/linux-arm64@0.17.12: resolution: { integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==, @@ -2418,7 +2472,19 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.12: + /@esbuild/linux-arm@0.17.12: + resolution: + { + integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.12: resolution: { integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==, @@ -2430,7 +2496,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.12: + /@esbuild/linux-loong64@0.17.12: resolution: { integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==, @@ -2442,7 +2508,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.12: + /@esbuild/linux-mips64el@0.17.12: resolution: { integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==, @@ -2454,7 +2520,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.12: + /@esbuild/linux-ppc64@0.17.12: resolution: { integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==, @@ -2466,7 +2532,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.12: + /@esbuild/linux-riscv64@0.17.12: resolution: { integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==, @@ -2478,7 +2544,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.12: + /@esbuild/linux-s390x@0.17.12: resolution: { integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==, @@ -2490,7 +2556,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.12: + /@esbuild/linux-x64@0.17.12: resolution: { integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==, @@ -2502,7 +2568,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.12: + /@esbuild/netbsd-x64@0.17.12: resolution: { integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==, @@ -2514,7 +2580,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.12: + /@esbuild/openbsd-x64@0.17.12: resolution: { integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==, @@ -2526,7 +2592,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.12: + /@esbuild/sunos-x64@0.17.12: resolution: { integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==, @@ -2538,7 +2604,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.12: + /@esbuild/win32-arm64@0.17.12: resolution: { integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==, @@ -2550,7 +2616,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.12: + /@esbuild/win32-ia32@0.17.12: resolution: { integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==, @@ -2562,7 +2628,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.12: + /@esbuild/win32-x64@0.17.12: resolution: { integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==, @@ -2574,7 +2640,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils/4.2.0_eslint@8.36.0: + /@eslint-community/eslint-utils@4.2.0(eslint@8.36.0): resolution: { integrity: sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==, @@ -2587,7 +2653,7 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@eslint-community/regexpp/4.4.0: + /@eslint-community/regexpp@4.4.0: resolution: { integrity: sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==, @@ -2595,7 +2661,7 @@ packages: engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } dev: true - /@eslint/eslintrc/2.0.1: + /@eslint/eslintrc@2.0.1: resolution: { integrity: sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==, @@ -2615,7 +2681,7 @@ packages: - supports-color dev: true - /@eslint/js/8.36.0: + /@eslint/js@8.36.0: resolution: { integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==, @@ -2623,14 +2689,14 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /@floating-ui/core/1.2.4: + /@floating-ui/core@1.2.4: resolution: { integrity: sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==, } dev: false - /@floating-ui/dom/1.2.5: + /@floating-ui/dom@1.2.5: resolution: { integrity: sha512-+sAUfpQ3Frz+VCbPCqj+cZzvEESy3fjSeT/pDWkYCWOBXYNNKZfuVsHuv8/JO2zze8+Eb/Q7a6hZVgzS81fLbQ==, @@ -2639,7 +2705,7 @@ packages: "@floating-ui/core": 1.2.4 dev: false - /@foliojs-fork/fontkit/1.9.1: + /@foliojs-fork/fontkit@1.9.1: resolution: { integrity: sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==, @@ -2657,7 +2723,7 @@ packages: unicode-trie: 2.0.0 dev: false - /@foliojs-fork/linebreak/1.1.1: + /@foliojs-fork/linebreak@1.1.1: resolution: { integrity: sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==, @@ -2668,7 +2734,7 @@ packages: unicode-trie: 2.0.0 dev: false - /@foliojs-fork/pdfkit/0.13.0: + /@foliojs-fork/pdfkit@0.13.0: resolution: { integrity: sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==, @@ -2680,35 +2746,35 @@ packages: png-js: 1.0.0 dev: false - /@foliojs-fork/restructure/2.0.2: + /@foliojs-fork/restructure@2.0.2: resolution: { integrity: sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==, } dev: false - /@github/clipboard-copy-element/1.1.2: + /@github/clipboard-copy-element@1.1.2: resolution: { integrity: sha512-L6CMrcA5we0udafvoSuRCE/Ci/3xrLWKYRGup2IlhxF771bQYsQ2EB1of182pI8ZWM4oxgwzu37+igMeoZjN/A==, } dev: false - /@github/hotkey/2.0.1: + /@github/hotkey@2.0.1: resolution: { integrity: sha512-qKXjAJjtheJbf4ie3hi8IwrHWJZHB5qdojR6JGo6jvQNPpsdUbk/NIdU8sxu4PW41CjW80vfciDMu3MAP3j2Fg==, } dev: false - /@github/markdown-toolbar-element/2.1.1: + /@github/markdown-toolbar-element@2.1.1: resolution: { integrity: sha512-J++rpd5H9baztabJQB82h26jtueOeBRSTqetk9Cri+Lj/s28ndu6Tovn0uHQaOKtBWDobFunk9b5pP5vcqt7cA==, } dev: false - /@github/time-elements/4.0.0: + /@github/time-elements@4.0.0: resolution: { integrity: sha512-oTPpERR/FylYCyUdVjufmF5MmlrIZ7gYzN59xe5mF3aQA+zn5IWiNj+5/D/6NgQWFNXoRB84DILnP/YlkETKhg==, @@ -2716,7 +2782,7 @@ packages: deprecated: Please use @github/relative-time-element insteadd dev: false - /@humanwhocodes/config-array/0.11.8: + /@humanwhocodes/config-array@0.11.8: resolution: { integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==, @@ -2730,7 +2796,7 @@ packages: - supports-color dev: true - /@humanwhocodes/module-importer/1.0.1: + /@humanwhocodes/module-importer@1.0.1: resolution: { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, @@ -2738,14 +2804,14 @@ packages: engines: { node: ">=12.22" } dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: { integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, } dev: true - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: { integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, @@ -2756,7 +2822,7 @@ packages: "@jridgewell/sourcemap-codec": 1.4.14 dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: { integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==, @@ -2768,7 +2834,7 @@ packages: "@jridgewell/trace-mapping": 0.3.17 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: { integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, @@ -2776,7 +2842,7 @@ packages: engines: { node: ">=6.0.0" } dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: { integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, @@ -2784,7 +2850,7 @@ packages: engines: { node: ">=6.0.0" } dev: true - /@jridgewell/source-map/0.3.2: + /@jridgewell/source-map@0.3.2: resolution: { integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==, @@ -2794,14 +2860,14 @@ packages: "@jridgewell/trace-mapping": 0.3.17 dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: { integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, } dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: { integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==, @@ -2811,7 +2877,7 @@ packages: "@jridgewell/sourcemap-codec": 1.4.14 dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, @@ -2821,14 +2887,14 @@ packages: "@jridgewell/sourcemap-codec": 1.4.14 dev: true - /@lezer/common/1.0.2: + /@lezer/common@1.0.2: resolution: { integrity: sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng==, } dev: false - /@lezer/highlight/1.1.3: + /@lezer/highlight@1.1.3: resolution: { integrity: sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==, @@ -2837,7 +2903,7 @@ packages: "@lezer/common": 1.0.2 dev: false - /@lezer/lr/1.3.3: + /@lezer/lr@1.3.3: resolution: { integrity: sha512-JPQe3mwJlzEVqy67iQiiGozhcngbO8QBgpqZM6oL1Wj/dXckrEexpBLeFkq0edtW5IqnPRFxA24BHJni8Js69w==, @@ -2846,7 +2912,7 @@ packages: "@lezer/common": 1.0.2 dev: false - /@lezer/xml/1.0.1: + /@lezer/xml@1.0.1: resolution: { integrity: sha512-jMDXrV953sDAUEMI25VNrI9dz94Ai96FfeglytFINhhwQ867HKlCE2jt3AwZTCT7M528WxdDWv/Ty8e9wizwmQ==, @@ -2856,21 +2922,21 @@ packages: "@lezer/lr": 1.3.3 dev: false - /@lit-labs/ssr-dom-shim/1.0.0: + /@lit-labs/ssr-dom-shim@1.0.0: resolution: { integrity: sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==, } dev: false - /@lit-labs/ssr-dom-shim/1.1.0: + /@lit-labs/ssr-dom-shim@1.1.0: resolution: { integrity: sha512-92uQ5ARf7UXYrzaFcAX3T2rTvaS9Z1//ukV+DqjACM4c8s0ZBQd7ayJU5Dh2AFLD/Ayuyz4uMmxQec8q3U4Ong==, } dev: false - /@lit/reactive-element/1.6.1: + /@lit/reactive-element@1.6.1: resolution: { integrity: sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==, @@ -2879,7 +2945,7 @@ packages: "@lit-labs/ssr-dom-shim": 1.0.0 dev: false - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, @@ -2890,7 +2956,7 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, @@ -2898,7 +2964,7 @@ packages: engines: { node: ">= 8" } dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, @@ -2909,7 +2975,7 @@ packages: fastq: 1.15.0 dev: true - /@octokit/auth-token/3.0.3: + /@octokit/auth-token@3.0.3: resolution: { integrity: sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==, @@ -2919,7 +2985,7 @@ packages: "@octokit/types": 9.0.0 dev: true - /@octokit/core/4.2.0: + /@octokit/core@4.2.0: resolution: { integrity: sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==, @@ -2937,7 +3003,7 @@ packages: - encoding dev: true - /@octokit/endpoint/7.0.5: + /@octokit/endpoint@7.0.5: resolution: { integrity: sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==, @@ -2949,7 +3015,7 @@ packages: universal-user-agent: 6.0.0 dev: true - /@octokit/graphql/5.0.5: + /@octokit/graphql@5.0.5: resolution: { integrity: sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==, @@ -2963,14 +3029,14 @@ packages: - encoding dev: true - /@octokit/openapi-types/16.0.0: + /@octokit/openapi-types@16.0.0: resolution: { integrity: sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==, } dev: true - /@octokit/plugin-paginate-rest/6.0.0_@octokit+core@4.2.0: + /@octokit/plugin-paginate-rest@6.0.0(@octokit/core@4.2.0): resolution: { integrity: sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==, @@ -2983,7 +3049,7 @@ packages: "@octokit/types": 9.0.0 dev: true - /@octokit/plugin-request-log/1.0.4_@octokit+core@4.2.0: + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.0): resolution: { integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==, @@ -2994,7 +3060,7 @@ packages: "@octokit/core": 4.2.0 dev: true - /@octokit/plugin-rest-endpoint-methods/7.0.1_@octokit+core@4.2.0: + /@octokit/plugin-rest-endpoint-methods@7.0.1(@octokit/core@4.2.0): resolution: { integrity: sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==, @@ -3008,7 +3074,7 @@ packages: deprecation: 2.3.1 dev: true - /@octokit/request-error/3.0.3: + /@octokit/request-error@3.0.3: resolution: { integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==, @@ -3020,7 +3086,7 @@ packages: once: 1.4.0 dev: true - /@octokit/request/6.2.3: + /@octokit/request@6.2.3: resolution: { integrity: sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==, @@ -3037,7 +3103,7 @@ packages: - encoding dev: true - /@octokit/rest/19.0.7: + /@octokit/rest@19.0.7: resolution: { integrity: sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==, @@ -3045,14 +3111,14 @@ packages: engines: { node: ">= 14" } dependencies: "@octokit/core": 4.2.0 - "@octokit/plugin-paginate-rest": 6.0.0_@octokit+core@4.2.0 - "@octokit/plugin-request-log": 1.0.4_@octokit+core@4.2.0 - "@octokit/plugin-rest-endpoint-methods": 7.0.1_@octokit+core@4.2.0 + "@octokit/plugin-paginate-rest": 6.0.0(@octokit/core@4.2.0) + "@octokit/plugin-request-log": 1.0.4(@octokit/core@4.2.0) + "@octokit/plugin-rest-endpoint-methods": 7.0.1(@octokit/core@4.2.0) transitivePeerDependencies: - encoding dev: true - /@octokit/types/9.0.0: + /@octokit/types@9.0.0: resolution: { integrity: sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==, @@ -3061,7 +3127,7 @@ packages: "@octokit/openapi-types": 16.0.0 dev: true - /@pnpm/network.ca-file/1.0.2: + /@pnpm/network.ca-file@1.0.2: resolution: { integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==, @@ -3071,7 +3137,7 @@ packages: graceful-fs: 4.2.10 dev: true - /@pnpm/npm-conf/1.0.5: + /@pnpm/npm-conf@1.0.5: resolution: { integrity: sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==, @@ -3082,7 +3148,7 @@ packages: config-chain: 1.1.13 dev: true - /@rollup/plugin-babel/5.3.1_4tnfxcmsyr7y5qv3uwkivwqysm: + /@rollup/plugin-babel@5.3.1(@babel/core@7.21.0)(rollup@2.79.1): resolution: { integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, @@ -3098,11 +3164,11 @@ packages: dependencies: "@babel/core": 7.21.0 "@babel/helper-module-imports": 7.18.6 - "@rollup/pluginutils": 3.1.0_rollup@2.79.1 + "@rollup/pluginutils": 3.1.0(rollup@2.79.1) rollup: 2.79.1 dev: true - /@rollup/plugin-node-resolve/11.2.1_rollup@2.79.1: + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): resolution: { integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==, @@ -3111,7 +3177,7 @@ packages: peerDependencies: rollup: ^1.20.0||^2.0.0 dependencies: - "@rollup/pluginutils": 3.1.0_rollup@2.79.1 + "@rollup/pluginutils": 3.1.0(rollup@2.79.1) "@types/resolve": 1.17.1 builtin-modules: 3.3.0 deepmerge: 4.3.0 @@ -3120,7 +3186,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/plugin-replace/2.4.2_rollup@2.79.1: + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): resolution: { integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, @@ -3128,12 +3194,12 @@ packages: peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - "@rollup/pluginutils": 3.1.0_rollup@2.79.1 + "@rollup/pluginutils": 3.1.0(rollup@2.79.1) magic-string: 0.25.9 rollup: 2.79.1 dev: true - /@rollup/plugin-replace/5.0.2_rollup@3.17.2: + /@rollup/plugin-replace@5.0.2(rollup@3.17.2): resolution: { integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==, @@ -3145,12 +3211,12 @@ packages: rollup: optional: true dependencies: - "@rollup/pluginutils": 5.0.2_rollup@3.17.2 + "@rollup/pluginutils": 5.0.2(rollup@3.17.2) magic-string: 0.27.0 rollup: 3.17.2 dev: true - /@rollup/pluginutils/3.1.0_rollup@2.79.1: + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: { integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, @@ -3165,7 +3231,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils/5.0.2_rollup@3.17.2: + /@rollup/pluginutils@5.0.2(rollup@3.17.2): resolution: { integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==, @@ -3183,7 +3249,7 @@ packages: rollup: 3.17.2 dev: true - /@semantic-release/changelog/6.0.2_semantic-release@20.1.3: + /@semantic-release/changelog@6.0.2(semantic-release@20.1.3): resolution: { integrity: sha512-jHqfTkoPbDEOAgAP18mGP53IxeMwxTISN+GwTRy9uLu58UjARoZU8ScCgWGeO2WPkEsm57H8AkyY02W2ntIlIw==, @@ -3199,7 +3265,7 @@ packages: semantic-release: 20.1.3 dev: true - /@semantic-release/commit-analyzer/9.0.2_semantic-release@20.1.3: + /@semantic-release/commit-analyzer@9.0.2(semantic-release@20.1.3): resolution: { integrity: sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==, @@ -3220,7 +3286,7 @@ packages: - supports-color dev: true - /@semantic-release/error/3.0.0: + /@semantic-release/error@3.0.0: resolution: { integrity: sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==, @@ -3228,7 +3294,7 @@ packages: engines: { node: ">=14.17" } dev: true - /@semantic-release/exec/6.0.3_semantic-release@20.1.3: + /@semantic-release/exec@6.0.3(semantic-release@20.1.3): resolution: { integrity: sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==, @@ -3248,7 +3314,7 @@ packages: - supports-color dev: true - /@semantic-release/git/10.0.1_semantic-release@20.1.3: + /@semantic-release/git@10.0.1(semantic-release@20.1.3): resolution: { integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==, @@ -3270,7 +3336,7 @@ packages: - supports-color dev: true - /@semantic-release/github/8.0.7_semantic-release@20.1.3: + /@semantic-release/github@8.0.7(semantic-release@20.1.3): resolution: { integrity: sha512-VtgicRIKGvmTHwm//iqTh/5NGQwsncOMR5vQK9pMT92Aem7dv37JFKKRuulUsAnUOIlO4G8wH3gPiBAA0iW0ww==, @@ -3301,7 +3367,7 @@ packages: - supports-color dev: true - /@semantic-release/gitlab/11.0.1_semantic-release@20.1.3: + /@semantic-release/gitlab@11.0.1(semantic-release@20.1.3): resolution: { integrity: sha512-CWXHlLZonwrUR2pbYaoERVu1cDVsi5W4H0WXDDCcDwicMmizsTkKJlpP9CQowoluqHKIJYrLkr2b+lYXCnBJZw==, @@ -3328,7 +3394,7 @@ packages: - supports-color dev: true - /@semantic-release/npm/9.0.2_semantic-release@20.1.3: + /@semantic-release/npm@9.0.2(semantic-release@20.1.3): resolution: { integrity: sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==, @@ -3353,7 +3419,7 @@ packages: tempy: 1.0.1 dev: true - /@semantic-release/release-notes-generator/10.0.3_semantic-release@20.1.3: + /@semantic-release/release-notes-generator@10.0.3(semantic-release@20.1.3): resolution: { integrity: sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==, @@ -3377,7 +3443,7 @@ packages: - supports-color dev: true - /@sindresorhus/is/5.3.0: + /@sindresorhus/is@5.3.0: resolution: { integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==, @@ -3385,7 +3451,7 @@ packages: engines: { node: ">=14.16" } dev: true - /@stencil/core/2.5.2: + /@stencil/core@2.5.2: resolution: { integrity: sha512-bgjPXkSzzg1WnTgVUm6m5ZzpKt602WmA/QljODAW1xVN40OHJdbGblzF/F6MFzqv2c5Cy30CB41arc8qADIdcQ==, @@ -3394,7 +3460,7 @@ packages: hasBin: true dev: false - /@surma/rollup-plugin-off-main-thread/2.2.3: + /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: { integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, @@ -3406,7 +3472,7 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /@szmarczak/http-timer/5.0.1: + /@szmarczak/http-timer@5.0.1: resolution: { integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, @@ -3416,7 +3482,7 @@ packages: defer-to-connect: 2.0.1 dev: true - /@tailwindcss/forms/0.5.3_tailwindcss@3.2.7: + /@tailwindcss/forms@0.5.3(tailwindcss@3.2.7): resolution: { integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==, @@ -3425,10 +3491,10 @@ packages: tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1" dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.2.7_postcss@8.4.21 + tailwindcss: 3.2.7(postcss@8.4.21)(ts-node@10.9.1) dev: true - /@tailwindcss/line-clamp/0.4.2_tailwindcss@3.2.7: + /@tailwindcss/line-clamp@0.4.2(tailwindcss@3.2.7): resolution: { integrity: sha512-HFzAQuqYCjyy/SX9sLGB1lroPzmcnWv1FHkIpmypte10hptf4oPUfucryMKovZh2u0uiS9U5Ty3GghWfEJGwVw==, @@ -3436,10 +3502,10 @@ packages: peerDependencies: tailwindcss: ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" dependencies: - tailwindcss: 3.2.7_postcss@8.4.21 + tailwindcss: 3.2.7(postcss@8.4.21)(ts-node@10.9.1) dev: true - /@tailwindcss/nesting/0.0.0-insiders.565cd3e_postcss@8.4.21: + /@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.21): resolution: { integrity: sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==, @@ -3448,10 +3514,10 @@ packages: postcss: ^8.2.15 dependencies: postcss: 8.4.21 - postcss-nested: 5.0.6_postcss@8.4.21 + postcss-nested: 5.0.6(postcss@8.4.21) dev: false - /@tailwindcss/typography/0.5.9_tailwindcss@3.2.7: + /@tailwindcss/typography@0.5.9(tailwindcss@3.2.7): resolution: { integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==, @@ -3463,10 +3529,10 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.2.7_postcss@8.4.21 + tailwindcss: 3.2.7(postcss@8.4.21)(ts-node@10.9.1) dev: true - /@tootallnate/once/2.0.0: + /@tootallnate/once@2.0.0: resolution: { integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, @@ -3474,7 +3540,7 @@ packages: engines: { node: ">= 10" } dev: true - /@trysound/sax/0.2.0: + /@trysound/sax@0.2.0: resolution: { integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, @@ -3482,84 +3548,84 @@ packages: engines: { node: ">=10.13.0" } dev: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: { integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, } dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: { integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, } dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: { integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, } dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: { integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==, } dev: true - /@types/debounce/1.2.1: + /@types/debounce@1.2.1: resolution: { integrity: sha512-epMsEE85fi4lfmJUH/89/iV/LI+F5CvNIvmgs5g5jYFPfhO2S/ae8WSsLOKWdwtoaZw9Q2IhJ4tQ5tFCcS/4HA==, } dev: true - /@types/estree/0.0.39: + /@types/estree@0.0.39: resolution: { integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==, } dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: { integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==, } dev: true - /@types/fscreen/1.0.1: + /@types/fscreen@1.0.1: resolution: { integrity: sha512-hV2d0BreihMGtrg+EdAFOIl/O2EL5vhAheHJUztGE/lPFZIN8ZCpGFL8hCbtyi1CfhKjDRCf47sHjP+FwJ4q0Q==, } dev: false - /@types/geojson/7946.0.10: + /@types/geojson@7946.0.10: resolution: { integrity: sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==, } dev: true - /@types/http-cache-semantics/4.0.1: + /@types/http-cache-semantics@4.0.1: resolution: { integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==, } dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: { integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==, } dev: true - /@types/leaflet/1.9.3: + /@types/leaflet@1.9.3: resolution: { integrity: sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==, @@ -3568,35 +3634,35 @@ packages: "@types/geojson": 7946.0.10 dev: true - /@types/marked/4.0.8: + /@types/marked@4.0.8: resolution: { integrity: sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw==, } dev: true - /@types/minimist/1.2.2: + /@types/minimist@1.2.2: resolution: { integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, } dev: true - /@types/node/18.14.0: + /@types/node@18.14.0: resolution: { integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==, } dev: true - /@types/normalize-package-data/2.4.1: + /@types/normalize-package-data@2.4.1: resolution: { integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, } dev: true - /@types/resolve/1.17.1: + /@types/resolve@1.17.1: resolution: { integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, @@ -3605,27 +3671,27 @@ packages: "@types/node": 18.14.0 dev: true - /@types/retry/0.12.0: + /@types/retry@0.12.0: resolution: { integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, } dev: true - /@types/semver/7.3.13: + /@types/semver@7.3.13: resolution: { integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==, } dev: true - /@types/trusted-types/2.0.3: + /@types/trusted-types@2.0.3: resolution: { integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==, } - /@types/wavesurfer.js/6.0.3: + /@types/wavesurfer.js@6.0.3: resolution: { integrity: sha512-5Sb5s3pEkOmDosaaP1DWp1Unnx8HhVorm5608TIVdT5jCMvJ6eqM19UD8n7DEbJ7rzreS9RqHmzR8TlcdQBvbA==, @@ -3634,7 +3700,7 @@ packages: "@types/debounce": 1.2.1 dev: true - /@typescript-eslint/eslint-plugin/5.56.0_2hcjazgfnbtq42tcc73br2vup4: + /@typescript-eslint/eslint-plugin@5.56.0(@typescript-eslint/parser@5.56.0)(eslint@8.36.0)(typescript@5.0.2): resolution: { integrity: sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==, @@ -3649,23 +3715,23 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.4.0 - "@typescript-eslint/parser": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu + "@typescript-eslint/parser": 5.56.0(eslint@8.36.0)(typescript@5.0.2) "@typescript-eslint/scope-manager": 5.56.0 - "@typescript-eslint/type-utils": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu - "@typescript-eslint/utils": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu + "@typescript-eslint/type-utils": 5.56.0(eslint@8.36.0)(typescript@5.0.2) + "@typescript-eslint/utils": 5.56.0(eslint@8.36.0)(typescript@5.0.2) debug: 4.3.4 eslint: 8.36.0 grapheme-splitter: 1.0.4 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: + /@typescript-eslint/parser@5.56.0(eslint@8.36.0)(typescript@5.0.2): resolution: { integrity: sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==, @@ -3680,7 +3746,7 @@ packages: dependencies: "@typescript-eslint/scope-manager": 5.56.0 "@typescript-eslint/types": 5.56.0 - "@typescript-eslint/typescript-estree": 5.56.0_typescript@5.0.2 + "@typescript-eslint/typescript-estree": 5.56.0(typescript@5.0.2) debug: 4.3.4 eslint: 8.36.0 typescript: 5.0.2 @@ -3688,7 +3754,7 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.56.0: + /@typescript-eslint/scope-manager@5.56.0: resolution: { integrity: sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==, @@ -3699,7 +3765,7 @@ packages: "@typescript-eslint/visitor-keys": 5.56.0 dev: true - /@typescript-eslint/type-utils/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: + /@typescript-eslint/type-utils@5.56.0(eslint@8.36.0)(typescript@5.0.2): resolution: { integrity: sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==, @@ -3712,17 +3778,17 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 5.56.0_typescript@5.0.2 - "@typescript-eslint/utils": 5.56.0_j4766f7ecgqbon3u7zlxn5zszu + "@typescript-eslint/typescript-estree": 5.56.0(typescript@5.0.2) + "@typescript-eslint/utils": 5.56.0(eslint@8.36.0)(typescript@5.0.2) debug: 4.3.4 eslint: 8.36.0 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.56.0: + /@typescript-eslint/types@5.56.0: resolution: { integrity: sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==, @@ -3730,7 +3796,7 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /@typescript-eslint/typescript-estree/5.56.0_typescript@5.0.2: + /@typescript-eslint/typescript-estree@5.56.0(typescript@5.0.2): resolution: { integrity: sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==, @@ -3748,13 +3814,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 + tsutils: 3.21.0(typescript@5.0.2) typescript: 5.0.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: + /@typescript-eslint/utils@5.56.0(eslint@8.36.0)(typescript@5.0.2): resolution: { integrity: sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==, @@ -3763,12 +3829,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.2.0_eslint@8.36.0 + "@eslint-community/eslint-utils": 4.2.0(eslint@8.36.0) "@types/json-schema": 7.0.11 "@types/semver": 7.3.13 "@typescript-eslint/scope-manager": 5.56.0 "@typescript-eslint/types": 5.56.0 - "@typescript-eslint/typescript-estree": 5.56.0_typescript@5.0.2 + "@typescript-eslint/typescript-estree": 5.56.0(typescript@5.0.2) eslint: 8.36.0 eslint-scope: 5.1.1 semver: 7.3.8 @@ -3777,7 +3843,7 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.56.0: + /@typescript-eslint/visitor-keys@5.56.0: resolution: { integrity: sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==, @@ -3788,7 +3854,7 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@vime/core/5.4.0: + /@vime/core@5.4.0: resolution: { integrity: sha512-ZP19/+9RDeX8q0dPGW1Au77/c7hqb8Lsd/4zV0pAsld+op/cYVMoByu5wd6luQ0R6AKwe/mYdNTDatAHZlhHZw==, @@ -3801,7 +3867,7 @@ packages: stencil-wormhole: 3.4.1 dev: false - /JSONStream/1.3.5: + /JSONStream@1.3.5: resolution: { integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, @@ -3812,7 +3878,7 @@ packages: through: 2.3.8 dev: true - /acorn-jsx/5.3.2_acorn@8.8.2: + /acorn-jsx@5.3.2(acorn@8.8.2): resolution: { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, @@ -3823,7 +3889,7 @@ packages: acorn: 8.8.2 dev: true - /acorn-node/1.8.2: + /acorn-node@1.8.2: resolution: { integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==, @@ -3833,14 +3899,14 @@ packages: acorn-walk: 7.2.0 xtend: 4.0.2 - /acorn-walk/7.2.0: + /acorn-walk@7.2.0: resolution: { integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, } engines: { node: ">=0.4.0" } - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: { integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, @@ -3848,7 +3914,7 @@ packages: engines: { node: ">=0.4.0" } dev: true - /acorn/7.4.1: + /acorn@7.4.1: resolution: { integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, @@ -3856,7 +3922,7 @@ packages: engines: { node: ">=0.4.0" } hasBin: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: { integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==, @@ -3865,7 +3931,7 @@ packages: hasBin: true dev: true - /adler-32/1.3.1: + /adler-32@1.3.1: resolution: { integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==, @@ -3873,7 +3939,7 @@ packages: engines: { node: ">=0.8" } dev: false - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: { integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, @@ -3885,7 +3951,7 @@ packages: - supports-color dev: true - /aggregate-error/3.1.0: + /aggregate-error@3.1.0: resolution: { integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, @@ -3896,7 +3962,7 @@ packages: indent-string: 4.0.0 dev: true - /aggregate-error/4.0.1: + /aggregate-error@4.0.1: resolution: { integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==, @@ -3907,7 +3973,7 @@ packages: indent-string: 5.0.0 dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, @@ -3919,7 +3985,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.12.0: + /ajv@8.12.0: resolution: { integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, @@ -3931,7 +3997,7 @@ packages: uri-js: 4.4.1 dev: true - /all-contributors-cli/6.24.0: + /all-contributors-cli@6.24.0: resolution: { integrity: sha512-7oSKr2PnqxsOotuSwciltcFTS1eVRdjR0cn99hbElfff7gRQBShVhsf/XBprY41sLcgqTk0l0MKgKv6QNgZdMg==, @@ -3953,7 +4019,7 @@ packages: - encoding dev: true - /amdefine/1.0.1: + /amdefine@1.0.1: resolution: { integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==, @@ -3962,7 +4028,7 @@ packages: dev: false optional: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: { integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, @@ -3972,7 +4038,7 @@ packages: type-fest: 0.21.3 dev: true - /ansi-escapes/5.0.0: + /ansi-escapes@5.0.0: resolution: { integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==, @@ -3982,7 +4048,7 @@ packages: type-fest: 1.4.0 dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, @@ -3990,7 +4056,7 @@ packages: engines: { node: ">=8" } dev: true - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, @@ -3998,7 +4064,7 @@ packages: engines: { node: ">=12" } dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: { integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, @@ -4008,7 +4074,7 @@ packages: color-convert: 1.9.3 dev: true - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, @@ -4018,7 +4084,7 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles/6.2.1: + /ansi-styles@6.2.1: resolution: { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, @@ -4026,14 +4092,14 @@ packages: engines: { node: ">=12" } dev: true - /ansicolors/0.3.2: + /ansicolors@0.3.2: resolution: { integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==, } dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, @@ -4044,49 +4110,49 @@ packages: picomatch: 2.3.1 dev: true - /arg/4.1.3: + /arg@4.1.3: resolution: { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, } dev: true - /arg/5.0.2: + /arg@5.0.2: resolution: { integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, } dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, } dev: true - /argv-formatter/1.0.0: + /argv-formatter@1.0.0: resolution: { integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==, } dev: true - /array-from/2.1.1: + /array-from@2.1.1: resolution: { integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, } dev: false - /array-ify/1.0.0: + /array-ify@1.0.0: resolution: { integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, } dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, @@ -4094,7 +4160,7 @@ packages: engines: { node: ">=8" } dev: true - /arrify/1.0.1: + /arrify@1.0.1: resolution: { integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, @@ -4102,7 +4168,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /ast-transform/0.0.0: + /ast-transform@0.0.0: resolution: { integrity: sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==, @@ -4113,7 +4179,7 @@ packages: through: 2.3.8 dev: false - /ast-types/0.7.8: + /ast-types@0.7.8: resolution: { integrity: sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==, @@ -4121,7 +4187,7 @@ packages: engines: { node: ">= 0.6" } dev: false - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: { integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, @@ -4129,21 +4195,21 @@ packages: engines: { node: ">=8" } dev: true - /async/3.2.4: + /async@3.2.4: resolution: { integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, } dev: true - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, } dev: true - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: { integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, @@ -4151,7 +4217,7 @@ packages: engines: { node: ">= 4.0.0" } dev: true - /autoprefixer/10.4.13_postcss@8.4.21: + /autoprefixer@10.4.13(postcss@8.4.21): resolution: { integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==, @@ -4170,7 +4236,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: { integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, @@ -4178,7 +4244,7 @@ packages: engines: { node: ">= 0.4" } dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.0: + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.0): resolution: { integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==, @@ -4188,13 +4254,13 @@ packages: dependencies: "@babel/compat-data": 7.21.0 "@babel/core": 7.21.0 - "@babel/helper-define-polyfill-provider": 0.3.3_@babel+core@7.21.0 + "@babel/helper-define-polyfill-provider": 0.3.3(@babel/core@7.21.0) semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.0: + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.0): resolution: { integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==, @@ -4203,13 +4269,13 @@ packages: "@babel/core": ^7.0.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-define-polyfill-provider": 0.3.3_@babel+core@7.21.0 + "@babel/helper-define-polyfill-provider": 0.3.3(@babel/core@7.21.0) core-js-compat: 3.28.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.0: + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.0): resolution: { integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==, @@ -4218,46 +4284,46 @@ packages: "@babel/core": ^7.0.0-0 dependencies: "@babel/core": 7.21.0 - "@babel/helper-define-polyfill-provider": 0.3.3_@babel+core@7.21.0 + "@babel/helper-define-polyfill-provider": 0.3.3(@babel/core@7.21.0) transitivePeerDependencies: - supports-color dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, } dev: true - /balanced-match/2.0.0: + /balanced-match@2.0.0: resolution: { integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==, } dev: true - /base64-js/1.3.1: + /base64-js@1.3.1: resolution: { integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==, } dev: false - /base64-js/1.5.1: + /base64-js@1.5.1: resolution: { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, } - /before-after-hook/2.2.3: + /before-after-hook@2.2.3: resolution: { integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, } dev: true - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: { integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, @@ -4265,7 +4331,7 @@ packages: engines: { node: ">=8" } dev: true - /bl/4.1.0: + /bl@4.1.0: resolution: { integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, @@ -4276,21 +4342,21 @@ packages: readable-stream: 3.6.0 dev: true - /boolbase/1.0.0: + /boolbase@1.0.0: resolution: { integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, } dev: true - /bottleneck/2.19.5: + /bottleneck@2.19.5: resolution: { integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, } dev: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, @@ -4300,7 +4366,7 @@ packages: concat-map: 0.0.1 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, @@ -4309,7 +4375,7 @@ packages: balanced-match: 1.0.2 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: { integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, @@ -4319,7 +4385,7 @@ packages: fill-range: 7.0.1 dev: true - /brfs/2.0.2: + /brfs@2.0.2: resolution: { integrity: sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==, @@ -4332,7 +4398,7 @@ packages: through2: 2.0.5 dev: false - /brotli/1.3.3: + /brotli@1.3.3: resolution: { integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==, @@ -4341,7 +4407,7 @@ packages: base64-js: 1.5.1 dev: false - /browser-resolve/1.11.3: + /browser-resolve@1.11.3: resolution: { integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==, @@ -4350,7 +4416,7 @@ packages: resolve: 1.1.7 dev: false - /browserify-optional/1.0.1: + /browserify-optional@1.0.1: resolution: { integrity: sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==, @@ -4361,7 +4427,7 @@ packages: browser-resolve: 1.11.3 dev: false - /browserslist/4.21.5: + /browserslist@4.21.5: resolution: { integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==, @@ -4372,10 +4438,10 @@ packages: caniuse-lite: 1.0.30001457 electron-to-chromium: 1.4.304 node-releases: 2.0.10 - update-browserslist-db: 1.0.10_browserslist@4.21.5 + update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true - /buffer-equal/0.0.1: + /buffer-equal@0.0.1: resolution: { integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==, @@ -4383,13 +4449,13 @@ packages: engines: { node: ">=0.4.0" } dev: false - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, } - /buffer/5.7.1: + /buffer@5.7.1: resolution: { integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, @@ -4399,7 +4465,7 @@ packages: ieee754: 1.2.1 dev: true - /builtin-modules/3.3.0: + /builtin-modules@3.3.0: resolution: { integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, @@ -4407,7 +4473,7 @@ packages: engines: { node: ">=6" } dev: true - /cacheable-lookup/7.0.0: + /cacheable-lookup@7.0.0: resolution: { integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, @@ -4415,7 +4481,7 @@ packages: engines: { node: ">=14.16" } dev: true - /cacheable-request/10.2.7: + /cacheable-request@10.2.7: resolution: { integrity: sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==, @@ -4431,7 +4497,7 @@ packages: responselike: 3.0.0 dev: true - /cachedir/2.3.0: + /cachedir@2.3.0: resolution: { integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==, @@ -4439,7 +4505,7 @@ packages: engines: { node: ">=6" } dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: { integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, @@ -4448,7 +4514,7 @@ packages: function-bind: 1.1.1 get-intrinsic: 1.2.0 - /callsites/3.1.0: + /callsites@3.1.0: resolution: { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, @@ -4456,7 +4522,7 @@ packages: engines: { node: ">=6" } dev: true - /camelcase-css/2.0.1: + /camelcase-css@2.0.1: resolution: { integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, @@ -4464,7 +4530,7 @@ packages: engines: { node: ">= 6" } dev: true - /camelcase-keys/6.2.2: + /camelcase-keys@6.2.2: resolution: { integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, @@ -4476,7 +4542,7 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: { integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, @@ -4484,7 +4550,7 @@ packages: engines: { node: ">=6" } dev: true - /caniuse-api/3.0.0: + /caniuse-api@3.0.0: resolution: { integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, @@ -4496,14 +4562,14 @@ packages: lodash.uniq: 4.5.0 dev: true - /caniuse-lite/1.0.30001457: + /caniuse-lite@1.0.30001457: resolution: { integrity: sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==, } dev: true - /cardinal/2.1.1: + /cardinal@2.1.1: resolution: { integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==, @@ -4514,7 +4580,7 @@ packages: redeyed: 2.1.1 dev: true - /cfb/1.2.2: + /cfb@1.2.2: resolution: { integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==, @@ -4525,7 +4591,7 @@ packages: crc-32: 1.2.2 dev: false - /chalk/2.4.2: + /chalk@2.4.2: resolution: { integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, @@ -4537,7 +4603,7 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, @@ -4548,7 +4614,7 @@ packages: supports-color: 7.2.0 dev: true - /chalk/5.2.0: + /chalk@5.2.0: resolution: { integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==, @@ -4556,14 +4622,14 @@ packages: engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } dev: true - /chardet/0.7.0: + /chardet@0.7.0: resolution: { integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, } dev: true - /choices.js/10.2.0: + /choices.js@10.2.0: resolution: { integrity: sha512-8PKy6wq7BMjNwDTZwr3+Zry6G2+opJaAJDDA/j3yxvqSCnvkKe7ZIFfIyOhoc7htIWFhsfzF9tJpGUATcpUtPg==, @@ -4574,7 +4640,7 @@ packages: redux: 4.2.1 dev: false - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: { integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, @@ -4592,7 +4658,7 @@ packages: fsevents: 2.3.2 dev: true - /ci-info/3.8.0: + /ci-info@3.8.0: resolution: { integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==, @@ -4600,7 +4666,7 @@ packages: engines: { node: ">=8" } dev: true - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: { integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, @@ -4608,7 +4674,7 @@ packages: engines: { node: ">=6" } dev: true - /clean-stack/4.2.0: + /clean-stack@4.2.0: resolution: { integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==, @@ -4618,7 +4684,7 @@ packages: escape-string-regexp: 5.0.0 dev: true - /cli-cursor/3.1.0: + /cli-cursor@3.1.0: resolution: { integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, @@ -4628,7 +4694,7 @@ packages: restore-cursor: 3.1.0 dev: true - /cli-spinners/2.7.0: + /cli-spinners@2.7.0: resolution: { integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==, @@ -4636,7 +4702,7 @@ packages: engines: { node: ">=6" } dev: true - /cli-table3/0.6.3: + /cli-table3@0.6.3: resolution: { integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, @@ -4648,7 +4714,7 @@ packages: "@colors/colors": 1.5.0 dev: true - /cli-truncate/2.1.0: + /cli-truncate@2.1.0: resolution: { integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==, @@ -4659,7 +4725,7 @@ packages: string-width: 4.2.3 dev: true - /cli-truncate/3.1.0: + /cli-truncate@3.1.0: resolution: { integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==, @@ -4670,7 +4736,7 @@ packages: string-width: 5.1.2 dev: true - /cli-width/3.0.0: + /cli-width@3.0.0: resolution: { integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, @@ -4678,7 +4744,7 @@ packages: engines: { node: ">= 10" } dev: true - /cliui/6.0.0: + /cliui@6.0.0: resolution: { integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, @@ -4689,7 +4755,7 @@ packages: wrap-ansi: 6.2.0 dev: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, @@ -4701,29 +4767,31 @@ packages: wrap-ansi: 7.0.0 dev: true - /clone/1.0.4: + /clone@1.0.4: resolution: { integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, } engines: { node: ">=0.8" } - /codemirror/6.0.1: + /codemirror@6.0.1(@lezer/common@1.0.2): resolution: { integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.4.2_ipi6fyicmvtccbdgcmxxogx7ni + "@codemirror/autocomplete": 6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.3)(@lezer/common@1.0.2) "@codemirror/commands": 6.2.2 "@codemirror/language": 6.6.0 "@codemirror/lint": 6.1.1 "@codemirror/search": 6.2.3 "@codemirror/state": 6.2.0 "@codemirror/view": 6.9.3 + transitivePeerDependencies: + - "@lezer/common" dev: false - /codepage/1.15.0: + /codepage@1.15.0: resolution: { integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==, @@ -4731,7 +4799,7 @@ packages: engines: { node: ">=0.8" } dev: false - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: { integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, @@ -4740,7 +4808,7 @@ packages: color-name: 1.1.3 dev: true - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, @@ -4750,35 +4818,35 @@ packages: color-name: 1.1.4 dev: true - /color-name/1.1.3: + /color-name@1.1.3: resolution: { integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, } dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, } dev: true - /colord/2.9.3: + /colord@2.9.3: resolution: { integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, } dev: true - /colorette/2.0.19: + /colorette@2.0.19: resolution: { integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==, } dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, @@ -4788,7 +4856,7 @@ packages: delayed-stream: 1.0.0 dev: true - /commander/10.0.0: + /commander@10.0.0: resolution: { integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==, @@ -4796,21 +4864,21 @@ packages: engines: { node: ">=14" } dev: true - /commander/2.20.3: + /commander@2.20.3: resolution: { integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, } dev: true - /commander/7.2.0: + /commander@7.2.0: resolution: { integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, } engines: { node: ">= 10" } - /commitizen/4.3.0: + /commitizen@4.3.0: resolution: { integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==, @@ -4837,7 +4905,7 @@ packages: - "@swc/wasm" dev: true - /common-tags/1.8.2: + /common-tags@1.8.2: resolution: { integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, @@ -4845,7 +4913,7 @@ packages: engines: { node: ">=4.0.0" } dev: true - /compare-func/2.0.0: + /compare-func@2.0.0: resolution: { integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, @@ -4855,14 +4923,14 @@ packages: dot-prop: 5.3.0 dev: true - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, } dev: true - /concat-stream/1.6.2: + /concat-stream@1.6.2: resolution: { integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, @@ -4875,7 +4943,7 @@ packages: typedarray: 0.0.6 dev: false - /config-chain/1.1.13: + /config-chain@1.1.13: resolution: { integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, @@ -4885,7 +4953,7 @@ packages: proto-list: 1.2.4 dev: true - /conventional-changelog-angular/5.0.13: + /conventional-changelog-angular@5.0.13: resolution: { integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, @@ -4896,7 +4964,7 @@ packages: q: 1.5.1 dev: true - /conventional-changelog-conventionalcommits/5.0.0: + /conventional-changelog-conventionalcommits@5.0.0: resolution: { integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==, @@ -4908,7 +4976,7 @@ packages: q: 1.5.1 dev: true - /conventional-changelog-writer/5.0.1: + /conventional-changelog-writer@5.0.1: resolution: { integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==, @@ -4927,14 +4995,14 @@ packages: through2: 4.0.2 dev: true - /conventional-commit-types/3.0.0: + /conventional-commit-types@3.0.0: resolution: { integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==, } dev: true - /conventional-commits-filter/2.0.7: + /conventional-commits-filter@2.0.7: resolution: { integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==, @@ -4945,7 +5013,7 @@ packages: modify-values: 1.0.1 dev: true - /conventional-commits-parser/3.2.4: + /conventional-commits-parser@3.2.4: resolution: { integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, @@ -4961,13 +5029,13 @@ packages: through2: 4.0.2 dev: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: { integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, } - /core-js-compat/3.28.0: + /core-js-compat@3.28.0: resolution: { integrity: sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==, @@ -4976,7 +5044,7 @@ packages: browserslist: 4.21.5 dev: true - /core-js/3.28.0: + /core-js@3.28.0: resolution: { integrity: sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==, @@ -4984,13 +5052,13 @@ packages: requiresBuild: true dev: false - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: { integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, } - /cosmiconfig-typescript-loader/4.3.0_jg2fnlxwfckic3l2an3gqrza7i: + /cosmiconfig-typescript-loader@4.3.0(@types/node@18.14.0)(cosmiconfig@8.0.0)(ts-node@10.9.1)(typescript@5.0.2): resolution: { integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==, @@ -5004,11 +5072,11 @@ packages: dependencies: "@types/node": 18.14.0 cosmiconfig: 8.0.0 - ts-node: 10.9.1_w3gialtd35h6ptuevfzy5ddjvu + ts-node: 10.9.1(@types/node@18.14.0)(typescript@5.0.2) typescript: 5.0.2 dev: true - /cosmiconfig/8.0.0: + /cosmiconfig@8.0.0: resolution: { integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==, @@ -5021,7 +5089,7 @@ packages: path-type: 4.0.0 dev: true - /cosmiconfig/8.1.3: + /cosmiconfig@8.1.3: resolution: { integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==, @@ -5034,7 +5102,7 @@ packages: path-type: 4.0.0 dev: true - /crc-32/1.2.2: + /crc-32@1.2.2: resolution: { integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, @@ -5043,21 +5111,21 @@ packages: hasBin: true dev: false - /create-require/1.1.1: + /create-require@1.1.1: resolution: { integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, } dev: true - /crelt/1.0.5: + /crelt@1.0.5: resolution: { integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==, } dev: false - /cross-env/7.0.3: + /cross-env@7.0.3: resolution: { integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, @@ -5068,7 +5136,7 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, @@ -5080,14 +5148,14 @@ packages: which: 2.0.2 dev: true - /crypto-js/4.1.1: + /crypto-js@4.1.1: resolution: { integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==, } dev: false - /crypto-random-string/2.0.0: + /crypto-random-string@2.0.0: resolution: { integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, @@ -5095,7 +5163,7 @@ packages: engines: { node: ">=8" } dev: true - /css-blank-pseudo/5.0.2_postcss@8.4.21: + /css-blank-pseudo@5.0.2(postcss@8.4.21): resolution: { integrity: sha512-aCU4AZ7uEcVSUzagTlA9pHciz7aWPKA/YzrEkpdSopJ2pvhIxiQ5sYeMz1/KByxlIo4XBdvMNJAVKMg/GRnhfw==, @@ -5108,7 +5176,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /css-declaration-sorter/6.3.1_postcss@8.4.21: + /css-declaration-sorter@6.3.1(postcss@8.4.21): resolution: { integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==, @@ -5120,7 +5188,7 @@ packages: postcss: 8.4.21 dev: true - /css-functions-list/3.1.0: + /css-functions-list@3.1.0: resolution: { integrity: sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==, @@ -5128,7 +5196,7 @@ packages: engines: { node: ">=12.22" } dev: true - /css-has-pseudo/5.0.2_postcss@8.4.21: + /css-has-pseudo@5.0.2(postcss@8.4.21): resolution: { integrity: sha512-q+U+4QdwwB7T9VEW/LyO6CFrLAeLqOykC5mDqJXc7aKZAhDbq7BvGT13VGJe+IwBfdN2o3Xdw2kJ5IxwV1Sc9Q==, @@ -5137,13 +5205,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + "@csstools/selector-specificity": 2.1.1(postcss-selector-parser@6.0.11)(postcss@8.4.21) postcss: 8.4.21 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true - /css-prefers-color-scheme/8.0.2_postcss@8.4.21: + /css-prefers-color-scheme@8.0.2(postcss@8.4.21): resolution: { integrity: sha512-OvFghizHJ45x7nsJJUSYLyQNTzsCU8yWjxAc/nhPQg1pbs18LMoET8N3kOweFDPy0JV0OSXN2iqRFhPBHYOeMA==, @@ -5155,7 +5223,7 @@ packages: postcss: 8.4.21 dev: true - /css-select/4.3.0: + /css-select@4.3.0: resolution: { integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, @@ -5168,7 +5236,7 @@ packages: nth-check: 2.1.1 dev: true - /css-select/5.1.0: + /css-select@5.1.0: resolution: { integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, @@ -5181,7 +5249,7 @@ packages: nth-check: 2.1.1 dev: true - /css-tree/1.1.3: + /css-tree@1.1.3: resolution: { integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, @@ -5192,7 +5260,7 @@ packages: source-map: 0.6.1 dev: true - /css-tree/2.2.1: + /css-tree@2.2.1: resolution: { integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, @@ -5203,7 +5271,7 @@ packages: source-map-js: 1.0.2 dev: true - /css-tree/2.3.1: + /css-tree@2.3.1: resolution: { integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==, @@ -5214,7 +5282,7 @@ packages: source-map-js: 1.0.2 dev: true - /css-what/6.1.0: + /css-what@6.1.0: resolution: { integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, @@ -5222,14 +5290,14 @@ packages: engines: { node: ">= 6" } dev: true - /cssdb/7.4.1: + /cssdb@7.4.1: resolution: { integrity: sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ==, } dev: true - /cssesc/3.0.0: + /cssesc@3.0.0: resolution: { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, @@ -5237,7 +5305,7 @@ packages: engines: { node: ">=4" } hasBin: true - /cssnano-preset-default/5.2.14_postcss@8.4.21: + /cssnano-preset-default@5.2.14(postcss@8.4.21): resolution: { integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==, @@ -5246,39 +5314,39 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.3.1_postcss@8.4.21 - cssnano-utils: 3.1.0_postcss@8.4.21 + css-declaration-sorter: 6.3.1(postcss@8.4.21) + cssnano-utils: 3.1.0(postcss@8.4.21) postcss: 8.4.21 - postcss-calc: 8.2.4_postcss@8.4.21 - postcss-colormin: 5.3.1_postcss@8.4.21 - postcss-convert-values: 5.1.3_postcss@8.4.21 - postcss-discard-comments: 5.1.2_postcss@8.4.21 - postcss-discard-duplicates: 5.1.0_postcss@8.4.21 - postcss-discard-empty: 5.1.1_postcss@8.4.21 - postcss-discard-overridden: 5.1.0_postcss@8.4.21 - postcss-merge-longhand: 5.1.7_postcss@8.4.21 - postcss-merge-rules: 5.1.4_postcss@8.4.21 - postcss-minify-font-values: 5.1.0_postcss@8.4.21 - postcss-minify-gradients: 5.1.1_postcss@8.4.21 - postcss-minify-params: 5.1.4_postcss@8.4.21 - postcss-minify-selectors: 5.2.1_postcss@8.4.21 - postcss-normalize-charset: 5.1.0_postcss@8.4.21 - postcss-normalize-display-values: 5.1.0_postcss@8.4.21 - postcss-normalize-positions: 5.1.1_postcss@8.4.21 - postcss-normalize-repeat-style: 5.1.1_postcss@8.4.21 - postcss-normalize-string: 5.1.0_postcss@8.4.21 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.21 - postcss-normalize-unicode: 5.1.1_postcss@8.4.21 - postcss-normalize-url: 5.1.0_postcss@8.4.21 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.21 - postcss-ordered-values: 5.1.3_postcss@8.4.21 - postcss-reduce-initial: 5.1.2_postcss@8.4.21 - postcss-reduce-transforms: 5.1.0_postcss@8.4.21 - postcss-svgo: 5.1.0_postcss@8.4.21 - postcss-unique-selectors: 5.1.1_postcss@8.4.21 + postcss-calc: 8.2.4(postcss@8.4.21) + postcss-colormin: 5.3.1(postcss@8.4.21) + postcss-convert-values: 5.1.3(postcss@8.4.21) + postcss-discard-comments: 5.1.2(postcss@8.4.21) + postcss-discard-duplicates: 5.1.0(postcss@8.4.21) + postcss-discard-empty: 5.1.1(postcss@8.4.21) + postcss-discard-overridden: 5.1.0(postcss@8.4.21) + postcss-merge-longhand: 5.1.7(postcss@8.4.21) + postcss-merge-rules: 5.1.4(postcss@8.4.21) + postcss-minify-font-values: 5.1.0(postcss@8.4.21) + postcss-minify-gradients: 5.1.1(postcss@8.4.21) + postcss-minify-params: 5.1.4(postcss@8.4.21) + postcss-minify-selectors: 5.2.1(postcss@8.4.21) + postcss-normalize-charset: 5.1.0(postcss@8.4.21) + postcss-normalize-display-values: 5.1.0(postcss@8.4.21) + postcss-normalize-positions: 5.1.1(postcss@8.4.21) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.21) + postcss-normalize-string: 5.1.0(postcss@8.4.21) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.21) + postcss-normalize-unicode: 5.1.1(postcss@8.4.21) + postcss-normalize-url: 5.1.0(postcss@8.4.21) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.21) + postcss-ordered-values: 5.1.3(postcss@8.4.21) + postcss-reduce-initial: 5.1.2(postcss@8.4.21) + postcss-reduce-transforms: 5.1.0(postcss@8.4.21) + postcss-svgo: 5.1.0(postcss@8.4.21) + postcss-unique-selectors: 5.1.1(postcss@8.4.21) dev: true - /cssnano-utils/3.1.0_postcss@8.4.21: + /cssnano-utils@3.1.0(postcss@8.4.21): resolution: { integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==, @@ -5290,7 +5358,7 @@ packages: postcss: 8.4.21 dev: true - /cssnano/5.1.15_postcss@8.4.21: + /cssnano@5.1.15(postcss@8.4.21): resolution: { integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==, @@ -5299,13 +5367,13 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.14_postcss@8.4.21 + cssnano-preset-default: 5.2.14(postcss@8.4.21) lilconfig: 2.0.6 postcss: 8.4.21 yaml: 1.10.2 dev: true - /csso/4.2.0: + /csso@4.2.0: resolution: { integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, @@ -5315,7 +5383,7 @@ packages: css-tree: 1.1.3 dev: true - /csso/5.0.5: + /csso@5.0.5: resolution: { integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, @@ -5325,7 +5393,7 @@ packages: css-tree: 2.2.1 dev: true - /cz-conventional-changelog/3.3.0: + /cz-conventional-changelog@3.3.0: resolution: { integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, @@ -5345,17 +5413,7 @@ packages: - "@swc/wasm" dev: true - /d/1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } - dependencies: - es5-ext: 0.10.62 - type: 1.2.0 - dev: false - - /d3-array/3.2.2: + /d3-array@3.2.2: resolution: { integrity: sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==, @@ -5365,7 +5423,7 @@ packages: internmap: 2.0.3 dev: false - /d3-color/3.1.0: + /d3-color@3.1.0: resolution: { integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, @@ -5373,7 +5431,7 @@ packages: engines: { node: ">=12" } dev: false - /d3-dispatch/3.0.1: + /d3-dispatch@3.0.1: resolution: { integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==, @@ -5381,7 +5439,7 @@ packages: engines: { node: ">=12" } dev: false - /d3-ease/3.0.1: + /d3-ease@3.0.1: resolution: { integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, @@ -5389,7 +5447,7 @@ packages: engines: { node: ">=12" } dev: false - /d3-force/3.0.0: + /d3-force@3.0.0: resolution: { integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==, @@ -5401,7 +5459,7 @@ packages: d3-timer: 3.0.1 dev: false - /d3-geo-projection/4.0.0: + /d3-geo-projection@4.0.0: resolution: { integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==, @@ -5414,7 +5472,7 @@ packages: d3-geo: 3.1.0 dev: false - /d3-geo/3.1.0: + /d3-geo@3.1.0: resolution: { integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==, @@ -5424,7 +5482,7 @@ packages: d3-array: 3.2.2 dev: false - /d3-interpolate/3.0.1: + /d3-interpolate@3.0.1: resolution: { integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, @@ -5434,7 +5492,7 @@ packages: d3-color: 3.1.0 dev: false - /d3-quadtree/3.0.1: + /d3-quadtree@3.0.1: resolution: { integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==, @@ -5442,7 +5500,7 @@ packages: engines: { node: ">=12" } dev: false - /d3-selection/3.0.0: + /d3-selection@3.0.0: resolution: { integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==, @@ -5450,7 +5508,7 @@ packages: engines: { node: ">=12" } dev: false - /d3-timer/3.0.1: + /d3-timer@3.0.1: resolution: { integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, @@ -5458,7 +5516,7 @@ packages: engines: { node: ">=12" } dev: false - /d3-transition/3.0.1_d3-selection@3.0.0: + /d3-transition@3.0.1(d3-selection@3.0.0): resolution: { integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==, @@ -5475,7 +5533,17 @@ packages: d3-timer: 3.0.1 dev: false - /dargs/7.0.0: + /d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: false + + /dargs@7.0.0: resolution: { integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, @@ -5483,21 +5551,21 @@ packages: engines: { node: ">=8" } dev: true - /dash-ast/2.0.1: + /dash-ast@2.0.1: resolution: { integrity: sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==, } dev: false - /dateformat/3.0.3: + /dateformat@3.0.3: resolution: { integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, } dev: true - /debug/4.3.4: + /debug@4.3.4: resolution: { integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, @@ -5512,7 +5580,7 @@ packages: ms: 2.1.2 dev: true - /decamelize-keys/1.1.1: + /decamelize-keys@1.1.1: resolution: { integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, @@ -5523,7 +5591,7 @@ packages: map-obj: 1.0.1 dev: true - /decamelize/1.2.0: + /decamelize@1.2.0: resolution: { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, @@ -5531,7 +5599,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /decompress-response/6.0.0: + /decompress-response@6.0.0: resolution: { integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, @@ -5541,14 +5609,14 @@ packages: mimic-response: 3.1.0 dev: true - /dedent/0.7.0: + /dedent@0.7.0: resolution: { integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, } dev: true - /deep-equal/1.1.1: + /deep-equal@1.1.1: resolution: { integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==, @@ -5562,7 +5630,7 @@ packages: regexp.prototype.flags: 1.4.3 dev: false - /deep-extend/0.6.0: + /deep-extend@0.6.0: resolution: { integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, @@ -5570,20 +5638,20 @@ packages: engines: { node: ">=4.0.0" } dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, } - /deepmerge/4.3.0: + /deepmerge@4.3.0: resolution: { integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==, } engines: { node: ">=0.10.0" } - /defaults/1.0.4: + /defaults@1.0.4: resolution: { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, @@ -5592,7 +5660,7 @@ packages: clone: 1.0.4 dev: true - /defer-to-connect/2.0.1: + /defer-to-connect@2.0.1: resolution: { integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, @@ -5600,7 +5668,7 @@ packages: engines: { node: ">=10" } dev: true - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: { integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==, @@ -5610,14 +5678,14 @@ packages: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /defined/1.0.1: + /defined@1.0.1: resolution: { integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==, } dev: true - /del/6.1.1: + /del@6.1.1: resolution: { integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==, @@ -5634,7 +5702,7 @@ packages: slash: 3.0.0 dev: true - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, @@ -5642,14 +5710,14 @@ packages: engines: { node: ">=0.4.0" } dev: true - /deprecation/2.3.1: + /deprecation@2.3.1: resolution: { integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, } dev: true - /detect-file/1.0.0: + /detect-file@1.0.0: resolution: { integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, @@ -5657,7 +5725,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /detect-indent/6.1.0: + /detect-indent@6.1.0: resolution: { integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, @@ -5665,7 +5733,7 @@ packages: engines: { node: ">=8" } dev: true - /detective/5.2.1: + /detective@5.2.1: resolution: { integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==, @@ -5678,21 +5746,21 @@ packages: minimist: 1.2.8 dev: true - /dfa/1.2.0: + /dfa@1.2.0: resolution: { integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==, } dev: false - /didyoumean/1.2.2: + /didyoumean@1.2.2: resolution: { integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, } dev: true - /diff/4.0.2: + /diff@4.0.2: resolution: { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, @@ -5700,7 +5768,7 @@ packages: engines: { node: ">=0.3.1" } dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, @@ -5710,14 +5778,14 @@ packages: path-type: 4.0.0 dev: true - /dlv/1.1.3: + /dlv@1.1.3: resolution: { integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, } dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: { integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, @@ -5727,7 +5795,7 @@ packages: esutils: 2.0.3 dev: true - /dom-serializer/1.4.1: + /dom-serializer@1.4.1: resolution: { integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, @@ -5738,7 +5806,7 @@ packages: entities: 2.2.0 dev: true - /dom-serializer/2.0.0: + /dom-serializer@2.0.0: resolution: { integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, @@ -5749,14 +5817,14 @@ packages: entities: 4.4.0 dev: true - /domelementtype/2.3.0: + /domelementtype@2.3.0: resolution: { integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, } dev: true - /domhandler/4.3.1: + /domhandler@4.3.1: resolution: { integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, @@ -5766,7 +5834,7 @@ packages: domelementtype: 2.3.0 dev: true - /domhandler/5.0.3: + /domhandler@5.0.3: resolution: { integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, @@ -5776,7 +5844,7 @@ packages: domelementtype: 2.3.0 dev: true - /domutils/2.8.0: + /domutils@2.8.0: resolution: { integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, @@ -5787,7 +5855,7 @@ packages: domhandler: 4.3.1 dev: true - /domutils/3.0.1: + /domutils@3.0.1: resolution: { integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==, @@ -5798,7 +5866,7 @@ packages: domhandler: 5.0.3 dev: true - /dot-prop/5.3.0: + /dot-prop@5.3.0: resolution: { integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, @@ -5808,7 +5876,7 @@ packages: is-obj: 2.0.0 dev: true - /duplexer2/0.1.4: + /duplexer2@0.1.4: resolution: { integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, @@ -5816,14 +5884,14 @@ packages: dependencies: readable-stream: 2.3.7 - /eastasianwidth/0.2.0: + /eastasianwidth@0.2.0: resolution: { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, } dev: true - /ejs/3.1.8: + /ejs@3.1.8: resolution: { integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==, @@ -5834,35 +5902,35 @@ packages: jake: 10.8.5 dev: true - /electron-to-chromium/1.4.304: + /electron-to-chromium@1.4.304: resolution: { integrity: sha512-6c8M+ojPgDIXN2NyfGn8oHASXYnayj+gSEnGeLMKb9zjsySeVB/j7KkNAAG9yDcv8gNlhvFg5REa1N/kQU6pgA==, } dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, } dev: true - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, } dev: true - /entities/2.2.0: + /entities@2.2.0: resolution: { integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, } dev: true - /entities/4.4.0: + /entities@4.4.0: resolution: { integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==, @@ -5870,7 +5938,7 @@ packages: engines: { node: ">=0.12" } dev: true - /env-ci/8.0.0: + /env-ci@8.0.0: resolution: { integrity: sha512-W+3BqGZozFua9MPeXpmTm5eYEBtGgL76jGu/pwMVp/L8PdECSCEWaIp7d4Mw7kuUrbUldK0oV0bNd6ZZjLiMiA==, @@ -5881,7 +5949,7 @@ packages: java-properties: 1.0.2 dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: { integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, @@ -5890,7 +5958,7 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract/1.21.1: + /es-abstract@1.21.1: resolution: { integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==, @@ -5932,7 +6000,7 @@ packages: which-typed-array: 1.1.9 dev: true - /es-set-tostringtag/2.0.1: + /es-set-tostringtag@2.0.1: resolution: { integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==, @@ -5944,7 +6012,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: { integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, @@ -5956,7 +6024,7 @@ packages: is-symbol: 1.0.4 dev: true - /es5-ext/0.10.62: + /es5-ext@0.10.62: resolution: { integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==, @@ -5969,7 +6037,7 @@ packages: next-tick: 1.1.0 dev: false - /es6-iterator/2.0.3: + /es6-iterator@2.0.3: resolution: { integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, @@ -5980,7 +6048,7 @@ packages: es6-symbol: 3.1.3 dev: false - /es6-map/0.1.5: + /es6-map@0.1.5: resolution: { integrity: sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==, @@ -5994,7 +6062,7 @@ packages: event-emitter: 0.3.5 dev: false - /es6-set/0.1.6: + /es6-set@0.1.6: resolution: { integrity: sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==, @@ -6009,7 +6077,7 @@ packages: type: 2.7.2 dev: false - /es6-symbol/3.1.3: + /es6-symbol@3.1.3: resolution: { integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, @@ -6019,7 +6087,7 @@ packages: ext: 1.7.0 dev: false - /esbuild/0.17.12: + /esbuild@0.17.12: resolution: { integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==, @@ -6052,7 +6120,7 @@ packages: "@esbuild/win32-x64": 0.17.12 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: { integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, @@ -6060,7 +6128,7 @@ packages: engines: { node: ">=6" } dev: true - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, @@ -6068,7 +6136,7 @@ packages: engines: { node: ">=0.8.0" } dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, @@ -6076,7 +6144,7 @@ packages: engines: { node: ">=10" } dev: true - /escape-string-regexp/5.0.0: + /escape-string-regexp@5.0.0: resolution: { integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, @@ -6084,7 +6152,7 @@ packages: engines: { node: ">=12" } dev: true - /escodegen/1.14.3: + /escodegen@1.14.3: resolution: { integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, @@ -6100,7 +6168,7 @@ packages: source-map: 0.6.1 dev: false - /escodegen/1.2.0: + /escodegen@1.2.0: resolution: { integrity: sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==, @@ -6115,7 +6183,7 @@ packages: source-map: 0.1.43 dev: false - /eslint-config-prettier/8.8.0_eslint@8.36.0: + /eslint-config-prettier@8.8.0(eslint@8.36.0): resolution: { integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==, @@ -6127,7 +6195,7 @@ packages: eslint: 8.36.0 dev: true - /eslint-plugin-prettier/4.2.1_ose2zoovovx4ulolhifz3tfzx4: + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.36.0)(prettier@2.8.6): resolution: { integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, @@ -6142,12 +6210,12 @@ packages: optional: true dependencies: eslint: 8.36.0 - eslint-config-prettier: 8.8.0_eslint@8.36.0 + eslint-config-prettier: 8.8.0(eslint@8.36.0) prettier: 2.8.6 prettier-linter-helpers: 1.0.0 dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: { integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, @@ -6158,7 +6226,7 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope/7.1.1: + /eslint-scope@7.1.1: resolution: { integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==, @@ -6169,7 +6237,7 @@ packages: estraverse: 5.3.0 dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: { integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==, @@ -6177,7 +6245,7 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /eslint/8.36.0: + /eslint@8.36.0: resolution: { integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==, @@ -6185,7 +6253,7 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.2.0_eslint@8.36.0 + "@eslint-community/eslint-utils": 4.2.0(eslint@8.36.0) "@eslint-community/regexpp": 4.4.0 "@eslint/eslintrc": 2.0.1 "@eslint/js": 8.36.0 @@ -6229,7 +6297,7 @@ packages: - supports-color dev: true - /espree/9.5.0: + /espree@9.5.0: resolution: { integrity: sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==, @@ -6237,11 +6305,11 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) eslint-visitor-keys: 3.3.0 dev: true - /esprima/1.0.4: + /esprima@1.0.4: resolution: { integrity: sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==, @@ -6250,7 +6318,7 @@ packages: hasBin: true dev: false - /esprima/4.0.1: + /esprima@4.0.1: resolution: { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, @@ -6258,7 +6326,7 @@ packages: engines: { node: ">=4" } hasBin: true - /esquery/1.4.2: + /esquery@1.4.2: resolution: { integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==, @@ -6268,7 +6336,7 @@ packages: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, @@ -6278,7 +6346,7 @@ packages: estraverse: 5.3.0 dev: true - /estraverse/1.5.1: + /estraverse@1.5.1: resolution: { integrity: sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==, @@ -6286,14 +6354,14 @@ packages: engines: { node: ">=0.4.0" } dev: false - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: { integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, } engines: { node: ">=4.0" } - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, @@ -6301,28 +6369,28 @@ packages: engines: { node: ">=4.0" } dev: true - /estree-is-function/1.0.0: + /estree-is-function@1.0.0: resolution: { integrity: sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==, } dev: false - /estree-walker/1.0.1: + /estree-walker@1.0.1: resolution: { integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==, } dev: true - /estree-walker/2.0.2: + /estree-walker@2.0.2: resolution: { integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, } dev: true - /esutils/1.0.0: + /esutils@1.0.0: resolution: { integrity: sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==, @@ -6330,14 +6398,14 @@ packages: engines: { node: ">=0.10.0" } dev: false - /esutils/2.0.3: + /esutils@2.0.3: resolution: { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, } engines: { node: ">=0.10.0" } - /event-emitter/0.3.5: + /event-emitter@0.3.5: resolution: { integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, @@ -6347,7 +6415,7 @@ packages: es5-ext: 0.10.62 dev: false - /execa/5.1.1: + /execa@5.1.1: resolution: { integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, @@ -6365,7 +6433,7 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa/6.1.0: + /execa@6.1.0: resolution: { integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==, @@ -6383,7 +6451,7 @@ packages: strip-final-newline: 3.0.0 dev: true - /execa/7.1.0: + /execa@7.1.0: resolution: { integrity: sha512-T6nIJO3LHxUZ6ahVRaxXz9WLEruXLqdcluA+UuTptXmLM7nDAn9lx9IfkxPyzEL21583qSt4RmL44pO71EHaJQ==, @@ -6401,7 +6469,7 @@ packages: strip-final-newline: 3.0.0 dev: true - /expand-tilde/2.0.2: + /expand-tilde@2.0.2: resolution: { integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, @@ -6411,7 +6479,7 @@ packages: homedir-polyfill: 1.0.3 dev: true - /ext/1.7.0: + /ext@1.7.0: resolution: { integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, @@ -6420,7 +6488,7 @@ packages: type: 2.7.2 dev: false - /external-editor/3.1.0: + /external-editor@3.1.0: resolution: { integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, @@ -6432,21 +6500,21 @@ packages: tmp: 0.0.33 dev: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, } dev: true - /fast-diff/1.2.0: + /fast-diff@1.2.0: resolution: { integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==, } dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: { integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, @@ -6460,20 +6528,20 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, } dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, } - /fastest-levenshtein/1.0.16: + /fastest-levenshtein@1.0.16: resolution: { integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, @@ -6481,7 +6549,7 @@ packages: engines: { node: ">= 4.9.1" } dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: { integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, @@ -6490,7 +6558,7 @@ packages: reusify: 1.0.4 dev: true - /figures/2.0.0: + /figures@2.0.0: resolution: { integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==, @@ -6500,7 +6568,7 @@ packages: escape-string-regexp: 1.0.5 dev: true - /figures/3.2.0: + /figures@3.2.0: resolution: { integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, @@ -6510,7 +6578,7 @@ packages: escape-string-regexp: 1.0.5 dev: true - /figures/5.0.0: + /figures@5.0.0: resolution: { integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==, @@ -6521,7 +6589,7 @@ packages: is-unicode-supported: 1.3.0 dev: true - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: { integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, @@ -6531,7 +6599,7 @@ packages: flat-cache: 3.0.4 dev: true - /filelist/1.0.4: + /filelist@1.0.4: resolution: { integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, @@ -6540,7 +6608,7 @@ packages: minimatch: 5.1.6 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: { integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, @@ -6550,7 +6618,7 @@ packages: to-regex-range: 5.0.1 dev: true - /find-node-modules/2.1.3: + /find-node-modules@2.1.3: resolution: { integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==, @@ -6560,14 +6628,14 @@ packages: merge: 2.1.1 dev: true - /find-root/1.1.0: + /find-root@1.1.0: resolution: { integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, } dev: true - /find-up/2.1.0: + /find-up@2.1.0: resolution: { integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, @@ -6577,7 +6645,7 @@ packages: locate-path: 2.0.0 dev: true - /find-up/4.1.0: + /find-up@4.1.0: resolution: { integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, @@ -6588,7 +6656,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, @@ -6599,7 +6667,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/6.3.0: + /find-up@6.3.0: resolution: { integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==, @@ -6610,7 +6678,7 @@ packages: path-exists: 5.0.0 dev: true - /find-versions/5.1.0: + /find-versions@5.1.0: resolution: { integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==, @@ -6620,7 +6688,7 @@ packages: semver-regex: 4.0.5 dev: true - /findup-sync/4.0.0: + /findup-sync@4.0.0: resolution: { integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==, @@ -6633,7 +6701,7 @@ packages: resolve-dir: 1.0.1 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: { integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, @@ -6644,21 +6712,21 @@ packages: rimraf: 3.0.2 dev: true - /flatpickr/4.6.13: + /flatpickr@4.6.13: resolution: { integrity: sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==, } dev: false - /flatted/3.2.7: + /flatted@3.2.7: resolution: { integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, } dev: true - /for-each/0.3.3: + /for-each@0.3.3: resolution: { integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, @@ -6667,7 +6735,7 @@ packages: is-callable: 1.2.7 dev: true - /form-data-encoder/2.1.4: + /form-data-encoder@2.1.4: resolution: { integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==, @@ -6675,7 +6743,7 @@ packages: engines: { node: ">= 14.17" } dev: true - /form-data/4.0.0: + /form-data@4.0.0: resolution: { integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, @@ -6687,7 +6755,7 @@ packages: mime-types: 2.1.35 dev: true - /frac/1.1.2: + /frac@1.1.2: resolution: { integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==, @@ -6695,14 +6763,14 @@ packages: engines: { node: ">=0.8" } dev: false - /fraction.js/4.2.0: + /fraction.js@4.2.0: resolution: { integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==, } dev: true - /from2/2.3.0: + /from2@2.3.0: resolution: { integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==, @@ -6712,7 +6780,7 @@ packages: readable-stream: 2.3.7 dev: true - /fs-extra/11.1.0: + /fs-extra@11.1.0: resolution: { integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==, @@ -6724,7 +6792,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: { integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, @@ -6737,21 +6805,21 @@ packages: universalify: 2.0.0 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, } dev: true - /fscreen/1.2.0: + /fscreen@1.2.0: resolution: { integrity: sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg==, } dev: false - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: { integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, @@ -6762,13 +6830,13 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: { integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, } - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: { integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, @@ -6781,13 +6849,13 @@ packages: functions-have-names: 1.2.3 dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, } - /fuse.js/6.6.2: + /fuse.js@6.6.2: resolution: { integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==, @@ -6795,7 +6863,7 @@ packages: engines: { node: ">=10" } dev: false - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, @@ -6803,14 +6871,14 @@ packages: engines: { node: ">=6.9.0" } dev: true - /get-assigned-identifiers/1.2.0: + /get-assigned-identifiers@1.2.0: resolution: { integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==, } dev: false - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, @@ -6818,7 +6886,7 @@ packages: engines: { node: 6.* || 8.* || >= 10.* } dev: true - /get-intrinsic/1.2.0: + /get-intrinsic@1.2.0: resolution: { integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==, @@ -6828,14 +6896,14 @@ packages: has: 1.0.3 has-symbols: 1.0.3 - /get-own-enumerable-property-symbols/3.0.2: + /get-own-enumerable-property-symbols@3.0.2: resolution: { integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, } dev: true - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, @@ -6843,7 +6911,7 @@ packages: engines: { node: ">=10" } dev: true - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: { integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==, @@ -6854,7 +6922,7 @@ packages: get-intrinsic: 1.2.0 dev: true - /git-log-parser/1.2.0: + /git-log-parser@1.2.0: resolution: { integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==, @@ -6868,7 +6936,7 @@ packages: traverse: 0.6.7 dev: true - /git-raw-commits/2.0.11: + /git-raw-commits@2.0.11: resolution: { integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, @@ -6883,7 +6951,7 @@ packages: through2: 4.0.2 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, @@ -6893,7 +6961,7 @@ packages: is-glob: 4.0.3 dev: true - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, @@ -6903,7 +6971,7 @@ packages: is-glob: 4.0.3 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, @@ -6917,7 +6985,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /global-dirs/0.1.1: + /global-dirs@0.1.1: resolution: { integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, @@ -6927,7 +6995,7 @@ packages: ini: 1.3.8 dev: true - /global-modules/1.0.0: + /global-modules@1.0.0: resolution: { integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, @@ -6939,7 +7007,7 @@ packages: resolve-dir: 1.0.1 dev: true - /global-modules/2.0.0: + /global-modules@2.0.0: resolution: { integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, @@ -6949,7 +7017,7 @@ packages: global-prefix: 3.0.0 dev: true - /global-prefix/1.0.2: + /global-prefix@1.0.2: resolution: { integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, @@ -6963,7 +7031,7 @@ packages: which: 1.3.1 dev: true - /global-prefix/3.0.0: + /global-prefix@3.0.0: resolution: { integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, @@ -6975,7 +7043,7 @@ packages: which: 1.3.1 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: { integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, @@ -6983,7 +7051,7 @@ packages: engines: { node: ">=4" } dev: true - /globals/13.20.0: + /globals@13.20.0: resolution: { integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, @@ -6993,7 +7061,7 @@ packages: type-fest: 0.20.2 dev: true - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: { integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==, @@ -7003,7 +7071,7 @@ packages: define-properties: 1.2.0 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: { integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, @@ -7018,14 +7086,14 @@ packages: slash: 3.0.0 dev: true - /globjoin/0.1.4: + /globjoin@0.1.4: resolution: { integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==, } dev: true - /gopd/1.0.1: + /gopd@1.0.1: resolution: { integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, @@ -7034,7 +7102,7 @@ packages: get-intrinsic: 1.2.0 dev: true - /got/12.5.3: + /got@12.5.3: resolution: { integrity: sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==, @@ -7054,21 +7122,21 @@ packages: responselike: 3.0.0 dev: true - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: { integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, } dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: { integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, } dev: true - /handlebars/4.7.7: + /handlebars@4.7.7: resolution: { integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==, @@ -7084,7 +7152,7 @@ packages: uglify-js: 3.17.4 dev: true - /hard-rejection/2.1.0: + /hard-rejection@2.1.0: resolution: { integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, @@ -7092,14 +7160,14 @@ packages: engines: { node: ">=6" } dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: { integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, } dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: { integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, @@ -7107,7 +7175,7 @@ packages: engines: { node: ">=4" } dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, @@ -7115,7 +7183,7 @@ packages: engines: { node: ">=8" } dev: true - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: { integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, @@ -7123,7 +7191,7 @@ packages: dependencies: get-intrinsic: 1.2.0 - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: { integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, @@ -7131,14 +7199,14 @@ packages: engines: { node: ">= 0.4" } dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: { integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, } engines: { node: ">= 0.4" } - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: { integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, @@ -7147,7 +7215,7 @@ packages: dependencies: has-symbols: 1.0.3 - /has/1.0.3: + /has@1.0.3: resolution: { integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, @@ -7156,7 +7224,7 @@ packages: dependencies: function-bind: 1.1.1 - /homedir-polyfill/1.0.3: + /homedir-polyfill@1.0.3: resolution: { integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, @@ -7166,7 +7234,7 @@ packages: parse-passwd: 1.0.0 dev: true - /hook-std/3.0.0: + /hook-std@3.0.0: resolution: { integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==, @@ -7174,14 +7242,14 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /hosted-git-info/2.8.9: + /hosted-git-info@2.8.9: resolution: { integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, } dev: true - /hosted-git-info/4.1.0: + /hosted-git-info@4.1.0: resolution: { integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, @@ -7191,7 +7259,7 @@ packages: lru-cache: 6.0.0 dev: true - /hosted-git-info/6.1.1: + /hosted-git-info@6.1.1: resolution: { integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==, @@ -7201,7 +7269,7 @@ packages: lru-cache: 7.16.1 dev: true - /hpagent/1.2.0: + /hpagent@1.2.0: resolution: { integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==, @@ -7209,7 +7277,7 @@ packages: engines: { node: ">=14" } dev: true - /html-tags/3.2.0: + /html-tags@3.2.0: resolution: { integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==, @@ -7217,14 +7285,14 @@ packages: engines: { node: ">=8" } dev: true - /http-cache-semantics/4.1.1: + /http-cache-semantics@4.1.1: resolution: { integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, } dev: true - /http-proxy-agent/5.0.0: + /http-proxy-agent@5.0.0: resolution: { integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, @@ -7238,7 +7306,7 @@ packages: - supports-color dev: true - /http2-wrapper/2.2.0: + /http2-wrapper@2.2.0: resolution: { integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==, @@ -7249,7 +7317,7 @@ packages: resolve-alpn: 1.2.1 dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: { integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, @@ -7262,7 +7330,7 @@ packages: - supports-color dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: { integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, @@ -7270,7 +7338,7 @@ packages: engines: { node: ">=10.17.0" } dev: true - /human-signals/3.0.1: + /human-signals@3.0.1: resolution: { integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==, @@ -7278,7 +7346,7 @@ packages: engines: { node: ">=12.20.0" } dev: true - /human-signals/4.3.0: + /human-signals@4.3.0: resolution: { integrity: sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==, @@ -7286,7 +7354,7 @@ packages: engines: { node: ">=14.18.0" } dev: true - /husky/8.0.3: + /husky@8.0.3: resolution: { integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, @@ -7295,7 +7363,7 @@ packages: hasBin: true dev: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: { integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, @@ -7305,7 +7373,7 @@ packages: safer-buffer: 2.1.2 dev: true - /iconv-lite/0.6.3: + /iconv-lite@0.6.3: resolution: { integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, @@ -7315,21 +7383,21 @@ packages: safer-buffer: 2.1.2 dev: false - /idb/7.1.1: + /idb@7.1.1: resolution: { integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, } dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, } dev: true - /ignore/5.2.4: + /ignore@5.2.4: resolution: { integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, @@ -7337,7 +7405,7 @@ packages: engines: { node: ">= 4" } dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, @@ -7348,7 +7416,7 @@ packages: resolve-from: 4.0.0 dev: true - /import-from/4.0.0: + /import-from@4.0.0: resolution: { integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==, @@ -7356,7 +7424,7 @@ packages: engines: { node: ">=12.2" } dev: true - /import-lazy/4.0.0: + /import-lazy@4.0.0: resolution: { integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==, @@ -7364,7 +7432,7 @@ packages: engines: { node: ">=8" } dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, @@ -7372,7 +7440,7 @@ packages: engines: { node: ">=0.8.19" } dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: { integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, @@ -7380,7 +7448,7 @@ packages: engines: { node: ">=8" } dev: true - /indent-string/5.0.0: + /indent-string@5.0.0: resolution: { integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==, @@ -7388,7 +7456,7 @@ packages: engines: { node: ">=12" } dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, @@ -7398,20 +7466,20 @@ packages: wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, } - /ini/1.3.8: + /ini@1.3.8: resolution: { integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, } dev: true - /inquirer/7.3.3: + /inquirer@7.3.3: resolution: { integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==, @@ -7433,7 +7501,7 @@ packages: through: 2.3.8 dev: true - /inquirer/8.2.5: + /inquirer@8.2.5: resolution: { integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, @@ -7457,7 +7525,7 @@ packages: wrap-ansi: 7.0.0 dev: true - /internal-slot/1.0.5: + /internal-slot@1.0.5: resolution: { integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, @@ -7469,7 +7537,7 @@ packages: side-channel: 1.0.4 dev: true - /internmap/2.0.3: + /internmap@2.0.3: resolution: { integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, @@ -7477,7 +7545,7 @@ packages: engines: { node: ">=12" } dev: false - /into-stream/6.0.0: + /into-stream@6.0.0: resolution: { integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==, @@ -7488,7 +7556,7 @@ packages: p-is-promise: 3.0.0 dev: true - /is-arguments/1.1.1: + /is-arguments@1.1.1: resolution: { integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, @@ -7499,7 +7567,7 @@ packages: has-tostringtag: 1.0.0 dev: false - /is-array-buffer/3.0.1: + /is-array-buffer@3.0.1: resolution: { integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==, @@ -7510,14 +7578,14 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, } dev: true - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: { integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, @@ -7526,7 +7594,7 @@ packages: has-bigints: 1.0.2 dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: { integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, @@ -7536,7 +7604,7 @@ packages: binary-extensions: 2.2.0 dev: true - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: { integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, @@ -7547,7 +7615,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, @@ -7555,7 +7623,7 @@ packages: engines: { node: ">= 0.4" } dev: true - /is-ci/3.0.1: + /is-ci@3.0.1: resolution: { integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, @@ -7565,7 +7633,7 @@ packages: ci-info: 3.8.0 dev: true - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: { integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==, @@ -7573,7 +7641,7 @@ packages: dependencies: has: 1.0.3 - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: { integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, @@ -7582,7 +7650,7 @@ packages: dependencies: has-tostringtag: 1.0.0 - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, @@ -7590,7 +7658,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, @@ -7598,7 +7666,7 @@ packages: engines: { node: ">=8" } dev: true - /is-fullwidth-code-point/4.0.0: + /is-fullwidth-code-point@4.0.0: resolution: { integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, @@ -7606,7 +7674,7 @@ packages: engines: { node: ">=12" } dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, @@ -7616,7 +7684,7 @@ packages: is-extglob: 2.1.1 dev: true - /is-interactive/1.0.0: + /is-interactive@1.0.0: resolution: { integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, @@ -7624,14 +7692,14 @@ packages: engines: { node: ">=8" } dev: true - /is-module/1.0.0: + /is-module@1.0.0: resolution: { integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, } dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: { integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, @@ -7639,7 +7707,7 @@ packages: engines: { node: ">= 0.4" } dev: true - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: { integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, @@ -7649,7 +7717,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, @@ -7657,7 +7725,7 @@ packages: engines: { node: ">=0.12.0" } dev: true - /is-obj/1.0.1: + /is-obj@1.0.1: resolution: { integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, @@ -7665,7 +7733,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /is-obj/2.0.0: + /is-obj@2.0.0: resolution: { integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, @@ -7673,7 +7741,7 @@ packages: engines: { node: ">=8" } dev: true - /is-path-cwd/2.2.0: + /is-path-cwd@2.2.0: resolution: { integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==, @@ -7681,7 +7749,7 @@ packages: engines: { node: ">=6" } dev: true - /is-path-inside/3.0.3: + /is-path-inside@3.0.3: resolution: { integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, @@ -7689,7 +7757,7 @@ packages: engines: { node: ">=8" } dev: true - /is-plain-obj/1.1.0: + /is-plain-obj@1.1.0: resolution: { integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, @@ -7697,7 +7765,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /is-plain-object/5.0.0: + /is-plain-object@5.0.0: resolution: { integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, @@ -7705,7 +7773,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: { integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, @@ -7715,7 +7783,7 @@ packages: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-regexp/1.0.0: + /is-regexp@1.0.0: resolution: { integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, @@ -7723,7 +7791,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: { integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, @@ -7732,7 +7800,7 @@ packages: call-bind: 1.0.2 dev: true - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, @@ -7740,7 +7808,7 @@ packages: engines: { node: ">=8" } dev: true - /is-stream/3.0.0: + /is-stream@3.0.0: resolution: { integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, @@ -7748,7 +7816,7 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: { integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, @@ -7758,7 +7826,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: { integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, @@ -7768,7 +7836,7 @@ packages: has-symbols: 1.0.3 dev: true - /is-text-path/1.0.1: + /is-text-path@1.0.1: resolution: { integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, @@ -7778,7 +7846,7 @@ packages: text-extensions: 1.9.0 dev: true - /is-typed-array/1.1.10: + /is-typed-array@1.1.10: resolution: { integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, @@ -7792,7 +7860,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-unicode-supported/0.1.0: + /is-unicode-supported@0.1.0: resolution: { integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, @@ -7800,7 +7868,7 @@ packages: engines: { node: ">=10" } dev: true - /is-unicode-supported/1.3.0: + /is-unicode-supported@1.3.0: resolution: { integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, @@ -7808,14 +7876,14 @@ packages: engines: { node: ">=12" } dev: true - /is-utf8/0.2.1: + /is-utf8@0.2.1: resolution: { integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, } dev: true - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: { integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, @@ -7824,7 +7892,7 @@ packages: call-bind: 1.0.2 dev: true - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: { integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, @@ -7832,20 +7900,20 @@ packages: engines: { node: ">=0.10.0" } dev: true - /isarray/1.0.0: + /isarray@1.0.0: resolution: { integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, } - /isexe/2.0.0: + /isexe@2.0.0: resolution: { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } dev: true - /issue-parser/6.0.0: + /issue-parser@6.0.0: resolution: { integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==, @@ -7859,7 +7927,7 @@ packages: lodash.uniqby: 4.7.0 dev: true - /jake/10.8.5: + /jake@10.8.5: resolution: { integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==, @@ -7873,7 +7941,7 @@ packages: minimatch: 3.1.2 dev: true - /java-properties/1.0.2: + /java-properties@1.0.2: resolution: { integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==, @@ -7881,7 +7949,7 @@ packages: engines: { node: ">= 0.6.0" } dev: true - /jest-worker/26.6.2: + /jest-worker@26.6.2: resolution: { integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, @@ -7893,21 +7961,21 @@ packages: supports-color: 7.2.0 dev: true - /js-sdsl/4.3.0: + /js-sdsl@4.3.0: resolution: { integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==, } dev: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, } dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, @@ -7917,7 +7985,7 @@ packages: argparse: 2.0.1 dev: true - /jsesc/0.5.0: + /jsesc@0.5.0: resolution: { integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, @@ -7925,7 +7993,7 @@ packages: hasBin: true dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: { integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, @@ -7934,14 +8002,14 @@ packages: hasBin: true dev: true - /json-buffer/3.0.1: + /json-buffer@3.0.1: resolution: { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, } dev: true - /json-fixer/1.6.15: + /json-fixer@1.6.15: resolution: { integrity: sha512-TuDuZ5KrgyjoCIppdPXBMqiGfota55+odM+j2cQ5rt/XKyKmqGB3Whz1F8SN8+60yYGy/Nu5lbRZ+rx8kBIvBw==, @@ -7953,56 +8021,56 @@ packages: pegjs: 0.10.0 dev: true - /json-parse-better-errors/1.0.2: + /json-parse-better-errors@1.0.2: resolution: { integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, } dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, } dev: true - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, } dev: true - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, } dev: true - /json-schema/0.4.0: + /json-schema@0.4.0: resolution: { integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, } dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, } dev: true - /json-stringify-safe/5.0.1: + /json-stringify-safe@5.0.1: resolution: { integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, } dev: true - /json5/2.2.3: + /json5@2.2.3: resolution: { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, @@ -8011,7 +8079,7 @@ packages: hasBin: true dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: { integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, @@ -8022,7 +8090,7 @@ packages: graceful-fs: 4.2.10 dev: true - /jsonparse/1.3.1: + /jsonparse@1.3.1: resolution: { integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, @@ -8030,7 +8098,7 @@ packages: engines: { "0": node >= 0.2.0 } dev: true - /jsonpointer/5.0.1: + /jsonpointer@5.0.1: resolution: { integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, @@ -8038,7 +8106,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /keyv/4.5.2: + /keyv@4.5.2: resolution: { integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==, @@ -8047,7 +8115,7 @@ packages: json-buffer: 3.0.1 dev: true - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: { integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, @@ -8055,14 +8123,14 @@ packages: engines: { node: ">=0.10.0" } dev: true - /known-css-properties/0.27.0: + /known-css-properties@0.27.0: resolution: { integrity: sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==, } dev: true - /leaflet.markercluster/1.5.3_leaflet@1.9.3: + /leaflet.markercluster@1.5.3(leaflet@1.9.3): resolution: { integrity: sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==, @@ -8073,14 +8141,14 @@ packages: leaflet: 1.9.3 dev: false - /leaflet/1.9.3: + /leaflet@1.9.3: resolution: { integrity: sha512-iB2cR9vAkDOu5l3HAay2obcUHZ7xwUBBjph8+PGtmW/2lYhbLizWtG7nTeYht36WfOslixQF9D/uSIzhZgGMfQ==, } dev: false - /leven/3.1.0: + /leven@3.1.0: resolution: { integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, @@ -8088,7 +8156,7 @@ packages: engines: { node: ">=6" } dev: true - /levn/0.3.0: + /levn@0.3.0: resolution: { integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, @@ -8099,7 +8167,7 @@ packages: type-check: 0.3.2 dev: false - /levn/0.4.1: + /levn@0.4.1: resolution: { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, @@ -8110,7 +8178,7 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.6: + /lilconfig@2.0.6: resolution: { integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==, @@ -8118,7 +8186,7 @@ packages: engines: { node: ">=10" } dev: true - /lilconfig/2.1.0: + /lilconfig@2.1.0: resolution: { integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, @@ -8126,14 +8194,14 @@ packages: engines: { node: ">=10" } dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, } dev: true - /lint-staged/13.2.0: + /lint-staged@13.2.0: resolution: { integrity: sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==, @@ -8159,7 +8227,7 @@ packages: - supports-color dev: true - /listr2/5.0.7: + /listr2@5.0.7: resolution: { integrity: sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==, @@ -8181,7 +8249,7 @@ packages: wrap-ansi: 7.0.0 dev: true - /lit-element/3.3.0: + /lit-element@3.3.0: resolution: { integrity: sha512-M3OIoblNS7LZdRxOIk8g0wyLEA/lRw/UGJ1TX+767OpkuDsRdSoxBIvewpWqCo7sMd9xt1XedUNZIr9jUO1X3g==, @@ -8192,7 +8260,7 @@ packages: lit-html: 2.7.0 dev: false - /lit-html/2.7.0: + /lit-html@2.7.0: resolution: { integrity: sha512-/zPOl8EfeB3HHpTzINSpnWgvgQ8N07g/j272EOAIyB0Ys2RzBqTVT23i+JZuUlNbB2WHHeSsTCFi92NtWrtpqQ==, @@ -8201,7 +8269,7 @@ packages: "@types/trusted-types": 2.0.3 dev: false - /lit/2.7.0: + /lit@2.7.0: resolution: { integrity: sha512-qSy2BAVA+OiWtNptP404egcC/izDdNRw6iHGIbUmkZtbMJvPKfNsaoKrNs8Zmsbjmv5ZX2tur1l9TfzkSWWT4g==, @@ -8212,7 +8280,7 @@ packages: lit-html: 2.7.0 dev: false - /load-json-file/4.0.0: + /load-json-file@4.0.0: resolution: { integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, @@ -8225,7 +8293,7 @@ packages: strip-bom: 3.0.0 dev: true - /locate-path/2.0.0: + /locate-path@2.0.0: resolution: { integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, @@ -8236,7 +8304,7 @@ packages: path-exists: 3.0.0 dev: true - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: { integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, @@ -8246,7 +8314,7 @@ packages: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, @@ -8256,7 +8324,7 @@ packages: p-locate: 5.0.0 dev: true - /locate-path/7.2.0: + /locate-path@7.2.0: resolution: { integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, @@ -8266,168 +8334,168 @@ packages: p-locate: 6.0.0 dev: true - /lodash-es/4.17.21: + /lodash-es@4.17.21: resolution: { integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, } dev: true - /lodash.camelcase/4.3.0: + /lodash.camelcase@4.3.0: resolution: { integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, } dev: true - /lodash.capitalize/4.2.1: + /lodash.capitalize@4.2.1: resolution: { integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==, } dev: true - /lodash.castarray/4.4.0: + /lodash.castarray@4.4.0: resolution: { integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==, } dev: true - /lodash.debounce/4.0.8: + /lodash.debounce@4.0.8: resolution: { integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, } dev: true - /lodash.escaperegexp/4.1.2: + /lodash.escaperegexp@4.1.2: resolution: { integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==, } dev: true - /lodash.isfunction/3.0.9: + /lodash.isfunction@3.0.9: resolution: { integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==, } dev: true - /lodash.ismatch/4.4.0: + /lodash.ismatch@4.4.0: resolution: { integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, } dev: true - /lodash.isplainobject/4.0.6: + /lodash.isplainobject@4.0.6: resolution: { integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, } dev: true - /lodash.isstring/4.0.1: + /lodash.isstring@4.0.1: resolution: { integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, } dev: true - /lodash.kebabcase/4.1.1: + /lodash.kebabcase@4.1.1: resolution: { integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==, } dev: true - /lodash.map/4.6.0: + /lodash.map@4.6.0: resolution: { integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==, } dev: true - /lodash.memoize/4.1.2: + /lodash.memoize@4.1.2: resolution: { integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, } dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, } dev: true - /lodash.mergewith/4.6.2: + /lodash.mergewith@4.6.2: resolution: { integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, } dev: true - /lodash.snakecase/4.1.1: + /lodash.snakecase@4.1.1: resolution: { integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==, } dev: true - /lodash.sortby/4.7.0: + /lodash.sortby@4.7.0: resolution: { integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, } dev: true - /lodash.startcase/4.4.0: + /lodash.startcase@4.4.0: resolution: { integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, } dev: true - /lodash.truncate/4.4.2: + /lodash.truncate@4.4.2: resolution: { integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, } dev: true - /lodash.uniq/4.5.0: + /lodash.uniq@4.5.0: resolution: { integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, } dev: true - /lodash.uniqby/4.7.0: + /lodash.uniqby@4.7.0: resolution: { integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==, } dev: true - /lodash.upperfirst/4.3.1: + /lodash.upperfirst@4.3.1: resolution: { integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==, } dev: true - /lodash/4.17.21: + /lodash@4.17.21: resolution: { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, } dev: true - /log-symbols/4.1.0: + /log-symbols@4.1.0: resolution: { integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, @@ -8438,7 +8506,7 @@ packages: is-unicode-supported: 0.1.0 dev: true - /log-update/4.0.0: + /log-update@4.0.0: resolution: { integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==, @@ -8451,7 +8519,7 @@ packages: wrap-ansi: 6.2.0 dev: true - /longest/2.0.1: + /longest@2.0.1: resolution: { integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==, @@ -8459,7 +8527,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /lowercase-keys/3.0.0: + /lowercase-keys@3.0.0: resolution: { integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, @@ -8467,7 +8535,7 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, @@ -8476,7 +8544,7 @@ packages: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, @@ -8486,7 +8554,7 @@ packages: yallist: 4.0.0 dev: true - /lru-cache/7.16.1: + /lru-cache@7.16.1: resolution: { integrity: sha512-9kkuMZHnLH/8qXARvYSjNvq8S1GYFFzynQTAfKeaJ0sIrR3PUPuu37Z+EiIANiZBvpfTf2B5y8ecDLSMWlLv+w==, @@ -8494,7 +8562,7 @@ packages: engines: { node: ">=12" } dev: true - /magic-string/0.25.1: + /magic-string@0.25.1: resolution: { integrity: sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==, @@ -8503,7 +8571,7 @@ packages: sourcemap-codec: 1.4.8 dev: false - /magic-string/0.25.9: + /magic-string@0.25.9: resolution: { integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, @@ -8512,7 +8580,7 @@ packages: sourcemap-codec: 1.4.8 dev: true - /magic-string/0.27.0: + /magic-string@0.27.0: resolution: { integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, @@ -8522,14 +8590,14 @@ packages: "@jridgewell/sourcemap-codec": 1.4.14 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: { integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, } dev: true - /map-obj/1.0.1: + /map-obj@1.0.1: resolution: { integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, @@ -8537,7 +8605,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /map-obj/4.3.0: + /map-obj@4.3.0: resolution: { integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, @@ -8545,7 +8613,7 @@ packages: engines: { node: ">=8" } dev: true - /marked-terminal/5.1.1_marked@4.3.0: + /marked-terminal@5.1.1(marked@4.3.0): resolution: { integrity: sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g==, @@ -8563,7 +8631,7 @@ packages: supports-hyperlinks: 2.3.0 dev: true - /marked/4.3.0: + /marked@4.3.0: resolution: { integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==, @@ -8571,35 +8639,35 @@ packages: engines: { node: ">= 12" } hasBin: true - /mathml-tag-names/2.1.3: + /mathml-tag-names@2.1.3: resolution: { integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==, } dev: true - /mdn-data/2.0.14: + /mdn-data@2.0.14: resolution: { integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, } dev: true - /mdn-data/2.0.28: + /mdn-data@2.0.28: resolution: { integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, } dev: true - /mdn-data/2.0.30: + /mdn-data@2.0.30: resolution: { integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==, } dev: true - /meow/8.1.2: + /meow@8.1.2: resolution: { integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, @@ -8619,7 +8687,7 @@ packages: yargs-parser: 20.2.9 dev: true - /meow/9.0.0: + /meow@9.0.0: resolution: { integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==, @@ -8640,7 +8708,7 @@ packages: yargs-parser: 20.2.9 dev: true - /merge-source-map/1.0.4: + /merge-source-map@1.0.4: resolution: { integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==, @@ -8649,21 +8717,14 @@ packages: source-map: 0.5.7 dev: false - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, } dev: true - /merge/2.1.1: - resolution: - { - integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==, - } - dev: true - - /merge2/1.4.1: + /merge2@1.4.1: resolution: { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, @@ -8671,7 +8732,14 @@ packages: engines: { node: ">= 8" } dev: true - /micromatch/4.0.5: + /merge@2.1.1: + resolution: + { + integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==, + } + dev: true + + /micromatch@4.0.5: resolution: { integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, @@ -8682,7 +8750,7 @@ packages: picomatch: 2.3.1 dev: true - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, @@ -8690,7 +8758,7 @@ packages: engines: { node: ">= 0.6" } dev: true - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, @@ -8700,7 +8768,7 @@ packages: mime-db: 1.52.0 dev: true - /mime/3.0.0: + /mime@3.0.0: resolution: { integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, @@ -8709,7 +8777,7 @@ packages: hasBin: true dev: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, @@ -8717,7 +8785,7 @@ packages: engines: { node: ">=6" } dev: true - /mimic-fn/4.0.0: + /mimic-fn@4.0.0: resolution: { integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, @@ -8725,7 +8793,7 @@ packages: engines: { node: ">=12" } dev: true - /mimic-response/3.1.0: + /mimic-response@3.1.0: resolution: { integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, @@ -8733,7 +8801,7 @@ packages: engines: { node: ">=10" } dev: true - /mimic-response/4.0.0: + /mimic-response@4.0.0: resolution: { integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, @@ -8741,7 +8809,7 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: { integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, @@ -8749,7 +8817,7 @@ packages: engines: { node: ">=4" } dev: true - /mini-svg-data-uri/1.4.4: + /mini-svg-data-uri@1.4.4: resolution: { integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==, @@ -8757,7 +8825,7 @@ packages: hasBin: true dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, @@ -8766,7 +8834,7 @@ packages: brace-expansion: 1.1.11 dev: true - /minimatch/5.1.6: + /minimatch@5.1.6: resolution: { integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, @@ -8776,7 +8844,7 @@ packages: brace-expansion: 2.0.1 dev: true - /minimist-options/4.1.0: + /minimist-options@4.1.0: resolution: { integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, @@ -8788,27 +8856,27 @@ packages: kind-of: 6.0.3 dev: true - /minimist/1.2.7: + /minimist@1.2.7: resolution: { integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==, } dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, } - /mitt/3.0.0: + /mitt@3.0.0: resolution: { integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, } dev: false - /modify-values/1.0.1: + /modify-values@1.0.1: resolution: { integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, @@ -8816,21 +8884,21 @@ packages: engines: { node: ">=0.10.0" } dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, } dev: true - /mute-stream/0.0.8: + /mute-stream@0.0.8: resolution: { integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, } dev: true - /nanoid/3.3.4: + /nanoid@3.3.4: resolution: { integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, @@ -8838,42 +8906,42 @@ packages: engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: { integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, } dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, } dev: true - /neo-async/2.6.2: + /neo-async@2.6.2: resolution: { integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, } dev: true - /nerf-dart/1.0.0: + /nerf-dart@1.0.0: resolution: { integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==, } dev: true - /next-tick/1.1.0: + /next-tick@1.1.0: resolution: { integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, } dev: false - /node-emoji/1.11.0: + /node-emoji@1.11.0: resolution: { integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==, @@ -8882,7 +8950,7 @@ packages: lodash: 4.17.21 dev: true - /node-fetch/2.6.9: + /node-fetch@2.6.9: resolution: { integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==, @@ -8897,14 +8965,14 @@ packages: whatwg-url: 5.0.0 dev: true - /node-releases/2.0.10: + /node-releases@2.0.10: resolution: { integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==, } dev: true - /normalize-package-data/2.5.0: + /normalize-package-data@2.5.0: resolution: { integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, @@ -8916,7 +8984,7 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data/3.0.3: + /normalize-package-data@3.0.3: resolution: { integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, @@ -8929,7 +8997,7 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, @@ -8937,7 +9005,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /normalize-range/0.1.2: + /normalize-range@0.1.2: resolution: { integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, @@ -8945,7 +9013,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /normalize-url/6.1.0: + /normalize-url@6.1.0: resolution: { integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, @@ -8953,7 +9021,7 @@ packages: engines: { node: ">=10" } dev: true - /normalize-url/8.0.0: + /normalize-url@8.0.0: resolution: { integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, @@ -8961,7 +9029,7 @@ packages: engines: { node: ">=14.16" } dev: true - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: { integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, @@ -8971,7 +9039,7 @@ packages: path-key: 3.1.1 dev: true - /npm-run-path/5.1.0: + /npm-run-path@5.1.0: resolution: { integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, @@ -8981,7 +9049,7 @@ packages: path-key: 4.0.0 dev: true - /npm/8.19.4: + /npm@8.19.4: resolution: { integrity: sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==, @@ -9064,7 +9132,7 @@ packages: - which - write-file-atomic - /nth-check/2.1.1: + /nth-check@2.1.1: resolution: { integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, @@ -9073,7 +9141,7 @@ packages: boolbase: 1.0.0 dev: true - /object-hash/3.0.0: + /object-hash@3.0.0: resolution: { integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, @@ -9081,13 +9149,13 @@ packages: engines: { node: ">= 6" } dev: true - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: { integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==, } - /object-is/1.1.5: + /object-is@1.1.5: resolution: { integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, @@ -9098,14 +9166,14 @@ packages: define-properties: 1.2.0 dev: false - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, } engines: { node: ">= 0.4" } - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: { integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==, @@ -9118,7 +9186,7 @@ packages: object-keys: 1.1.1 dev: true - /once/1.4.0: + /once@1.4.0: resolution: { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, @@ -9127,7 +9195,7 @@ packages: wrappy: 1.0.2 dev: true - /onetime/5.1.2: + /onetime@5.1.2: resolution: { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, @@ -9137,7 +9205,7 @@ packages: mimic-fn: 2.1.0 dev: true - /onetime/6.0.0: + /onetime@6.0.0: resolution: { integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, @@ -9147,7 +9215,7 @@ packages: mimic-fn: 4.0.0 dev: true - /optionator/0.8.3: + /optionator@0.8.3: resolution: { integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, @@ -9162,7 +9230,7 @@ packages: word-wrap: 1.2.3 dev: false - /optionator/0.9.1: + /optionator@0.9.1: resolution: { integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==, @@ -9177,7 +9245,7 @@ packages: word-wrap: 1.2.3 dev: true - /ora/5.4.1: + /ora@5.4.1: resolution: { integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, @@ -9195,7 +9263,7 @@ packages: wcwidth: 1.0.1 dev: true - /os-tmpdir/1.0.2: + /os-tmpdir@1.0.2: resolution: { integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, @@ -9203,7 +9271,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /p-cancelable/3.0.0: + /p-cancelable@3.0.0: resolution: { integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==, @@ -9211,7 +9279,7 @@ packages: engines: { node: ">=12.20" } dev: true - /p-each-series/3.0.0: + /p-each-series@3.0.0: resolution: { integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==, @@ -9219,7 +9287,7 @@ packages: engines: { node: ">=12" } dev: true - /p-filter/2.1.0: + /p-filter@2.1.0: resolution: { integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==, @@ -9229,7 +9297,7 @@ packages: p-map: 2.1.0 dev: true - /p-is-promise/3.0.0: + /p-is-promise@3.0.0: resolution: { integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==, @@ -9237,7 +9305,7 @@ packages: engines: { node: ">=8" } dev: true - /p-limit/1.3.0: + /p-limit@1.3.0: resolution: { integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, @@ -9247,7 +9315,7 @@ packages: p-try: 1.0.0 dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: { integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, @@ -9257,7 +9325,7 @@ packages: p-try: 2.2.0 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, @@ -9267,7 +9335,7 @@ packages: yocto-queue: 0.1.0 dev: true - /p-limit/4.0.0: + /p-limit@4.0.0: resolution: { integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, @@ -9277,7 +9345,7 @@ packages: yocto-queue: 1.0.0 dev: true - /p-locate/2.0.0: + /p-locate@2.0.0: resolution: { integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, @@ -9287,7 +9355,7 @@ packages: p-limit: 1.3.0 dev: true - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: { integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, @@ -9297,7 +9365,7 @@ packages: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, @@ -9307,7 +9375,7 @@ packages: p-limit: 3.1.0 dev: true - /p-locate/6.0.0: + /p-locate@6.0.0: resolution: { integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, @@ -9317,7 +9385,7 @@ packages: p-limit: 4.0.0 dev: true - /p-map/2.1.0: + /p-map@2.1.0: resolution: { integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==, @@ -9325,7 +9393,7 @@ packages: engines: { node: ">=6" } dev: true - /p-map/4.0.0: + /p-map@4.0.0: resolution: { integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, @@ -9335,7 +9403,7 @@ packages: aggregate-error: 3.1.0 dev: true - /p-reduce/2.1.0: + /p-reduce@2.1.0: resolution: { integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, @@ -9343,7 +9411,7 @@ packages: engines: { node: ">=8" } dev: true - /p-reduce/3.0.0: + /p-reduce@3.0.0: resolution: { integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==, @@ -9351,7 +9419,7 @@ packages: engines: { node: ">=12" } dev: true - /p-retry/4.6.2: + /p-retry@4.6.2: resolution: { integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==, @@ -9362,7 +9430,7 @@ packages: retry: 0.13.1 dev: true - /p-try/1.0.0: + /p-try@1.0.0: resolution: { integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, @@ -9370,7 +9438,7 @@ packages: engines: { node: ">=4" } dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, @@ -9378,14 +9446,14 @@ packages: engines: { node: ">=6" } dev: true - /pako/0.2.9: + /pako@0.2.9: resolution: { integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==, } dev: false - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, @@ -9395,7 +9463,7 @@ packages: callsites: 3.1.0 dev: true - /parse-json/4.0.0: + /parse-json@4.0.0: resolution: { integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, @@ -9406,7 +9474,7 @@ packages: json-parse-better-errors: 1.0.2 dev: true - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, @@ -9419,7 +9487,7 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-passwd/1.0.0: + /parse-passwd@1.0.0: resolution: { integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, @@ -9427,7 +9495,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /parse-path/7.0.0: + /parse-path@7.0.0: resolution: { integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==, @@ -9436,7 +9504,7 @@ packages: protocols: 2.0.1 dev: true - /parse-url/8.1.0: + /parse-url@8.1.0: resolution: { integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==, @@ -9445,7 +9513,7 @@ packages: parse-path: 7.0.0 dev: true - /path-exists/3.0.0: + /path-exists@3.0.0: resolution: { integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, @@ -9453,7 +9521,7 @@ packages: engines: { node: ">=4" } dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, @@ -9461,7 +9529,7 @@ packages: engines: { node: ">=8" } dev: true - /path-exists/5.0.0: + /path-exists@5.0.0: resolution: { integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, @@ -9469,7 +9537,7 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: { integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, @@ -9477,7 +9545,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, @@ -9485,7 +9553,7 @@ packages: engines: { node: ">=8" } dev: true - /path-key/4.0.0: + /path-key@4.0.0: resolution: { integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, @@ -9493,13 +9561,13 @@ packages: engines: { node: ">=12" } dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, } - /path-type/4.0.0: + /path-type@4.0.0: resolution: { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, @@ -9507,7 +9575,7 @@ packages: engines: { node: ">=8" } dev: true - /pdfmake/0.2.7: + /pdfmake@0.2.7: resolution: { integrity: sha512-ClLpgx30H5G3EDvRW1MrA1Xih6YxEaSgIVFrOyBMgAAt62V+hxsyWAi6JNP7u1Fc5JKYAbpb4RRVw8Rhvmz5cQ==, @@ -9520,7 +9588,7 @@ packages: xmldoc: 1.2.0 dev: false - /pegjs/0.10.0: + /pegjs@0.10.0: resolution: { integrity: sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==, @@ -9529,20 +9597,20 @@ packages: hasBin: true dev: true - /performance-now/2.1.0: + /performance-now@2.1.0: resolution: { integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, } dev: false - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: { integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, } - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, @@ -9550,7 +9618,7 @@ packages: engines: { node: ">=8.6" } dev: true - /pidtree/0.6.0: + /pidtree@0.6.0: resolution: { integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, @@ -9559,7 +9627,7 @@ packages: hasBin: true dev: true - /pify/2.3.0: + /pify@2.3.0: resolution: { integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, @@ -9567,7 +9635,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /pify/3.0.0: + /pify@3.0.0: resolution: { integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, @@ -9575,7 +9643,7 @@ packages: engines: { node: ">=4" } dev: true - /pify/5.0.0: + /pify@5.0.0: resolution: { integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, @@ -9583,7 +9651,7 @@ packages: engines: { node: ">=10" } dev: true - /pkg-conf/2.1.0: + /pkg-conf@2.1.0: resolution: { integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==, @@ -9594,14 +9662,14 @@ packages: load-json-file: 4.0.0 dev: true - /png-js/1.0.0: + /png-js@1.0.0: resolution: { integrity: sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==, } dev: false - /polylabel/1.1.0: + /polylabel@1.1.0: resolution: { integrity: sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==, @@ -9610,7 +9678,7 @@ packages: tinyqueue: 2.0.3 dev: false - /postcss-attribute-case-insensitive/6.0.2_postcss@8.4.21: + /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.21): resolution: { integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==, @@ -9623,7 +9691,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-calc/8.2.4_postcss@8.4.21: + /postcss-calc@8.2.4(postcss@8.4.21): resolution: { integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==, @@ -9636,7 +9704,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-clamp/4.1.0_postcss@8.4.21: + /postcss-clamp@4.1.0(postcss@8.4.21): resolution: { integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, @@ -9649,7 +9717,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation/5.0.2_postcss@8.4.21: + /postcss-color-functional-notation@5.0.2(postcss@8.4.21): resolution: { integrity: sha512-M6ygxWOyd6eWf3sd1Lv8xi4SeF4iBPfJvkfMU4ITh8ExJc1qhbvh/U8Cv/uOvBgUVOMDdScvCdlg8+hREQzs7w==, @@ -9662,7 +9730,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-color-hex-alpha/9.0.2_postcss@8.4.21: + /postcss-color-hex-alpha@9.0.2(postcss@8.4.21): resolution: { integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==, @@ -9675,7 +9743,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple/8.0.2_postcss@8.4.21: + /postcss-color-rebeccapurple@8.0.2(postcss@8.4.21): resolution: { integrity: sha512-xWf/JmAxVoB5bltHpXk+uGRoGFwu4WDAR7210el+iyvTdqiKpDhtcT8N3edXMoVJY0WHFMrKMUieql/wRNiXkw==, @@ -9688,7 +9756,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-colormin/5.3.1_postcss@8.4.21: + /postcss-colormin@5.3.1(postcss@8.4.21): resolution: { integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==, @@ -9704,7 +9772,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values/5.1.3_postcss@8.4.21: + /postcss-convert-values@5.1.3(postcss@8.4.21): resolution: { integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==, @@ -9718,7 +9786,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media/9.1.2_postcss@8.4.21: + /postcss-custom-media@9.1.2(postcss@8.4.21): resolution: { integrity: sha512-osM9g4UKq4XKimAC7RAXroqi3BXpxfwTswAJQiZdrBjWGFGEyxQrY5H2eDWI8F+MEvEUfYDxA8scqi3QWROCSw==, @@ -9727,14 +9795,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.1_ppok7cytzjc65mcyxmtit3wdyi - "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/cascade-layer-name-parser": 1.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0) + "@csstools/css-parser-algorithms": 2.0.1(@csstools/css-tokenizer@2.1.0) "@csstools/css-tokenizer": 2.1.0 - "@csstools/media-query-list-parser": 2.0.1_ppok7cytzjc65mcyxmtit3wdyi + "@csstools/media-query-list-parser": 2.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0) postcss: 8.4.21 dev: true - /postcss-custom-properties/13.1.3_postcss@8.4.21: + /postcss-custom-properties@13.1.3(postcss@8.4.21): resolution: { integrity: sha512-15equAsfqtnr7jyzes6vyaGdAiNmKd+50FZ35/E/huBNBt7PgGMSNL/4o765nnNoP2dmaMJklb3FwJf3fdRcpA==, @@ -9743,14 +9811,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.1_ppok7cytzjc65mcyxmtit3wdyi - "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/cascade-layer-name-parser": 1.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0) + "@csstools/css-parser-algorithms": 2.0.1(@csstools/css-tokenizer@2.1.0) "@csstools/css-tokenizer": 2.1.0 postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors/7.1.2_postcss@8.4.21: + /postcss-custom-selectors@7.1.2(postcss@8.4.21): resolution: { integrity: sha512-jX7VlE3jrgfBIOfxiGNRFq81xUoHSZhvxhQurzE7ZFRv+bUmMwB7/XnA0nNlts2CwNtbXm4Ozy0ZAYKHlCRmBQ==, @@ -9759,14 +9827,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.1_ppok7cytzjc65mcyxmtit3wdyi - "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/cascade-layer-name-parser": 1.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0) + "@csstools/css-parser-algorithms": 2.0.1(@csstools/css-tokenizer@2.1.0) "@csstools/css-tokenizer": 2.1.0 postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /postcss-dir-pseudo-class/7.0.2_postcss@8.4.21: + /postcss-dir-pseudo-class@7.0.2(postcss@8.4.21): resolution: { integrity: sha512-cMnslilYxBf9k3qejnovrUONZx1rXeUZJw06fgIUBzABJe3D2LiLL5WAER7Imt3nrkaIgG05XZBztueLEf5P8w==, @@ -9779,7 +9847,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-discard-comments/5.1.2_postcss@8.4.21: + /postcss-discard-comments@5.1.2(postcss@8.4.21): resolution: { integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==, @@ -9791,7 +9859,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-discard-duplicates/5.1.0_postcss@8.4.21: + /postcss-discard-duplicates@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==, @@ -9803,7 +9871,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-discard-empty/5.1.1_postcss@8.4.21: + /postcss-discard-empty@5.1.1(postcss@8.4.21): resolution: { integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==, @@ -9815,7 +9883,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-discard-overridden/5.1.0_postcss@8.4.21: + /postcss-discard-overridden@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==, @@ -9827,7 +9895,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-double-position-gradients/4.0.2_postcss@8.4.21: + /postcss-double-position-gradients@4.0.2(postcss@8.4.21): resolution: { integrity: sha512-GXL1RmFREDK4Q9aYvI2RhVrA6a6qqSMQQ5ke8gSH1xgV6exsqbcJpIumC7AOgooH6/WIG3/K/T8xxAiVHy/tJg==, @@ -9836,12 +9904,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + "@csstools/postcss-progressive-custom-properties": 2.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-focus-visible/8.0.2_postcss@8.4.21: + /postcss-focus-visible@8.0.2(postcss@8.4.21): resolution: { integrity: sha512-f/Vd+EC/GaKElknU59esVcRYr/Y3t1ZAQyL4u2xSOgkDy4bMCmG7VP5cGvj3+BTLNE9ETfEuz2nnt4qkZwTTeA==, @@ -9854,7 +9922,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-focus-within/7.0.2_postcss@8.4.21: + /postcss-focus-within@7.0.2(postcss@8.4.21): resolution: { integrity: sha512-AHAJ89UQBcqBvFgQJE9XasGuwMNkKsGj4D/f9Uk60jFmEBHpAL14DrnSk3Rj+SwZTr/WUG+mh+Rvf8fid/346w==, @@ -9867,7 +9935,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-font-variant/5.0.0_postcss@8.4.21: + /postcss-font-variant@5.0.0(postcss@8.4.21): resolution: { integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, @@ -9878,7 +9946,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-gap-properties/4.0.1_postcss@8.4.21: + /postcss-gap-properties@4.0.1(postcss@8.4.21): resolution: { integrity: sha512-V5OuQGw4lBumPlwHWk/PRfMKjaq/LTGR4WDTemIMCaMevArVfCCA9wBJiL1VjDAd+rzuCIlkRoRvDsSiAaZ4Fg==, @@ -9890,7 +9958,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-image-set-function/5.0.2_postcss@8.4.21: + /postcss-image-set-function@5.0.2(postcss@8.4.21): resolution: { integrity: sha512-Sszjwo0ubETX0Fi5MvpYzsONwrsjeabjMoc5YqHvURFItXgIu3HdCjcVuVKGMPGzKRhgaknmdM5uVWInWPJmeg==, @@ -9903,7 +9971,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-import/14.1.0_postcss@8.4.21: + /postcss-import@14.1.0(postcss@8.4.21): resolution: { integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==, @@ -9918,7 +9986,7 @@ packages: resolve: 1.22.1 dev: true - /postcss-import/15.1.0_postcss@8.4.21: + /postcss-import@15.1.0(postcss@8.4.21): resolution: { integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, @@ -9933,7 +10001,7 @@ packages: resolve: 1.22.1 dev: true - /postcss-initial/4.0.1_postcss@8.4.21: + /postcss-initial@4.0.1(postcss@8.4.21): resolution: { integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==, @@ -9944,7 +10012,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-js/4.0.1_postcss@8.4.21: + /postcss-js@4.0.1(postcss@8.4.21): resolution: { integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, @@ -9957,7 +10025,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-lab-function/5.1.0_postcss@8.4.21: + /postcss-lab-function@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-iZApRTNcpc71uTn7PkzjHtj5cmuZpvu6okX4jHnM5OFi2fG97sodjxkq6SpL65xhW0NviQrAMSX97ntyGVRV0w==, @@ -9967,12 +10035,12 @@ packages: postcss: ^8.4 dependencies: "@csstools/color-helpers": 1.0.0 - "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 + "@csstools/postcss-progressive-custom-properties": 2.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-load-config/3.1.4_postcss@8.4.21: + /postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.9.1): resolution: { integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==, @@ -9989,10 +10057,11 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.21 + ts-node: 10.9.1(@types/node@18.14.0)(typescript@5.0.2) yaml: 1.10.2 dev: true - /postcss-logical/6.1.0_postcss@8.4.21: + /postcss-logical@6.1.0(postcss@8.4.21): resolution: { integrity: sha512-qb1+LpClhYjxac8SfOcWotnY3unKZesDqIOm+jnGt8rTl7xaIWpE2bPGZHxflOip1E/4ETo79qlJyRL3yrHn1g==, @@ -10005,7 +10074,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-media-minmax/5.0.0_postcss@8.4.21: + /postcss-media-minmax@5.0.0(postcss@8.4.21): resolution: { integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==, @@ -10017,14 +10086,14 @@ packages: postcss: 8.4.21 dev: true - /postcss-media-query-parser/0.2.3: + /postcss-media-query-parser@0.2.3: resolution: { integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==, } dev: true - /postcss-merge-longhand/5.1.7_postcss@8.4.21: + /postcss-merge-longhand@5.1.7(postcss@8.4.21): resolution: { integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==, @@ -10035,10 +10104,10 @@ packages: dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1_postcss@8.4.21 + stylehacks: 5.1.1(postcss@8.4.21) dev: true - /postcss-merge-rules/5.1.4_postcss@8.4.21: + /postcss-merge-rules@5.1.4(postcss@8.4.21): resolution: { integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==, @@ -10049,12 +10118,12 @@ packages: dependencies: browserslist: 4.21.5 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.21 + cssnano-utils: 3.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /postcss-minify-font-values/5.1.0_postcss@8.4.21: + /postcss-minify-font-values@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==, @@ -10067,7 +10136,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients/5.1.1_postcss@8.4.21: + /postcss-minify-gradients@5.1.1(postcss@8.4.21): resolution: { integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==, @@ -10077,12 +10146,12 @@ packages: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0_postcss@8.4.21 + cssnano-utils: 3.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params/5.1.4_postcss@8.4.21: + /postcss-minify-params@5.1.4(postcss@8.4.21): resolution: { integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==, @@ -10092,12 +10161,12 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.5 - cssnano-utils: 3.1.0_postcss@8.4.21 + cssnano-utils: 3.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-selectors/5.2.1_postcss@8.4.21: + /postcss-minify-selectors@5.2.1(postcss@8.4.21): resolution: { integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==, @@ -10110,7 +10179,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-nested/5.0.6_postcss@8.4.21: + /postcss-nested@5.0.6(postcss@8.4.21): resolution: { integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, @@ -10123,7 +10192,7 @@ packages: postcss-selector-parser: 6.0.11 dev: false - /postcss-nested/6.0.0_postcss@8.4.21: + /postcss-nested@6.0.0(postcss@8.4.21): resolution: { integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==, @@ -10136,7 +10205,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-nesting/11.2.1_postcss@8.4.21: + /postcss-nesting@11.2.1(postcss@8.4.21): resolution: { integrity: sha512-E6Jq74Jo/PbRAtZioON54NPhUNJYxVWhwxbweYl1vAoBYuGlDIts5yhtKiZFLvkvwT73e/9nFrW3oMqAtgG+GQ==, @@ -10145,12 +10214,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + "@csstools/selector-specificity": 2.1.1(postcss-selector-parser@6.0.11)(postcss@8.4.21) postcss: 8.4.21 postcss-selector-parser: 6.0.11 dev: true - /postcss-normalize-charset/5.1.0_postcss@8.4.21: + /postcss-normalize-charset@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==, @@ -10162,7 +10231,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-normalize-display-values/5.1.0_postcss@8.4.21: + /postcss-normalize-display-values@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==, @@ -10175,7 +10244,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions/5.1.1_postcss@8.4.21: + /postcss-normalize-positions@5.1.1(postcss@8.4.21): resolution: { integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==, @@ -10188,7 +10257,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.21: + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.21): resolution: { integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==, @@ -10201,7 +10270,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string/5.1.0_postcss@8.4.21: + /postcss-normalize-string@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==, @@ -10214,7 +10283,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.21: + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==, @@ -10227,7 +10296,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode/5.1.1_postcss@8.4.21: + /postcss-normalize-unicode@5.1.1(postcss@8.4.21): resolution: { integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==, @@ -10241,7 +10310,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url/5.1.0_postcss@8.4.21: + /postcss-normalize-url@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==, @@ -10255,7 +10324,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace/5.1.1_postcss@8.4.21: + /postcss-normalize-whitespace@5.1.1(postcss@8.4.21): resolution: { integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==, @@ -10268,7 +10337,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-opacity-percentage/1.1.3_postcss@8.4.21: + /postcss-opacity-percentage@1.1.3(postcss@8.4.21): resolution: { integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==, @@ -10280,7 +10349,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-ordered-values/5.1.3_postcss@8.4.21: + /postcss-ordered-values@5.1.3(postcss@8.4.21): resolution: { integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==, @@ -10289,12 +10358,12 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0_postcss@8.4.21 + cssnano-utils: 3.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: true - /postcss-overflow-shorthand/4.0.1_postcss@8.4.21: + /postcss-overflow-shorthand@4.0.1(postcss@8.4.21): resolution: { integrity: sha512-HQZ0qi/9iSYHW4w3ogNqVNr2J49DHJAl7r8O2p0Meip38jsdnRPgiDW7r/LlLrrMBMe3KHkvNtAV2UmRVxzLIg==, @@ -10307,7 +10376,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-page-break/3.0.4_postcss@8.4.21: + /postcss-page-break@3.0.4(postcss@8.4.21): resolution: { integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, @@ -10318,7 +10387,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-place/8.0.1_postcss@8.4.21: + /postcss-place@8.0.1(postcss@8.4.21): resolution: { integrity: sha512-Ow2LedN8sL4pq8ubukO77phSVt4QyCm35ZGCYXKvRFayAwcpgB0sjNJglDoTuRdUL32q/ZC1VkPBo0AOEr4Uiw==, @@ -10331,7 +10400,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env/8.0.1_postcss@8.4.21: + /postcss-preset-env@8.0.1(postcss@8.4.21): resolution: { integrity: sha512-IUbymw0JlUbyVG+I85963PNWgPp3KhnFa1sxU7M/2dGthxV8e297P0VV5W9XcyypoH4hirH2fp1c6fmqh6YnSg==, @@ -10340,63 +10409,63 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-cascade-layers": 3.0.1_postcss@8.4.21 - "@csstools/postcss-color-function": 2.1.0_postcss@8.4.21 - "@csstools/postcss-font-format-keywords": 2.0.2_postcss@8.4.21 - "@csstools/postcss-hwb-function": 2.1.1_postcss@8.4.21 - "@csstools/postcss-ic-unit": 2.0.2_postcss@8.4.21 - "@csstools/postcss-is-pseudo-class": 3.1.1_postcss@8.4.21 - "@csstools/postcss-logical-float-and-clear": 1.0.1_postcss@8.4.21 - "@csstools/postcss-logical-resize": 1.0.1_postcss@8.4.21 - "@csstools/postcss-logical-viewport-units": 1.0.2_postcss@8.4.21 - "@csstools/postcss-media-queries-aspect-ratio-number-values": 1.0.1_postcss@8.4.21 - "@csstools/postcss-nested-calc": 2.0.2_postcss@8.4.21 - "@csstools/postcss-normalize-display-values": 2.0.1_postcss@8.4.21 - "@csstools/postcss-oklab-function": 2.1.0_postcss@8.4.21 - "@csstools/postcss-progressive-custom-properties": 2.1.0_postcss@8.4.21 - "@csstools/postcss-scope-pseudo-class": 2.0.2_postcss@8.4.21 - "@csstools/postcss-stepped-value-functions": 2.0.1_postcss@8.4.21 - "@csstools/postcss-text-decoration-shorthand": 2.2.1_postcss@8.4.21 - "@csstools/postcss-trigonometric-functions": 2.0.1_postcss@8.4.21 - "@csstools/postcss-unset-value": 2.0.1_postcss@8.4.21 - autoprefixer: 10.4.13_postcss@8.4.21 + "@csstools/postcss-cascade-layers": 3.0.1(postcss@8.4.21) + "@csstools/postcss-color-function": 2.1.0(postcss@8.4.21) + "@csstools/postcss-font-format-keywords": 2.0.2(postcss@8.4.21) + "@csstools/postcss-hwb-function": 2.1.1(postcss@8.4.21) + "@csstools/postcss-ic-unit": 2.0.2(postcss@8.4.21) + "@csstools/postcss-is-pseudo-class": 3.1.1(postcss@8.4.21) + "@csstools/postcss-logical-float-and-clear": 1.0.1(postcss@8.4.21) + "@csstools/postcss-logical-resize": 1.0.1(postcss@8.4.21) + "@csstools/postcss-logical-viewport-units": 1.0.2(postcss@8.4.21) + "@csstools/postcss-media-queries-aspect-ratio-number-values": 1.0.1(postcss@8.4.21) + "@csstools/postcss-nested-calc": 2.0.2(postcss@8.4.21) + "@csstools/postcss-normalize-display-values": 2.0.1(postcss@8.4.21) + "@csstools/postcss-oklab-function": 2.1.0(postcss@8.4.21) + "@csstools/postcss-progressive-custom-properties": 2.1.0(postcss@8.4.21) + "@csstools/postcss-scope-pseudo-class": 2.0.2(postcss@8.4.21) + "@csstools/postcss-stepped-value-functions": 2.0.1(postcss@8.4.21) + "@csstools/postcss-text-decoration-shorthand": 2.2.1(postcss@8.4.21) + "@csstools/postcss-trigonometric-functions": 2.0.1(postcss@8.4.21) + "@csstools/postcss-unset-value": 2.0.1(postcss@8.4.21) + autoprefixer: 10.4.13(postcss@8.4.21) browserslist: 4.21.5 - css-blank-pseudo: 5.0.2_postcss@8.4.21 - css-has-pseudo: 5.0.2_postcss@8.4.21 - css-prefers-color-scheme: 8.0.2_postcss@8.4.21 + css-blank-pseudo: 5.0.2(postcss@8.4.21) + css-has-pseudo: 5.0.2(postcss@8.4.21) + css-prefers-color-scheme: 8.0.2(postcss@8.4.21) cssdb: 7.4.1 postcss: 8.4.21 - postcss-attribute-case-insensitive: 6.0.2_postcss@8.4.21 - postcss-clamp: 4.1.0_postcss@8.4.21 - postcss-color-functional-notation: 5.0.2_postcss@8.4.21 - postcss-color-hex-alpha: 9.0.2_postcss@8.4.21 - postcss-color-rebeccapurple: 8.0.2_postcss@8.4.21 - postcss-custom-media: 9.1.2_postcss@8.4.21 - postcss-custom-properties: 13.1.3_postcss@8.4.21 - postcss-custom-selectors: 7.1.2_postcss@8.4.21 - postcss-dir-pseudo-class: 7.0.2_postcss@8.4.21 - postcss-double-position-gradients: 4.0.2_postcss@8.4.21 - postcss-focus-visible: 8.0.2_postcss@8.4.21 - postcss-focus-within: 7.0.2_postcss@8.4.21 - postcss-font-variant: 5.0.0_postcss@8.4.21 - postcss-gap-properties: 4.0.1_postcss@8.4.21 - postcss-image-set-function: 5.0.2_postcss@8.4.21 - postcss-initial: 4.0.1_postcss@8.4.21 - postcss-lab-function: 5.1.0_postcss@8.4.21 - postcss-logical: 6.1.0_postcss@8.4.21 - postcss-media-minmax: 5.0.0_postcss@8.4.21 - postcss-nesting: 11.2.1_postcss@8.4.21 - postcss-opacity-percentage: 1.1.3_postcss@8.4.21 - postcss-overflow-shorthand: 4.0.1_postcss@8.4.21 - postcss-page-break: 3.0.4_postcss@8.4.21 - postcss-place: 8.0.1_postcss@8.4.21 - postcss-pseudo-class-any-link: 8.0.2_postcss@8.4.21 - postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.21 - postcss-selector-not: 7.0.1_postcss@8.4.21 + postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.21) + postcss-clamp: 4.1.0(postcss@8.4.21) + postcss-color-functional-notation: 5.0.2(postcss@8.4.21) + postcss-color-hex-alpha: 9.0.2(postcss@8.4.21) + postcss-color-rebeccapurple: 8.0.2(postcss@8.4.21) + postcss-custom-media: 9.1.2(postcss@8.4.21) + postcss-custom-properties: 13.1.3(postcss@8.4.21) + postcss-custom-selectors: 7.1.2(postcss@8.4.21) + postcss-dir-pseudo-class: 7.0.2(postcss@8.4.21) + postcss-double-position-gradients: 4.0.2(postcss@8.4.21) + postcss-focus-visible: 8.0.2(postcss@8.4.21) + postcss-focus-within: 7.0.2(postcss@8.4.21) + postcss-font-variant: 5.0.0(postcss@8.4.21) + postcss-gap-properties: 4.0.1(postcss@8.4.21) + postcss-image-set-function: 5.0.2(postcss@8.4.21) + postcss-initial: 4.0.1(postcss@8.4.21) + postcss-lab-function: 5.1.0(postcss@8.4.21) + postcss-logical: 6.1.0(postcss@8.4.21) + postcss-media-minmax: 5.0.0(postcss@8.4.21) + postcss-nesting: 11.2.1(postcss@8.4.21) + postcss-opacity-percentage: 1.1.3(postcss@8.4.21) + postcss-overflow-shorthand: 4.0.1(postcss@8.4.21) + postcss-page-break: 3.0.4(postcss@8.4.21) + postcss-place: 8.0.1(postcss@8.4.21) + postcss-pseudo-class-any-link: 8.0.2(postcss@8.4.21) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.21) + postcss-selector-not: 7.0.1(postcss@8.4.21) postcss-value-parser: 4.2.0 dev: true - /postcss-pseudo-class-any-link/8.0.2_postcss@8.4.21: + /postcss-pseudo-class-any-link@8.0.2(postcss@8.4.21): resolution: { integrity: sha512-FYTIuRE07jZ2CW8POvctRgArQJ43yxhr5vLmImdKUvjFCkR09kh8pIdlCwdx/jbFm7MiW4QP58L4oOUv3grQYA==, @@ -10409,7 +10478,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-reduce-initial/5.1.2_postcss@8.4.21: + /postcss-reduce-initial@5.1.2(postcss@8.4.21): resolution: { integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==, @@ -10423,7 +10492,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-reduce-transforms/5.1.0_postcss@8.4.21: + /postcss-reduce-transforms@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==, @@ -10436,7 +10505,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.21: + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.21): resolution: { integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, @@ -10447,7 +10516,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-reporter/7.0.5_postcss@8.4.21: + /postcss-reporter@7.0.5(postcss@8.4.21): resolution: { integrity: sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==, @@ -10461,14 +10530,14 @@ packages: thenby: 1.3.4 dev: true - /postcss-resolve-nested-selector/0.1.1: + /postcss-resolve-nested-selector@0.1.1: resolution: { integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==, } dev: true - /postcss-safe-parser/6.0.0_postcss@8.4.21: + /postcss-safe-parser@6.0.0(postcss@8.4.21): resolution: { integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==, @@ -10480,7 +10549,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-selector-not/7.0.1_postcss@8.4.21: + /postcss-selector-not@7.0.1(postcss@8.4.21): resolution: { integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==, @@ -10493,7 +10562,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-selector-parser/6.0.10: + /postcss-selector-parser@6.0.10: resolution: { integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, @@ -10504,7 +10573,7 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-selector-parser/6.0.11: + /postcss-selector-parser@6.0.11: resolution: { integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==, @@ -10514,7 +10583,7 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-svgo/5.1.0_postcss@8.4.21: + /postcss-svgo@5.1.0(postcss@8.4.21): resolution: { integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==, @@ -10528,7 +10597,7 @@ packages: svgo: 2.8.0 dev: true - /postcss-unique-selectors/5.1.1_postcss@8.4.21: + /postcss-unique-selectors@5.1.1(postcss@8.4.21): resolution: { integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==, @@ -10541,14 +10610,14 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-value-parser/4.2.0: + /postcss-value-parser@4.2.0: resolution: { integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, } dev: true - /postcss/8.4.21: + /postcss@8.4.21: resolution: { integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==, @@ -10559,7 +10628,7 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /prelude-ls/1.1.2: + /prelude-ls@1.1.2: resolution: { integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, @@ -10567,7 +10636,7 @@ packages: engines: { node: ">= 0.8.0" } dev: false - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, @@ -10575,7 +10644,7 @@ packages: engines: { node: ">= 0.8.0" } dev: true - /prettier-linter-helpers/1.0.0: + /prettier-linter-helpers@1.0.0: resolution: { integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, @@ -10585,7 +10654,7 @@ packages: fast-diff: 1.2.0 dev: true - /prettier-plugin-organize-imports/3.2.2_tcllvk4eo3otqqvuorc2duftpy: + /prettier-plugin-organize-imports@3.2.2(prettier@2.8.6)(typescript@5.0.2): resolution: { integrity: sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==, @@ -10605,7 +10674,7 @@ packages: typescript: 5.0.2 dev: true - /prettier/2.8.6: + /prettier@2.8.6: resolution: { integrity: sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==, @@ -10614,7 +10683,7 @@ packages: hasBin: true dev: true - /pretty-bytes/5.6.0: + /pretty-bytes@5.6.0: resolution: { integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, @@ -10622,7 +10691,7 @@ packages: engines: { node: ">=6" } dev: true - /pretty-bytes/6.1.0: + /pretty-bytes@6.1.0: resolution: { integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==, @@ -10630,27 +10699,27 @@ packages: engines: { node: ^14.13.1 || >=16.0.0 } dev: true - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: { integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, } - /proto-list/1.2.4: + /proto-list@1.2.4: resolution: { integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, } dev: true - /protocols/2.0.1: + /protocols@2.0.1: resolution: { integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==, } dev: true - /punycode/2.3.0: + /punycode@2.3.0: resolution: { integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, @@ -10658,7 +10727,7 @@ packages: engines: { node: ">=6" } dev: true - /q/1.5.1: + /q@1.5.1: resolution: { integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==, @@ -10666,14 +10735,14 @@ packages: engines: { node: ">=0.6.0", teleport: ">=0.2.0" } dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } dev: true - /quick-lru/4.0.1: + /quick-lru@4.0.1: resolution: { integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, @@ -10681,7 +10750,7 @@ packages: engines: { node: ">=8" } dev: true - /quick-lru/5.1.1: + /quick-lru@5.1.1: resolution: { integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, @@ -10689,7 +10758,7 @@ packages: engines: { node: ">=10" } dev: true - /quote-stream/1.0.2: + /quote-stream@1.0.2: resolution: { integrity: sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==, @@ -10701,7 +10770,7 @@ packages: through2: 2.0.5 dev: false - /raf/3.4.1: + /raf@3.4.1: resolution: { integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, @@ -10710,7 +10779,7 @@ packages: performance-now: 2.1.0 dev: false - /randombytes/2.1.0: + /randombytes@2.1.0: resolution: { integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, @@ -10719,7 +10788,7 @@ packages: safe-buffer: 5.2.1 dev: true - /rc/1.2.8: + /rc@1.2.8: resolution: { integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, @@ -10732,7 +10801,7 @@ packages: strip-json-comments: 2.0.1 dev: true - /read-cache/1.0.0: + /read-cache@1.0.0: resolution: { integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, @@ -10741,7 +10810,7 @@ packages: pify: 2.3.0 dev: true - /read-pkg-up/7.0.1: + /read-pkg-up@7.0.1: resolution: { integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, @@ -10753,7 +10822,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg-up/9.1.0: + /read-pkg-up@9.1.0: resolution: { integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==, @@ -10765,7 +10834,7 @@ packages: type-fest: 2.19.0 dev: true - /read-pkg/5.2.0: + /read-pkg@5.2.0: resolution: { integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, @@ -10778,7 +10847,7 @@ packages: type-fest: 0.6.0 dev: true - /read-pkg/7.1.0: + /read-pkg@7.1.0: resolution: { integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==, @@ -10791,7 +10860,7 @@ packages: type-fest: 2.19.0 dev: true - /readable-stream/2.3.7: + /readable-stream@2.3.7: resolution: { integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==, @@ -10805,7 +10874,7 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream/3.6.0: + /readable-stream@3.6.0: resolution: { integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==, @@ -10817,7 +10886,7 @@ packages: util-deprecate: 1.0.2 dev: true - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, @@ -10827,7 +10896,7 @@ packages: picomatch: 2.3.1 dev: true - /redent/3.0.0: + /redent@3.0.0: resolution: { integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, @@ -10838,7 +10907,7 @@ packages: strip-indent: 3.0.0 dev: true - /redeyed/2.1.1: + /redeyed@2.1.1: resolution: { integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==, @@ -10847,7 +10916,7 @@ packages: esprima: 4.0.1 dev: true - /redux/4.2.1: + /redux@4.2.1: resolution: { integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==, @@ -10856,7 +10925,7 @@ packages: "@babel/runtime": 7.21.0 dev: false - /regenerate-unicode-properties/10.1.0: + /regenerate-unicode-properties@10.1.0: resolution: { integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==, @@ -10866,20 +10935,20 @@ packages: regenerate: 1.4.2 dev: true - /regenerate/1.4.2: + /regenerate@1.4.2: resolution: { integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, } dev: true - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: { integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, } - /regenerator-transform/0.15.1: + /regenerator-transform@0.15.1: resolution: { integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==, @@ -10888,7 +10957,7 @@ packages: "@babel/runtime": 7.21.0 dev: true - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: { integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==, @@ -10899,7 +10968,7 @@ packages: define-properties: 1.2.0 functions-have-names: 1.2.3 - /regexpu-core/5.3.1: + /regexpu-core@5.3.1: resolution: { integrity: sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==, @@ -10914,7 +10983,7 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /registry-auth-token/5.0.1: + /registry-auth-token@5.0.1: resolution: { integrity: sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==, @@ -10924,7 +10993,7 @@ packages: "@pnpm/npm-conf": 1.0.5 dev: true - /regjsparser/0.9.1: + /regjsparser@0.9.1: resolution: { integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, @@ -10934,14 +11003,14 @@ packages: jsesc: 0.5.0 dev: true - /regression/2.0.1: + /regression@2.0.1: resolution: { integrity: sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ==, } dev: false - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, @@ -10949,7 +11018,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, @@ -10957,21 +11026,21 @@ packages: engines: { node: ">=0.10.0" } dev: true - /require-main-filename/2.0.0: + /require-main-filename@2.0.0: resolution: { integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, } dev: true - /resolve-alpn/1.2.1: + /resolve-alpn@1.2.1: resolution: { integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, } dev: true - /resolve-dir/1.0.1: + /resolve-dir@1.0.1: resolution: { integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, @@ -10982,7 +11051,7 @@ packages: global-modules: 1.0.0 dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, @@ -10990,7 +11059,7 @@ packages: engines: { node: ">=4" } dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, @@ -10998,7 +11067,7 @@ packages: engines: { node: ">=8" } dev: true - /resolve-global/1.0.0: + /resolve-global@1.0.0: resolution: { integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, @@ -11008,14 +11077,14 @@ packages: global-dirs: 0.1.1 dev: true - /resolve/1.1.7: + /resolve@1.1.7: resolution: { integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==, } dev: false - /resolve/1.22.1: + /resolve@1.22.1: resolution: { integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==, @@ -11026,7 +11095,7 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /responselike/3.0.0: + /responselike@3.0.0: resolution: { integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, @@ -11036,7 +11105,7 @@ packages: lowercase-keys: 3.0.0 dev: true - /restore-cursor/3.1.0: + /restore-cursor@3.1.0: resolution: { integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, @@ -11047,7 +11116,7 @@ packages: signal-exit: 3.0.7 dev: true - /retry/0.13.1: + /retry@0.13.1: resolution: { integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, @@ -11055,7 +11124,7 @@ packages: engines: { node: ">= 4" } dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, @@ -11063,14 +11132,14 @@ packages: engines: { iojs: ">=1.0.0", node: ">=0.10.0" } dev: true - /rfdc/1.3.0: + /rfdc@1.3.0: resolution: { integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==, } dev: true - /rgbcolor/1.0.1: + /rgbcolor@1.0.1: resolution: { integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==, @@ -11078,7 +11147,7 @@ packages: engines: { node: ">= 0.8.15" } dev: false - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, @@ -11088,7 +11157,7 @@ packages: glob: 7.2.3 dev: true - /rollup-plugin-terser/7.0.2_rollup@2.79.1: + /rollup-plugin-terser@7.0.2(rollup@2.79.1): resolution: { integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==, @@ -11104,7 +11173,7 @@ packages: terser: 5.16.4 dev: true - /rollup/2.79.1: + /rollup@2.79.1: resolution: { integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==, @@ -11115,7 +11184,7 @@ packages: fsevents: 2.3.2 dev: true - /rollup/3.17.2: + /rollup@3.17.2: resolution: { integrity: sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA==, @@ -11126,7 +11195,7 @@ packages: fsevents: 2.3.2 dev: true - /rollup/3.20.1: + /rollup@3.20.1: resolution: { integrity: sha512-sz2w8cBJlWQ2E17RcpvHuf4sk2BQx4tfKDnjNPikEpLEevrbIAR7CH3PGa2hpPwWbNgPaA9yh9Jzljds5bc9zg==, @@ -11137,7 +11206,7 @@ packages: fsevents: 2.3.2 dev: true - /run-async/2.4.1: + /run-async@2.4.1: resolution: { integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, @@ -11145,7 +11214,7 @@ packages: engines: { node: ">=0.12.0" } dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, @@ -11154,7 +11223,7 @@ packages: queue-microtask: 1.2.3 dev: true - /rxjs/6.6.7: + /rxjs@6.6.7: resolution: { integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, @@ -11164,7 +11233,7 @@ packages: tslib: 1.14.1 dev: true - /rxjs/7.8.0: + /rxjs@7.8.0: resolution: { integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==, @@ -11173,20 +11242,20 @@ packages: tslib: 2.5.0 dev: true - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: { integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, } - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, } dev: true - /safe-regex-test/1.0.0: + /safe-regex-test@1.0.0: resolution: { integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==, @@ -11197,20 +11266,20 @@ packages: is-regex: 1.1.4 dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, } - /sax/1.2.4: + /sax@1.2.4: resolution: { integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, } dev: false - /scope-analyzer/2.1.2: + /scope-analyzer@2.1.2: resolution: { integrity: sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==, @@ -11225,7 +11294,7 @@ packages: get-assigned-identifiers: 1.2.0 dev: false - /semantic-release/20.1.3: + /semantic-release@20.1.3: resolution: { integrity: sha512-sMIK9IaOdLP9hxzTxdTVHxINsazlDgv2gjZ1yeyRZXpIT3xAnuQUDEez8k+AC+lFUtGnfzA2Ct3V5lDyiMestw==, @@ -11233,11 +11302,11 @@ packages: engines: { node: ">=18" } hasBin: true dependencies: - "@semantic-release/commit-analyzer": 9.0.2_semantic-release@20.1.3 + "@semantic-release/commit-analyzer": 9.0.2(semantic-release@20.1.3) "@semantic-release/error": 3.0.0 - "@semantic-release/github": 8.0.7_semantic-release@20.1.3 - "@semantic-release/npm": 9.0.2_semantic-release@20.1.3 - "@semantic-release/release-notes-generator": 10.0.3_semantic-release@20.1.3 + "@semantic-release/github": 8.0.7(semantic-release@20.1.3) + "@semantic-release/npm": 9.0.2(semantic-release@20.1.3) + "@semantic-release/release-notes-generator": 10.0.3(semantic-release@20.1.3) aggregate-error: 4.0.1 cosmiconfig: 8.0.0 debug: 4.3.4 @@ -11251,7 +11320,7 @@ packages: hosted-git-info: 6.1.1 lodash-es: 4.17.21 marked: 4.3.0 - marked-terminal: 5.1.1_marked@4.3.0 + marked-terminal: 5.1.1(marked@4.3.0) micromatch: 4.0.5 p-each-series: 3.0.0 p-reduce: 3.0.0 @@ -11266,7 +11335,7 @@ packages: - supports-color dev: true - /semver-diff/4.0.0: + /semver-diff@4.0.0: resolution: { integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==, @@ -11276,7 +11345,7 @@ packages: semver: 7.3.8 dev: true - /semver-regex/4.0.5: + /semver-regex@4.0.5: resolution: { integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==, @@ -11284,7 +11353,7 @@ packages: engines: { node: ">=12" } dev: true - /semver/5.7.1: + /semver@5.7.1: resolution: { integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==, @@ -11292,7 +11361,7 @@ packages: hasBin: true dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: { integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, @@ -11300,7 +11369,7 @@ packages: hasBin: true dev: true - /semver/7.3.8: + /semver@7.3.8: resolution: { integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==, @@ -11311,7 +11380,7 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript/4.0.0: + /serialize-javascript@4.0.0: resolution: { integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, @@ -11320,21 +11389,21 @@ packages: randombytes: 2.1.0 dev: true - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: { integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, } dev: true - /shallow-copy/0.0.1: + /shallow-copy@0.0.1: resolution: { integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==, } dev: false - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, @@ -11344,7 +11413,7 @@ packages: shebang-regex: 3.0.0 dev: true - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, @@ -11352,7 +11421,7 @@ packages: engines: { node: ">=8" } dev: true - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: { integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, @@ -11363,14 +11432,14 @@ packages: object-inspect: 1.12.3 dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, } dev: true - /signale/1.4.0: + /signale@1.4.0: resolution: { integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==, @@ -11382,7 +11451,7 @@ packages: pkg-conf: 2.1.0 dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, @@ -11390,7 +11459,7 @@ packages: engines: { node: ">=8" } dev: true - /slice-ansi/3.0.0: + /slice-ansi@3.0.0: resolution: { integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==, @@ -11402,7 +11471,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/4.0.0: + /slice-ansi@4.0.0: resolution: { integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, @@ -11414,7 +11483,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/5.0.0: + /slice-ansi@5.0.0: resolution: { integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, @@ -11425,14 +11494,14 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /source-map-js/1.0.2: + /source-map-js@1.0.2: resolution: { integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, } engines: { node: ">=0.10.0" } - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: { integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, @@ -11442,7 +11511,7 @@ packages: source-map: 0.6.1 dev: true - /source-map/0.1.43: + /source-map@0.1.43: resolution: { integrity: sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==, @@ -11454,7 +11523,7 @@ packages: dev: false optional: true - /source-map/0.5.7: + /source-map@0.5.7: resolution: { integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, @@ -11462,14 +11531,14 @@ packages: engines: { node: ">=0.10.0" } dev: false - /source-map/0.6.1: + /source-map@0.6.1: resolution: { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, } engines: { node: ">=0.10.0" } - /source-map/0.8.0-beta.0: + /source-map@0.8.0-beta.0: resolution: { integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, @@ -11479,21 +11548,21 @@ packages: whatwg-url: 7.1.0 dev: true - /sourcemap-codec/1.4.8: + /sourcemap-codec@1.4.8: resolution: { integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, } deprecated: Please use @jridgewell/sourcemap-codec instead - /spawn-error-forwarder/1.0.0: + /spawn-error-forwarder@1.0.0: resolution: { integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==, } dev: true - /spdx-correct/3.1.1: + /spdx-correct@3.1.1: resolution: { integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==, @@ -11503,14 +11572,14 @@ packages: spdx-license-ids: 3.0.12 dev: true - /spdx-exceptions/2.3.0: + /spdx-exceptions@2.3.0: resolution: { integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, } dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: { integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, @@ -11520,23 +11589,14 @@ packages: spdx-license-ids: 3.0.12 dev: true - /spdx-license-ids/3.0.12: + /spdx-license-ids@3.0.12: resolution: { integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==, } dev: true - /split/1.0.1: - resolution: - { - integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, - } - dependencies: - through: 2.3.8 - dev: true - - /split2/1.0.0: + /split2@1.0.0: resolution: { integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==, @@ -11545,7 +11605,7 @@ packages: through2: 2.0.5 dev: true - /split2/3.2.2: + /split2@3.2.2: resolution: { integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, @@ -11554,7 +11614,16 @@ packages: readable-stream: 3.6.0 dev: true - /ssf/0.11.2: + /split@1.0.1: + resolution: + { + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, + } + dependencies: + through: 2.3.8 + dev: true + + /ssf@0.11.2: resolution: { integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==, @@ -11564,7 +11633,7 @@ packages: frac: 1.1.2 dev: false - /stable/0.1.8: + /stable@0.1.8: resolution: { integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==, @@ -11572,7 +11641,7 @@ packages: deprecated: "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" dev: true - /stackblur-canvas/2.5.0: + /stackblur-canvas@2.5.0: resolution: { integrity: sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==, @@ -11580,7 +11649,7 @@ packages: engines: { node: ">=0.1.14" } dev: false - /static-eval/2.1.0: + /static-eval@2.1.0: resolution: { integrity: sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==, @@ -11589,7 +11658,7 @@ packages: escodegen: 1.14.3 dev: false - /static-module/3.0.4: + /static-module@3.0.4: resolution: { integrity: sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==, @@ -11611,14 +11680,14 @@ packages: through2: 2.0.5 dev: false - /stencil-wormhole/3.4.1: + /stencil-wormhole@3.4.1: resolution: { integrity: sha512-ppYTcWTJnIl4ZAKwF39LTA9f/ypHfbVefsHdN2hpMQGrR57wt1TieZo9tlCM/r1Y4SFiZ5yz/cjho564C921Xw==, } dev: false - /stream-combiner2/1.1.1: + /stream-combiner2@1.1.1: resolution: { integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==, @@ -11628,7 +11697,7 @@ packages: readable-stream: 2.3.7 dev: true - /string-argv/0.3.1: + /string-argv@0.3.1: resolution: { integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==, @@ -11636,7 +11705,7 @@ packages: engines: { node: ">=0.6.19" } dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, @@ -11648,7 +11717,7 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width/5.1.2: + /string-width@5.1.2: resolution: { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, @@ -11660,7 +11729,7 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.matchall/4.0.8: + /string.prototype.matchall@4.0.8: resolution: { integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==, @@ -11676,7 +11745,7 @@ packages: side-channel: 1.0.4 dev: true - /string.prototype.trimend/1.0.6: + /string.prototype.trimend@1.0.6: resolution: { integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==, @@ -11687,7 +11756,7 @@ packages: es-abstract: 1.21.1 dev: true - /string.prototype.trimstart/1.0.6: + /string.prototype.trimstart@1.0.6: resolution: { integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==, @@ -11698,7 +11767,7 @@ packages: es-abstract: 1.21.1 dev: true - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: { integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, @@ -11706,7 +11775,7 @@ packages: dependencies: safe-buffer: 5.1.2 - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: { integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, @@ -11715,7 +11784,7 @@ packages: safe-buffer: 5.2.1 dev: true - /stringify-object/3.3.0: + /stringify-object@3.3.0: resolution: { integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, @@ -11727,7 +11796,7 @@ packages: is-regexp: 1.0.0 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, @@ -11737,7 +11806,7 @@ packages: ansi-regex: 5.0.1 dev: true - /strip-ansi/7.0.1: + /strip-ansi@7.0.1: resolution: { integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==, @@ -11747,7 +11816,7 @@ packages: ansi-regex: 6.0.1 dev: true - /strip-bom/3.0.0: + /strip-bom@3.0.0: resolution: { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, @@ -11755,7 +11824,7 @@ packages: engines: { node: ">=4" } dev: true - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: { integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, @@ -11763,7 +11832,7 @@ packages: engines: { node: ">=8" } dev: true - /strip-comments/2.0.1: + /strip-comments@2.0.1: resolution: { integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==, @@ -11771,7 +11840,7 @@ packages: engines: { node: ">=10" } dev: true - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: { integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, @@ -11779,7 +11848,7 @@ packages: engines: { node: ">=6" } dev: true - /strip-final-newline/3.0.0: + /strip-final-newline@3.0.0: resolution: { integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, @@ -11787,7 +11856,7 @@ packages: engines: { node: ">=12" } dev: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: { integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, @@ -11797,7 +11866,7 @@ packages: min-indent: 1.0.1 dev: true - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: { integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, @@ -11805,7 +11874,7 @@ packages: engines: { node: ">=0.10.0" } dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, @@ -11813,21 +11882,21 @@ packages: engines: { node: ">=8" } dev: true - /style-mod/4.0.0: + /style-mod@4.0.0: resolution: { integrity: sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==, } dev: false - /style-search/0.1.0: + /style-search@0.1.0: resolution: { integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==, } dev: true - /stylehacks/5.1.1_postcss@8.4.21: + /stylehacks@5.1.1(postcss@8.4.21): resolution: { integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==, @@ -11841,7 +11910,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /stylelint-config-recommended/11.0.0_stylelint@15.3.0: + /stylelint-config-recommended@11.0.0(stylelint@15.3.0): resolution: { integrity: sha512-SoGIHNI748OCZn6BxFYT83ytWoYETCINVHV3LKScVAWQQauWdvmdDqJC5YXWjpBbxg2E761Tg5aUGKLFOVhEkA==, @@ -11852,7 +11921,7 @@ packages: stylelint: 15.3.0 dev: true - /stylelint-config-standard/31.0.0_stylelint@15.3.0: + /stylelint-config-standard@31.0.0(stylelint@15.3.0): resolution: { integrity: sha512-CUGAmtROCvX0YgMY2+6P9tqSkHj5z/75XxrQ8bGxvkCa1xYdGDx4poM0pa7cXc3s74/PZLJH/okxZZouRfOSGw==, @@ -11861,10 +11930,10 @@ packages: stylelint: ^15.3.0 dependencies: stylelint: 15.3.0 - stylelint-config-recommended: 11.0.0_stylelint@15.3.0 + stylelint-config-recommended: 11.0.0(stylelint@15.3.0) dev: true - /stylelint/15.3.0: + /stylelint@15.3.0: resolution: { integrity: sha512-9UYBYk7K9rtlKcTUDZrtntE840sZM00qyYBQHHe7tjwMNUsPsGvR6Fd43IxHEAhRrDLzpy3TVaHb6CReBB3eFg==, @@ -11872,10 +11941,10 @@ packages: engines: { node: ^14.13.1 || >=16.0.0 } hasBin: true dependencies: - "@csstools/css-parser-algorithms": 2.0.1_5vzy4lghjvuzkedkkk4tqwjftm + "@csstools/css-parser-algorithms": 2.0.1(@csstools/css-tokenizer@2.1.0) "@csstools/css-tokenizer": 2.1.0 - "@csstools/media-query-list-parser": 2.0.1_ppok7cytzjc65mcyxmtit3wdyi - "@csstools/selector-specificity": 2.1.1_wajs5nedgkikc5pcuwett7legi + "@csstools/media-query-list-parser": 2.0.1(@csstools/css-parser-algorithms@2.0.1)(@csstools/css-tokenizer@2.1.0) + "@csstools/selector-specificity": 2.1.1(postcss-selector-parser@6.0.11)(postcss@8.4.21) balanced-match: 2.0.0 colord: 2.9.3 cosmiconfig: 8.1.3 @@ -11902,7 +11971,7 @@ packages: postcss: 8.4.21 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.1 - postcss-safe-parser: 6.0.0_postcss@8.4.21 + postcss-safe-parser: 6.0.0(postcss@8.4.21) postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -11918,7 +11987,7 @@ packages: - supports-color dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: { integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, @@ -11928,7 +11997,7 @@ packages: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, @@ -11938,7 +12007,7 @@ packages: has-flag: 4.0.0 dev: true - /supports-hyperlinks/2.3.0: + /supports-hyperlinks@2.3.0: resolution: { integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, @@ -11949,7 +12018,7 @@ packages: supports-color: 7.2.0 dev: true - /supports-hyperlinks/3.0.0: + /supports-hyperlinks@3.0.0: resolution: { integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==, @@ -11960,21 +12029,21 @@ packages: supports-color: 7.2.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, } engines: { node: ">= 0.4" } - /svg-tags/1.0.0: + /svg-tags@1.0.0: resolution: { integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, } dev: true - /svgo/2.8.0: + /svgo@2.8.0: resolution: { integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, @@ -11991,7 +12060,7 @@ packages: stable: 0.1.8 dev: true - /svgo/3.0.2: + /svgo@3.0.2: resolution: { integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==, @@ -12007,7 +12076,7 @@ packages: picocolors: 1.0.0 dev: true - /table/6.8.1: + /table@6.8.1: resolution: { integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==, @@ -12021,7 +12090,7 @@ packages: strip-ansi: 6.0.1 dev: true - /tailwindcss/3.2.7_postcss@8.4.21: + /tailwindcss@3.2.7(postcss@8.4.21)(ts-node@10.9.1): resolution: { integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==, @@ -12046,10 +12115,10 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.21 - postcss-import: 14.1.0_postcss@8.4.21 - postcss-js: 4.0.1_postcss@8.4.21 - postcss-load-config: 3.1.4_postcss@8.4.21 - postcss-nested: 6.0.0_postcss@8.4.21 + postcss-import: 14.1.0(postcss@8.4.21) + postcss-js: 4.0.1(postcss@8.4.21) + postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.9.1) + postcss-nested: 6.0.0(postcss@8.4.21) postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -12058,7 +12127,7 @@ packages: - ts-node dev: true - /temp-dir/2.0.0: + /temp-dir@2.0.0: resolution: { integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, @@ -12066,7 +12135,7 @@ packages: engines: { node: ">=8" } dev: true - /tempy/0.6.0: + /tempy@0.6.0: resolution: { integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==, @@ -12079,7 +12148,7 @@ packages: unique-string: 2.0.0 dev: true - /tempy/1.0.1: + /tempy@1.0.1: resolution: { integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==, @@ -12093,7 +12162,7 @@ packages: unique-string: 2.0.0 dev: true - /terser/5.16.4: + /terser@5.16.4: resolution: { integrity: sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==, @@ -12107,7 +12176,7 @@ packages: source-map-support: 0.5.21 dev: true - /text-extensions/1.9.0: + /text-extensions@1.9.0: resolution: { integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, @@ -12115,27 +12184,21 @@ packages: engines: { node: ">=0.10" } dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, } dev: true - /thenby/1.3.4: + /thenby@1.3.4: resolution: { integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==, } dev: true - /through/2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } - - /through2/2.0.5: + /through2@2.0.5: resolution: { integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, @@ -12144,7 +12207,7 @@ packages: readable-stream: 2.3.7 xtend: 4.0.2 - /through2/4.0.2: + /through2@4.0.2: resolution: { integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, @@ -12153,21 +12216,27 @@ packages: readable-stream: 3.6.0 dev: true - /tiny-inflate/1.0.3: + /through@2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } + + /tiny-inflate@1.0.3: resolution: { integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==, } dev: false - /tinyqueue/2.0.3: + /tinyqueue@2.0.3: resolution: { integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==, } dev: false - /tmp/0.0.33: + /tmp@0.0.33: resolution: { integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, @@ -12177,7 +12246,7 @@ packages: os-tmpdir: 1.0.2 dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: { integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, @@ -12185,7 +12254,7 @@ packages: engines: { node: ">=4" } dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, @@ -12195,14 +12264,14 @@ packages: is-number: 7.0.0 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, } dev: true - /tr46/1.0.1: + /tr46@1.0.1: resolution: { integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, @@ -12211,14 +12280,14 @@ packages: punycode: 2.3.0 dev: true - /traverse/0.6.7: + /traverse@0.6.7: resolution: { integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==, } dev: true - /trim-newlines/3.0.1: + /trim-newlines@3.0.1: resolution: { integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, @@ -12226,7 +12295,7 @@ packages: engines: { node: ">=8" } dev: true - /ts-node/10.9.1_w3gialtd35h6ptuevfzy5ddjvu: + /ts-node@10.9.1(@types/node@18.14.0)(typescript@5.0.2): resolution: { integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, @@ -12260,20 +12329,20 @@ packages: yn: 3.1.1 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: { integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, } dev: true - /tslib/2.5.0: + /tslib@2.5.0: resolution: { integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==, } - /tsutils/3.21.0_typescript@5.0.2: + /tsutils@3.21.0(typescript@5.0.2): resolution: { integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, @@ -12286,7 +12355,7 @@ packages: typescript: 5.0.2 dev: true - /type-check/0.3.2: + /type-check@0.3.2: resolution: { integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, @@ -12296,7 +12365,7 @@ packages: prelude-ls: 1.1.2 dev: false - /type-check/0.4.0: + /type-check@0.4.0: resolution: { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, @@ -12306,7 +12375,7 @@ packages: prelude-ls: 1.2.1 dev: true - /type-fest/0.16.0: + /type-fest@0.16.0: resolution: { integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, @@ -12314,7 +12383,7 @@ packages: engines: { node: ">=10" } dev: true - /type-fest/0.18.1: + /type-fest@0.18.1: resolution: { integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, @@ -12322,7 +12391,7 @@ packages: engines: { node: ">=10" } dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: { integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, @@ -12330,7 +12399,7 @@ packages: engines: { node: ">=10" } dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: { integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, @@ -12338,7 +12407,7 @@ packages: engines: { node: ">=10" } dev: true - /type-fest/0.6.0: + /type-fest@0.6.0: resolution: { integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, @@ -12346,7 +12415,7 @@ packages: engines: { node: ">=8" } dev: true - /type-fest/0.8.1: + /type-fest@0.8.1: resolution: { integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, @@ -12354,7 +12423,7 @@ packages: engines: { node: ">=8" } dev: true - /type-fest/1.4.0: + /type-fest@1.4.0: resolution: { integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, @@ -12362,7 +12431,7 @@ packages: engines: { node: ">=10" } dev: true - /type-fest/2.19.0: + /type-fest@2.19.0: resolution: { integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, @@ -12370,21 +12439,21 @@ packages: engines: { node: ">=12.20" } dev: true - /type/1.2.0: + /type@1.2.0: resolution: { integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, } dev: false - /type/2.7.2: + /type@2.7.2: resolution: { integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, } dev: false - /typed-array-length/1.0.4: + /typed-array-length@1.0.4: resolution: { integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==, @@ -12395,14 +12464,14 @@ packages: is-typed-array: 1.1.10 dev: true - /typedarray/0.0.6: + /typedarray@0.0.6: resolution: { integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, } dev: false - /typescript/5.0.2: + /typescript@5.0.2: resolution: { integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==, @@ -12411,7 +12480,7 @@ packages: hasBin: true dev: true - /uglify-js/3.17.4: + /uglify-js@3.17.4: resolution: { integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, @@ -12422,7 +12491,7 @@ packages: dev: true optional: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: { integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, @@ -12434,7 +12503,7 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /unicode-canonical-property-names-ecmascript/2.0.0: + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: { integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, @@ -12442,7 +12511,7 @@ packages: engines: { node: ">=4" } dev: true - /unicode-match-property-ecmascript/2.0.0: + /unicode-match-property-ecmascript@2.0.0: resolution: { integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, @@ -12453,7 +12522,7 @@ packages: unicode-property-aliases-ecmascript: 2.1.0 dev: true - /unicode-match-property-value-ecmascript/2.1.0: + /unicode-match-property-value-ecmascript@2.1.0: resolution: { integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==, @@ -12461,7 +12530,7 @@ packages: engines: { node: ">=4" } dev: true - /unicode-properties/1.4.1: + /unicode-properties@1.4.1: resolution: { integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==, @@ -12471,7 +12540,7 @@ packages: unicode-trie: 2.0.0 dev: false - /unicode-property-aliases-ecmascript/2.1.0: + /unicode-property-aliases-ecmascript@2.1.0: resolution: { integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, @@ -12479,7 +12548,7 @@ packages: engines: { node: ">=4" } dev: true - /unicode-trie/2.0.0: + /unicode-trie@2.0.0: resolution: { integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==, @@ -12489,7 +12558,7 @@ packages: tiny-inflate: 1.0.3 dev: false - /unique-string/2.0.0: + /unique-string@2.0.0: resolution: { integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, @@ -12499,14 +12568,14 @@ packages: crypto-random-string: 2.0.0 dev: true - /universal-user-agent/6.0.0: + /universal-user-agent@6.0.0: resolution: { integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==, } dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: { integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, @@ -12514,7 +12583,7 @@ packages: engines: { node: ">= 10.0.0" } dev: true - /upath/1.2.0: + /upath@1.2.0: resolution: { integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, @@ -12522,7 +12591,7 @@ packages: engines: { node: ">=4" } dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.5: + /update-browserslist-db@1.0.10(browserslist@4.21.5): resolution: { integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==, @@ -12536,7 +12605,7 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, @@ -12545,34 +12614,34 @@ packages: punycode: 2.3.0 dev: true - /url-join/4.0.1: + /url-join@4.0.1: resolution: { integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==, } dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, } - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, } dev: true - /v8-compile-cache/2.3.0: + /v8-compile-cache@2.3.0: resolution: { integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==, } dev: true - /validate-npm-package-license/3.0.4: + /validate-npm-package-license@3.0.4: resolution: { integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, @@ -12582,7 +12651,7 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-plugin-pwa/0.14.5_7pzn4vgxpc2rxxz25gxxv2wcqm: + /vite-plugin-pwa@0.14.5(vite@4.2.1)(workbox-build@6.5.4)(workbox-window@6.5.4): resolution: { integrity: sha512-LH3VCtoWx0scfim8Ph+daVl45uVRyWzXn3C3GUq92uWUui1p8eh+DjTQ23Pvb7SJ0SJtxZ99LCpOLCkFkaxokg==, @@ -12590,20 +12659,21 @@ packages: peerDependencies: vite: ^3.1.0 || ^4.0.0 workbox-build: ^6.5.4 + workbox-window: ^6.5.4 dependencies: - "@rollup/plugin-replace": 5.0.2_rollup@3.17.2 + "@rollup/plugin-replace": 5.0.2(rollup@3.17.2) debug: 4.3.4 fast-glob: 3.2.12 pretty-bytes: 6.1.0 rollup: 3.17.2 - vite: 4.2.1 + vite: 4.2.1(@types/node@18.14.0) workbox-build: 6.5.4 workbox-window: 6.5.4 transitivePeerDependencies: - supports-color dev: true - /vite/4.2.1: + /vite@4.2.1(@types/node@18.14.0): resolution: { integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==, @@ -12631,6 +12701,7 @@ packages: terser: optional: true dependencies: + "@types/node": 18.14.0 esbuild: 0.17.12 postcss: 8.4.21 resolve: 1.22.1 @@ -12639,21 +12710,21 @@ packages: fsevents: 2.3.2 dev: true - /w3c-keyname/2.2.6: + /w3c-keyname@2.2.6: resolution: { integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==, } dev: false - /wavesurfer.js/6.6.1: + /wavesurfer.js@6.6.1: resolution: { integrity: sha512-J3Zxm9t6gOueHVH0/lToFyiEoWi7s5W1iUoS6GRJKQr7Jc/sE+2rfAYhdrmB1o+XI1eu4gl4KEicnCwm2z5W8g==, } dev: false - /wcwidth/1.0.1: + /wcwidth@1.0.1: resolution: { integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, @@ -12662,21 +12733,21 @@ packages: defaults: 1.0.4 dev: true - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: { integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, } dev: true - /webidl-conversions/4.0.2: + /webidl-conversions@4.0.2: resolution: { integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, } dev: true - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: { integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, @@ -12686,7 +12757,7 @@ packages: webidl-conversions: 3.0.1 dev: true - /whatwg-url/7.1.0: + /whatwg-url@7.1.0: resolution: { integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, @@ -12697,7 +12768,7 @@ packages: webidl-conversions: 4.0.2 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: { integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, @@ -12710,14 +12781,14 @@ packages: is-symbol: 1.0.4 dev: true - /which-module/2.0.0: + /which-module@2.0.0: resolution: { integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==, } dev: true - /which-typed-array/1.1.9: + /which-typed-array@1.1.9: resolution: { integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==, @@ -12732,7 +12803,7 @@ packages: is-typed-array: 1.1.10 dev: true - /which/1.3.1: + /which@1.3.1: resolution: { integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, @@ -12742,7 +12813,7 @@ packages: isexe: 2.0.0 dev: true - /which/2.0.2: + /which@2.0.2: resolution: { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, @@ -12753,7 +12824,7 @@ packages: isexe: 2.0.0 dev: true - /wmf/1.0.2: + /wmf@1.0.2: resolution: { integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==, @@ -12761,14 +12832,14 @@ packages: engines: { node: ">=0.8" } dev: false - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: { integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==, } engines: { node: ">=0.10.0" } - /word/0.3.0: + /word@0.3.0: resolution: { integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==, @@ -12776,14 +12847,14 @@ packages: engines: { node: ">=0.8" } dev: false - /wordwrap/1.0.0: + /wordwrap@1.0.0: resolution: { integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, } dev: true - /workbox-background-sync/6.5.4: + /workbox-background-sync@6.5.4: resolution: { integrity: sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==, @@ -12793,7 +12864,7 @@ packages: workbox-core: 6.5.4 dev: true - /workbox-broadcast-update/6.5.4: + /workbox-broadcast-update@6.5.4: resolution: { integrity: sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==, @@ -12802,20 +12873,20 @@ packages: workbox-core: 6.5.4 dev: true - /workbox-build/6.5.4: + /workbox-build@6.5.4: resolution: { integrity: sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==, } engines: { node: ">=10.0.0" } dependencies: - "@apideck/better-ajv-errors": 0.3.6_ajv@8.12.0 + "@apideck/better-ajv-errors": 0.3.6(ajv@8.12.0) "@babel/core": 7.21.0 - "@babel/preset-env": 7.20.2_@babel+core@7.21.0 + "@babel/preset-env": 7.20.2(@babel/core@7.21.0) "@babel/runtime": 7.21.0 - "@rollup/plugin-babel": 5.3.1_4tnfxcmsyr7y5qv3uwkivwqysm - "@rollup/plugin-node-resolve": 11.2.1_rollup@2.79.1 - "@rollup/plugin-replace": 2.4.2_rollup@2.79.1 + "@rollup/plugin-babel": 5.3.1(@babel/core@7.21.0)(rollup@2.79.1) + "@rollup/plugin-node-resolve": 11.2.1(rollup@2.79.1) + "@rollup/plugin-replace": 2.4.2(rollup@2.79.1) "@surma/rollup-plugin-off-main-thread": 2.2.3 ajv: 8.12.0 common-tags: 1.8.2 @@ -12825,7 +12896,7 @@ packages: lodash: 4.17.21 pretty-bytes: 5.6.0 rollup: 2.79.1 - rollup-plugin-terser: 7.0.2_rollup@2.79.1 + rollup-plugin-terser: 7.0.2(rollup@2.79.1) source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 @@ -12851,7 +12922,7 @@ packages: - supports-color dev: true - /workbox-cacheable-response/6.5.4: + /workbox-cacheable-response@6.5.4: resolution: { integrity: sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==, @@ -12860,14 +12931,14 @@ packages: workbox-core: 6.5.4 dev: true - /workbox-core/6.5.4: + /workbox-core@6.5.4: resolution: { integrity: sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==, } dev: true - /workbox-expiration/6.5.4: + /workbox-expiration@6.5.4: resolution: { integrity: sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==, @@ -12877,7 +12948,7 @@ packages: workbox-core: 6.5.4 dev: true - /workbox-google-analytics/6.5.4: + /workbox-google-analytics@6.5.4: resolution: { integrity: sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==, @@ -12889,7 +12960,7 @@ packages: workbox-strategies: 6.5.4 dev: true - /workbox-navigation-preload/6.5.4: + /workbox-navigation-preload@6.5.4: resolution: { integrity: sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==, @@ -12898,7 +12969,7 @@ packages: workbox-core: 6.5.4 dev: true - /workbox-precaching/6.5.4: + /workbox-precaching@6.5.4: resolution: { integrity: sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==, @@ -12909,7 +12980,7 @@ packages: workbox-strategies: 6.5.4 dev: true - /workbox-range-requests/6.5.4: + /workbox-range-requests@6.5.4: resolution: { integrity: sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==, @@ -12918,7 +12989,7 @@ packages: workbox-core: 6.5.4 dev: true - /workbox-recipes/6.5.4: + /workbox-recipes@6.5.4: resolution: { integrity: sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==, @@ -12932,7 +13003,7 @@ packages: workbox-strategies: 6.5.4 dev: true - /workbox-routing/6.5.4: + /workbox-routing@6.5.4: resolution: { integrity: sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==, @@ -12941,7 +13012,7 @@ packages: workbox-core: 6.5.4 dev: true - /workbox-strategies/6.5.4: + /workbox-strategies@6.5.4: resolution: { integrity: sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==, @@ -12950,7 +13021,7 @@ packages: workbox-core: 6.5.4 dev: true - /workbox-streams/6.5.4: + /workbox-streams@6.5.4: resolution: { integrity: sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==, @@ -12960,14 +13031,14 @@ packages: workbox-routing: 6.5.4 dev: true - /workbox-sw/6.5.4: + /workbox-sw@6.5.4: resolution: { integrity: sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==, } dev: true - /workbox-window/6.5.4: + /workbox-window@6.5.4: resolution: { integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==, @@ -12977,7 +13048,7 @@ packages: workbox-core: 6.5.4 dev: true - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: { integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, @@ -12989,7 +13060,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, @@ -13001,14 +13072,14 @@ packages: strip-ansi: 6.0.1 dev: true - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, } dev: true - /write-file-atomic/5.0.0: + /write-file-atomic@5.0.0: resolution: { integrity: sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==, @@ -13019,7 +13090,7 @@ packages: signal-exit: 3.0.7 dev: true - /xlsx/0.18.5: + /xlsx@0.18.5: resolution: { integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==, @@ -13036,7 +13107,7 @@ packages: word: 0.3.0 dev: false - /xml-formatter/3.3.2: + /xml-formatter@3.3.2: resolution: { integrity: sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==, @@ -13046,7 +13117,7 @@ packages: xml-parser-xo: 4.0.5 dev: false - /xml-parser-xo/4.0.5: + /xml-parser-xo@4.0.5: resolution: { integrity: sha512-UWXOHMQ4ySxpUiU3S/9KzPOhninlL8SN1xFfWgX9WjgoZWoLKtEeJIEz4jhKtdFsoZBCYjg9rDEP3qfnpiHagQ==, @@ -13054,7 +13125,7 @@ packages: engines: { node: ">= 14" } dev: false - /xmldoc/1.2.0: + /xmldoc@1.2.0: resolution: { integrity: sha512-2eN8QhjBsMW2uVj7JHLHkMytpvGHLHxKXBy4J3fAT/HujsEtM6yU84iGjpESYGHg6XwK0Vu4l+KgqQ2dv2cCqg==, @@ -13063,21 +13134,21 @@ packages: sax: 1.2.4 dev: false - /xtend/4.0.2: + /xtend@4.0.2: resolution: { integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, } engines: { node: ">=0.4" } - /y18n/4.0.3: + /y18n@4.0.3: resolution: { integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, } dev: true - /y18n/5.0.8: + /y18n@5.0.8: resolution: { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, @@ -13085,21 +13156,21 @@ packages: engines: { node: ">=10" } dev: true - /yallist/3.1.1: + /yallist@3.1.1: resolution: { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, } dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, } dev: true - /yaml/1.10.2: + /yaml@1.10.2: resolution: { integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, @@ -13107,7 +13178,7 @@ packages: engines: { node: ">= 6" } dev: true - /yaml/2.2.1: + /yaml@2.2.1: resolution: { integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==, @@ -13115,7 +13186,7 @@ packages: engines: { node: ">= 14" } dev: true - /yargs-parser/18.1.3: + /yargs-parser@18.1.3: resolution: { integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, @@ -13126,7 +13197,7 @@ packages: decamelize: 1.2.0 dev: true - /yargs-parser/20.2.9: + /yargs-parser@20.2.9: resolution: { integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, @@ -13134,7 +13205,7 @@ packages: engines: { node: ">=10" } dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, @@ -13142,7 +13213,7 @@ packages: engines: { node: ">=12" } dev: true - /yargs/15.4.1: + /yargs@15.4.1: resolution: { integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, @@ -13162,7 +13233,7 @@ packages: yargs-parser: 18.1.3 dev: true - /yargs/17.7.1: + /yargs@17.7.1: resolution: { integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==, @@ -13178,7 +13249,7 @@ packages: yargs-parser: 21.1.1 dev: true - /yn/3.1.1: + /yn@3.1.1: resolution: { integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, @@ -13186,7 +13257,7 @@ packages: engines: { node: ">=6" } dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, @@ -13194,7 +13265,7 @@ packages: engines: { node: ">=10" } dev: true - /yocto-queue/1.0.0: + /yocto-queue@1.0.0: resolution: { integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, From 1a69bc48bb1d04fb7566e4012470c167ac6fb5d5 Mon Sep 17 00:00:00 2001 From: crowdin Date: Sat, 1 Apr 2023 12:38:40 +0000 Subject: [PATCH 101/477] chore(i18n): new Crowdin updates --- docs/src/ar/getting-started/install.md | 18 ++++++++++++++++-- docs/src/br/getting-started/install.md | 18 ++++++++++++++++-- docs/src/ca/getting-started/install.md | 18 ++++++++++++++++-- docs/src/de/getting-started/install.md | 18 ++++++++++++++++-- docs/src/el/getting-started/install.md | 18 ++++++++++++++++-- docs/src/es/getting-started/install.md | 20 +++++++++++++++++--- docs/src/fa/getting-started/install.md | 18 ++++++++++++++++-- docs/src/fr/getting-started/install.md | 18 ++++++++++++++++-- docs/src/fr2/getting-started/install.md | 18 ++++++++++++++++-- docs/src/fr_CA/getting-started/install.md | 18 ++++++++++++++++-- docs/src/gd/getting-started/install.md | 18 ++++++++++++++++-- docs/src/gl/getting-started/install.md | 18 ++++++++++++++++-- docs/src/id/getting-started/install.md | 18 ++++++++++++++++-- docs/src/it/getting-started/install.md | 18 ++++++++++++++++-- docs/src/ko/getting-started/install.md | 18 ++++++++++++++++-- docs/src/nl/getting-started/install.md | 18 ++++++++++++++++-- docs/src/nn-NO/getting-started/install.md | 18 ++++++++++++++++-- docs/src/oc/getting-started/install.md | 18 ++++++++++++++++-- docs/src/pl/getting-started/install.md | 18 ++++++++++++++++-- docs/src/pt-BR/getting-started/install.md | 18 ++++++++++++++++-- docs/src/pt/getting-started/install.md | 18 ++++++++++++++++-- docs/src/ro/getting-started/install.md | 18 ++++++++++++++++-- docs/src/ru/getting-started/install.md | 18 ++++++++++++++++-- docs/src/sk/getting-started/install.md | 18 ++++++++++++++++-- docs/src/sr_Latn/getting-started/install.md | 18 ++++++++++++++++-- docs/src/sv/getting-started/install.md | 18 ++++++++++++++++-- docs/src/uk/getting-started/install.md | 18 ++++++++++++++++-- docs/src/zh-Hans/getting-started/install.md | 18 ++++++++++++++++-- modules/Admin/Language/es/Charts.php | 2 +- modules/Admin/Language/es/Episode.php | 4 ++-- modules/Admin/Language/es/Podcast.php | 6 +++--- 31 files changed, 455 insertions(+), 63 deletions(-) diff --git a/docs/src/ar/getting-started/install.md b/docs/src/ar/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/ar/getting-started/install.md +++ b/docs/src/ar/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/br/getting-started/install.md b/docs/src/br/getting-started/install.md index 5ce6df8d..62bd340c 100644 --- a/docs/src/br/getting-started/install.md +++ b/docs/src/br/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/ca/getting-started/install.md b/docs/src/ca/getting-started/install.md index c2b1a87a..60d4b1fe 100644 --- a/docs/src/ca/getting-started/install.md +++ b/docs/src/ca/getting-started/install.md @@ -167,9 +167,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/de/getting-started/install.md b/docs/src/de/getting-started/install.md index f59050e5..2e8a1a7d 100644 --- a/docs/src/de/getting-started/install.md +++ b/docs/src/de/getting-started/install.md @@ -164,9 +164,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/el/getting-started/install.md b/docs/src/el/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/el/getting-started/install.md +++ b/docs/src/el/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/es/getting-started/install.md b/docs/src/es/getting-started/install.md index cd0b29a2..38dc1a8d 100644 --- a/docs/src/es/getting-started/install.md +++ b/docs/src/es/getting-started/install.md @@ -169,9 +169,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: @@ -188,7 +202,7 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | +| Nombre de variable | Type | Default | | ----------------------- | ------- | ----------- | | **`endpoint`** | string | `undefined` | | **`key`** | string | `undefined` | diff --git a/docs/src/fa/getting-started/install.md b/docs/src/fa/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/fa/getting-started/install.md +++ b/docs/src/fa/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/fr/getting-started/install.md b/docs/src/fr/getting-started/install.md index 4d189246..d908fa5e 100644 --- a/docs/src/fr/getting-started/install.md +++ b/docs/src/fr/getting-started/install.md @@ -169,9 +169,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/fr2/getting-started/install.md b/docs/src/fr2/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/fr2/getting-started/install.md +++ b/docs/src/fr2/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/fr_CA/getting-started/install.md b/docs/src/fr_CA/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/fr_CA/getting-started/install.md +++ b/docs/src/fr_CA/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/gd/getting-started/install.md b/docs/src/gd/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/gd/getting-started/install.md +++ b/docs/src/gd/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/gl/getting-started/install.md b/docs/src/gl/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/gl/getting-started/install.md +++ b/docs/src/gl/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/id/getting-started/install.md b/docs/src/id/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/id/getting-started/install.md +++ b/docs/src/id/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/it/getting-started/install.md b/docs/src/it/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/it/getting-started/install.md +++ b/docs/src/it/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/ko/getting-started/install.md b/docs/src/ko/getting-started/install.md index d204abf9..bdf7e6a4 100644 --- a/docs/src/ko/getting-started/install.md +++ b/docs/src/ko/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/nl/getting-started/install.md +++ b/docs/src/nl/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md index 50438637..39a95ee7 100644 --- a/docs/src/nn-NO/getting-started/install.md +++ b/docs/src/nn-NO/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/oc/getting-started/install.md +++ b/docs/src/oc/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/pl/getting-started/install.md +++ b/docs/src/pl/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md index 0593645b..41badebf 100644 --- a/docs/src/pt-BR/getting-started/install.md +++ b/docs/src/pt-BR/getting-started/install.md @@ -167,9 +167,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md index dc19943d..eab2dca5 100644 --- a/docs/src/pt/getting-started/install.md +++ b/docs/src/pt/getting-started/install.md @@ -164,9 +164,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/ro/getting-started/install.md b/docs/src/ro/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/ro/getting-started/install.md +++ b/docs/src/ro/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md index dc19943d..eab2dca5 100644 --- a/docs/src/ru/getting-started/install.md +++ b/docs/src/ru/getting-started/install.md @@ -164,9 +164,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/sk/getting-started/install.md +++ b/docs/src/sk/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/sr_Latn/getting-started/install.md b/docs/src/sr_Latn/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/sr_Latn/getting-started/install.md +++ b/docs/src/sr_Latn/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md index 4e19c761..b47727ee 100644 --- a/docs/src/sv/getting-started/install.md +++ b/docs/src/sv/getting-started/install.md @@ -163,9 +163,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | nummer | `25` | | **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/uk/getting-started/install.md b/docs/src/uk/getting-started/install.md index 92537f82..03549bcc 100644 --- a/docs/src/uk/getting-started/install.md +++ b/docs/src/uk/getting-started/install.md @@ -162,9 +162,23 @@ email.SMTPPass="your_smtp_password" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md index 079a117e..b59c6c46 100644 --- a/docs/src/zh-Hans/getting-started/install.md +++ b/docs/src/zh-Hans/getting-started/install.md @@ -154,9 +154,23 @@ email.SMTPPass="你的邮件密码" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### S3 +### Media storage -By default, files are stored in the `public/media` folder using the filesystem. +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 If you prefer storing your media files on an S3 compatible storage, you may specify it in your `.env`: diff --git a/modules/Admin/Language/es/Charts.php b/modules/Admin/Language/es/Charts.php index 11c714f0..7294231c 100644 --- a/modules/Admin/Language/es/Charts.php +++ b/modules/Admin/Language/es/Charts.php @@ -37,5 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Ancho de banda diario usado (en MB)', 'total_storage_by_month' => 'Almacenamiento mensual (en MB)', 'total_bandwidth_by_month' => 'Ancho de banda mensual usado (en MB)', - 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', + 'total_bandwidth_by_month_limit' => 'Limitado a {totalBandwidth} al mes', ]; diff --git a/modules/Admin/Language/es/Episode.php b/modules/Admin/Language/es/Episode.php index 84f32672..6dcde24f 100644 --- a/modules/Admin/Language/es/Episode.php +++ b/modules/Admin/Language/es/Episode.php @@ -55,7 +55,7 @@ return [ }', 'episode' => 'Episodio', 'visibility' => 'Visibilidad', - 'downloads' => 'Downloads', + 'downloads' => 'Descargas', 'comments' => 'Comentarios', 'actions' => 'Acciones', ], @@ -80,7 +80,7 @@ return [ audio {audio} other {media} }.', - 'deleteFileError' => 'Hubo un problema al tratar de eliminar el archivo {file_key} {type, select, + 'deleteFileError' => 'Hubo un problema al tratar de eliminar el archivo {file_path} {type, select, transcript {de la transcripción} chapters {de los episodios} image {de la portada} diff --git a/modules/Admin/Language/es/Podcast.php b/modules/Admin/Language/es/Podcast.php index c70b6ffd..5e83f118 100644 --- a/modules/Admin/Language/es/Podcast.php +++ b/modules/Admin/Language/es/Podcast.php @@ -111,9 +111,9 @@ return [ 'premium_by_default' => 'Los episodios deben establecerse como premium por defecto', 'premium_by_default_hint' => 'Los episodios Podcast se marcarán como premium de forma predeterminada. Todavía puedes elegir establecer algunos episodios, trailers o bonificaciones como públicos.', 'op3' => 'Open Podcast Prefix Project (OP3)', - 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', - 'op3_enable' => 'Enable OP3 analytics service', - 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'op3_hint' => 'Analiza tus datos de estadísticas con OP3, un servicio de analíticas fiable y de código abierto. Comparte, valida y compara tus estadísticas con el ecosistema de podcasting abierto.', + 'op3_enable' => 'Activa el servicio de estadísticas OP3', + 'op3_enable_hint' => 'Por motivos de seguridad, las estadísticas de los episodios premium no serán compartidas con OP3.', 'payment_pointer' => 'Puntero de pago para Monetización web', 'payment_pointer_hint' => 'Aquí es donde usted recibirá dinero gracias a la Monetización Web', From c5eb6ed590c52042d2a67750bd9c93aa19290e0e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 3 Apr 2023 15:07:06 +0000 Subject: [PATCH 102/477] chore(release): 1.3.0 [skip ci] # [1.3.0](https://code.castopod.org/adaures/castopod/compare/v1.2.4...v1.3.0) (2023-04-03) ### Bug Fixes * delete files using file_manager when deleting episode and podcast ([41d8efe](https://code.castopod.org/adaures/castopod/commit/41d8efe6e71566eba44bfdfd00d1708ac4338366)) ### Features * **media:** set media storage directory as configurable ([7e1a470](https://code.castopod.org/adaures/castopod/commit/7e1a470ba42172eb4c3864ab3652e9f8b55d1ba8)) --- CHANGELOG.md | 12 ++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45f2d4cd..55fbb6f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [1.3.0](https://code.castopod.org/adaures/castopod/compare/v1.2.4...v1.3.0) (2023-04-03) + +### Bug Fixes + +- delete files using file_manager when deleting episode and podcast + ([41d8efe](https://code.castopod.org/adaures/castopod/commit/41d8efe6e71566eba44bfdfd00d1708ac4338366)) + +### Features + +- **media:** set media storage directory as configurable + ([7e1a470](https://code.castopod.org/adaures/castopod/commit/7e1a470ba42172eb4c3864ab3652e9f8b55d1ba8)) + ## [1.2.4](https://code.castopod.org/adaures/castopod/compare/v1.2.3...v1.2.4) (2023-03-23) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 241a554a..1c19ed69 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.2.4'); +defined('CP_VERSION') || define('CP_VERSION', '1.3.0'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 3ac0ae0b..31c47e45 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.2.4", + "version": "1.3.0", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index faff06d6..175b7a5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.2.4", + "version": "1.3.0", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From a76724a8cfee700f6874f86b35616d61facc664e Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 13 Apr 2023 11:45:03 +0000 Subject: [PATCH 103/477] fix(s3): add proxy to serve images from s3 to client refs #321 --- .gitignore | 6 +- app/Config/Fediverse.php | 4 +- app/Controllers/CreditsController.php | 4 +- app/Controllers/FeedController.php | 2 +- app/Controllers/WebmanifestController.php | 6 +- app/Entities/Person.php | 17 +--- app/Entities/Podcast.php | 16 +--- app/Helpers/id3_helper.php | 2 +- app/Helpers/misc_helper.php | 89 ++++++++++++++++++ app/Helpers/rss_helper.php | 4 +- app/Helpers/seo_helper.php | 4 +- app/Libraries/MediaClipper/VideoClipper.php | 2 +- app/Models/PodcastModel.php | 4 +- .../Admin/Controllers/SettingsController.php | 65 ++++++++----- modules/Fediverse/Config/Fediverse.php | 4 +- modules/Media/Config/Routes.php | 16 ++++ modules/Media/Controllers/MediaController.php | 26 +++++ modules/Media/Entities/BaseMedia.php | 28 +----- modules/Media/Entities/Image.php | 13 ++- modules/Media/Entities/Transcript.php | 12 +-- modules/Media/FileManagers/FS.php | 41 ++++++-- .../FileManagers/FileManagerInterface.php | 5 +- modules/Media/FileManagers/S3.php | 54 +++++++---- modules/Media/Helpers/filesystem_helper.php | 17 +--- modules/Media/Helpers/media_helper.php | 31 ------ public/{media => }/castopod-avatar.jpg | Bin .../{media => }/castopod-avatar_medium.webp | Bin .../castopod-avatar_thumbnail.webp | Bin public/{media => }/castopod-avatar_tiny.webp | Bin public/{media => }/castopod-banner-amber.jpg | Bin .../castopod-banner-amber_federation.jpg | Bin .../castopod-banner-amber_medium.webp | Bin .../castopod-banner-amber_small.webp | Bin .../{media => }/castopod-banner-crimson.jpg | Bin .../castopod-banner-crimson_federation.jpg | Bin .../castopod-banner-crimson_medium.webp | Bin .../castopod-banner-crimson_small.webp | Bin .../{media => }/castopod-banner-jacaranda.jpg | Bin .../castopod-banner-jacaranda_federation.jpg | Bin .../castopod-banner-jacaranda_medium.webp | Bin .../castopod-banner-jacaranda_small.webp | Bin public/{media => }/castopod-banner-lake.jpg | Bin .../castopod-banner-lake_federation.jpg | Bin .../castopod-banner-lake_medium.webp | Bin .../castopod-banner-lake_small.webp | Bin public/{media => }/castopod-banner-onyx.jpg | Bin .../castopod-banner-onyx_federation.jpg | Bin .../castopod-banner-onyx_medium.webp | Bin .../castopod-banner-onyx_small.webp | Bin public/{media => }/castopod-banner-pine.jpg | Bin .../castopod-banner-pine_federation.jpg | Bin .../castopod-banner-pine_medium.webp | Bin .../castopod-banner-pine_small.webp | Bin public/media/persons/index.html | 9 ++ public/media/podcasts/index.html | 9 ++ public/media/site/index.html | 9 ++ themes/cp_admin/_layout.php | 5 +- themes/cp_admin/episode/persons.php | 2 +- themes/cp_admin/person/_card.php | 2 +- themes/cp_admin/person/view.php | 2 +- themes/cp_admin/podcast/edit.php | 2 +- themes/cp_admin/podcast/persons.php | 2 +- themes/cp_admin/settings/general.php | 4 +- themes/cp_app/_persons_modal.php | 2 +- themes/cp_app/embed.php | 5 +- themes/cp_app/episode/_layout.php | 9 +- themes/cp_app/home.php | 5 +- themes/cp_app/pages/_layout.php | 5 +- themes/cp_app/pages/map.php | 5 +- themes/cp_app/podcast/_layout.php | 7 +- themes/cp_app/podcast/about.php | 2 +- themes/cp_app/podcast/follow.php | 7 +- themes/cp_app/podcast/unlock.php | 7 +- themes/cp_app/post/remote_action.php | 5 +- 74 files changed, 353 insertions(+), 224 deletions(-) create mode 100644 modules/Media/Config/Routes.php create mode 100644 modules/Media/Controllers/MediaController.php rename public/{media => }/castopod-avatar.jpg (100%) rename public/{media => }/castopod-avatar_medium.webp (100%) rename public/{media => }/castopod-avatar_thumbnail.webp (100%) rename public/{media => }/castopod-avatar_tiny.webp (100%) rename public/{media => }/castopod-banner-amber.jpg (100%) rename public/{media => }/castopod-banner-amber_federation.jpg (100%) rename public/{media => }/castopod-banner-amber_medium.webp (100%) rename public/{media => }/castopod-banner-amber_small.webp (100%) rename public/{media => }/castopod-banner-crimson.jpg (100%) rename public/{media => }/castopod-banner-crimson_federation.jpg (100%) rename public/{media => }/castopod-banner-crimson_medium.webp (100%) rename public/{media => }/castopod-banner-crimson_small.webp (100%) rename public/{media => }/castopod-banner-jacaranda.jpg (100%) rename public/{media => }/castopod-banner-jacaranda_federation.jpg (100%) rename public/{media => }/castopod-banner-jacaranda_medium.webp (100%) rename public/{media => }/castopod-banner-jacaranda_small.webp (100%) rename public/{media => }/castopod-banner-lake.jpg (100%) rename public/{media => }/castopod-banner-lake_federation.jpg (100%) rename public/{media => }/castopod-banner-lake_medium.webp (100%) rename public/{media => }/castopod-banner-lake_small.webp (100%) rename public/{media => }/castopod-banner-onyx.jpg (100%) rename public/{media => }/castopod-banner-onyx_federation.jpg (100%) rename public/{media => }/castopod-banner-onyx_medium.webp (100%) rename public/{media => }/castopod-banner-onyx_small.webp (100%) rename public/{media => }/castopod-banner-pine.jpg (100%) rename public/{media => }/castopod-banner-pine_federation.jpg (100%) rename public/{media => }/castopod-banner-pine_medium.webp (100%) rename public/{media => }/castopod-banner-pine_small.webp (100%) diff --git a/.gitignore b/.gitignore index 45fa5204..75d7aa6e 100644 --- a/.gitignore +++ b/.gitignore @@ -143,16 +143,20 @@ node_modules # public folder public/* -public/media/site !public/media !public/.htaccess !public/favicon.ico !public/icon* +!public/castopod-banner* +!public/castopod-avatar* !public/index.php !public/robots.txt !public/.well-known !public/.well-known/GDPR.yml +public/assets/* +!public/assets/index.html + # public media folder !public/media/podcasts !public/media/persons diff --git a/app/Config/Fediverse.php b/app/Config/Fediverse.php index cb10bc1a..f42d4558 100644 --- a/app/Config/Fediverse.php +++ b/app/Config/Fediverse.php @@ -23,7 +23,7 @@ class Fediverse extends FediverseBaseConfig */ public string $noteObject = NoteObject::class; - public string $defaultAvatarImagePath = 'media/castopod-avatar_thumbnail.webp'; + public string $defaultAvatarImagePath = 'castopod-avatar_thumbnail.webp'; public string $defaultAvatarImageMimetype = 'image/webp'; @@ -52,7 +52,7 @@ class Fediverse extends FediverseBaseConfig helper('media'); - $this->defaultCoverImagePath = media_path($defaultBannerPath . '_federation.' . $extension); + $this->defaultCoverImagePath = $defaultBannerPath . '_federation.' . $extension; $this->defaultCoverImageMimetype = $defaultBanner['mimetype']; } } diff --git a/app/Controllers/CreditsController.php b/app/Controllers/CreditsController.php index 1d41afd2..ca243a95 100644 --- a/app/Controllers/CreditsController.php +++ b/app/Controllers/CreditsController.php @@ -52,7 +52,7 @@ class CreditsController extends BaseController $personId => [ 'full_name' => $credit->person->full_name, 'thumbnail_url' => - $credit->person->avatar->thumbnail_url, + get_avatar_url($credit->person, 'thumbnail'), 'information_url' => $credit->person->information_url, 'roles' => [ @@ -90,7 +90,7 @@ class CreditsController extends BaseController $credits[$personGroup]['persons'][$personId] = [ 'full_name' => $credit->person->full_name, 'thumbnail_url' => - $credit->person->avatar->thumbnail_url, + get_avatar_url($credit->person, 'thumbnail'), 'information_url' => $credit->person->information_url, 'roles' => [ $personRole => [ diff --git a/app/Controllers/FeedController.php b/app/Controllers/FeedController.php index 290de8c4..ee0ad37e 100644 --- a/app/Controllers/FeedController.php +++ b/app/Controllers/FeedController.php @@ -23,7 +23,7 @@ class FeedController extends Controller { public function index(string $podcastHandle): ResponseInterface { - helper(['rss', 'premium_podcasts']); + helper(['rss', 'premium_podcasts', 'misc']); $podcast = (new PodcastModel())->where('handle', $podcastHandle) ->first(); diff --git a/app/Controllers/WebmanifestController.php b/app/Controllers/WebmanifestController.php index 653bcaae..f1e6449b 100644 --- a/app/Controllers/WebmanifestController.php +++ b/app/Controllers/WebmanifestController.php @@ -61,14 +61,12 @@ class WebmanifestController extends Controller 'background_color' => self::THEME_COLORS[service('settings')->get('App.theme')]['background'], 'icons' => [ [ - 'src' => service('settings') - ->get('App.siteIcon')['192'], + 'src' => get_site_icon_url('192'), 'type' => 'image/png', 'sizes' => '192x192', ], [ - 'src' => service('settings') - ->get('App.siteIcon')['512'], + 'src' => get_site_icon_url('512'), 'type' => 'image/png', 'sizes' => '512x512', ], diff --git a/app/Entities/Person.php b/app/Entities/Person.php index f0f27721..5ce4d8f0 100644 --- a/app/Entities/Person.php +++ b/app/Entities/Person.php @@ -84,21 +84,10 @@ class Person extends Entity return $this; } - public function getAvatar(): Image + public function getAvatar(): ?Image { - if ($this->attributes['avatar_id'] === null) { - helper('media'); - return new Image([ - 'file_key' => config('Images') - ->avatarDefaultPath, - 'file_mimetype' => config('Images') - ->avatarDefaultMimeType, - 'file_size' => 0, - 'file_metadata' => [ - 'sizes' => config('Images') - ->personAvatarSizes, - ], - ], 'fs'); + if ($this->avatar_id === null) { + return null; } if ($this->avatar === null) { diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index 313fa085..3894b102 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -294,22 +294,10 @@ class Podcast extends Entity return $this; } - public function getBanner(): Image + public function getBanner(): ?Image { if ($this->banner_id === null) { - $defaultBanner = config('Images') - ->podcastBannerDefaultPaths[service('settings')->get('App.theme')] ?? config( - 'Images' - )->podcastBannerDefaultPaths['default']; - return new Image([ - 'file_key' => $defaultBanner['path'], - 'file_mimetype' => $defaultBanner['mimetype'], - 'file_size' => 0, - 'file_metadata' => [ - 'sizes' => config('Images') -->podcastBannerSizes, - ], - ], 'fs'); + return null; } if (! $this->banner instanceof Image) { diff --git a/app/Helpers/id3_helper.php b/app/Helpers/id3_helper.php index 584a07d5..e0564f29 100644 --- a/app/Helpers/id3_helper.php +++ b/app/Helpers/id3_helper.php @@ -33,7 +33,7 @@ if (! function_exists('write_audio_file_tags')) { /** @var FileManagerInterface $fileManager */ $fileManager = service('file_manager'); - $APICdata = $fileManager->getFileContents($episode->cover->id3_key); + $APICdata = (string) $fileManager->getFileContents($episode->cover->id3_key); // TODO: variables used for podcast specific tags // $podcastUrl = $episode->podcast->link; diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php index e4a5dc93..06b0aff3 100644 --- a/app/Helpers/misc_helper.php +++ b/app/Helpers/misc_helper.php @@ -2,6 +2,9 @@ declare(strict_types=1); +use App\Entities\Person; +use App\Entities\Podcast; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -297,3 +300,89 @@ if (! function_exists('format_bytes')) { return round($bytes, $precision) . $units[$pow]; } } + + +if (! function_exists('get_site_icon_url')) { + function get_site_icon_url(string $size): string + { + if (config('App')->siteIcon['ico'] === service('settings')->get('App.siteIcon')['ico']) { + // return default site icon url + return base_url(service('settings')->get('App.siteIcon')[$size]); + } + + return service('file_manager')->getUrl(service('settings')->get('App.siteIcon')[$size]); + } +} + + +if (! function_exists('get_podcast_banner')) { + function get_podcast_banner_url(Podcast $podcast, string $size): string + { + if ($podcast->banner === null) { + $defaultBanner = config('Images') + ->podcastBannerDefaultPaths[service('settings')->get('App.theme')] ?? config( + 'Images' + )->podcastBannerDefaultPaths['default']; + + $sizes = config('Images') +->podcastBannerSizes; + + $sizeConfig = $sizes[$size]; + helper('filesystem'); + + // return default site icon url + return base_url( + change_file_path($defaultBanner['path'], '_' . $size, $sizeConfig['extension'] ?? null) + ); + } + + $sizeKey = $size . '_url'; + return $podcast->banner->{$sizeKey}; + } +} + +if (! function_exists('get_podcast_banner_mimetype')) { + function get_podcast_banner_mimetype(Podcast $podcast, string $size): string + { + if ($podcast->banner === null) { + $sizes = config('Images') +->podcastBannerSizes; + + $sizeConfig = $sizes[$size]; + helper('filesystem'); + + // return default site icon url + return array_key_exists('mimetype', $sizeConfig) ? $sizeConfig['mimetype'] : config( + 'Images' + )->podcastBannerDefaultMimeType; + } + + $mimetype = $size . '_mimetype'; + return $podcast->banner->{$mimetype}; + } +} + +if (! function_exists('get_avatar_url')) { + function get_avatar_url(Person $person, string $size): string + { + if ($person->avatar === null) { + $defaultAvatar = config('Images') +->avatarDefaultPath; + + $sizes = config('Images') +->personAvatarSizes; + + $sizeConfig = $sizes[$size]; + + helper('filesystem'); + + // return default site icon url + return base_url( + change_file_path($defaultAvatar['path'], '_' . $size, $sizeConfig['extension'] ?? null) + ); + } + + $sizeKey = $size . '_url'; + return $person->avatar->{$sizeKey}; + } +} diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index c4329f77..7da6baa2 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -204,7 +204,7 @@ if (! function_exists('get_rss_feed')) { foreach ($person->roles as $role) { $personElement = $channel->addChild('person', $person->full_name, $podcastNamespace); - $personElement->addAttribute('img', $person->avatar->medium_url); + $personElement->addAttribute('img', get_avatar_url($person, 'medium')); if ($person->information_url !== null) { $personElement->addAttribute('href', $person->information_url); @@ -388,7 +388,7 @@ if (! function_exists('get_rss_feed')) { esc(lang("PersonsTaxonomy.persons.{$role->group}.label", [], 'en')), ); - $personElement->addAttribute('img', $person->avatar->medium_url); + $personElement->addAttribute('img', get_avatar_url($person, 'medium')); if ($person->information_url !== null) { $personElement->addAttribute('href', $person->information_url); diff --git a/app/Helpers/seo_helper.php b/app/Helpers/seo_helper.php index 6d535739..3099965d 100644 --- a/app/Helpers/seo_helper.php +++ b/app/Helpers/seo_helper.php @@ -273,7 +273,7 @@ if (! function_exists('get_home_metatags')) { $metatags ->title(service('settings')->get('App.siteName')) ->description(esc(service('settings')->get('App.siteDescription'))) - ->image(service('settings')->get('App.siteIcon')['512']) + ->image(get_site_icon_url('512')) ->canonical((string) current_url()) ->og('site_name', esc(service('settings')->get('App.siteName'))); @@ -292,7 +292,7 @@ if (! function_exists('get_page_metatags')) { )->get('App.siteName') ) ->description(esc(service('settings')->get('App.siteDescription'))) - ->image(service('settings')->get('App.siteIcon')['512']) + ->image(get_site_icon_url('512')) ->canonical((string) current_url()) ->og('site_name', esc(service('settings')->get('App.siteName'))); diff --git a/app/Libraries/MediaClipper/VideoClipper.php b/app/Libraries/MediaClipper/VideoClipper.php index 86ebb758..f3315fd2 100644 --- a/app/Libraries/MediaClipper/VideoClipper.php +++ b/app/Libraries/MediaClipper/VideoClipper.php @@ -134,7 +134,7 @@ class VideoClipper /** @var FileManagerInterface $fileManager */ $fileManager = service('file_manager'); - $jsonTranscriptString = $fileManager->getFileContents($jsonFileKey); + $jsonTranscriptString = (string) $fileManager->getFileContents($jsonFileKey); if ($jsonTranscriptString === '') { throw new Exception('Cannot get transcript json contents.'); } diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 0590b434..8fd51be4 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -469,8 +469,8 @@ class PodcastModel extends Model $actor->summary = $podcast->description_html; $actor->avatar_image_url = $podcast->cover->federation_url; $actor->avatar_image_mimetype = $podcast->cover->federation_mimetype; - $actor->cover_image_url = $podcast->banner->federation_url; - $actor->cover_image_mimetype = $podcast->banner->federation_mimetype; + $actor->cover_image_url = get_podcast_banner_url($podcast, 'federation'); + $actor->cover_image_mimetype = get_podcast_banner_mimetype($podcast, 'federation'); if ($actor->hasChanged()) { $actorModel->update($actor->id, $actor); diff --git a/modules/Admin/Controllers/SettingsController.php b/modules/Admin/Controllers/SettingsController.php index d68e3394..e6215e17 100644 --- a/modules/Admin/Controllers/SettingsController.php +++ b/modules/Admin/Controllers/SettingsController.php @@ -17,10 +17,10 @@ use App\Models\EpisodeModel; use App\Models\PersonModel; use App\Models\PodcastModel; use App\Models\PostModel; +use CodeIgniter\Files\File; use CodeIgniter\HTTP\RedirectResponse; use Modules\Media\Entities\Audio; use Modules\Media\FileManagers\FileManagerInterface; -use Modules\Media\FileManagers\FS; use Modules\Media\Models\MediaModel; use PHP_ICO; @@ -58,47 +58,60 @@ class SettingsController extends BaseController $siteIconFile = $this->request->getFile('site_icon'); if ($siteIconFile !== null && $siteIconFile->isValid()) { - helper(['filesystem', 'media']); + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); // delete site folder in media before repopulating it - delete_files(media_path_absolute('/site')); - - // save original in disk - $originalFilename = (new FS(config('Media')))->save( - $siteIconFile, - 'site/icon.' . $siteIconFile->getExtension() - ); + $fileManager->deleteAll('site'); // convert jpeg image to png if not if ($siteIconFile->getClientMimeType() !== 'image/png') { - service('image')->withFile(media_path_absolute($originalFilename)) + $tempFilePath = tempnam(WRITEPATH . 'temp', 'img_'); + service('image') + ->withFile($siteIconFile->getRealPath()) ->convert(IMAGETYPE_JPEG) - ->save(media_path_absolute('/site/icon.png')); + ->save($tempFilePath); + + @unlink($siteIconFile->getRealPath()); + + $siteIconFile = new File($tempFilePath, true); } + $icoTempFilePath = WRITEPATH . 'temp/img_favicon.ico'; + + // generate ico + $ico_lib = new PHP_ICO(); + $ico_lib->add_image($siteIconFile->getRealPath(), [[32, 32], [64, 64]]); + $ico_lib->save_ico($icoTempFilePath); + // generate random hash to use as a suffix to renew browser cache $randomHash = substr(bin2hex(random_bytes(18)), 0, 8); - // generate ico - $ico_lib = new PHP_ICO(); - $ico_lib->add_image(media_path_absolute('/site/icon.png'), [[32, 32], [64, 64]]); - $ico_lib->save_ico(media_path_absolute("/site/favicon.{$randomHash}.ico")); + // save ico + $fileManager->save(new File($icoTempFilePath, true), "site/favicon.{$randomHash}.ico"); // resize original to needed sizes foreach ([64, 180, 192, 512] as $size) { + $tempFilePath = tempnam(WRITEPATH . 'temp', 'img_'); service('image') - ->withFile(media_path_absolute('/site/icon.png')) + ->withFile($siteIconFile->getRealPath()) ->resize($size, $size) - ->save(media_path_absolute("/site/icon-{$size}.{$randomHash}.png")); + ->save($tempFilePath); + + // save sizes to + $fileManager->save(new File($tempFilePath), "site/icon-{$size}.{$randomHash}.png"); } + // save original as png + $fileManager->save($siteIconFile, 'site/icon.png'); + service('settings') ->set('App.siteIcon', [ - 'ico' => '/' . media_path("/site/favicon.{$randomHash}.ico"), - '64' => '/' . media_path("/site/icon-64.{$randomHash}.png"), - '180' => '/' . media_path("/site/icon-180.{$randomHash}.png"), - '192' => '/' . media_path("/site/icon-192.{$randomHash}.png"), - '512' => '/' . media_path("/site/icon-512.{$randomHash}.png"), + 'ico' => "site/favicon.{$randomHash}.ico", + '64' => "site/icon-64.{$randomHash}.png", + '180' => "site/icon-180.{$randomHash}.png", + '192' => "site/icon-192.{$randomHash}.png", + '512' => "site/icon-512.{$randomHash}.png", ]); } @@ -107,9 +120,11 @@ class SettingsController extends BaseController public function deleteIcon(): RedirectResponse { - helper(['filesystem', 'media']); - // delete site folder in media - delete_files(media_path_absolute('/site')); + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); + + // delete site folder + $fileManager->deleteAll('site'); service('settings') ->forget('App.siteIcon'); diff --git a/modules/Fediverse/Config/Fediverse.php b/modules/Fediverse/Config/Fediverse.php index 382153a8..f40fec37 100644 --- a/modules/Fediverse/Config/Fediverse.php +++ b/modules/Fediverse/Config/Fediverse.php @@ -30,11 +30,11 @@ class Fediverse extends BaseConfig * Default avatar and cover images * -------------------------------------------------------------------- */ - public string $defaultAvatarImagePath = 'media/avatar-default.jpg'; + public string $defaultAvatarImagePath = 'avatar-default.jpg'; public string $defaultAvatarImageMimetype = 'image/jpeg'; - public string $defaultCoverImagePath = 'media/banner-default.jpg'; + public string $defaultCoverImagePath = 'banner-default.jpg'; public string $defaultCoverImageMimetype = 'image/jpeg'; diff --git a/modules/Media/Config/Routes.php b/modules/Media/Config/Routes.php new file mode 100644 index 00000000..19766ba1 --- /dev/null +++ b/modules/Media/Config/Routes.php @@ -0,0 +1,16 @@ +get('static/(:any)', 'MediaController::serve/$1', [ + 'as' => 'media-serve', + 'namespace' => 'Modules\Media\Controllers', +]); diff --git a/modules/Media/Controllers/MediaController.php b/modules/Media/Controllers/MediaController.php new file mode 100644 index 00000000..65a8f5db --- /dev/null +++ b/modules/Media/Controllers/MediaController.php @@ -0,0 +1,26 @@ +serve(implode('/', $key)); + } +} diff --git a/modules/Media/Entities/BaseMedia.php b/modules/Media/Entities/BaseMedia.php index d293ef6b..905a0c21 100644 --- a/modules/Media/Entities/BaseMedia.php +++ b/modules/Media/Entities/BaseMedia.php @@ -12,9 +12,6 @@ namespace Modules\Media\Entities; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; -use Modules\Media\FileManagers\FileManagerInterface; -use Modules\Media\FileManagers\FS; -use Modules\Media\FileManagers\S3; use Modules\Media\Models\MediaModel; /** @@ -58,28 +55,13 @@ class BaseMedia extends Entity 'updated_by' => 'integer', ]; - protected FileManagerInterface $fileManager; - /** * @param array|null $data - * @param 'fs'|'s3'|null $fileManager */ - public function __construct(array $data = null, string $fileManager = null) + public function __construct(array $data = null) { parent::__construct($data); - if ($fileManager !== null) { - $this->fileManager = match ($fileManager) { - 'fs' => new FS(config('Media')), - 's3' => new S3(config('Media')) - }; - } else { - /** @var FileManagerInterface $fileManagerService */ - $fileManagerService = service('file_manager'); - - $this->fileManager = $fileManagerService; - } - $this->initFileProperties(); } @@ -92,7 +74,7 @@ class BaseMedia extends Entity 'extension' => $extension, ] = pathinfo($this->file_key); - $this->attributes['file_url'] = $this->fileManager->getUrl($this->file_key); + $this->attributes['file_url'] = service('file_manager')->getUrl($this->file_key); $this->attributes['file_name'] = $filename; $this->attributes['file_directory'] = $dirname; $this->attributes['file_extension'] = $extension; @@ -120,14 +102,14 @@ class BaseMedia extends Entity return false; } - $this->attributes['file_key'] = $this->fileManager->save($this->attributes['file'], $this->file_key); + $this->attributes['file_key'] = service('file_manager')->save($this->attributes['file'], $this->file_key); return true; } public function deleteFile(): bool { - return $this->fileManager->delete($this->file_key); + return service('file_manager')->delete($this->file_key); } public function rename(): bool @@ -143,7 +125,7 @@ class BaseMedia extends Entity return false; } - if (! $this->fileManager->rename($this->file_key, $newFileKey)) { + if (! service('file_manager')->rename($this->file_key, $newFileKey)) { $db->transRollback(); return false; } diff --git a/modules/Media/Entities/Image.php b/modules/Media/Entities/Image.php index 9f45bacc..123cc203 100644 --- a/modules/Media/Entities/Image.php +++ b/modules/Media/Entities/Image.php @@ -42,14 +42,12 @@ class Image extends BaseMedia { helper('filesystem'); - $fileKeyWithoutExt = path_without_ext($this->file_key); - foreach ($this->sizes as $name => $size) { $extension = array_key_exists('extension', $size) ? $size['extension'] : $this->file_extension; $mimetype = array_key_exists('mimetype', $size) ? $size['mimetype'] : $this->file_mimetype; - $this->{$name . '_key'} = $fileKeyWithoutExt . '_' . $name . '.' . $extension; - $this->{$name . '_url'} = $this->fileManager->getUrl($this->{$name . '_key'}); + $this->{$name . '_key'} = change_file_path($this->file_key, '_' . $name, $extension); + $this->{$name . '_url'} = service('file_manager')->getUrl($this->{$name . '_key'}); $this->{$name . '_mimetype'} = $mimetype; } @@ -126,7 +124,8 @@ class Image extends BaseMedia // download image temporarily to generate sizes from $tempImagePath = (string) tempnam(WRITEPATH . 'temp', 'img_'); - $imageContent = $this->fileManager->getFileContents($this->file_key); + $imageContent = (string) service('file_manager') + ->getFileContents($this->file_key); file_put_contents($tempImagePath, $imageContent); $this->attributes['file'] = new File($tempImagePath, true); @@ -144,7 +143,7 @@ class Image extends BaseMedia $newImage = new File($tempFilePath, true); - $this->fileManager + service('file_manager') ->save($newImage, $this->{$name . '_key'}); } @@ -159,7 +158,7 @@ class Image extends BaseMedia foreach (array_keys($this->sizes) as $name) { $pathProperty = $name . '_key'; - if (! $this->fileManager->delete($this->{$pathProperty})) { + if (! service('file_manager')->delete($this->{$pathProperty})) { return false; } } diff --git a/modules/Media/Entities/Transcript.php b/modules/Media/Entities/Transcript.php index 4ad7cdcb..a969cff1 100644 --- a/modules/Media/Entities/Transcript.php +++ b/modules/Media/Entities/Transcript.php @@ -29,7 +29,7 @@ class Transcript extends BaseMedia helper('media'); $this->json_key = $this->file_metadata['json_key']; - $this->json_url = $this->fileManager + $this->json_url = service('file_manager') ->getUrl($this->json_key); } } @@ -42,12 +42,8 @@ class Transcript extends BaseMedia helper('filesystem'); - $fileKeyWithoutExt = path_without_ext($this->file_key); - - $jsonfileKey = $fileKeyWithoutExt . '.json'; - // set metadata (generated json file path) - $this->json_key = $jsonfileKey; + $this->json_key = change_file_path($this->file_key, '', 'json'); $metadata['json_key'] = $this->json_key; $this->attributes['file_metadata'] = json_encode($metadata, JSON_INVALID_UTF8_IGNORE); @@ -71,7 +67,7 @@ class Transcript extends BaseMedia } if ($this->json_key) { - return $this->fileManager->delete($this->json_key); + return service('file_manager')->delete($this->json_key); } return true; @@ -96,7 +92,7 @@ class Transcript extends BaseMedia $newTranscriptJson = new File($tempFilePath, true); - $this->fileManager + service('file_manager') ->save($newTranscriptJson, $this->json_key); return true; diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index 141f690d..63c1f707 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Modules\Media\FileManagers; use CodeIgniter\Files\File; +use CodeIgniter\HTTP\Response; use Exception; use Modules\Media\Config\Media as MediaConfig; @@ -27,7 +28,7 @@ class FS implements FileManagerInterface $path = $path . '.' . $extension; } - $mediaRoot = media_path_absolute(); + $mediaRoot = $this->media_path_absolute(); if (! file_exists(dirname($mediaRoot . '/' . $path))) { mkdir(dirname($mediaRoot . '/' . $path), 0777, true); @@ -51,7 +52,7 @@ class FS implements FileManagerInterface { helper('media'); - return @unlink(media_path_absolute($key)); + return @unlink($this->media_path_absolute($key)); } public function getUrl(string $key): string @@ -70,21 +71,21 @@ class FS implements FileManagerInterface { helper('media'); - return rename(media_path_absolute($oldKey), media_path_absolute($newKey)); + return rename($this->media_path_absolute($oldKey), $this->media_path_absolute($newKey)); } - public function getFileContents(string $key): string + public function getFileContents(string $key): string|false { helper('media'); - return (string) file_get_contents(media_path_absolute($key)); + return file_get_contents($this->media_path_absolute($key)); } public function getFileInput(string $key): string { helper('media'); - return media_path_absolute($key); + return $this->media_path_absolute($key); } public function deletePodcastImageSizes(string $podcastHandle): bool @@ -113,12 +114,12 @@ class FS implements FileManagerInterface if ($pattern === '*') { helper('filesystem'); - return delete_files(media_path_absolute($prefix), true); + return delete_files($this->media_path_absolute($prefix), true); } $prefix = rtrim($prefix, '/') . '/'; - $imagePaths = glob(media_path_absolute($prefix . $pattern)); + $imagePaths = glob($this->media_path_absolute($prefix . $pattern)); if (! $imagePaths) { return true; @@ -135,6 +136,28 @@ class FS implements FileManagerInterface { helper('media'); - return is_really_writable(media_path_absolute()); + return is_really_writable($this->media_path_absolute()); + } + + public function serve(string $key): Response + { + return redirect()->to($this->getUrl($key)); + } + + /** + * Prefixes the absolute storage directory to the media path of a given uri + * + * @param string|string[] $uri URI string or array of URI segments + */ + private function media_path_absolute(string | array $uri = ''): string + { + // convert segment array to string + if (is_array($uri)) { + $uri = implode('/', $uri); + } + + $uri = trim($uri, '/'); + + return config('Media')->storage . '/' . config('Media')->root . '/' . $uri; } } diff --git a/modules/Media/FileManagers/FileManagerInterface.php b/modules/Media/FileManagers/FileManagerInterface.php index 3d1d2ac4..5b2dd078 100644 --- a/modules/Media/FileManagers/FileManagerInterface.php +++ b/modules/Media/FileManagers/FileManagerInterface.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Modules\Media\FileManagers; use CodeIgniter\Files\File; +use CodeIgniter\HTTP\Response; interface FileManagerInterface { @@ -16,7 +17,7 @@ interface FileManagerInterface public function rename(string $oldKey, string $newKey): bool; - public function getFileContents(string $key): string; + public function getFileContents(string $key): string|false; public function getFileInput(string $key): string; @@ -27,4 +28,6 @@ interface FileManagerInterface public function deleteAll(string $prefix, string $pattern = '*'): bool; public function isHealthy(): bool; + + public function serve(string $key): Response; } diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index b5856faf..fe5b5e3d 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -6,8 +6,9 @@ namespace Modules\Media\FileManagers; use Aws\Credentials\Credentials; use Aws\S3\S3Client; +use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\Files\File; -use CodeIgniter\HTTP\URI; +use CodeIgniter\HTTP\Response; use Exception; use Modules\Media\Config\Media as MediaConfig; @@ -35,6 +36,7 @@ class S3 implements FileManagerInterface 'Bucket' => $this->config->s3['bucket'], 'Key' => $this->prefixKey($key), 'SourceFile' => $file, + 'ContentType' => $file->getMimeType(), ]); } catch (Exception) { return false; @@ -62,16 +64,7 @@ class S3 implements FileManagerInterface public function getUrl(string $key): string { - $url = new URI((string) $this->config->s3['endpoint']); - - if ($this->config->s3['pathStyleEndpoint'] === true) { - $url->setPath($this->config->s3['bucket'] . '/' . $this->prefixKey($key)); - return (string) $url; - } - - $url->setHost($this->config->s3['bucket'] . '.' . $url->getHost()); - $url->setPath($this->prefixKey($key)); - return (string) $url; + return url_to('media-serve', $key); } public function rename(string $oldKey, string $newKey): bool @@ -91,12 +84,16 @@ class S3 implements FileManagerInterface return $this->delete($oldKey); } - public function getFileContents(string $key): string + public function getFileContents(string $key): string|false { - $result = $this->s3->getObject([ - 'Bucket' => $this->config->s3['bucket'], - 'Key' => $this->prefixKey($key), - ]); + try { + $result = $this->s3->getObject([ + 'Bucket' => $this->config->s3['bucket'], + 'Key' => $this->prefixKey($key), + ]); + } catch (Exception) { + return false; + } return (string) $result->get('Body'); } @@ -186,6 +183,31 @@ class S3 implements FileManagerInterface return true; } + public function serve(string $key): Response + { + $response = service('response'); + + try { + $result = $this->s3->getObject([ + 'Bucket' => $this->config->s3['bucket'], + 'Key' => $this->prefixKey($key), + ]); + } catch (Exception) { + throw new PageNotFoundException(); + } + + // Remove Cache-Control header before redefining it + header_remove('Cache-Control'); + + return $response->setCache([ + 'max-age' => DECADE, + 'last-modified' => $result->get('LastModified'), + 'etag' => $result->get('ETag'), + 'public' => true, + ])->setContentType($result->get('ContentType')) + ->setBody((string) $result->get('Body')->getContents()); + } + private function prefixKey(string $key): string { if ($this->config->s3['keyPrefix'] === '') { diff --git a/modules/Media/Helpers/filesystem_helper.php b/modules/Media/Helpers/filesystem_helper.php index 0cff140c..9a6d00c8 100644 --- a/modules/Media/Helpers/filesystem_helper.php +++ b/modules/Media/Helpers/filesystem_helper.php @@ -8,20 +8,13 @@ declare(strict_types=1); * @link https://castopod.org/ */ - -if (! function_exists('path_without_ext')) { - function path_without_ext(string $path): string +if (! function_exists('add_suffix_to_path')) { + function change_file_path(string $path, string $suffix = '', ?string $newExtension = null): string { - $fileKeyInfo = pathinfo($path); - - if ($fileKeyInfo['dirname'] === '.' && ! str_starts_with($path, '.')) { - return $fileKeyInfo['filename']; + if ($newExtension === null) { + $newExtension = pathinfo($path, PATHINFO_EXTENSION); } - if ($fileKeyInfo['dirname'] === '/') { - return '/' . $fileKeyInfo['filename']; - } - - return implode('/', [$fileKeyInfo['dirname'], $fileKeyInfo['filename']]); + return preg_replace('~\.[^.]+$~', '', $path) . $suffix . '.' . $newExtension; } } diff --git a/modules/Media/Helpers/media_helper.php b/modules/Media/Helpers/media_helper.php index fab6123d..68eb3aa9 100644 --- a/modules/Media/Helpers/media_helper.php +++ b/modules/Media/Helpers/media_helper.php @@ -63,34 +63,3 @@ if (! function_exists('download_file')) { return new File($tmpfileKey); } } - -if (! function_exists('media_path')) { - /** - * Prefixes the root media path to a given uri - * - * @param string|string[] $uri URI string or array of URI segments - */ - function media_path(string | array $uri = ''): string - { - // convert segment array to string - if (is_array($uri)) { - $uri = implode('/', $uri); - } - - $uri = trim($uri, '/'); - - return config('Media')->root . '/' . $uri; - } -} - -if (! function_exists('media_path_absolute')) { - /** - * Prefixes the absolute storage directory to the media path of a given uri - * - * @param string|string[] $uri URI string or array of URI segments - */ - function media_path_absolute(string | array $uri = ''): string - { - return config('Media')->storage . '/' . media_path($uri); - } -} diff --git a/public/media/castopod-avatar.jpg b/public/castopod-avatar.jpg similarity index 100% rename from public/media/castopod-avatar.jpg rename to public/castopod-avatar.jpg diff --git a/public/media/castopod-avatar_medium.webp b/public/castopod-avatar_medium.webp similarity index 100% rename from public/media/castopod-avatar_medium.webp rename to public/castopod-avatar_medium.webp diff --git a/public/media/castopod-avatar_thumbnail.webp b/public/castopod-avatar_thumbnail.webp similarity index 100% rename from public/media/castopod-avatar_thumbnail.webp rename to public/castopod-avatar_thumbnail.webp diff --git a/public/media/castopod-avatar_tiny.webp b/public/castopod-avatar_tiny.webp similarity index 100% rename from public/media/castopod-avatar_tiny.webp rename to public/castopod-avatar_tiny.webp diff --git a/public/media/castopod-banner-amber.jpg b/public/castopod-banner-amber.jpg similarity index 100% rename from public/media/castopod-banner-amber.jpg rename to public/castopod-banner-amber.jpg diff --git a/public/media/castopod-banner-amber_federation.jpg b/public/castopod-banner-amber_federation.jpg similarity index 100% rename from public/media/castopod-banner-amber_federation.jpg rename to public/castopod-banner-amber_federation.jpg diff --git a/public/media/castopod-banner-amber_medium.webp b/public/castopod-banner-amber_medium.webp similarity index 100% rename from public/media/castopod-banner-amber_medium.webp rename to public/castopod-banner-amber_medium.webp diff --git a/public/media/castopod-banner-amber_small.webp b/public/castopod-banner-amber_small.webp similarity index 100% rename from public/media/castopod-banner-amber_small.webp rename to public/castopod-banner-amber_small.webp diff --git a/public/media/castopod-banner-crimson.jpg b/public/castopod-banner-crimson.jpg similarity index 100% rename from public/media/castopod-banner-crimson.jpg rename to public/castopod-banner-crimson.jpg diff --git a/public/media/castopod-banner-crimson_federation.jpg b/public/castopod-banner-crimson_federation.jpg similarity index 100% rename from public/media/castopod-banner-crimson_federation.jpg rename to public/castopod-banner-crimson_federation.jpg diff --git a/public/media/castopod-banner-crimson_medium.webp b/public/castopod-banner-crimson_medium.webp similarity index 100% rename from public/media/castopod-banner-crimson_medium.webp rename to public/castopod-banner-crimson_medium.webp diff --git a/public/media/castopod-banner-crimson_small.webp b/public/castopod-banner-crimson_small.webp similarity index 100% rename from public/media/castopod-banner-crimson_small.webp rename to public/castopod-banner-crimson_small.webp diff --git a/public/media/castopod-banner-jacaranda.jpg b/public/castopod-banner-jacaranda.jpg similarity index 100% rename from public/media/castopod-banner-jacaranda.jpg rename to public/castopod-banner-jacaranda.jpg diff --git a/public/media/castopod-banner-jacaranda_federation.jpg b/public/castopod-banner-jacaranda_federation.jpg similarity index 100% rename from public/media/castopod-banner-jacaranda_federation.jpg rename to public/castopod-banner-jacaranda_federation.jpg diff --git a/public/media/castopod-banner-jacaranda_medium.webp b/public/castopod-banner-jacaranda_medium.webp similarity index 100% rename from public/media/castopod-banner-jacaranda_medium.webp rename to public/castopod-banner-jacaranda_medium.webp diff --git a/public/media/castopod-banner-jacaranda_small.webp b/public/castopod-banner-jacaranda_small.webp similarity index 100% rename from public/media/castopod-banner-jacaranda_small.webp rename to public/castopod-banner-jacaranda_small.webp diff --git a/public/media/castopod-banner-lake.jpg b/public/castopod-banner-lake.jpg similarity index 100% rename from public/media/castopod-banner-lake.jpg rename to public/castopod-banner-lake.jpg diff --git a/public/media/castopod-banner-lake_federation.jpg b/public/castopod-banner-lake_federation.jpg similarity index 100% rename from public/media/castopod-banner-lake_federation.jpg rename to public/castopod-banner-lake_federation.jpg diff --git a/public/media/castopod-banner-lake_medium.webp b/public/castopod-banner-lake_medium.webp similarity index 100% rename from public/media/castopod-banner-lake_medium.webp rename to public/castopod-banner-lake_medium.webp diff --git a/public/media/castopod-banner-lake_small.webp b/public/castopod-banner-lake_small.webp similarity index 100% rename from public/media/castopod-banner-lake_small.webp rename to public/castopod-banner-lake_small.webp diff --git a/public/media/castopod-banner-onyx.jpg b/public/castopod-banner-onyx.jpg similarity index 100% rename from public/media/castopod-banner-onyx.jpg rename to public/castopod-banner-onyx.jpg diff --git a/public/media/castopod-banner-onyx_federation.jpg b/public/castopod-banner-onyx_federation.jpg similarity index 100% rename from public/media/castopod-banner-onyx_federation.jpg rename to public/castopod-banner-onyx_federation.jpg diff --git a/public/media/castopod-banner-onyx_medium.webp b/public/castopod-banner-onyx_medium.webp similarity index 100% rename from public/media/castopod-banner-onyx_medium.webp rename to public/castopod-banner-onyx_medium.webp diff --git a/public/media/castopod-banner-onyx_small.webp b/public/castopod-banner-onyx_small.webp similarity index 100% rename from public/media/castopod-banner-onyx_small.webp rename to public/castopod-banner-onyx_small.webp diff --git a/public/media/castopod-banner-pine.jpg b/public/castopod-banner-pine.jpg similarity index 100% rename from public/media/castopod-banner-pine.jpg rename to public/castopod-banner-pine.jpg diff --git a/public/media/castopod-banner-pine_federation.jpg b/public/castopod-banner-pine_federation.jpg similarity index 100% rename from public/media/castopod-banner-pine_federation.jpg rename to public/castopod-banner-pine_federation.jpg diff --git a/public/media/castopod-banner-pine_medium.webp b/public/castopod-banner-pine_medium.webp similarity index 100% rename from public/media/castopod-banner-pine_medium.webp rename to public/castopod-banner-pine_medium.webp diff --git a/public/media/castopod-banner-pine_small.webp b/public/castopod-banner-pine_small.webp similarity index 100% rename from public/media/castopod-banner-pine_small.webp rename to public/castopod-banner-pine_small.webp diff --git a/public/media/persons/index.html b/public/media/persons/index.html index e69de29b..eebf8ecb 100644 --- a/public/media/persons/index.html +++ b/public/media/persons/index.html @@ -0,0 +1,9 @@ + + + + 403 Forbidden + + +

    Directory access is forbidden.

    + + diff --git a/public/media/podcasts/index.html b/public/media/podcasts/index.html index e69de29b..eebf8ecb 100644 --- a/public/media/podcasts/index.html +++ b/public/media/podcasts/index.html @@ -0,0 +1,9 @@ + + + + 403 Forbidden + + +

    Directory access is forbidden.

    + + diff --git a/public/media/site/index.html b/public/media/site/index.html index e69de29b..eebf8ecb 100644 --- a/public/media/site/index.html +++ b/public/media/site/index.html @@ -0,0 +1,9 @@ + + + + 403 Forbidden + + +

    Directory access is forbidden.

    + + diff --git a/themes/cp_admin/_layout.php b/themes/cp_admin/_layout.php index d23a48a4..2cca6f23 100644 --- a/themes/cp_admin/_layout.php +++ b/themes/cp_admin/_layout.php @@ -15,9 +15,8 @@ $isEpisodeArea = isset($podcast) && isset($episode); <?= $this->renderSection('title') ?> | Castopod Admin - - + + ' /> diff --git a/themes/cp_admin/episode/persons.php b/themes/cp_admin/episode/persons.php index 05e0a619..d5deb5ba 100644 --- a/themes/cp_admin/episode/persons.php +++ b/themes/cp_admin/episode/persons.php @@ -58,7 +58,7 @@ return '
    ' . '' . esc($person->full_name) . '' . + '">' . esc($person->full_name) . '' . '
    ' . esc($person->full_name) . implode( diff --git a/themes/cp_admin/person/_card.php b/themes/cp_admin/person/_card.php index 20408bb5..afd7e23f 100644 --- a/themes/cp_admin/person/_card.php +++ b/themes/cp_admin/person/_card.php @@ -2,7 +2,7 @@
    - <?= esc($person->full_name) ?> + <?= esc($person->full_name) ?>

    full_name) ?>

    diff --git a/themes/cp_admin/person/view.php b/themes/cp_admin/person/view.php index 4956b3cc..e07efd77 100644 --- a/themes/cp_admin/person/view.php +++ b/themes/cp_admin/person/view.php @@ -17,7 +17,7 @@
    <?= esc($person->full_name) ?>banner_id !== null): ?> - +
    <?= esc($podcast->title) ?> diff --git a/themes/cp_admin/podcast/persons.php b/themes/cp_admin/podcast/persons.php index 7b127d63..c19f061e 100644 --- a/themes/cp_admin/podcast/persons.php +++ b/themes/cp_admin/podcast/persons.php @@ -55,7 +55,7 @@ return '
    ' . '' . esc($person->full_name) . '' . + '">' . esc($person->full_name) . '' . '
    ' . esc($person->full_name) . implode( diff --git a/themes/cp_admin/settings/general.php b/themes/cp_admin/settings/general.php index dd2ce565..182d59a7 100644 --- a/themes/cp_admin/settings/general.php +++ b/themes/cp_admin/settings/general.php @@ -46,7 +46,7 @@ siteIcon['ico'] !== service('settings')->get('App.siteIcon')['ico']): ?>
    - <?= esc(service('settings')->get('App.siteName')) ?> Favicon + <?= esc(service('settings')->get('App.siteName')) ?> Favicon
    @@ -62,7 +62,7 @@ + subtitle=""> diff --git a/themes/cp_app/_persons_modal.php b/themes/cp_app/_persons_modal.php index 237fefee..847f46d2 100644 --- a/themes/cp_app/_persons_modal.php +++ b/themes/cp_app/_persons_modal.php @@ -17,7 +17,7 @@
    - <?= esc($person->full_name) ?> + <?= esc($person->full_name) ?>

    information_url): ?> diff --git a/themes/cp_app/embed.php b/themes/cp_app/embed.php index afc1c05d..f18322d6 100644 --- a/themes/cp_app/embed.php +++ b/themes/cp_app/embed.php @@ -9,9 +9,8 @@ - - + + ' /> asset('styles/index.css', 'css') ?> diff --git a/themes/cp_app/episode/_layout.php b/themes/cp_app/episode/_layout.php index 8bf65fd3..730ec143 100644 --- a/themes/cp_app/episode/_layout.php +++ b/themes/cp_app/episode/_layout.php @@ -7,9 +7,8 @@ - - + + + + + + ' /> + asset('styles/index.css', 'css') ?> + asset('js/app.ts', 'js') ?> + asset('js/podcast.ts', 'js') ?> + + + + +
    + include('_admin_navbar') ?> +
    + + +
    +
    +
    + <?= esc($podcast->title) ?> +

    title) ?>@handle) ?>

    +
    + fundingPlatforms, 'is_visible'), true)): ?> + + + handle)), + icon( + 'social/castopod', + 'mr-2 text-xl text-black/75 group-hover:text-black', + ) . lang('Podcast.follow'), + [ + 'width' => 420, + 'height' => 620, + 'class' => 'group inline-flex items-center px-4 text-xs tracking-wider font-semibold text-black uppercase rounded-full leading-8 shadow focus:ring-accent bg-white', + ], + ) ?> + +
    +
    +
    +
    + podcastingPlatforms as $podcastingPlatform): ?> + is_visible): ?> + slug, 'text-xl mr-auto', $podcastingPlatform->type) ?>label ?> + + + +
    +
    + socialPlatforms as $socialPlatform): ?> + is_visible): ?> + link_url), + icon( + esc($socialPlatform->slug), + '', + $socialPlatform->type + ), + [ + 'class' => 'focus:ring-accent rounded-full text-4xl text-skin-muted hover:text-skin-base w-8 h-8 items-center inline-flex justify-center', + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'data-tooltip' => 'bottom', + 'title' => $socialPlatform->label, + ], + ) ?> + + +
    + + fundingPlatforms, 'is_visible'), true)): ?> + include('podcast/_partials/funding_links_modal') ?> + + + From dfa93ff8e32669a5555aa88289911afecc289603 Mon Sep 17 00:00:00 2001 From: crowdin Date: Thu, 27 Jul 2023 10:49:25 +0000 Subject: [PATCH 176/477] chore(i18n): new Crowdin updates --- app/Language/ar/Podcast.php | 1 + app/Language/br/Podcast.php | 1 + app/Language/ca/Podcast.php | 1 + app/Language/da/Podcast.php | 1 + app/Language/de/Podcast.php | 1 + app/Language/el/Podcast.php | 1 + app/Language/es/Podcast.php | 1 + app/Language/fa/Comment.php | 6 +- app/Language/fa/Common.php | 2 +- app/Language/fa/Episode.php | 6 +- app/Language/fa/Fediverse.php | 4 +- app/Language/fa/Podcast.php | 16 +-- app/Language/fa/Post.php | 9 +- app/Language/fr/Podcast.php | 1 + app/Language/fr2/Podcast.php | 1 + app/Language/fr_CA/Podcast.php | 1 + app/Language/gd/Podcast.php | 1 + app/Language/gl/Podcast.php | 1 + app/Language/id/Podcast.php | 1 + app/Language/it/Podcast.php | 1 + app/Language/ja/Podcast.php | 1 + app/Language/ko/Podcast.php | 1 + app/Language/nl/Podcast.php | 1 + app/Language/nn-NO/Podcast.php | 1 + app/Language/oc/Podcast.php | 1 + app/Language/pl/Podcast.php | 1 + app/Language/pt-BR/Podcast.php | 1 + app/Language/pt/Podcast.php | 1 + app/Language/ro/Podcast.php | 1 + app/Language/ru/Podcast.php | 1 + app/Language/sk/Podcast.php | 1 + app/Language/sr_Latn/Podcast.php | 1 + app/Language/sv/Podcast.php | 1 + app/Language/uk/Podcast.php | 1 + app/Language/zh-Hans/Episode.php | 2 +- app/Language/zh-Hans/Podcast.php | 3 +- docs/src/pt-BR/getting-started/install.md | 4 +- docs/src/zh-Hans/getting-started/docker.md | 6 +- docs/src/zh-Hans/getting-started/install.md | 54 ++++---- docs/src/zh-Hans/index.md | 127 ++++++++---------- modules/Admin/Language/fa/Home.php | 4 +- modules/Admin/Language/fa/Install.php | 44 +++--- modules/Admin/Language/fa/Person.php | 62 ++++----- modules/Admin/Language/fa/Platforms.php | 26 ++-- modules/Admin/Language/fa/Podcast.php | 58 ++++---- modules/Admin/Language/fa/Validation.php | 4 +- modules/Admin/Language/fr/Episode.php | 2 +- modules/Admin/Language/fr/Podcast.php | 2 +- modules/Admin/Language/pt-BR/Breadcrumb.php | 2 +- modules/Admin/Language/pt-BR/Charts.php | 2 +- modules/Admin/Language/pt-BR/Episode.php | 2 +- modules/Admin/Language/pt-BR/Navigation.php | 4 +- modules/Admin/Language/pt-BR/Podcast.php | 8 +- modules/Admin/Language/sk/Episode.php | 2 +- modules/Admin/Language/sk/Podcast.php | 82 +++++------ modules/Admin/Language/zh-Hans/Breadcrumb.php | 6 +- modules/Admin/Language/zh-Hans/Charts.php | 2 +- modules/Admin/Language/zh-Hans/Episode.php | 6 +- modules/Admin/Language/zh-Hans/Navigation.php | 4 +- modules/Admin/Language/zh-Hans/Podcast.php | 32 ++--- .../Language/zh-Hans/PodcastNavigation.php | 2 +- .../Language/fa/PodcastImport.php | 74 +++++----- .../Language/zh-Hans/PodcastImport.php | 74 +++++----- .../Language/zh-Hans/Subscription.php | 4 +- 64 files changed, 382 insertions(+), 393 deletions(-) diff --git a/app/Language/ar/Podcast.php b/app/Language/ar/Podcast.php index 4ba5bf63..fccaa0c0 100644 --- a/app/Language/ar/Podcast.php +++ b/app/Language/ar/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'النشاط', 'episodes' => 'الحلقات', 'episodes_title' => 'حلقات {podcastTitle}', diff --git a/app/Language/br/Podcast.php b/app/Language/br/Podcast.php index d2b0533a..a073756f 100644 --- a/app/Language/br/Podcast.php +++ b/app/Language/br/Podcast.php @@ -61,6 +61,7 @@ return [ 84 {# c\'hemennadenn} 89 {# c\'hemennadenn} }', + 'links' => 'Links', 'activity' => 'Oberiantiz', 'episodes' => 'Rannoù', 'episodes_title' => 'Rannoù {podcastTitle}', diff --git a/app/Language/ca/Podcast.php b/app/Language/ca/Podcast.php index 06102441..78a3a334 100644 --- a/app/Language/ca/Podcast.php +++ b/app/Language/ca/Podcast.php @@ -25,6 +25,7 @@ return [ one {# publicació} other {# publicacions} }', + 'links' => 'Links', 'activity' => 'Activitat', 'episodes' => 'Episodis', 'episodes_title' => 'Episodis de {podcastTitle}', diff --git a/app/Language/da/Podcast.php b/app/Language/da/Podcast.php index 9b1e749a..dbccf51b 100644 --- a/app/Language/da/Podcast.php +++ b/app/Language/da/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Activity', 'episodes' => 'Episodes', 'episodes_title' => 'Episodes of {podcastTitle}', diff --git a/app/Language/de/Podcast.php b/app/Language/de/Podcast.php index e22ecfe5..18e414b5 100644 --- a/app/Language/de/Podcast.php +++ b/app/Language/de/Podcast.php @@ -25,6 +25,7 @@ return [ one {# Beitrag} other {# Beiträge} }', + 'links' => 'Links', 'activity' => 'Aktivitäten', 'episodes' => 'Episoden', 'episodes_title' => 'Folgen von {podcastTitle}', diff --git a/app/Language/el/Podcast.php b/app/Language/el/Podcast.php index 0287a94d..7baf119f 100644 --- a/app/Language/el/Podcast.php +++ b/app/Language/el/Podcast.php @@ -25,6 +25,7 @@ return [ one {# δημοσίευση} other {# δημοσιεύσεις} }', + 'links' => 'Links', 'activity' => 'Δραστηριότητα', 'episodes' => 'Επεισόδια', 'episodes_title' => 'Επεισόδια του {podcastTitle}', diff --git a/app/Language/es/Podcast.php b/app/Language/es/Podcast.php index 81b7d3ec..f89d6809 100644 --- a/app/Language/es/Podcast.php +++ b/app/Language/es/Podcast.php @@ -25,6 +25,7 @@ return [ one {# publicación} other {# publicaciones} }', + 'links' => 'Links', 'activity' => 'Actividad', 'episodes' => 'Episodios', 'episodes_title' => 'Episodios de {podcastTitle}', diff --git a/app/Language/fa/Comment.php b/app/Language/fa/Comment.php index bc390fb7..e5271fc0 100644 --- a/app/Language/fa/Comment.php +++ b/app/Language/fa/Comment.php @@ -18,12 +18,10 @@ return [ 'submit_reply' => 'پاسخ', ], 'likes' => '{numberOfLikes, plural, - one {# like} - other {# likes} + other {# پسند} }', 'replies' => '{numberOfReplies, plural, - one {# reply} - other {# replies} + other {# پاسخ} }', 'like' => 'پسند', 'reply' => 'پاسخ', diff --git a/app/Language/fa/Common.php b/app/Language/fa/Common.php index 2cb6a2a0..ad4fbde6 100644 --- a/app/Language/fa/Common.php +++ b/app/Language/fa/Common.php @@ -15,7 +15,7 @@ return [ 'optional' => 'اختیاری', 'close' => 'بستن', 'home' => 'خانه', - 'explicit' => 'Explicit', + 'explicit' => 'صریح', 'powered_by' => 'نیرو گرفته از {castopod}', 'go_back' => 'بازگشت', 'play_episode_button' => [ diff --git a/app/Language/fa/Episode.php b/app/Language/fa/Episode.php index 0a0ee986..981ea9c7 100644 --- a/app/Language/fa/Episode.php +++ b/app/Language/fa/Episode.php @@ -16,8 +16,7 @@ return [ 'season_episode' => 'قسمت {episodeNumber} فصل {seasonNumber}', 'season_episode_abbr' => 'ف{seasonNumber}: ق{episodeNumber}', 'persons' => '{personsCount, plural, - one {# person} - other {# persons} + other {# نفر} }', 'persons_list' => 'نفر', 'back_to_episodes' => 'بازگشت به قسمت‌های {podcast}', @@ -25,8 +24,7 @@ return [ 'activity' => 'فعّالیت', 'description' => 'شرح قسمت', 'number_of_comments' => '{numberOfComments, plural, - one {# comment} - other {# comments} + other {# نظر} }', 'all_podcast_episodes' => 'تمامی قسمت‌های پادکست', 'back_to_podcast' => 'بازگشت به پادکست', diff --git a/app/Language/fa/Fediverse.php b/app/Language/fa/Fediverse.php index a2ff8596..0666b39f 100644 --- a/app/Language/fa/Fediverse.php +++ b/app/Language/fa/Fediverse.php @@ -9,8 +9,8 @@ declare(strict_types=1); */ return [ - 'your_handle' => 'Your handle', - 'your_handle_hint' => 'Enter the @username@domain you want to act from.', + 'your_handle' => 'شناسه‌تان', + 'your_handle_hint' => '‪@username@domain‬ای که می‌خواهید کنشتان از آن باشد را وارد کنید.', 'follow' => [ 'label' => 'پی‌گیری', 'title' => 'پی‌گیری {actorDisplayName}', diff --git a/app/Language/fa/Podcast.php b/app/Language/fa/Podcast.php index ed22775b..44c1fb78 100644 --- a/app/Language/fa/Podcast.php +++ b/app/Language/fa/Podcast.php @@ -18,13 +18,12 @@ return [ 'follow' => 'پی‌گیری', 'followTitle' => 'پی‌گیری {actorDisplayName} روی فدیورس!', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + other {# پی‌گیر} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + other {# فرسته} }', + 'links' => 'Links', 'activity' => 'فعّالیت', 'episodes' => 'قسمت‌ها', 'episodes_title' => 'قسمت‌های {podcastTitle}', @@ -32,12 +31,10 @@ return [ 'stats' => [ 'title' => 'آمار', 'number_of_seasons' => '{0, plural, - one {# season} - other {# seasons} + other {# فصل} }', 'number_of_episodes' => '{0, plural, - one {# episode} - other {# episodes} + other {# قسمت} }', 'first_published_at' => 'قسمت نخست منتشر شده روی {0, date, medium}', ], @@ -46,8 +43,7 @@ return [ 'find_on' => 'یافتن {podcastTitle} روی', 'listen_on' => 'شنیدن روی', 'persons' => '{personsCount, plural, - one {# person} - other {# persons} + other {# نفر} }', 'persons_list' => 'نفر', ]; diff --git a/app/Language/fa/Post.php b/app/Language/fa/Post.php index 204f4776..79a94573 100644 --- a/app/Language/fa/Post.php +++ b/app/Language/fa/Post.php @@ -22,16 +22,13 @@ return [ 'submit_reply' => 'پاسخ', ], 'favourites' => '{numberOfFavourites, plural, - one {# favourite} - other {# favourites} + other {# برگزیده} }', 'reblogs' => '{numberOfReblogs, plural, - one {# share} - other {# shares} + other {# هم‌رسانی} }', 'replies' => '{numberOfReplies, plural, - one {# reply} - other {# replies} + other {# پاسخ} }', 'expand' => 'گسترش فرسته', 'block_actor' => 'انسداد کاربر ‪@{actorUsername}‬', diff --git a/app/Language/fr/Podcast.php b/app/Language/fr/Podcast.php index 30c507e6..f212d564 100644 --- a/app/Language/fr/Podcast.php +++ b/app/Language/fr/Podcast.php @@ -25,6 +25,7 @@ return [ one {# publication} other {# publications} }', + 'links' => 'Links', 'activity' => 'Activité', 'episodes' => 'Épisodes', 'episodes_title' => 'Épisodes de {podcastTitle}', diff --git a/app/Language/fr2/Podcast.php b/app/Language/fr2/Podcast.php index 5b0af2e7..8a79be58 100644 --- a/app/Language/fr2/Podcast.php +++ b/app/Language/fr2/Podcast.php @@ -25,6 +25,7 @@ return [ one {# publication} other {# publications} }', + 'links' => 'Links', 'activity' => 'Activité', 'episodes' => 'Épisodes', 'episodes_title' => 'Épisodes de {podcastTitle}', diff --git a/app/Language/fr_CA/Podcast.php b/app/Language/fr_CA/Podcast.php index 9b1e749a..dbccf51b 100644 --- a/app/Language/fr_CA/Podcast.php +++ b/app/Language/fr_CA/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Activity', 'episodes' => 'Episodes', 'episodes_title' => 'Episodes of {podcastTitle}', diff --git a/app/Language/gd/Podcast.php b/app/Language/gd/Podcast.php index c9e6c962..2a93dcbe 100644 --- a/app/Language/gd/Podcast.php +++ b/app/Language/gd/Podcast.php @@ -29,6 +29,7 @@ return [ few {# postaichean} other {# post} }', + 'links' => 'Links', 'activity' => 'Gnìomhachd', 'episodes' => 'Eapasodan', 'episodes_title' => 'Eapasodan aig {podcastTitle}', diff --git a/app/Language/gl/Podcast.php b/app/Language/gl/Podcast.php index f26babe3..79db7b49 100644 --- a/app/Language/gl/Podcast.php +++ b/app/Language/gl/Podcast.php @@ -25,6 +25,7 @@ return [ one {# publicación} other {# publicacións} }', + 'links' => 'Links', 'activity' => 'Actividade', 'episodes' => 'Episodios', 'episodes_title' => 'Episodios de {podcastTitle}', diff --git a/app/Language/id/Podcast.php b/app/Language/id/Podcast.php index e8b27239..83d0b160 100644 --- a/app/Language/id/Podcast.php +++ b/app/Language/id/Podcast.php @@ -23,6 +23,7 @@ return [ 'posts' => '{numberOfPosts, plural, other {# postingan} }', + 'links' => 'Links', 'activity' => 'Aktivitas', 'episodes' => 'Episode', 'episodes_title' => 'Episode-episode {podcastTitle}', diff --git a/app/Language/it/Podcast.php b/app/Language/it/Podcast.php index eafcec6e..1ee5d5cf 100644 --- a/app/Language/it/Podcast.php +++ b/app/Language/it/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Attività', 'episodes' => 'Episodi', 'episodes_title' => 'Episodi di {podcastTitle}', diff --git a/app/Language/ja/Podcast.php b/app/Language/ja/Podcast.php index 9b1e749a..dbccf51b 100644 --- a/app/Language/ja/Podcast.php +++ b/app/Language/ja/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Activity', 'episodes' => 'Episodes', 'episodes_title' => 'Episodes of {podcastTitle}', diff --git a/app/Language/ko/Podcast.php b/app/Language/ko/Podcast.php index 9b1e749a..dbccf51b 100644 --- a/app/Language/ko/Podcast.php +++ b/app/Language/ko/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Activity', 'episodes' => 'Episodes', 'episodes_title' => 'Episodes of {podcastTitle}', diff --git a/app/Language/nl/Podcast.php b/app/Language/nl/Podcast.php index 22e17de8..a5d5f61f 100644 --- a/app/Language/nl/Podcast.php +++ b/app/Language/nl/Podcast.php @@ -25,6 +25,7 @@ return [ one {# bericht} other {# berichten} }', + 'links' => 'Links', 'activity' => 'Activiteit', 'episodes' => 'Afleveringen', 'episodes_title' => 'Afleveringen van {podcastTitle}', diff --git a/app/Language/nn-NO/Podcast.php b/app/Language/nn-NO/Podcast.php index 7f3b760f..abcbdf6e 100644 --- a/app/Language/nn-NO/Podcast.php +++ b/app/Language/nn-NO/Podcast.php @@ -25,6 +25,7 @@ return [ one {# innlegg} other {# innlegg} }', + 'links' => 'Links', 'activity' => 'Aktivitet', 'episodes' => 'Episodar', 'episodes_title' => 'Episodar av {podcastTitle}', diff --git a/app/Language/oc/Podcast.php b/app/Language/oc/Podcast.php index 9b1e749a..dbccf51b 100644 --- a/app/Language/oc/Podcast.php +++ b/app/Language/oc/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Activity', 'episodes' => 'Episodes', 'episodes_title' => 'Episodes of {podcastTitle}', diff --git a/app/Language/pl/Podcast.php b/app/Language/pl/Podcast.php index c72d00c3..e36b92de 100644 --- a/app/Language/pl/Podcast.php +++ b/app/Language/pl/Podcast.php @@ -27,6 +27,7 @@ return [ few {# osoby} other {# osób} }', + 'links' => 'Links', 'activity' => 'Aktywność', 'episodes' => 'Odcinki', 'episodes_title' => 'Odcinki {podcastTitle}', diff --git a/app/Language/pt-BR/Podcast.php b/app/Language/pt-BR/Podcast.php index 220725ac..4f9c6954 100644 --- a/app/Language/pt-BR/Podcast.php +++ b/app/Language/pt-BR/Podcast.php @@ -25,6 +25,7 @@ return [ one {# publicação} other {# publicações} }', + 'links' => 'Links', 'activity' => 'Atividade', 'episodes' => 'Episódios', 'episodes_title' => 'Episódios de {podcastTitle}', diff --git a/app/Language/pt/Podcast.php b/app/Language/pt/Podcast.php index 9b1e749a..dbccf51b 100644 --- a/app/Language/pt/Podcast.php +++ b/app/Language/pt/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Activity', 'episodes' => 'Episodes', 'episodes_title' => 'Episodes of {podcastTitle}', diff --git a/app/Language/ro/Podcast.php b/app/Language/ro/Podcast.php index f5134251..c21e4404 100644 --- a/app/Language/ro/Podcast.php +++ b/app/Language/ro/Podcast.php @@ -27,6 +27,7 @@ return [ few {# postări} other {# postări} }', + 'links' => 'Links', 'activity' => 'Activitate', 'episodes' => 'Episoade', 'episodes_title' => 'Episoadele podcastului {podcastTitle}', diff --git a/app/Language/ru/Podcast.php b/app/Language/ru/Podcast.php index 94fb76f5..65a2701d 100644 --- a/app/Language/ru/Podcast.php +++ b/app/Language/ru/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Активность', 'episodes' => 'Выпуски', 'episodes_title' => 'Выпуски {podcastTitle}', diff --git a/app/Language/sk/Podcast.php b/app/Language/sk/Podcast.php index aa228d45..7cd79c57 100644 --- a/app/Language/sk/Podcast.php +++ b/app/Language/sk/Podcast.php @@ -29,6 +29,7 @@ return [ many {# príspevkov} other {# príspevkov} }', + 'links' => 'Links', 'activity' => 'Aktivita', 'episodes' => 'Časti', 'episodes_title' => 'Časti {podcastTitle}', diff --git a/app/Language/sr_Latn/Podcast.php b/app/Language/sr_Latn/Podcast.php index c412e8ab..2dc4000c 100644 --- a/app/Language/sr_Latn/Podcast.php +++ b/app/Language/sr_Latn/Podcast.php @@ -25,6 +25,7 @@ return [ few {# objave} other {# objava} }', + 'links' => 'Links', 'activity' => 'Aktivnost', 'episodes' => 'Epizode', 'episodes_title' => 'Epizode {podcastTitle}', diff --git a/app/Language/sv/Podcast.php b/app/Language/sv/Podcast.php index 067056f2..7cfc658a 100644 --- a/app/Language/sv/Podcast.php +++ b/app/Language/sv/Podcast.php @@ -25,6 +25,7 @@ return [ one {# inlägg} other {# inlägg} }', + 'links' => 'Links', 'activity' => 'Aktivitet', 'episodes' => 'Avsnitt', 'episodes_title' => 'Avsnitt av {podcastTitle}', diff --git a/app/Language/uk/Podcast.php b/app/Language/uk/Podcast.php index 9b1e749a..dbccf51b 100644 --- a/app/Language/uk/Podcast.php +++ b/app/Language/uk/Podcast.php @@ -25,6 +25,7 @@ return [ one {# post} other {# posts} }', + 'links' => 'Links', 'activity' => 'Activity', 'episodes' => 'Episodes', 'episodes_title' => 'Episodes of {podcastTitle}', diff --git a/app/Language/zh-Hans/Episode.php b/app/Language/zh-Hans/Episode.php index dcd96bdc..778837dd 100644 --- a/app/Language/zh-Hans/Episode.php +++ b/app/Language/zh-Hans/Episode.php @@ -25,7 +25,7 @@ return [ 'activity' => '活动', 'description' => '剧集描述', 'number_of_comments' => '{numberOfComments, plural, - one {# 评论} + other {# 评论} other {# 评论} }', 'all_podcast_episodes' => '所有播客剧集', diff --git a/app/Language/zh-Hans/Podcast.php b/app/Language/zh-Hans/Podcast.php index 475bc4a9..1731418d 100644 --- a/app/Language/zh-Hans/Podcast.php +++ b/app/Language/zh-Hans/Podcast.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'feed' => '播客订阅源', + 'feed' => '播客 RSS 摘要', 'season' => '第 {seasonNumber} 季', 'list_of_episodes_year' => '{year} 剧集 ({episodeCount})', 'list_of_episodes_season' => @@ -25,6 +25,7 @@ return [ one {# 帖子} other {# 帖子} }}', + 'links' => 'Links', 'activity' => '活动', 'episodes' => '剧集', 'episodes_title' => '{podcastTitle} 的剧集', diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md index 072dd2c3..c736872c 100644 --- a/docs/src/pt-BR/getting-started/install.md +++ b/docs/src/pt-BR/getting-started/install.md @@ -20,13 +20,13 @@ Se você prefere usar o Docker, você pode pular isso e ir direto para a ## Requisitos -- PHP v8.1 only +- Somente PHP v8.1 - MySQL versão 5.7 ou superior ou MariaDB versão 10.2 ou superior - Suporte a HTTPS - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### Somento PHP v8.1 PHP version 8.1 is required, with the following extensions installed: diff --git a/docs/src/zh-Hans/getting-started/docker.md b/docs/src/zh-Hans/getting-started/docker.md index 7467bb2c..b350a978 100644 --- a/docs/src/zh-Hans/getting-started/docker.md +++ b/docs/src/zh-Hans/getting-started/docker.md @@ -7,8 +7,8 @@ sidebarDepth: 3 Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub : -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod);一个使 + 用 nginx 单元的整合 Castopod 镜像 - [**`castopod/app`**](https://hub.docker.com/r/castopod/app):应用程序包,包含 所有 Castopod 依赖关系 - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server):Castopod @@ -108,7 +108,7 @@ Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub ## 环境变量 -- **castopod/castopod** and **castopod/app** +- **castopod/castopod** 和 **castopod/app** | 变量名称 | 类型 (`默认值`) | Default | | ------------------------------------- | ----------------------- | ---------------- | diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md index f2e383de..aa9938eb 100644 --- a/docs/src/zh-Hans/getting-started/install.md +++ b/docs/src/zh-Hans/getting-started/install.md @@ -19,15 +19,14 @@ Castopod 的安装非常简单。 你能在大多数兼容的 PHP-MySQL 的服 ## 要求 -- PHP v8.1 only +- 仅 PHP v8.1 - MySQL 5.7 或更高版本与 MariaDB 10.2 或更高版本 - HTTPS 支持 -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests +- 用于验证的 [NTP 同步时钟](https://wiki.debian.org/NTP) 传入请求 -### PHP v8.1 only +### 仅 PHP v8.1 -PHP version 8.1 is required, with the following extensions installed: +需要 PHP 8.1,并安装以下扩展: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -86,22 +85,19 @@ Castopod 仅适用于受支持的 MySQL 5.7 或更高版本的兼容数据库。 3. 下载最新的 [Castopod](https://castopod.org/) 到 web 服务器并解压(如果尚未下 载)。 - ⚠️ 将 web 服务器根目录设置为 `castopod` 文件夹中的 `public/` 子文件夹。 -4. Add **cron tasks** on your web server for various background processes - (replace the paths accordingly): +4. 在 Web 服务器上为各种后台进程添加 **cron 任务** (相应地替换路径): ```bash * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 ``` - **Note** - If you do not add this cron task, the following Castopod features - will not work: + **注意** - 如果您不添加此 cron 任务,则以下 Castopod 功能不工作: - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + - 从现有的 RSS 摘要导入播客文件 + - 在联邦宇宙中向您的关注者广播社交活动 + - 使用 [WebSub](https://en.wikipedia.org/wiki/WebSub) 开放订阅打开广播剧集 + - 生成视频素材 - + [需要 FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) ### (推荐) 安装向导 @@ -146,11 +142,10 @@ email.SMTPPass="你的邮件密码" | **`SMTPPort`** | number | `25` | | **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### Media storage +### 媒体存储 -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: +默认情况下,文件使用文件系统保存到 `公共/媒体` 文件夹中。 如果您需要将 `media` +文件夹重新定位到其他位置,您可以在您的 `.env` 文件中指定它,如下所示: ```ini # […] @@ -159,13 +154,12 @@ media.root="media" media.storage="/mnt/storage" ``` -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. +在此示例中,文件将保存到 /mnt/storage/media 文件夹。 请确保同时更新您的 Web 服务 +器配置以应用此更改。 ### S3 -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: +如果您想要将媒体文件存储在 S3 兼容存储上,可以在您的 `.env` 中指定: ```ini # […] @@ -177,9 +171,9 @@ media.s3.secret="your_s3_secret" media.s3.region="your_s3_region" ``` -#### S3 config options +#### S3 配置选项 -| Variable name | Type | Default | +| 变量名称 | 类型 | 默认 | | ----------------------- | ------- | ----------- | | **`endpoint`** | string | `undefined` | | **`key`** | string | `undefined` | @@ -192,14 +186,12 @@ media.s3.region="your_s3_region" ## 社区套餐 -If you don't want to bother with installing Castopod manually, you may use one -of the packages created and maintained by the open-source community. +如果你不想手动安装 Castopod,可以使用一个由开源社区创建和维护的软件包。 -### Install with YunoHost +### 使用 YunoHost 安装 -[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux -made up of free and open-source software packages. It manages the hardships of -self-hosting for you. +[YunoHost](https://yunohost.org/) 是一个基于 Debian GNU/Linux 的发行版,由免费和 +开源软件包组成。 它可以为你解决自托管的困难。
    diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md index 1ac086dd..1effc2f8 100644 --- a/docs/src/zh-Hans/index.md +++ b/docs/src/zh-Hans/index.md @@ -41,7 +41,7 @@ Castopod 易于安装,并使用 [CodeIgniter4](https://codeigniter.com/) 构 - 📲  点击收听广告 - 🤝  value4value / 网络货币化 - 💎  高级版播客 -- 📡  使用 RSS 将你的剧集发布到任何地方 +- 📡  使用 RSS 将你的剧集发布到任何地方: - 📱  支持众多索引和应用程序:Podcast Index,Apple Podcasts,Spotify,Google Podcasts,Deezer,Podcast Addict,Podfriend... - ⚡  使用 WebSub 即时广播你的剧集 @@ -54,85 +54,70 @@ Castopod 易于安装,并使用 [CodeIgniter4](https://codeigniter.com/) 构 ## 创作动机 -The podcasting ecosystem is decentralized by nature: you can create your podcast -as an RSS file, publish it on the web and have it shared everywhere online. +播客生态系统本质上是去中心化的:你可以创建自己的播客 RSS 文件,将其发布到网络上 +并在线共享。 -It is in fact one of the only media to have stayed this way for a long time. +事实上,它是唯一长期保持这种状态的媒体之一。 -As usages are evolving, more and more people are getting into podcasts: whether -it is creators finding new ways to share their ideas, or listeners in the search -for better content. +随着习惯的发展,越来越多的人开始接触播客:允许创作者寻找新的方式来分享他们的想法 +,或是让听众获得更好的内容。 -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized medium. +随着播客的使用越来越广泛,一些公司正试图控制播客与集中化。 -Castopod was created in an effort to provide an open and sustainable alternative -to hosting your podcasts, promoting decentralization to ensure that podcasters -creativity can express itself. +Castopod 的创建旨在提供一种开放且可持续的替代方案来托管你的播客,促进权力下放, +确保播客可以用创造力表达自己。 -This project is pushed by the open-source community, and specifically by the -[Fediverse](https://fediverse.party/en/fediverse/) and -[Podcasting 2.0](https://podcastindex.org/) movements. +此项目由开源社区推动的,特别是 +由[联邦宇宙](https://fediverse.party/en/fediverse/) 和 +[播客 2.0](https://podcastindex.org/) 推动。 ## 与其他解决方案的对比 -We believe that a solution is not necessarily right for everyone, it highly -depends on your needs. So, here are comparisons with other tools to help you to -gauge whether Castopod is the right fit for you. +我们相信此解决方案不一定适合所有人,它只取决于你是否需要。 因此,下面是与其他解 +决方案的比较,可帮助判断 Castopod 是否适合你。 ### Castopod 对比 Wordpress -Castopod is often referred to as "the Wordpress for podcasts" because of the -similarities between the two. In some ways this is true. And actually, Castopod -was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption -from the community and the number of websites running it. +Castopod 经常被称为 “播客中的 Wordpress”,因为两者有很多相似之处。 在某些方面, +确实如此。 实际上,Castopod 受到 WordPress 生态的极大启发,看到了采用社区的易用 +性以及运行它的网站数量。 -Just like Wordpress, Castopod is free & open source, built using PHP with a -MySQL database and is packaged in a way that you can easily install on most web -servers. +就像 Wordpress 一样,Castopod 是免费 & 开源的,PHP 构建并使用 MySQL 数据库,可以 +在大多数 Web 服务器上轻松安装。 -Wordpress is a great way to create your website and extend it with plugins to -get what you want. It is a full fledged CMS that helps you get any type of -website online. +Wordpress 是创建你的网站,并使用插件扩展以获得想要内容的好办法。 这是一个成熟的 +CMS,可以帮助你在线访问任何类型的网站。 -On the other hand, Castopod is meant to address the podcasters needs -specifically, focusing on podcasting, and nothing else. You don't need any -plugin to get you started on your podcasting journey. +另一方面,Castopod 旨在专门满足播客的需求,专注于播客,而不是其他。 你不需要任何 +插件即可轻松开始播客之旅。 -This allows optimizing the processes specific to podcasting: ranging from the -creation of your podcasts and the publication of new episodes all the way to -broadcasting, marketing and analytics. +还拥有对播客的独特优化:从播客的创建和新剧集的发布一直到广播,营销和分析。 -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! +最后,根据你的需要,Wordpress 和 Castopod 甚至可以共存,因为他们有相同的配置环境 +! ### Castopod 对比 Funkwhale -Funkwhale is a self-hosted, modern free and open-source music server. Just as -Castopod, Funkwhale is on the fediverse, a decentralized social network allowing -interoperability between the two. +Funkwhale 是一个自托管、现代界面、免费开源的音乐服务器。 就像 Castopod 一样 +,Funkwhale 也位于联邦宇宙中,这是一个去中心化的社交网络,允许两者的互联。 -Funkwhale was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. +Funkwhale 最初是围绕音乐制作的。 后来,随着项目的发展,引入了托管播客的能力。 -Unlike Funkwhale, Castopod has been designed and built around podcasting -exclusively. This allows easier implementation for features related to the -podcasting ecosystem, such as the podcasting 2.0 features (transcripts, -chapters, locations, persons, …). +与 Funkwhale 不同,Castopod 是只围绕播客设计和构建的。 这样可以更简单地实现与播 +客相关的生态系统,例如播客 2.0 功能(报表、 章节、地点、人员…)。 -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. +因此,如果你想托管你的音乐库,你可能应该使用 Funkwhale,如果您想主持一个播客,请 +使用 Castopod。 ### Castopod 与其他播客 -There are many solutions for you to host your podcasts, some of which are really -great and [a lot of them](https://podcastindex.org/apps) are jumping into the -Podcasting 2.0 wagon just like Castopod! +有许多非常棒地解决方案可供你托管播客,并 +且[很多](https://podcastindex.org/apps)正在搭上播客 2.0 的便车,就像 Castopod 一 +样! -Each of these solutions differ from one another, you may compare with the -[list of features](#features). +这些解决方案各不相同,你可以对比 [功能列表](#features)。 -That being said, there are two main differences with other podcasting solutions: +话虽如此,Castopod 与其他播客解决方案有两个主要区别: - Castopod 是自托管的,唯一允许你控制所有数据的方案。 并且,由于是开源的,甚至可 以按自己的想法修改。 @@ -142,26 +127,23 @@ That being said, there are two main differences with other podcasting solutions: ## 贡献 -Love Castopod and would like to help? Take a look at the following documentation -to get you started. +喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你 +入门。 ### 行为准则 -Castopod has adopted a Code of Conduct that we expect project participants to -adhere to. Please read the -[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -so that you can understand what actions will and will not be tolerated. +Castopod 已经通过了一项行为准则,并希望所有的参与者都能够遵循本行为准则。 请阅 +读[行为准则](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +以便了解哪些行为被允许,哪些行为不会被容忍。 ### 贡献指南 -Read our [contributing guide](../contributing/guidelines.md) to learn about our -development process, how to propose bugfixes and improvements, and how to build -and test your changes to Castopod. +阅读我们的 [贡献指南](../contributing/guidelines.md) ,了解我们的开发过程。 提出 +错 误修正和改进想法,以及如何构建和测试 Castopod 。 ## 贡献者 ✨ -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): +感谢这些了不起的人([表情符号键](https://allcontributors.org/docs/en/emoji-key)): @@ -242,20 +224,18 @@ Thanks goes to these wonderful people -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! +此项目遵循 [所有贡献者](https://github.com/all-contributors/all-contributors) 规 +范。 欢迎任何形式的贡献! ## 联系 -You may reach us for help or ask any question you have on: +你可以联系我们寻求帮助或提出任何问题: - [Discord](https://castopod.org/discord) (用于与开发人员和社区直接互动) - [问题跟踪器](https://code.castopod.org/adaures/castopod/-/issues)(用于功能请 求和错误报告) -Alternatively, you can follow us on social media platforms to get news about -Castopod: +或者,你可以在社交媒体上关注我们,以获取有关 Castopod 的新闻: - [podlibre.social](https://podlibre.social/@Castopod) (Mastodon 实例) - [推特](https://twitter.com/castopod) @@ -264,9 +244,8 @@ Castopod: ## 赞助商 -The ongoing development of Castopod is made possible with the support of its -backers. If you'd like to help, please consider -[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). +Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们,请考 +虑[赞助 Castopod 的开发](https://opencollective.com/castopod/contribute).
    Ad Aures Logo @@ -277,7 +256,7 @@ backers. If you'd like to help, please consider [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-present, [Ad Aures](https://adaures.com/). +版权 ©️ 2020 至今, [Audes](https://adaures.com/)。 https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/modules/Admin/Language/fa/Home.php b/modules/Admin/Language/fa/Home.php index 3ff4c04d..bc83fd98 100644 --- a/modules/Admin/Language/fa/Home.php +++ b/modules/Admin/Language/fa/Home.php @@ -9,6 +9,6 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found', + 'all_podcasts' => 'تمامی پادکست‌ها', + 'no_podcast' => 'هیچ پادکستی پیدا نشد', ]; diff --git a/modules/Admin/Language/fa/Install.php b/modules/Admin/Language/fa/Install.php index 36e373a2..a2643d24 100644 --- a/modules/Admin/Language/fa/Install.php +++ b/modules/Admin/Language/fa/Install.php @@ -9,46 +9,46 @@ declare(strict_types=1); */ return [ - 'manual_config' => 'Manual configuration', + 'manual_config' => 'پیکربندی دستی', 'manual_config_subtitle' => 'Create a `.env` file with your settings and refresh the page to continue installation.', 'form' => [ - 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', - 'media_base_url' => 'Media base URL', + 'instance_config' => 'پیکربندی نمونه', + 'hostname' => 'نام میزبان', + 'media_base_url' => 'نشانی پایهٔ رسانه', 'media_base_url_hint' => 'If you use a CDN and/or an external analytics service, you may set them here.', - 'admin_gateway' => 'Admin gateway', + 'admin_gateway' => 'دروازهٔ مدیر', 'admin_gateway_hint' => 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', - 'auth_gateway' => 'Auth gateway', + 'auth_gateway' => 'دروازهٔ هویت‌سنجی', 'auth_gateway_hint' => 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', + 'database_config' => 'پیکربندی پایگاه داده', 'database_config_hint' => 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', + 'db_hostname' => 'نام میزبان پایگاه داده', + 'db_name' => 'نام پایگاه‌داده', + 'db_username' => 'نام کاربری پایگاه‌داده', + 'db_password' => 'گذرواژهٔ پایگاه‌داده', + 'db_prefix' => 'پيشوند پايگاه‌داده', 'db_prefix_hint' => "The prefix of the Castopod table names, leave as is if you don't know what it means.", - 'cache_config' => 'Cache configuration', + 'cache_config' => 'پیکربندی انباره', 'cache_config_hint' => 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', - 'cache_handler' => 'Cache handler', + 'cache_handler' => 'مدیر انباره', 'cacheHandlerOptions' => [ - 'file' => 'File', - 'redis' => 'Redis', + 'file' => 'پرونده', + 'redis' => 'ردیس', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', - 'create_superadmin' => 'Create your superadmin account', - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', + 'next' => 'بعدی', + 'submit' => 'پایان نصب', + 'create_superadmin' => 'ایجاد حساب ابرمدیریتان', + 'email' => 'رایانامه', + 'username' => 'نام‌کاربری', + 'password' => 'گذرواژه', ], 'messages' => [ 'createSuperAdminSuccess' => diff --git a/modules/Admin/Language/fa/Person.php b/modules/Admin/Language/fa/Person.php index a652be9f..3465af96 100644 --- a/modules/Admin/Language/fa/Person.php +++ b/modules/Admin/Language/fa/Person.php @@ -9,57 +9,57 @@ declare(strict_types=1); */ return [ - 'persons' => 'Persons', - 'all_persons' => 'All persons', - 'no_person' => 'Nobody found!', - 'create' => 'Create a person', - 'view' => 'View person', - 'edit' => 'Edit person', - 'delete' => 'Delete person', + 'persons' => 'افراد', + 'all_persons' => 'تمامی افراد', + 'no_person' => 'هیچ‌کس پیدا نشد!', + 'create' => 'ایجاد یک نفر', + 'view' => 'دیدن فرد', + 'edit' => 'ویرایش فرد', + 'delete' => 'حذف فرد', 'messages' => [ - 'createSuccess' => 'Person has been successfully created!', - 'editSuccess' => 'Person has been successfully updated!', - 'deleteSuccess' => 'Person has been removed!', + 'createSuccess' => 'فرد با موفّقیت ساخته شد!', + 'editSuccess' => 'فرد با موفّقیت به‌روز شد!', + 'deleteSuccess' => 'فرد برداشته شد!', ], 'form' => [ - 'avatar' => 'Avatar', + 'avatar' => 'چهرک', 'avatar_size_hint' => - 'Avatar must be squared and at least 400px wide and tall.', - 'full_name' => 'Full name', + 'چهرک باید مربّعی بوده و کمینه ۴۰۰ پیکسل پنها و بلندا داشته باشد.', + 'full_name' => 'نام کامل', 'full_name_hint' => 'This is the full name or alias of the person.', - 'unique_name' => 'Unique name', - 'unique_name_hint' => 'Used for URLs', - 'information_url' => 'Information URL', + 'unique_name' => 'نام یکتا', + 'unique_name_hint' => 'استفاده شده برای نشانی‌ها', + 'information_url' => 'نشانی اطّلاعات', 'information_url_hint' => 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', - 'submit_create' => 'Create person', - 'submit_edit' => 'Save person', + 'submit_create' => 'ایجاد فرد', + 'submit_edit' => 'ذخیرهٔ فرد', ], 'podcast_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this podcast', + 'title' => 'مدیریت افراد', + 'add_section_title' => 'افزودن افراد به این پادکست', 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'persons' => 'افراد', 'persons_hint' => 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'roles' => 'نقش‌ها', 'roles_hint' => 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'submit_add' => 'افزودن فرد(ها)', + 'remove' => 'برداشتن', ], 'episode_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this episode', + 'title' => 'مدیریت افراد', + 'add_section_title' => 'افزودن افراد به این قسمت', 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'persons' => 'افراد', 'persons_hint' => 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'roles' => 'نقش‌ها', 'roles_hint' => 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'submit_add' => 'افزودن فرد(ها)', + 'remove' => 'برداشتن', ], - 'credits' => 'Credits', + 'credits' => 'اعتبارها', ]; diff --git a/modules/Admin/Language/fa/Platforms.php b/modules/Admin/Language/fa/Platforms.php index ab17d599..6bdfb6ed 100644 --- a/modules/Admin/Language/fa/Platforms.php +++ b/modules/Admin/Language/fa/Platforms.php @@ -9,22 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', - 'home_url' => 'Go to {platformName} website', - 'submit_url' => 'Submit your podcast on {platformName}', - 'visible' => 'Display in podcast homepage?', - 'on_embed' => 'Display on embeddable player?', - 'remove' => 'Remove {platformName}', - 'submit' => 'Save', + 'title' => 'بن‌سازه‌ها', + 'home_url' => 'رفتن به پایگاه وب {platformName}', + 'submit_url' => 'ثبت پادکستتان روی {platformName}', + 'visible' => 'نمایش در صفحهٔ خانگی پادکست؟', + 'on_embed' => 'نمایش در پخش‌کنندهٔ تعبیه شده؟', + 'remove' => 'برداشتن {platformName}', + 'submit' => 'ذخیره', 'messages' => [ - 'updateSuccess' => 'Platform links have been successfully updated!', - 'removeLinkSuccess' => 'The platform link has been removed.', + 'updateSuccess' => 'پیوندهای بن‌سازه با موفّقیت به‌روز شدند!', + 'removeLinkSuccess' => 'پیوند بن‌سازه برداشته شد.', 'removeLinkError' => - 'The platform link could not be removed. Try again.', + 'پیوند بن‌سازه نتوانست برداشته شود. دوباره تلاش کنید.', ], 'description' => [ - 'podcasting' => 'The podcast ID on this platform', - 'social' => 'The podcast account ID on this platform', - 'funding' => 'Call to action message', + 'podcasting' => 'شناسهٔ پادکست روی این بن‌سازه', + 'social' => 'شناسهٔ حساب پادکست روی این بن‌سازه', + 'funding' => 'پیام فراخوانی کنش', ], ]; diff --git a/modules/Admin/Language/fa/Podcast.php b/modules/Admin/Language/fa/Podcast.php index 08768f1b..10271de5 100644 --- a/modules/Admin/Language/fa/Podcast.php +++ b/modules/Admin/Language/fa/Podcast.php @@ -9,24 +9,24 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found!', - 'create' => 'Create podcast', - 'import' => 'Import podcast', - 'all_imports' => 'Podcast imports', - 'new_episode' => 'New Episode', - 'view' => 'View podcast', - 'edit' => 'Edit podcast', - 'publish' => 'Publish podcast', + 'all_podcasts' => 'تمامی پادکست‌ها', + 'no_podcast' => 'هیچ پادکستی پیدا نشد!', + 'create' => 'ایجاد پادکست', + 'import' => 'درون‌ریزی پادکست', + 'all_imports' => 'درون‌ریزی‌های پادکست', + 'new_episode' => 'قسمت جدید', + 'view' => 'دیدن پادکست', + 'edit' => 'ویرایش پادکست', + 'publish' => 'انتشار پادکست', 'publish_edit' => 'Edit publication', - 'delete' => 'Delete podcast', - 'see_episodes' => 'See episodes', - 'see_contributors' => 'See contributors', - 'go_to_page' => 'Go to page', - 'latest_episodes' => 'Latest episodes', - 'see_all_episodes' => 'See all episodes', - 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', + 'delete' => 'حذف پادکست', + 'see_episodes' => 'دیدن قسمت‌ّا', + 'see_contributors' => 'دیدن مشارکت‌کنندگان', + 'go_to_page' => 'رفتن به صفحه', + 'latest_episodes' => 'جدیدترین قسمت‌ها', + 'see_all_episodes' => 'دیدن تمامی قسمت‌ها', + 'draft' => 'پیش‌نویس', + 'sync_feed' => 'خوراک هم‌گام شده', 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', @@ -57,26 +57,26 @@ return [ 'scheduleDateError' => 'Schedule date must be set!', ], 'form' => [ - 'identity_section_title' => 'Podcast identity', + 'identity_section_title' => 'هویت پادکست', 'identity_section_subtitle' => 'These fields allow you to get noticed.', - 'cover' => 'Podcast cover', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', - 'banner' => 'Podcast banner', + 'cover' => 'جلد پادکست', + 'cover_size_hint' => 'جلد باید مربّعی بوده و کمینه ۱۴۰۰ پیکسل پنها و بلندا داشته باشد.', + 'banner' => 'بیرق پادکست', 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', - 'banner_delete' => 'Delete podcast banner', - 'title' => 'Title', - 'handle' => 'Handle', + 'banner_delete' => 'حذف بیرق پادکست', + 'title' => 'عنوان', + 'handle' => 'شناسه', 'handle_hint' => 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', 'type' => [ - 'label' => 'Type', - 'episodic' => 'Episodic', + 'label' => 'گونه', + 'episodic' => 'قسمتی', 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', - 'serial' => 'Serial', + 'serial' => 'سریالی', 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', ], - 'description' => 'Description', - 'classification_section_title' => 'Classification', + 'description' => 'شرح', + 'classification_section_title' => 'طبقه‌بندی', 'classification_section_subtitle' => 'These fields will impact your audience and competition.', 'language' => 'Language', diff --git a/modules/Admin/Language/fa/Validation.php b/modules/Admin/Language/fa/Validation.php index 3bc78cfe..2759ccc9 100644 --- a/modules/Admin/Language/fa/Validation.php +++ b/modules/Admin/Language/fa/Validation.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'min_dims' => - '{field} is either not an image, or it is not wide or tall enough.', + '{field} تصویر نبوده یا پنها و بلندایش کافی نیست.', 'is_image_ratio' => - '{field} is either not an image or not of the right ratio.', + '{field} تصویر نبوده یا ابعادش درست نیست.', ]; diff --git a/modules/Admin/Language/fr/Episode.php b/modules/Admin/Language/fr/Episode.php index 83caff77..4ef980f1 100644 --- a/modules/Admin/Language/fr/Episode.php +++ b/modules/Admin/Language/fr/Episode.php @@ -114,7 +114,7 @@ return [ 'bonus' => 'Bonus', 'bonus_hint' => 'Contenu supplémentaire pour le podcast (par exemple des informations sur les coulisses ou des interviews avec les acteurs) ou du contenu promotionnel croisé pour un autre podcast', ], - 'premium_title' => 'Prémium', + 'premium_title' => 'Premium', 'premium' => 'L\'épisode doit être accessible aux abonnés premium uniquement', 'parental_advisory' => [ 'label' => 'Avertissement parental', diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php index 597e2127..fd8ce6db 100644 --- a/modules/Admin/Language/fr/Podcast.php +++ b/modules/Admin/Language/fr/Podcast.php @@ -109,7 +109,7 @@ return [ 'monetization_section_title' => 'Monétisation', 'monetization_section_subtitle' => 'Gagnez de l’argent grâce à votre audience.', - 'premium' => 'Prémium', + 'premium' => 'Premium', 'premium_by_default' => 'Les épisodes doivent être définis comme premium par défaut', 'premium_by_default_hint' => 'Les épisodes de Podcast seront marqués comme premium par défaut. Vous pouvez toujours choisir de définir certains épisodes, bandes-annonces ou bonus comme publics.', 'op3' => 'Open Podcast Prefix Project (OP3)', diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-BR/Breadcrumb.php index d252ede2..0194ee38 100644 --- a/modules/Admin/Language/pt-BR/Breadcrumb.php +++ b/modules/Admin/Language/pt-BR/Breadcrumb.php @@ -36,7 +36,7 @@ return [ 'users' => 'usuários', 'my-account' => 'minha conta', 'change-password' => 'alterar senha', - 'imports' => 'imports', + 'imports' => 'importações', 'platforms' => 'plataformas', 'social' => 'redes sociais', 'funding' => 'financiamento', diff --git a/modules/Admin/Language/pt-BR/Charts.php b/modules/Admin/Language/pt-BR/Charts.php index b0196488..9a84d031 100644 --- a/modules/Admin/Language/pt-BR/Charts.php +++ b/modules/Admin/Language/pt-BR/Charts.php @@ -37,5 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Largura de banda usada diária (em MB)', 'total_storage_by_month' => 'Armazenamento mensal (em MB)', 'total_bandwidth_by_month' => 'Largura de banda usada mensalmente (em MB)', - 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', + 'total_bandwidth_by_month_limit' => 'Limitado a {totalBandwidth} por mês', ]; diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-BR/Episode.php index ad8e6510..8a7e19d7 100644 --- a/modules/Admin/Language/pt-BR/Episode.php +++ b/modules/Admin/Language/pt-BR/Episode.php @@ -190,7 +190,7 @@ return [ ], 'unpublish_form' => [ 'disclaimer' => - "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + "O cancelamento da publicação do episódio excluirá todos os comentários e publicações associados a ele e o removerá do feed RSS do podcast.", 'understand' => 'Eu entendo, eu quero despublicar o episódio', 'submit' => 'Despublicar', ], diff --git a/modules/Admin/Language/pt-BR/Navigation.php b/modules/Admin/Language/pt-BR/Navigation.php index 0e8ca75b..1d772b3c 100644 --- a/modules/Admin/Language/pt-BR/Navigation.php +++ b/modules/Admin/Language/pt-BR/Navigation.php @@ -17,8 +17,8 @@ return [ 'podcasts' => 'Podcasts', 'podcast-list' => 'Todos os podcasts', 'podcast-create' => 'Novo podcast', - 'all-podcast-imports' => 'All Podcast imports', - 'podcast-imports-add' => 'Import a podcast', + 'all-podcast-imports' => 'Todos os importações de Podcast', + 'podcast-imports-add' => 'Importar um podcast', 'persons' => 'Pessoas', 'person-list' => 'Todas as pessoas', 'person-create' => 'Nova pessoa', diff --git a/modules/Admin/Language/pt-BR/Podcast.php b/modules/Admin/Language/pt-BR/Podcast.php index 471387b7..8678bbe8 100644 --- a/modules/Admin/Language/pt-BR/Podcast.php +++ b/modules/Admin/Language/pt-BR/Podcast.php @@ -26,8 +26,8 @@ return [ 'latest_episodes' => 'Últimos episódios', 'see_all_episodes' => 'Ver todos os episódios', 'draft' => 'Rascunho', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', + 'sync_feed' => 'Sincronizar o feed', + 'sync_feed_hint' => 'Importar os últimos episódios deste podcast', 'messages' => [ 'createSuccess' => 'Podcast criado com sucesso!', 'editSuccess' => 'Podcast foi atualizado com sucesso!', @@ -114,8 +114,8 @@ return [ 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', - 'op3_enable' => 'Enable OP3 analytics service', - 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'op3_enable' => 'Ativar serviço de análise OP3', + 'op3_enable_hint' => 'Por razões de segurança, os dados de análise dos episódios premium não serão compartilhados com o OP3.', 'payment_pointer' => 'Endereço de pagamento (Payment Pointer) para web monetização', 'payment_pointer_hint' => 'Este é o seu lugar onde você receberá dinheiro graças à web monetização', diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php index e1894d11..5619ea85 100644 --- a/modules/Admin/Language/sk/Episode.php +++ b/modules/Admin/Language/sk/Episode.php @@ -59,7 +59,7 @@ return [ }', 'episode' => 'Epizóda', 'visibility' => 'Viditeľnosť', - 'downloads' => 'Downloads', + 'downloads' => 'Stiahnutia', 'comments' => 'Komentáre', 'actions' => 'Úkony', ], diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php index 8708b54a..bd1979ed 100644 --- a/modules/Admin/Language/sk/Podcast.php +++ b/modules/Admin/Language/sk/Podcast.php @@ -88,7 +88,7 @@ return [ 'hint' => 'Does it contain explicit content?', 'undefined' => 'undefined', 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'explicit' => 'Chúlostivé', ], 'author_section_title' => 'Autor', 'author_section_subtitle' => 'Kto spravuje tento podcast?', @@ -156,14 +156,14 @@ return [ 'health_and_fitness' => 'Health & Fitness', 'history' => 'History', 'kids_and_family' => 'Kids & Family', - 'leisure' => 'Leisure', - 'music' => 'Music', - 'news' => 'News', + 'leisure' => 'Voľný čas', + 'music' => 'Hudba', + 'news' => 'Správy', 'religion_and_spirituality' => 'Religion & Spirituality', - 'science' => 'Science', - 'society_and_culture' => 'Society & Culture', - 'sports' => 'Sports', - 'technology' => 'Technology', + 'science' => 'Veda', + 'society_and_culture' => 'Spoločnosť a kultúra', + 'sports' => 'Športy', + 'technology' => 'Technológia', 'true_crime' => 'True Crime', 'tv_and_film' => 'TV & Film', 'books' => 'Books', @@ -182,12 +182,12 @@ return [ 'improv' => 'Improv', 'stand_up' => 'Stand-Up', 'courses' => 'Kurzy', - 'how_to' => 'How To', - 'language_learning' => 'Language Learning', - 'self_improvement' => 'Self-Improvement', + 'how_to' => 'Ako na to', + 'language_learning' => 'Učenie jazykov', + 'self_improvement' => 'Sebazdokonaľovanie', 'comedy_fiction' => 'Comedy Fiction', 'drama' => 'Drama', - 'science_fiction' => 'Science Fiction', + 'science_fiction' => 'Vedecko-fantastické', 'alternative_health' => 'Alternative Health', 'fitness' => 'Fitness', 'medicine' => 'Medicínsky', @@ -195,39 +195,39 @@ return [ 'nutrition' => 'Nutrition', 'sexuality' => 'Sexualita', 'education_for_kids' => 'Education for Kids', - 'parenting' => 'Parenting', + 'parenting' => 'Rodičovstvo', 'pets_and_animals' => 'Pets & Animals', 'stories_for_kids' => 'Príbehy pre deti', 'animation_and_manga' => 'Animation & Manga', 'automotive' => 'Automotive', 'aviation' => 'Aviation', 'crafts' => 'Crafts', - 'games' => 'Games', - 'hobbies' => 'Hobbies', + 'games' => 'Hry', + 'hobbies' => 'Záľuby', 'home_and_garden' => 'Home & Garden', - 'video_games' => 'Video Games', + 'video_games' => 'Videohry', 'music_commentary' => 'Music Commentary', - 'music_history' => 'Music History', - 'music_interviews' => 'Music Interviews', + 'music_history' => 'Hudobná história', + 'music_interviews' => 'Hudobné rozhovory', 'business_news' => 'Business News', 'daily_news' => 'Daily News', 'entertainment_news' => 'Entertainment News', 'news_commentary' => 'News Commentary', - 'politics' => 'Politics', - 'sports_news' => 'Sports News', + 'politics' => 'Politika', + 'sports_news' => 'Športové správy', 'tech_news' => 'Tech News', 'buddhism' => 'Buddhism', - 'christianity' => 'Christianity', + 'christianity' => 'Kresťanstvo', 'hinduism' => 'Hinduism', 'islam' => 'Islam', 'judaism' => 'Judaism', - 'religion' => 'Religion', - 'spirituality' => 'Spirituality', - 'astronomy' => 'Astronomy', - 'chemistry' => 'Chemistry', + 'religion' => 'Náboženstvo', + 'spirituality' => 'Duchovno', + 'astronomy' => 'Astronómia', + 'chemistry' => 'Chémia', 'earth_sciences' => 'Earth Sciences', 'life_sciences' => 'Life Sciences', - 'mathematics' => 'Mathematics', + 'mathematics' => 'Matematické', 'natural_sciences' => 'Natural Sciences', 'nature' => 'Príroda', 'physics' => 'Fyzika', @@ -263,21 +263,21 @@ return [ 'post' => 'Your announcement post', 'post_hint' => "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'submit' => 'Publish', - 'publication_date' => 'Publication date', + 'message_placeholder' => 'Napíšte vašu správu…', + 'submit' => 'Zverejniť', + 'publication_date' => 'Dátum zverejnenia', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', + 'now' => 'Hneď teraz', + 'schedule' => 'Naplánovať', ], - 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date' => 'Dátum plánovaného zverejnenia', 'scheduled_publication_date_hint' => 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', + 'submit_edit' => 'Upraviť zverejnenie', + 'cancel_publication' => 'Zrušiť zverejnenie', 'message_warning' => 'You did not write a message for your announcement post!', 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', - 'message_warning_submit' => 'Publish anyway', + 'message_warning_submit' => 'Napriek tomu zverejniť', ], 'publication_status_banner' => [ 'draft_mode' => 'draft mode', @@ -305,10 +305,10 @@ return [ one {# post} other {# posts} }', - 'activity' => 'Activity', - 'episodes' => 'Episodes', - 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', + 'activity' => 'Aktivita', + 'episodes' => 'Časti', + 'sponsor' => 'Sponzor', + 'funding_links' => 'Odkazy na financovanie {podcastTitle}', + 'find_on' => 'Nájsť {podcastTitle} na', + 'listen_on' => 'Počúvajte na', ]; diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-Hans/Breadcrumb.php index 8aef36b2..df604854 100644 --- a/modules/Admin/Language/zh-Hans/Breadcrumb.php +++ b/modules/Admin/Language/zh-Hans/Breadcrumb.php @@ -31,12 +31,12 @@ return [ 'delete' => '删除', 'remove' => '移除', 'fediverse' => '联邦宇宙', - 'blocked-actors' => 'blocked actors', - 'blocked-domains' => 'blocked domains', + 'blocked-actors' => '已屏蔽演员', + 'blocked-domains' => '已屏蔽域名', 'users' => '用户', 'my-account' => '我的帐户', 'change-password' => '修改密码', - 'imports' => 'imports', + 'imports' => '导入', 'platforms' => '平台', 'social' => '社交网络', 'funding' => '资金支持', diff --git a/modules/Admin/Language/zh-Hans/Charts.php b/modules/Admin/Language/zh-Hans/Charts.php index 92a6e4c2..e1da7b26 100644 --- a/modules/Admin/Language/zh-Hans/Charts.php +++ b/modules/Admin/Language/zh-Hans/Charts.php @@ -37,5 +37,5 @@ return [ 'podcast_by_bandwidth' => '每日使用带宽(MB)', 'total_storage_by_month' => '每月存储量 (MB)', 'total_bandwidth_by_month' => '每月使用带宽(MB)', - 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', + 'total_bandwidth_by_month_limit' => '每月限制为 {totalBandwidth}', ]; diff --git a/modules/Admin/Language/zh-Hans/Episode.php b/modules/Admin/Language/zh-Hans/Episode.php index 74111c23..84ac4e98 100644 --- a/modules/Admin/Language/zh-Hans/Episode.php +++ b/modules/Admin/Language/zh-Hans/Episode.php @@ -151,8 +151,8 @@ return [ 'chapters_file_delete' => '删除章节文件', 'advanced_section_title' => '高级参数', 'advanced_section_subtitle' => - '如果你不需要 Castopod 处理某些订阅源标签,请在此处设置。', - 'custom_rss' => '剧集的自定义订阅标签', + '如果您需要 Castopod 无法处理的 RSS 标签,请在此处设置它们。', + 'custom_rss' => '剧集的自定义 RSS 标签', 'custom_rss_hint' => '这将被注入到 ❬item❭ 标签中。', 'block' => '剧集应该在公共目录中隐藏', 'block_hint' => @@ -190,7 +190,7 @@ return [ ], 'unpublish_form' => [ 'disclaimer' => - "取消发布该剧集将删除相关的所有评论和播文,并将其从播客的订阅源中删除。", + "取消发布该剧集将删除相关的所有评论和播文,并将其从播客的 RSS 摘要中删除。", 'understand' => '我明白,我想取消发布此剧集', 'submit' => '取消发布', ], diff --git a/modules/Admin/Language/zh-Hans/Navigation.php b/modules/Admin/Language/zh-Hans/Navigation.php index 401f08b3..fb0685c2 100644 --- a/modules/Admin/Language/zh-Hans/Navigation.php +++ b/modules/Admin/Language/zh-Hans/Navigation.php @@ -17,8 +17,8 @@ return [ 'podcasts' => '播客', 'podcast-list' => '全部播客', 'podcast-create' => '新播客', - 'all-podcast-imports' => 'All Podcast imports', - 'podcast-imports-add' => 'Import a podcast', + 'all-podcast-imports' => '全部播客导入', + 'podcast-imports-add' => '导入播客', 'persons' => '人员', 'person-list' => '所有人', 'person-create' => '新成员', diff --git a/modules/Admin/Language/zh-Hans/Podcast.php b/modules/Admin/Language/zh-Hans/Podcast.php index c442e666..d07c4fd6 100644 --- a/modules/Admin/Language/zh-Hans/Podcast.php +++ b/modules/Admin/Language/zh-Hans/Podcast.php @@ -13,7 +13,7 @@ return [ 'no_podcast' => '没有找到播客!', 'create' => '创建播客', 'import' => '导入播客', - 'all_imports' => 'Podcast imports', + 'all_imports' => '播客导入', 'new_episode' => '新剧集', 'view' => '浏览博客', 'edit' => '编辑播客', @@ -26,8 +26,8 @@ return [ 'latest_episodes' => '最新剧集', 'see_all_episodes' => '查看所有剧集', 'draft' => '草稿', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', + 'sync_feed' => '同步摘要', + 'sync_feed_hint' => '导入此播客的最新剧集', 'messages' => [ 'createSuccess' => '播客创建成功!', 'editSuccess' => '播客已更新!', @@ -94,10 +94,10 @@ return [ 'author_section_subtitle' => '谁在管理播客?', 'owner_name' => '所有者名称', 'owner_name_hint' => - '仅供管理使用,在公开 RSS 提要中可见。', + '仅供管理使用,在公开 RSS 摘要中可见。', 'owner_email' => '所有者邮箱', 'owner_email_hint' => - '大多数平台将使用它来验证播客的所有权。 在公开 RSS 提要中可见。', + '大多数平台将使用它来验证播客的所有权。 在公开 RSS 摘要中可见。', 'publisher' => '发布者', 'publisher_hint' => '负责制作节目的小组。 通常指播客的母公司或网络。 有时会被标记为“作者”。', @@ -112,21 +112,21 @@ return [ 'premium' => '高级版', 'premium_by_default' => '剧集必须默认设置为付费会员订阅。', 'premium_by_default_hint' => '默认情况下,播客剧集将被标记为高级。 你仍然可以选择将某些剧集、预告片等设置为公开。', - 'op3' => 'Open Podcast Prefix Project (OP3)', - 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', - 'op3_enable' => 'Enable OP3 analytics service', - 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'op3' => '打开播客前缀项目 (OP3)', + 'op3_hint' => '使用 OP3(一项开源且值得信赖的第三方分析服务)来评估您的分析数据。 与开源播客生态系统共享、验证和比较您的分析数据。', + 'op3_enable' => '启用 OP3 分析服务', + 'op3_enable_hint' => '出于安全原因,高级剧集的分析数据将不会与 OP3 共享。', 'payment_pointer' => '网络货币化支付指南', 'payment_pointer_hint' => '借助网络货币化,你可以在此收款', 'advanced_section_title' => '高级参数', 'advanced_section_subtitle' => - '如果你不需要 Castopod 处理某些订阅源标签,请在此处设置。', - 'custom_rss' => '播客的自定义订阅标签', - 'custom_rss_hint' => '这将被注入到❬channel❭标签中。', - 'new_feed_url' => '新订阅源网址', - 'new_feed_url_hint' => '当你迁移到另一个域或播客托管平台时,请使用此字段。 默认情况下,播客导入时,该值为当前的订阅源网址。', - 'old_feed_url' => '旧订阅源网址', + '如果您需要 Castopod 无法处理的 RSS 标签,请在此处设置它们。', + 'custom_rss' => '播客的自定义 RSS 标签', + 'custom_rss_hint' => '这将被注入到 ❬channel❭ 标签中。', + 'new_feed_url' => '新摘要网址', + 'new_feed_url_hint' => '当你迁移到另一个域或播客托管平台时,请使用此字段。 默认情况下,播客导入时,该值为当前的 RSS 网址。', + 'old_feed_url' => '旧摘要网址', 'partnership' => '合作伙伴', 'partner_id' => 'ID', 'partner_link_url' => '链接网址', @@ -141,7 +141,7 @@ return [ 'complete' => '播客没有新剧集', 'lock' => '防止播客被盗用', 'lock_hint' => - '目的是告诉其他播客平台是否允许导入此订阅源。 值为是表示拒绝将此订阅源导入任何平台。', + '目的是告诉其他播客平台是否允许导入此摘要。 值为是表示拒绝将此摘要导入任何平台。', 'submit_create' => '创建播客', 'submit_edit' => '保存播客', ], diff --git a/modules/Admin/Language/zh-Hans/PodcastNavigation.php b/modules/Admin/Language/zh-Hans/PodcastNavigation.php index 656f48f8..9a50d223 100644 --- a/modules/Admin/Language/zh-Hans/PodcastNavigation.php +++ b/modules/Admin/Language/zh-Hans/PodcastNavigation.php @@ -14,7 +14,7 @@ return [ 'podcast-view' => '主页', 'podcast-edit' => '编辑播客', 'podcast-persons-manage' => '管理人员', - 'podcast-imports' => 'Podcast imports', + 'podcast-imports' => '播客导入', 'episodes' => '剧集', 'episode-list' => '所有剧集', 'episode-create' => '新剧集', diff --git a/modules/PodcastImport/Language/fa/PodcastImport.php b/modules/PodcastImport/Language/fa/PodcastImport.php index e7503eef..34c55dc9 100644 --- a/modules/PodcastImport/Language/fa/PodcastImport.php +++ b/modules/PodcastImport/Language/fa/PodcastImport.php @@ -10,52 +10,52 @@ declare(strict_types=1); return [ 'banner' => [ - 'disclaimer' => 'Importing', - 'text' => '{podcastTitle} is currently being imported.', - 'cta' => 'See import status', + 'disclaimer' => 'درون‌ریزی', + 'text' => '{podcastTitle} دارد درون‌ریخته می‌شود.', + 'cta' => 'دیدن وضعیت درون‌ریزی', ], - 'old_podcast_section_title' => 'The podcast to import', - 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_section_title' => 'پادکست برای درون‌ریزی', + 'old_podcast_legal_disclaimer_title' => 'سلب مسئولیت حقوقی', 'old_podcast_legal_disclaimer' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', + 'پیش از درون‌ریزی مطمئن شوید حقوق این پادکست را دارید. رونوشت و پخش یک پادکست بدون حقوق مناسب دزدی دریایی حساب شده و قابل پیگرد است.', + 'imported_feed_url' => 'نشانی خوراک', + 'imported_feed_url_hint' => 'خورام باید در قالب xml یا rss باشد.', + 'new_podcast_section_title' => 'پادکست جدید', 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', - 'submit' => 'Add import to queue', + 'این خوراک محافظت شده است. نمی‌توانید درون‌ریزیش کنید. اگر مالکش هستید، روی بن‌سازهٔ اصلی قفل‌گشاییش کنید.', + 'submit' => 'افزودن درون‌ریزی به صف', 'queue' => [ 'status' => [ - 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Import task is awaiting to be processed.', - 'canceled' => 'canceled', - 'canceled_hint' => 'Import task was canceled.', - 'running' => 'running', - 'running_hint' => 'Import task is being processed.', - 'failed' => 'failed', - 'failed_hint' => 'Import task could not complete: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Import task was completed successfully!', + 'label' => 'وضعیت', + 'queued' => 'صف شده', + 'queued_hint' => 'وظیفهٔ درون‌ریزی منتظر پردازش است.', + 'canceled' => 'لغو شده', + 'canceled_hint' => 'وظیفهٔ درون‌ریزی لغو شد.', + 'running' => 'درحال اجرا', + 'running_hint' => 'وظیفهٔ درون‌ریزی در حال پردازش است.', + 'failed' => 'شکست خورده', + 'failed_hint' => 'وظیفهٔ درون‌ریزی نتوانست کامل شود: شکست کدنوشته.', + 'passed' => 'قبول شده', + 'passed_hint' => 'وظیفهٔ درون‌ریزی با موفّقیت کامل شد!', ], - 'feed' => 'Feed', - 'duration' => 'Import duration', - 'imported_episodes' => 'Imported episodes', - 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'feed' => 'خوراک', + 'duration' => 'طول درون‌ریزی', + 'imported_episodes' => 'قسمت‌های درون‌ریخته', + 'imported_episodes_hint' => '{newlyImportedCount} به تازگی درون‌ریخته. {alreadyImportedCount} از پیش درون‌ریخته.', 'actions' => [ - 'cancel' => 'Cancel', - 'retry' => 'Retry', - 'delete' => 'Delete', + 'cancel' => 'لغو', + 'retry' => 'تلاش دوباره', + 'delete' => 'حذف', ], ], 'messages' => [ - 'canceled' => 'Import task has been successfully canceled!', - 'notRunning' => 'Cannot cancel Import Task as it is not running.', - 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', - 'retried' => 'Import task has been queued, it will be retried shortly!', - 'deleted' => 'Import task has been successfully deleted!', - 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', - 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + 'canceled' => 'وظیفهٔ درون‌ریزی با موفّقیت لغو شد!', + 'notRunning' => 'نمی‌توان وظیفهٔ درون‌ریزی را لغو کرد؛ چرا که در حال اجرا نیست.', + 'alreadyRunning' => 'وظیفهٔ درون‌ریزی در حال اجراست. پیش از تلاش دوباره باید لغوش کنید.', + 'retried' => 'وظیفهٔ درون‌ریزی صف شد. به زودی دوباره انجام خواهد شد!', + 'deleted' => 'وظیفهٔ درون‌ریزی با موفّقیت حذف شد!', + 'importTaskQueued' => 'وظیفه‌ای جدید صف شد. درون‌ریزی به زودی آغاز خواهد شد!', + 'podcastNotImported' => 'از آن‌جا که پادکست درون‌ریزی نشده، قابل هم‌گام سازی نیست.', + 'syncTaskQueued' => 'وظیفهٔ درون‌ریزی جدیدی صف شد. هم‌گام سازی به زودی آغاز خواهد شد!', ], ]; diff --git a/modules/PodcastImport/Language/zh-Hans/PodcastImport.php b/modules/PodcastImport/Language/zh-Hans/PodcastImport.php index e7503eef..bc46c816 100644 --- a/modules/PodcastImport/Language/zh-Hans/PodcastImport.php +++ b/modules/PodcastImport/Language/zh-Hans/PodcastImport.php @@ -10,52 +10,52 @@ declare(strict_types=1); return [ 'banner' => [ - 'disclaimer' => 'Importing', - 'text' => '{podcastTitle} is currently being imported.', - 'cta' => 'See import status', + 'disclaimer' => '输入', + 'text' => '{podcastTitle} 正在导入中。', + 'cta' => '查看导入状态', ], - 'old_podcast_section_title' => 'The podcast to import', - 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_section_title' => '要导入的播客', + 'old_podcast_legal_disclaimer_title' => '法律免责声明', 'old_podcast_legal_disclaimer' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', + '请确保您在导入之前拥有此播客的权限。 在没有权限的情况下复制和广播播客是盗版行为,可能受到起诉。', + 'imported_feed_url' => '摘要 URL', + 'imported_feed_url_hint' => '摘要必须是 xml 或 rss 格式。', + 'new_podcast_section_title' => '新播客', 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', - 'submit' => 'Add import to queue', + '该摘要受到保护。 您无法导入它。 如果您是所有者,请在源平台解锁。', + 'submit' => '添加导入到队列', 'queue' => [ 'status' => [ - 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Import task is awaiting to be processed.', - 'canceled' => 'canceled', - 'canceled_hint' => 'Import task was canceled.', - 'running' => 'running', - 'running_hint' => 'Import task is being processed.', - 'failed' => 'failed', - 'failed_hint' => 'Import task could not complete: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Import task was completed successfully!', + 'label' => '状态', + 'queued' => '队列', + 'queued_hint' => '导入任务正在等待处理。', + 'canceled' => '已取消', + 'canceled_hint' => '导入任务已取消。', + 'running' => '运行中', + 'running_hint' => '导入任务正在处理中。', + 'failed' => '已失败', + 'failed_hint' => '导入任务无法完成:脚本失败。', + 'passed' => '已通过', + 'passed_hint' => '导入任务顺利完成!', ], - 'feed' => 'Feed', - 'duration' => 'Import duration', - 'imported_episodes' => 'Imported episodes', - 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'feed' => '摘要', + 'duration' => '导入时长', + 'imported_episodes' => '导入剧集', + 'imported_episodes_hint' => '{newlyImportedCount} 新导入, {alreadyImportedCount} 已经导入。', 'actions' => [ - 'cancel' => 'Cancel', - 'retry' => 'Retry', - 'delete' => 'Delete', + 'cancel' => '取消', + 'retry' => '重试', + 'delete' => '删除', ], ], 'messages' => [ - 'canceled' => 'Import task has been successfully canceled!', - 'notRunning' => 'Cannot cancel Import Task as it is not running.', - 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', - 'retried' => 'Import task has been queued, it will be retried shortly!', - 'deleted' => 'Import task has been successfully deleted!', - 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', - 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + 'canceled' => '导入任务已成功取消!', + 'notRunning' => '无法取消导入任务,因为它未运行。', + 'alreadyRunning' => '导入任务已在运行。 您可以在重试之前取消它。', + 'retried' => '导入任务已排队,稍后将重试!', + 'deleted' => '导入任务已成功删除!', + 'importTaskQueued' => '新任务已排队,导入即将开始!', + 'podcastNotImported' => '播客无法同步,因为未导入。', + 'syncTaskQueued' => '新的导入任务已排队,即将开始同步!', ], ]; diff --git a/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php b/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php index ceaeb7df..ce755d24 100644 --- a/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php +++ b/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php @@ -72,10 +72,10 @@ return [ 'emails' => [ 'greeting' => '嘿,', 'token' => '你的令牌: {0}', - 'unique_feed_link' => '你唯一的源链接:{0}', + 'unique_feed_link' => '你唯一的摘要链接:{0}', 'how_to_use' => '如何使用?', 'two_ways' => '你有两种解锁高级剧集的方法:', - 'import_into_app' => '在你最喜欢的播客应用程序中复制你唯一的源 URL(将其作为私人源导入以防止暴露你的凭据)。', + 'import_into_app' => '在你最喜欢的播客应用程序中复制你唯一的摘要 URL(将其作为私人源导入以防止暴露你的凭据)。', 'go_to_website' => '访问 {podcastWebsite} 的网站并使用你的令牌解锁播客。', 'welcome_subject' => '欢迎来到 {podcastTitle}', 'welcome' => '你已订阅 {podcastTitle},谢谢,欢迎加入!', From 411b90b4b2a169c885fa10ebad6934e768e9530f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 27 Jul 2023 13:03:19 +0000 Subject: [PATCH 177/477] chore(release): 1.5.0 [skip ci] # [1.5.0](https://code.castopod.org/adaures/castopod/compare/v1.4.7...v1.5.0) (2023-07-27) ### Bug Fixes * **admin-ui:** truncate header title + remove sticky podcast banner card on mobile ([63c20da](https://code.castopod.org/adaures/castopod/commit/63c20da5ffd500265f06fa38f2b2c963e14602af)) ### Features * add podcast links page including social, podcasting and funding links ([8ae2929](https://code.castopod.org/adaures/castopod/commit/8ae292933af15fa99856582ac24e985bfef37d5b)) --- CHANGELOG.md | 13 +++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9d577b6..f5601a95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# [1.5.0](https://code.castopod.org/adaures/castopod/compare/v1.4.7...v1.5.0) (2023-07-27) + +### Bug Fixes + +- **admin-ui:** truncate header title + remove sticky podcast banner card on + mobile + ([63c20da](https://code.castopod.org/adaures/castopod/commit/63c20da5ffd500265f06fa38f2b2c963e14602af)) + +### Features + +- add podcast links page including social, podcasting and funding links + ([8ae2929](https://code.castopod.org/adaures/castopod/commit/8ae292933af15fa99856582ac24e985bfef37d5b)) + ## [1.4.7](https://code.castopod.org/adaures/castopod/compare/v1.4.6...v1.4.7) (2023-07-19) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 519725e6..6bdf905c 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.4.7'); +defined('CP_VERSION') || define('CP_VERSION', '1.5.0'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index f8ee93c5..cfec3319 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.4.7", + "version": "1.5.0", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index bb43f9ec..0ecf9f0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.4.7", + "version": "1.5.0", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 3747fa2c2b913632e9392604f39d713cda272d3c Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 29 Jul 2023 07:56:52 +0000 Subject: [PATCH 178/477] build(docker-dev): use a network pool unlikely to get overlapped --- docker-compose.yml | 12 ++++++------ docs/src/contributing/setup-development.md | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index a2ad2317..8111cc2f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ networks: castopod: ipam: config: - - subnet: 172.20.0.0/24 + - subnet: 172.100.0.0/24 services: app: @@ -22,7 +22,7 @@ services: - mariadb networks: castopod: - ipv4_address: 172.20.0.2 + ipv4_address: 172.100.0.2 redis: image: redis:alpine @@ -33,7 +33,7 @@ services: - redis:/data networks: castopod: - ipv4_address: 172.20.0.3 + ipv4_address: 172.100.0.3 mariadb: image: mariadb:10.2 @@ -50,7 +50,7 @@ services: MYSQL_PASSWORD: castopod networks: castopod: - ipv4_address: 172.20.0.4 + ipv4_address: 172.100.0.4 phpmyadmin: image: phpmyadmin/phpmyadmin:latest @@ -67,7 +67,7 @@ services: - mariadb networks: castopod: - ipv4_address: 172.20.0.5 + ipv4_address: 172.100.0.5 s3: image: adobe/s3mock:latest @@ -82,7 +82,7 @@ services: - ./data/s3:/data:cached networks: castopod: - ipv4_address: 172.20.0.6 + ipv4_address: 172.100.0.6 volumes: redis: diff --git a/docs/src/contributing/setup-development.md b/docs/src/contributing/setup-development.md index 27f68cab..a5216cda 100644 --- a/docs/src/contributing/setup-development.md +++ b/docs/src/contributing/setup-development.md @@ -74,7 +74,7 @@ to help you kickstart your contribution. # ----------------------- #media.fileManager="s3" #media.s3.bucket="castopod" - #media.s3.endpoint="http://172.20.0.6:9090/" + #media.s3.endpoint="http://172.100.0.6:9090/" #media.s3.pathStyleEndpoint=true ``` From 6833dd05ab51bc530d34fd4174ad732f623226c0 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 29 Jul 2023 08:04:19 +0000 Subject: [PATCH 179/477] fix(rss): update podcast extension namespace refs #360 --- app/Entities/Episode.php | 4 ++-- app/Entities/Podcast.php | 4 ++-- app/Helpers/rss_helper.php | 9 ++------- app/Models/PodcastModel.php | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index e16fc81c..bb45c773 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -598,7 +598,7 @@ class Episode extends Entity helper('rss'); $xmlNode = (new SimpleRSSElement( - '', + '', )) ->addChild('channel') ->addChild('item'); @@ -622,7 +622,7 @@ class Episode extends Entity helper('rss'); $customXML = simplexml_load_string( - '' . + '' . $customRssString . '', ); diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index 3aff5e15..0ab77601 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -642,7 +642,7 @@ class Podcast extends Entity helper('rss'); $xmlNode = (new SimpleRSSElement( - '', + '', ))->addChild('channel'); array_to_rss([ 'elements' => $this->custom_rss, @@ -664,7 +664,7 @@ class Podcast extends Entity helper('rss'); $customRssArray = rss_to_array( simplexml_load_string( - '' . + '' . $customRssString . '', ), diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 223c68f6..d3ee71aa 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -35,8 +35,7 @@ if (! function_exists('get_rss_feed')) { $itunesNamespace = 'http://www.itunes.com/dtds/podcast-1.0.dtd'; - $podcastNamespace = - 'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md'; + $podcastNamespace = 'https://podcastindex.org/namespace/1.0'; $atomNamespace = 'http://www.w3.org/2005/Atom'; @@ -450,11 +449,7 @@ if (! function_exists('rss_to_array')) { */ function rss_to_array(SimpleXMLElement $rssNode): array { - $nameSpaces = [ - '', - 'http://www.itunes.com/dtds/podcast-1.0.dtd', - 'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md', - ]; + $nameSpaces = ['', 'http://www.itunes.com/dtds/podcast-1.0.dtd', 'https://podcastindex.org/namespace/1.0']; $arrayNode = []; $arrayNode['name'] = $rssNode->getName(); $arrayNode['namespace'] = $rssNode->getNamespaces(false); diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index a49a0ab0..3efef73b 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -500,7 +500,7 @@ class PodcastModel extends Model * @param mixed[] $data * * Sets the UUIDv5 for a podcast. For more information, see - * https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#guid + * https://podcastindex.org/namespace/1.0#guid * * @return mixed[] */ From 16a3fdb56e3f07185e75d106216f29519ccb25f7 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 29 Jul 2023 08:27:06 +0000 Subject: [PATCH 180/477] fix(rss): set srt transcripts' mimetype to application/x-subrip with rel="captions" attribute closes #360 --- app/Config/Mimes.php | 2 +- app/Helpers/rss_helper.php | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Config/Mimes.php b/app/Config/Mimes.php index cb944c17..433c932f 100644 --- a/app/Config/Mimes.php +++ b/app/Config/Mimes.php @@ -276,7 +276,7 @@ class Mimes ], 'svg' => ['image/svg+xml', 'image/svg', 'application/xml', 'text/xml'], 'vcf' => 'text/x-vcard', - 'srt' => ['text/srt', 'text/plain', 'application/octet-stream'], + 'srt' => ['application/x-subrip', 'text/srt', 'text/plain', 'application/octet-stream'], 'vtt' => ['text/vtt', 'text/plain'], 'ico' => ['image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'], 'stl' => ['application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle'], diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index d3ee71aa..a20f71a6 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -360,6 +360,9 @@ if (! function_exists('get_rss_feed')) { pathinfo($episode->transcript->file_url, PATHINFO_EXTENSION) ) ?? 'text/html', ); + // Castopod only allows for captions (SubRip files) + $transcriptElement->addAttribute('rel', 'captions'); + // TODO: allow for multiple languages $transcriptElement->addAttribute('language', $podcast->language_code); } From 9cc5ffd1439fdc86f46a03f4319cae32db95f84e Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 29 Jul 2023 09:57:35 +0000 Subject: [PATCH 181/477] fix(admin-ui): remove button labels on smaller screens in podcast view - update components renderer regex to include special characters - fix itunes_explicit mapping during import --- app/Libraries/ViewComponents/ComponentRenderer.php | 2 +- app/Views/Components/Button.php | 4 ++++ modules/PodcastImport/Commands/PodcastImport.php | 14 ++++++++++++-- themes/cp_admin/_partials/_nav_header.php | 2 +- themes/cp_admin/podcast/view.php | 4 ++-- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/app/Libraries/ViewComponents/ComponentRenderer.php b/app/Libraries/ViewComponents/ComponentRenderer.php index 76495398..7eb0984d 100644 --- a/app/Libraries/ViewComponents/ComponentRenderer.php +++ b/app/Libraries/ViewComponents/ComponentRenderer.php @@ -96,7 +96,7 @@ class ComponentRenderer private function renderPairedTags(string $output): string { - $pattern = '/<\s*(?[A-Z][A-Za-z0-9\.]*?)(?[\s\S\=\'\"]*)>(?.*)<\/\s*\1\s*>/uUsm'; + $pattern = '/<\s*(?[A-Z][A-Za-z0-9\.]*?)(?(\s*[\w\-]+\s*=\s*(\'[^\']*\'|\"[^\"]*\"))+\s*)>(?.*)<\/\s*\1\s*>/uUsm'; ini_set('pcre.backtrack_limit', '-1'); /* $matches[0] = full tags matched and all of its content diff --git a/app/Views/Components/Button.php b/app/Views/Components/Button.php index 89115bae..4f15bfe7 100644 --- a/app/Views/Components/Button.php +++ b/app/Views/Components/Button.php @@ -81,6 +81,10 @@ class Button extends Component unset($this->attributes['class']); } + if ($this->iconLeft !== '' || $this->iconRight !== '') { + $this->slot = '' . $this->slot . ''; + } + if ($this->iconLeft !== '') { $this->slot = (new Icon([ 'glyph' => $this->iconLeft, diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php index 4d1abe6a..9104f9ed 100644 --- a/modules/PodcastImport/Commands/PodcastImport.php +++ b/modules/PodcastImport/Commands/PodcastImport.php @@ -209,6 +209,11 @@ class PodcastImport extends BaseCommand throw new Exception('Missing podcast cover. Please include an tag'); } + $parentalAdvisory = null; + if ($this->podcastFeed->channel->itunes_explicit->getValue() !== null) { + $parentalAdvisory = $this->podcastFeed->channel->itunes_explicit->getValue() ? 'explicit' : 'clean'; + } + $htmlConverter = new HtmlConverter(); $podcast = new Podcast([ 'created_by' => $this->user->id, @@ -224,7 +229,7 @@ class PodcastImport extends BaseCommand 'banner' => null, 'language_code' => $this->importTask->language, 'category_id' => $this->importTask->category, - 'parental_advisory' => $this->podcastFeed->channel->itunes_explicit->getValue(), + 'parental_advisory' => $parentalAdvisory, 'owner_name' => $this->podcastFeed->channel->itunes_owner->itunes_name->getValue(), 'owner_email' => $this->podcastFeed->channel->itunes_owner->itunes_email->getValue(), 'publisher' => $this->podcastFeed->channel->itunes_author->getValue(), @@ -439,6 +444,11 @@ class PodcastImport extends BaseCommand $coverUrl = $this->getCoverUrl($item); + $parentalAdvisory = null; + if ($item->itunes_explicit->getValue() !== null) { + $parentalAdvisory = $item->itunes_explicit->getValue() ? 'explicit' : 'clean'; + } + $episode = new Episode([ 'created_by' => $this->user->id, 'updated_by' => $this->user->id, @@ -455,7 +465,7 @@ class PodcastImport extends BaseCommand 'description_markdown' => $htmlConverter->convert($showNotes), 'description_html' => $showNotes, 'cover' => $coverUrl ? download_file($coverUrl) : null, - 'parental_advisory' => $item->itunes_explicit->getValue(), + 'parental_advisory' => $parentalAdvisory, 'number' => $item->itunes_episode->getValue(), 'season_number' => $item->itunes_season->getValue(), 'type' => $item->itunes_episodeType->getValue(), diff --git a/themes/cp_admin/_partials/_nav_header.php b/themes/cp_admin/_partials/_nav_header.php index 1633fb52..5c5c00c5 100644 --- a/themes/cp_admin/_partials/_nav_header.php +++ b/themes/cp_admin/_partials/_nav_header.php @@ -16,7 +16,7 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?> 'home', ) ?>" class="inline-flex items-center h-full px-2 text-sm font-semibold sm:px-6 hover:underline focus:ring-inset focus:ring-accent" title=""> - +
    diff --git a/themes/cp_admin/podcast/view.php b/themes/cp_admin/podcast/view.php index ece3ca9d..c899e852 100644 --- a/themes/cp_admin/podcast/view.php +++ b/themes/cp_admin/podcast/view.php @@ -9,8 +9,8 @@ endSection() ?> section('headerRight') ?> - - + + endSection() ?> section('content') ?> From ef9e897b2791625f89a0905f269298751601068c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 29 Jul 2023 10:26:44 +0000 Subject: [PATCH 182/477] chore(release): 1.5.1 [skip ci] ## [1.5.1](https://code.castopod.org/adaures/castopod/compare/v1.5.0...v1.5.1) (2023-07-29) ### Bug Fixes * **admin-ui:** remove button labels on smaller screens in podcast view ([9cc5ffd](https://code.castopod.org/adaures/castopod/commit/9cc5ffd1439fdc86f46a03f4319cae32db95f84e)) * **rss:** set srt transcripts' mimetype to application/x-subrip with rel="captions" attribute ([16a3fdb](https://code.castopod.org/adaures/castopod/commit/16a3fdb56e3f07185e75d106216f29519ccb25f7)), closes [#360](https://code.castopod.org/adaures/castopod/issues/360) * **rss:** update podcast extension namespace ([6833dd0](https://code.castopod.org/adaures/castopod/commit/6833dd05ab51bc530d34fd4174ad732f623226c0)), closes [#360](https://code.castopod.org/adaures/castopod/issues/360) --- CHANGELOG.md | 14 ++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5601a95..e768cd7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +## [1.5.1](https://code.castopod.org/adaures/castopod/compare/v1.5.0...v1.5.1) (2023-07-29) + +### Bug Fixes + +- **admin-ui:** remove button labels on smaller screens in podcast view + ([9cc5ffd](https://code.castopod.org/adaures/castopod/commit/9cc5ffd1439fdc86f46a03f4319cae32db95f84e)) +- **rss:** set srt transcripts' mimetype to application/x-subrip with + rel="captions" attribute + ([16a3fdb](https://code.castopod.org/adaures/castopod/commit/16a3fdb56e3f07185e75d106216f29519ccb25f7)), + closes [#360](https://code.castopod.org/adaures/castopod/issues/360) +- **rss:** update podcast extension namespace + ([6833dd0](https://code.castopod.org/adaures/castopod/commit/6833dd05ab51bc530d34fd4174ad732f623226c0)), + closes [#360](https://code.castopod.org/adaures/castopod/issues/360) + # [1.5.0](https://code.castopod.org/adaures/castopod/compare/v1.4.7...v1.5.0) (2023-07-27) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 6bdf905c..97e1a377 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.5.0'); +defined('CP_VERSION') || define('CP_VERSION', '1.5.1'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index cfec3319..c3671190 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.5.0", + "version": "1.5.1", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 0ecf9f0b..467d4fda 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.5.0", + "version": "1.5.1", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 73a5b680875cc520fd15c529c01d44df728f9be2 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 31 Jul 2023 09:35:16 +0000 Subject: [PATCH 183/477] fix(credits): remove undefined $podcast variable from page layout fixes #359 --- themes/cp_app/pages/_layout.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/cp_app/pages/_layout.php b/themes/cp_app/pages/_layout.php index a7684d62..7f0fb1c5 100644 --- a/themes/cp_app/pages/_layout.php +++ b/themes/cp_app/pages/_layout.php @@ -51,7 +51,7 @@ renderSection('content') ?>
    - handle) ?> + 'Castopod', ], null, false) ?> From d69b4e4857fcb1ac1c05ac59c78d130788f00400 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 31 Jul 2023 10:53:46 +0000 Subject: [PATCH 184/477] fix(platforms): change twitter to X + add buymeacoffee and kofi as funding + fix a few typos closes #353, #361 --- app/Database/Seeds/PlatformSeeder.php | 36 ++++++++++++++------ app/Resources/icons/funding/buymeacoffee.svg | 4 +++ app/Resources/icons/funding/kofi.svg | 4 +++ app/Resources/icons/social/twitter.svg | 2 +- app/Resources/icons/social/x.svg | 4 +++ 5 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 app/Resources/icons/funding/buymeacoffee.svg create mode 100644 app/Resources/icons/funding/kofi.svg create mode 100755 app/Resources/icons/social/x.svg diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index c207b06d..156ec328 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -22,7 +22,7 @@ class PlatformSeeder extends Seeder [ 'slug' => 'amazon', 'type' => 'podcasting', - 'label' => 'Amazon Music and Audible', + 'label' => 'Amazon Music & Audible', 'home_url' => 'https://music.amazon.com/', 'submit_url' => 'https://podcasters.amazon.com/', ], @@ -365,7 +365,7 @@ class PlatformSeeder extends Seeder [ 'slug' => 'podnews', 'type' => 'podcasting', - 'label' => 'podnews', + 'label' => 'Podnews', 'home_url' => 'https://podnews.net/podcast/subscribe-pages', 'submit_url' => '', ], @@ -394,16 +394,23 @@ class PlatformSeeder extends Seeder 'slug' => 'zion', 'type' => 'podcasting', 'label' => 'Zion', - 'home_url' => 'https://getzion.com/', - 'submit_url' => 'https://shop.n2n2.chat/', + 'home_url' => 'https://zion.fyi/', + 'submit_url' => 'https://guide.zion.fyi/zion/getting-started', ], ]; $fundingData = [ + [ + 'slug' => 'buymeacoffee', + 'type' => 'funding', + 'label' => 'Buy Me a Coffee', + 'home_url' => 'https://www.buymeacoffee.com/', + 'submit_url' => 'https://www.buymeacoffee.com/signup', + ], [ 'slug' => 'paypal', 'type' => 'funding', - 'label' => 'Paypal', + 'label' => 'PayPal', 'home_url' => 'https://www.paypal.com/', 'submit_url' => 'https://www.paypal.com/paypalme/my/grab', ], @@ -424,7 +431,7 @@ class PlatformSeeder extends Seeder [ 'slug' => 'helloasso', 'type' => 'funding', - 'label' => 'helloasso', + 'label' => 'HelloAsso', 'home_url' => 'https://www.helloasso.com/', 'submit_url' => 'https://auth.helloasso.com/inscription', ], @@ -449,6 +456,13 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://www.kisskissbankbank.com/', 'submit_url' => 'https://www.kisskissbankbank.com/en/financer-mon-projet', ], + [ + 'slug' => 'kofi', + 'type' => 'funding', + 'label' => 'Ko-fi', + 'home_url' => 'https://ko-fi.com/', + 'submit_url' => 'https://ko-fi.com/account/register', + ], [ 'slug' => 'liberapay', 'type' => 'funding', @@ -579,11 +593,11 @@ class PlatformSeeder extends Seeder 'submit_url' => 'https://www.twitch.tv/signup', ], [ - 'slug' => 'twitter', + 'slug' => 'x', 'type' => 'social', - 'label' => 'Twitter', - 'home_url' => 'https://twitter.com/', - 'submit_url' => 'https://twitter.com/i/flow/signup', + 'label' => 'X', + 'home_url' => 'https://x.com/', + 'submit_url' => 'https://x.com/i/flow/signup', ], [ 'slug' => 'writefreely', @@ -595,7 +609,7 @@ class PlatformSeeder extends Seeder [ 'slug' => 'youtube', 'type' => 'social', - 'label' => 'Youtube', + 'label' => 'YouTube', 'home_url' => 'https://www.youtube.com/', 'submit_url' => 'https://creatoracademy.youtube.com/page/home', ], diff --git a/app/Resources/icons/funding/buymeacoffee.svg b/app/Resources/icons/funding/buymeacoffee.svg new file mode 100644 index 00000000..987bd109 --- /dev/null +++ b/app/Resources/icons/funding/buymeacoffee.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/Resources/icons/funding/kofi.svg b/app/Resources/icons/funding/kofi.svg new file mode 100644 index 00000000..e27ef1b4 --- /dev/null +++ b/app/Resources/icons/funding/kofi.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/Resources/icons/social/twitter.svg b/app/Resources/icons/social/twitter.svg index 1b07620c..3c6492d2 100755 --- a/app/Resources/icons/social/twitter.svg +++ b/app/Resources/icons/social/twitter.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/Resources/icons/social/x.svg b/app/Resources/icons/social/x.svg new file mode 100755 index 00000000..3c6492d2 --- /dev/null +++ b/app/Resources/icons/social/x.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 6a9d14d24e19dd2f8deb86f186491a42fb6f318e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 31 Jul 2023 11:24:44 +0000 Subject: [PATCH 185/477] chore(release): 1.5.2 [skip ci] ## [1.5.2](https://code.castopod.org/adaures/castopod/compare/v1.5.1...v1.5.2) (2023-07-31) ### Bug Fixes * **credits:** remove undefined $podcast variable from page layout ([73a5b68](https://code.castopod.org/adaures/castopod/commit/73a5b680875cc520fd15c529c01d44df728f9be2)), closes [#359](https://code.castopod.org/adaures/castopod/issues/359) * **platforms:** change twitter to X + add buymeacoffee and kofi as funding ([d69b4e4](https://code.castopod.org/adaures/castopod/commit/d69b4e4857fcb1ac1c05ac59c78d130788f00400)), closes [#353](https://code.castopod.org/adaures/castopod/issues/353) [#361](https://code.castopod.org/adaures/castopod/issues/361) --- CHANGELOG.md | 12 ++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e768cd7c..363077cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [1.5.2](https://code.castopod.org/adaures/castopod/compare/v1.5.1...v1.5.2) (2023-07-31) + +### Bug Fixes + +- **credits:** remove undefined $podcast variable from page layout + ([73a5b68](https://code.castopod.org/adaures/castopod/commit/73a5b680875cc520fd15c529c01d44df728f9be2)), + closes [#359](https://code.castopod.org/adaures/castopod/issues/359) +- **platforms:** change twitter to X + add buymeacoffee and kofi as funding + ([d69b4e4](https://code.castopod.org/adaures/castopod/commit/d69b4e4857fcb1ac1c05ac59c78d130788f00400)), + closes [#353](https://code.castopod.org/adaures/castopod/issues/353) + [#361](https://code.castopod.org/adaures/castopod/issues/361) + ## [1.5.1](https://code.castopod.org/adaures/castopod/compare/v1.5.0...v1.5.1) (2023-07-29) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 97e1a377..cf2aa1bb 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.5.1'); +defined('CP_VERSION') || define('CP_VERSION', '1.5.2'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index c3671190..0e7f7fcb 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.5.1", + "version": "1.5.2", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 467d4fda..40574363 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.5.1", + "version": "1.5.2", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 26a714d9c231a8644435fb8d67c46eb2bb47e799 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 2 Aug 2023 19:05:12 +0200 Subject: [PATCH 186/477] build(devcontainer): update network's subnet to 172.31.0.0/24 --- app/Entities/Episode.php | 5 +---- composer.json | 1 + docker-compose.yml | 12 ++++++------ docs/src/contributing/setup-development.md | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index bb45c773..41c54a5b 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -238,10 +238,7 @@ class Episode extends Entity (new MediaModel('audio'))->updateMedia($this->getAudio()); } else { $audio = new Audio([ - 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . pathinfo( - $file->getRandomName(), - PATHINFO_FILENAME - ) . '.' . $file->getExtension(), + 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $file->getRandomName(), 'language_code' => $this->getPodcast() ->language_code, 'uploaded_by' => $this->attributes['updated_by'], diff --git a/composer.json b/composer.json index 0e7f7fcb..039093f1 100644 --- a/composer.json +++ b/composer.json @@ -48,6 +48,7 @@ } }, "scripts": { + "dev": "php spark serve", "test": "vendor/bin/phpunit --no-coverage", "analyse": "vendor/bin/phpstan analyse --ansi", "rector": "vendor/bin/rector process --dry-run --ansi --memory-limit=2G", diff --git a/docker-compose.yml b/docker-compose.yml index 8111cc2f..43a05a53 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ networks: castopod: ipam: config: - - subnet: 172.100.0.0/24 + - subnet: 172.31.0.0/24 services: app: @@ -22,7 +22,7 @@ services: - mariadb networks: castopod: - ipv4_address: 172.100.0.2 + ipv4_address: 172.31.0.2 redis: image: redis:alpine @@ -33,7 +33,7 @@ services: - redis:/data networks: castopod: - ipv4_address: 172.100.0.3 + ipv4_address: 172.31.0.3 mariadb: image: mariadb:10.2 @@ -50,7 +50,7 @@ services: MYSQL_PASSWORD: castopod networks: castopod: - ipv4_address: 172.100.0.4 + ipv4_address: 172.31.0.4 phpmyadmin: image: phpmyadmin/phpmyadmin:latest @@ -67,7 +67,7 @@ services: - mariadb networks: castopod: - ipv4_address: 172.100.0.5 + ipv4_address: 172.31.0.5 s3: image: adobe/s3mock:latest @@ -82,7 +82,7 @@ services: - ./data/s3:/data:cached networks: castopod: - ipv4_address: 172.100.0.6 + ipv4_address: 172.31.0.6 volumes: redis: diff --git a/docs/src/contributing/setup-development.md b/docs/src/contributing/setup-development.md index a5216cda..82e4a8fd 100644 --- a/docs/src/contributing/setup-development.md +++ b/docs/src/contributing/setup-development.md @@ -74,7 +74,7 @@ to help you kickstart your contribution. # ----------------------- #media.fileManager="s3" #media.s3.bucket="castopod" - #media.s3.endpoint="http://172.100.0.6:9090/" + #media.s3.endpoint="http://172.31.0.6:9090/" #media.s3.pathStyleEndpoint=true ``` From 0775add67860b94a35b68c01b133ec8ec969f539 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 5 Aug 2023 10:06:49 +0000 Subject: [PATCH 187/477] fix(media): init file properties in setAttributes' Model method + set defaults to pathinfo data --- modules/Media/Entities/Audio.php | 9 ++---- modules/Media/Entities/BaseMedia.php | 29 ++++++++++--------- modules/Media/Entities/Image.php | 5 +--- modules/Media/Entities/Transcript.php | 6 ++-- modules/Media/Models/MediaModel.php | 9 +----- .../PodcastImport/Commands/PodcastImport.php | 4 +++ 6 files changed, 27 insertions(+), 35 deletions(-) diff --git a/modules/Media/Entities/Audio.php b/modules/Media/Entities/Audio.php index 8ee6a70a..7637099d 100644 --- a/modules/Media/Entities/Audio.php +++ b/modules/Media/Entities/Audio.php @@ -21,14 +21,11 @@ class Audio extends BaseMedia { protected string $type = 'audio'; - /** - * @param array|null $data - */ - public function __construct(array $data = null) + public function initFileProperties(): void { - parent::__construct($data); + parent::initFileProperties(); - if ($this->file_metadata) { + if ($this->file_metadata !== null) { $this->duration = (float) $this->file_metadata['playtime_seconds']; $this->header_size = (int) $this->file_metadata['avdataoffset']; } diff --git a/modules/Media/Entities/BaseMedia.php b/modules/Media/Entities/BaseMedia.php index 750db5a7..df6d1f9d 100644 --- a/modules/Media/Entities/BaseMedia.php +++ b/modules/Media/Entities/BaseMedia.php @@ -56,29 +56,30 @@ class BaseMedia extends Entity ]; /** - * @param array|null $data + * @param array $data */ - public function __construct(array $data = null) + public function setAttributes(array $data): self { - parent::__construct($data); + parent::setAttributes($data); $this->initFileProperties(); + + return $this; } public function initFileProperties(): void { - if ($this->file_key !== '') { - [ - 'filename' => $filename, - 'dirname' => $dirname, - 'extension' => $extension, - ] = pathinfo($this->file_key); + $pathInfo = pathinfo($this->file_key) + [ + 'filename' => '', + 'dirname' => '', + 'extension' => '', + ]; - $this->attributes['file_url'] = service('file_manager')->getUrl($this->file_key); - $this->attributes['file_name'] = $filename; - $this->attributes['file_directory'] = $dirname; - $this->attributes['file_extension'] = $extension; - } + $this->file_url = service('file_manager') + ->getUrl($this->file_key); + $this->file_name = $pathInfo['filename']; + $this->file_directory = $pathInfo['dirname']; + $this->file_extension = $pathInfo['extension']; } public function setFile(File $file): self diff --git a/modules/Media/Entities/Image.php b/modules/Media/Entities/Image.php index aae0fd19..4e0af892 100644 --- a/modules/Media/Entities/Image.php +++ b/modules/Media/Entities/Image.php @@ -29,10 +29,7 @@ class Image extends BaseMedia { parent::initFileProperties(); - if ($this->file_key !== '' && $this->file_metadata !== null && array_key_exists( - 'sizes', - $this->file_metadata - )) { + if ($this->file_metadata && array_key_exists('sizes', $this->file_metadata)) { $this->sizes = $this->file_metadata['sizes']; $this->initSizeProperties(); } diff --git a/modules/Media/Entities/Transcript.php b/modules/Media/Entities/Transcript.php index a969cff1..6bb5cf1e 100644 --- a/modules/Media/Entities/Transcript.php +++ b/modules/Media/Entities/Transcript.php @@ -21,11 +21,11 @@ class Transcript extends BaseMedia protected string $type = 'transcript'; - public function __construct(?array $data = null) + public function initFileProperties(): void { - parent::__construct($data); + parent::initFileProperties(); - if ($this->file_key && $this->file_metadata && array_key_exists('json_key', $this->file_metadata)) { + if ($this->file_metadata !== null && array_key_exists('json_key', $this->file_metadata)) { helper('media'); $this->json_key = $this->file_metadata['json_key']; diff --git a/modules/Media/Models/MediaModel.php b/modules/Media/Models/MediaModel.php index 69506c7c..97f2880a 100644 --- a/modules/Media/Models/MediaModel.php +++ b/modules/Media/Models/MediaModel.php @@ -102,14 +102,7 @@ class MediaModel extends Model { $cacheName = "media#{$mediaId}"; if (! ($found = cache($cacheName))) { - $builder = $this->where([ - 'id' => $mediaId, - ]); - - /** @var object $result */ - $result = $builder->first(); - $mediaClass = $this->returnType; - $found = new $mediaClass($result->toArray(false, true)); + $found = $this->find($mediaId); cache() ->save($cacheName, $found, DECADE); diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php index 9104f9ed..504214e2 100644 --- a/modules/PodcastImport/Commands/PodcastImport.php +++ b/modules/PodcastImport/Commands/PodcastImport.php @@ -168,6 +168,10 @@ class PodcastImport extends BaseCommand $this->importTask->pass(); } catch (Exception $exception) { $this->error($exception->getMessage()); + log_message( + 'critical', + 'Error when importing ' . $this->importTask->feed_url . PHP_EOL . $exception->getTraceAsString() + ); } } From 9346e787bd2a2c815533092279f96ae1fe0d9aae Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sun, 6 Aug 2023 12:14:05 +0000 Subject: [PATCH 188/477] fix(media): copy and delete temp file when saving instead of moving it for FS FileManager + throw exception instead silently failing file save closes #338 --- modules/Media/Entities/BaseMedia.php | 8 ++--- modules/Media/Entities/Image.php | 4 +-- modules/Media/Entities/Transcript.php | 16 +++++----- modules/Media/FileManagers/FS.php | 30 +++++++++---------- .../FileManagers/FileManagerInterface.php | 2 +- modules/Media/FileManagers/S3.php | 20 +++++-------- modules/Media/Models/MediaModel.php | 15 +++++----- modules/Media/TranscriptParser.php | 13 ++++++-- .../PodcastImport/Commands/PodcastImport.php | 6 ++-- modules/WebSub/Commands/Publish.php | 2 +- 10 files changed, 59 insertions(+), 57 deletions(-) diff --git a/modules/Media/Entities/BaseMedia.php b/modules/Media/Entities/BaseMedia.php index df6d1f9d..6098edd0 100644 --- a/modules/Media/Entities/BaseMedia.php +++ b/modules/Media/Entities/BaseMedia.php @@ -13,6 +13,7 @@ namespace Modules\Media\Entities; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use Modules\Media\Models\MediaModel; +use RuntimeException; /** * @property int $id @@ -97,15 +98,13 @@ class BaseMedia extends Entity return $this; } - public function saveFile(): bool + public function saveFile(): void { if (! $this->attributes['file'] || ! $this->file_key) { - return false; + throw new RuntimeException("'file' and 'file_key' attributes must be set before saving a file."); } $this->attributes['file_key'] = service('file_manager')->save($this->attributes['file'], $this->file_key); - - return true; } public function deleteFile(): bool @@ -128,6 +127,7 @@ class BaseMedia extends Entity if (! service('file_manager')->rename($this->file_key, $newFileKey)) { $db->transRollback(); + return false; } diff --git a/modules/Media/Entities/Image.php b/modules/Media/Entities/Image.php index 4e0af892..b4b53499 100644 --- a/modules/Media/Entities/Image.php +++ b/modules/Media/Entities/Image.php @@ -94,14 +94,14 @@ class Image extends BaseMedia return $this; } - public function saveFile(): bool + public function saveFile(): void { if ($this->attributes['sizes'] !== []) { $this->initFileProperties(); $this->saveSizes(); } - return parent::saveFile(); + parent::saveFile(); } public function deleteFile(): bool diff --git a/modules/Media/Entities/Transcript.php b/modules/Media/Entities/Transcript.php index 6bb5cf1e..33e9ac4e 100644 --- a/modules/Media/Entities/Transcript.php +++ b/modules/Media/Entities/Transcript.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Modules\Media\Entities; use CodeIgniter\Files\File; +use Exception; use Modules\Media\TranscriptParser; class Transcript extends BaseMedia @@ -53,11 +54,11 @@ class Transcript extends BaseMedia return $this; } - public function saveFile(): bool + public function saveFile(): void { $this->saveJsonTranscript(); - return parent::saveFile(); + parent::saveFile(); } public function deleteFile(): bool @@ -73,19 +74,18 @@ class Transcript extends BaseMedia return true; } - private function saveJsonTranscript(): bool + private function saveJsonTranscript(): void { $srtContent = file_get_contents($this->file->getRealPath()); $transcriptParser = new TranscriptParser(); if ($srtContent === false) { - return false; + throw new Exception('Could not read transcript file at ' . $this->file->getRealPath()); } - if (! $transcriptJson = $transcriptParser->loadString($srtContent)->parseSrt()) { - return false; - } + $transcriptJson = $transcriptParser->loadString($srtContent) + ->parseSrt(); $tempFilePath = WRITEPATH . 'uploads/' . $this->file->getRandomName(); file_put_contents($tempFilePath, $transcriptJson); @@ -94,7 +94,5 @@ class Transcript extends BaseMedia service('file_manager') ->save($newTranscriptJson, $this->json_key); - - return true; } } diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index ad8602fc..7abcf488 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -20,32 +20,32 @@ class FS implements FileManagerInterface /** * Saves a file to the corresponding folder in `public/media` */ - public function save(File $file, string $path): string | false + public function save(File $file, string $key): string { helper('media'); - if ((pathinfo($path, PATHINFO_EXTENSION) === '') && (($extension = $file->getExtension()) !== '')) { - $path = $path . '.' . $extension; - } - $mediaRoot = $this->media_path_absolute(); + $path = $mediaRoot . '/' . $key; - if (! file_exists(dirname($mediaRoot . '/' . $path))) { - mkdir(dirname($mediaRoot . '/' . $path), 0777, true); + if (! file_exists(dirname($path))) { + mkdir(dirname($path), 0777, true); } - if (! file_exists(dirname($mediaRoot . '/' . $path) . '/index.html')) { - touch(dirname($mediaRoot . '/' . $path) . '/index.html'); + if (! file_exists(dirname($path) . '/index.html')) { + touch(dirname($path) . '/index.html'); } - try { - // move to media folder, overwrite file if already existing - $file->move($mediaRoot . '/', $path, true); - } catch (Exception) { - return false; + // copy to media folder, overwrite file if already existing + $isCopySuccessful = copy($file->getRealPath(), $path); + + if (! $isCopySuccessful) { + throw new Exception("Could not save file {$key} to {$path}"); } - return $path; + // delete temporary file after copy + unlink($file->getRealPath()); + + return $key; } public function delete(string $key): bool diff --git a/modules/Media/FileManagers/FileManagerInterface.php b/modules/Media/FileManagers/FileManagerInterface.php index 5b2dd078..eb365429 100644 --- a/modules/Media/FileManagers/FileManagerInterface.php +++ b/modules/Media/FileManagers/FileManagerInterface.php @@ -9,7 +9,7 @@ use CodeIgniter\HTTP\Response; interface FileManagerInterface { - public function save(File $file, string $key): string | false; + public function save(File $file, string $key): string; public function delete(string $key): bool; diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index ca03904d..d67e7059 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -30,19 +30,15 @@ class S3 implements FileManagerInterface ]); } - public function save(File $file, string $key): string|false + public function save(File $file, string $key): string { - try { - $this->s3->putObject([ - 'Bucket' => $this->config->s3['bucket'], - 'Key' => $this->prefixKey($key), - 'SourceFile' => $file, - 'ContentType' => $file->getMimeType(), - 'CacheControl' => 'max-age=' . YEAR, - ]); - } catch (Exception) { - return false; - } + $this->s3->putObject([ + 'Bucket' => $this->config->s3['bucket'], + 'Key' => $this->prefixKey($key), + 'SourceFile' => $file, + 'ContentType' => $file->getMimeType(), + 'CacheControl' => 'max-age=' . YEAR, + ]); // delete file after storage in s3 unlink($file->getRealPath()); diff --git a/modules/Media/Models/MediaModel.php b/modules/Media/Models/MediaModel.php index 97f2880a..4b042fd0 100644 --- a/modules/Media/Models/MediaModel.php +++ b/modules/Media/Models/MediaModel.php @@ -117,12 +117,13 @@ class MediaModel extends Model public function saveMedia(object $media): int | false { // save file first - if (! $media->saveFile()) { - return false; - } + $media->saveFile(); // insert record in database - if (! $mediaId = $this->insert($media, true)) { + /** @var int|false $mediaId */ + $mediaId = $this->insert($media, true); + + if (! $mediaId) { $this->db->transRollback(); return false; @@ -137,10 +138,10 @@ class MediaModel extends Model public function updateMedia(object $media): bool { // save file first - if (! $media->saveFile()) { - return false; - } + // FIXME: what if file is not set? + $media->saveFile(); + // update record in database return $this->update($media->id, $media); } diff --git a/modules/Media/TranscriptParser.php b/modules/Media/TranscriptParser.php index 3034e388..45e097e0 100644 --- a/modules/Media/TranscriptParser.php +++ b/modules/Media/TranscriptParser.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Modules\Media; +use Exception; use stdClass; class TranscriptParser @@ -27,8 +28,10 @@ class TranscriptParser /** * Adapted from: https://stackoverflow.com/a/11659306 + * + * @return string Returns the json encoded string */ - public function parseSrt(): string | false + public function parseSrt(): string { if (! defined('SRT_STATE_SUBNUMBER')) { define('SRT_STATE_SUBNUMBER', 0); @@ -98,7 +101,13 @@ class TranscriptParser $subs[] = $sub; } - return json_encode($subs, JSON_PRETTY_PRINT); + $jsonString = json_encode($subs, JSON_PRETTY_PRINT); + + if (! $jsonString) { + throw new Exception('Failed to parse SRT to JSON.'); + } + + return $jsonString; } private function getSecondsFromTimeString(string $timeString): float diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php index 504214e2..e2ebba74 100644 --- a/modules/PodcastImport/Commands/PodcastImport.php +++ b/modules/PodcastImport/Commands/PodcastImport.php @@ -46,8 +46,6 @@ class PodcastImport extends BaseCommand public function init(): void { - CLI::clearScreen(); - helper('podcast_import'); $importQueue = get_import_tasks(); @@ -97,9 +95,9 @@ class PodcastImport extends BaseCommand public function run(array $params): void { - try { - $this->init(); + $this->init(); + try { CLI::write('All good! Feed was parsed successfully!'); CLI::write( diff --git a/modules/WebSub/Commands/Publish.php b/modules/WebSub/Commands/Publish.php index 7024acf0..ddca5126 100644 --- a/modules/WebSub/Commands/Publish.php +++ b/modules/WebSub/Commands/Publish.php @@ -69,7 +69,7 @@ class Publish extends BaseCommand $request->post($hub, $requestOptions); } catch (Exception $exception) { log_message( - 'critical', + 'warning', "COULD NOT PUBLISH @{$podcast->handle} ON {$hub}" . PHP_EOL . $exception->getMessage() ); } From 754e7a6b4b2c12cf50c1c8b166732dc3255f36fb Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sun, 6 Aug 2023 13:49:06 +0000 Subject: [PATCH 189/477] fix(media): get path using media_path_absolute when saving media file --- modules/Media/FileManagers/FS.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index 7abcf488..ca31bc23 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -24,8 +24,7 @@ class FS implements FileManagerInterface { helper('media'); - $mediaRoot = $this->media_path_absolute(); - $path = $mediaRoot . '/' . $key; + $path = $this->media_path_absolute($key); if (! file_exists(dirname($path))) { mkdir(dirname($path), 0777, true); From 11aa3586a04c166404954600235634cee77219df Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 21 Aug 2023 13:34:48 +0000 Subject: [PATCH 190/477] fix(s3): add a flag to serve media files by redirecting to a presigned url instead of default proxy --- modules/Media/Config/Media.php | 1 + modules/Media/FileManagers/S3.php | 59 ++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/modules/Media/Config/Media.php b/modules/Media/Config/Media.php index 987847c4..daa2f4b8 100644 --- a/modules/Media/Config/Media.php +++ b/modules/Media/Config/Media.php @@ -33,6 +33,7 @@ class Media extends BaseConfig 'debug' => false, 'pathStyleEndpoint' => false, 'keyPrefix' => '', + 'serveWithRedirect' => false, ]; /** diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index d67e7059..4ce3cae1 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -10,6 +10,7 @@ use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\Files\File; use CodeIgniter\HTTP\IncomingRequest; use CodeIgniter\HTTP\Response; +use DateTime; use Exception; use Modules\Media\Config\Media as MediaConfig; @@ -183,8 +184,17 @@ class S3 implements FileManagerInterface public function serve(string $key): Response { - /** @var IncomingRequest $request */ - $request = service('request'); + if ($this->config->s3['serveWithRedirect']) { + return $this->servePresignedRequest($key); + } + + return $this->serveProxy($key); + } + + private function serveProxy(string $key): Response + { + /** @var IncomingRequest $incomingRequest */ + $incomingRequest = service('request'); /** @var Response $response */ $response = service('response'); @@ -194,8 +204,8 @@ class S3 implements FileManagerInterface 'Key' => $this->prefixKey($key), ]; - if ($request->hasHeader('Range')) { - $s3Request['Range'] = $request->header('Range')->getValue(); + foreach ($incomingRequest->headers() as $header) { + $s3Request[$header->getName()] = $header->getValue(); } try { @@ -217,6 +227,47 @@ class S3 implements FileManagerInterface return $response->setBody((string) $result->get('Body')->getContents()); } + private function servePresignedRequest(string $key): Response + { + $cacheName = 'object_presigned_uri_' . str_replace('/', '-', $key) . '_' . $this->config->s3['bucket']; + if (! $found = cache($cacheName)) { + $cmd = $this->s3->getCommand('GetObject', [ + 'Bucket' => $this->config->s3['bucket'], + 'Key' => $this->prefixKey($key), + ]); + + $request = $this->s3->createPresignedRequest($cmd, '+1 day'); + + $found = (string) $request->getUri(); + + cache() + ->save($cacheName, $found, DAY); + } + + $cacheOptions = [ + 'max-age' => DAY, + 'etag' => md5($found), + 'public' => true, + ]; + + if (cache()->getMetaData($cacheName)) { + $lastModifiedTimestamp = cache() + ->getMetaData($cacheName)['mtime']; + $lastModified = new DateTime(); + $lastModified->setTimestamp($lastModifiedTimestamp); + $cacheOptions['last-modified'] = $lastModified->format(DATE_RFC7231); + } + + /** @var Response $response */ + $response = service('response'); + + // Remove Cache-Control header before redefining it + header_remove('Cache-Control'); + + return $response->setCache($cacheOptions) + ->redirect($found); + } + private function prefixKey(string $key): string { if ($this->config->s3['keyPrefix'] === '') { From 7a1eea58d3cbc1982baaec21d87a36e218e1910a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 22 Aug 2023 15:00:01 +0000 Subject: [PATCH 191/477] fix(home): update where clause when getting all podcasts to prevent draft podcasts from showing up --- app/Models/PodcastModel.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 3efef73b..0e5b732c 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -185,11 +185,13 @@ class PodcastModel extends Model $fediverseTablePrefix . 'posts.actor_id = podcasts.actor_id', 'left' ) + ->groupStart() ->where( '`' . $fediverseTablePrefix . 'posts`.`published_at` <= UTC_TIMESTAMP()', null, false )->orWhere($fediverseTablePrefix . 'posts.published_at', null) + ->groupEnd() ->groupBy('podcasts.actor_id') ->orderBy('max_published_at', 'DESC'); } elseif ($orderBy === 'created_desc') { From 7d21b3509ec5d1aa65420efa038f44bcd235e64f Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 28 Aug 2023 13:53:04 +0000 Subject: [PATCH 192/477] feat(episode): add preview link in admin to view and share episode before publication --- app/Config/Routes.php | 9 + app/Controllers/EpisodePreviewController.php | 66 ++++++ ...23-08-22-120000_add_episode_preview_id.php | 36 ++++ app/Entities/Episode.php | 21 +- app/Helpers/components_helper.php | 63 +++++- app/Helpers/id3_helper.php | 8 +- app/Language/en/Episode.php | 12 ++ app/Models/EpisodeModel.php | 43 +++- app/Resources/styles/custom.css | 2 +- modules/Admin/Language/en/Episode.php | 11 + themes/cp_admin/_layout.php | 3 + themes/cp_app/episode/_layout-preview.php | 199 ++++++++++++++++++ .../cp_app/episode/_partials/navigation.php | 39 ++-- themes/cp_app/episode/preview-activity.php | 15 ++ themes/cp_app/episode/preview-comments.php | 14 ++ 15 files changed, 515 insertions(+), 26 deletions(-) create mode 100644 app/Controllers/EpisodePreviewController.php create mode 100644 app/Database/Migrations/2023-08-22-120000_add_episode_preview_id.php create mode 100644 themes/cp_app/episode/_layout-preview.php create mode 100644 themes/cp_app/episode/preview-activity.php create mode 100644 themes/cp_app/episode/preview-comments.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index d46a8855..ae3c9365 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -210,6 +210,15 @@ $routes->get('audio/@(:podcastHandle)/(:slug).(:alphanum)', 'EpisodeAudioControl 'as' => 'episode-audio', ], ); +// episode preview link +$routes->get('/p/(:uuid)', 'EpisodePreviewController::index/$1', [ + 'as' => 'episode-preview', +]); + +$routes->get('/p/(:uuid)/activity', 'EpisodePreviewController::activity/$1', [ + 'as' => 'episode-preview-activity', +]); + // Other pages $routes->get('/credits', 'CreditsController', [ 'as' => 'credits', diff --git a/app/Controllers/EpisodePreviewController.php b/app/Controllers/EpisodePreviewController.php new file mode 100644 index 00000000..6c03eef2 --- /dev/null +++ b/app/Controllers/EpisodePreviewController.php @@ -0,0 +1,66 @@ +getEpisodeByPreviewId($params[0]); + + if (! $episode instanceof Episode) { + throw PageNotFoundException::forPageNotFound(); + } + + $this->episode = $episode; + + if ($episode->publication_status === 'published') { + // redirect to episode page + return redirect()->route('episode', [$episode->podcast->handle, $episode->slug]); + } + + unset($params[0]); + + return $this->{$method}(...$params); + } + + public function index(): RedirectResponse | string + { + helper('form'); + + return view('episode/preview-comments', [ + 'podcast' => $this->episode->podcast, + 'episode' => $this->episode, + ]); + } + + public function activity(): RedirectResponse | string + { + helper('form'); + + return view('episode/preview-activity', [ + 'podcast' => $this->episode->podcast, + 'episode' => $this->episode, + ]); + } +} diff --git a/app/Database/Migrations/2023-08-22-120000_add_episode_preview_id.php b/app/Database/Migrations/2023-08-22-120000_add_episode_preview_id.php new file mode 100644 index 00000000..2bd026e2 --- /dev/null +++ b/app/Database/Migrations/2023-08-22-120000_add_episode_preview_id.php @@ -0,0 +1,36 @@ + [ + 'type' => 'BINARY', + 'constraint' => 16, + 'after' => 'podcast_id', + ], + ]; + + $this->forge->addColumn('episodes', $fields); + + // set preview_id as unique key + $prefix = $this->db->getPrefix(); + $uniquePreviewId = <<db->query($uniquePreviewId); + } + + public function down(): void + { + $fields = ['preview_id']; + $this->forge->dropColumn('episodes', $fields); + } +} diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 41c54a5b..c7af02d3 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -14,6 +14,7 @@ use App\Entities\Clip\Soundbite; use App\Libraries\SimpleRSSElement; use App\Models\ClipModel; use App\Models\EpisodeCommentModel; +use App\Models\EpisodeModel; use App\Models\PersonModel; use App\Models\PodcastModel; use App\Models\PostModel; @@ -21,6 +22,7 @@ use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; use CodeIgniter\I18n\Time; +use Exception; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\Autolink\AutolinkExtension; use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; @@ -39,6 +41,8 @@ use SimpleXMLElement; * @property int $id * @property int $podcast_id * @property Podcast $podcast + * @property ?string $preview_id + * @property string $preview_link * @property string $link * @property string $guid * @property string $slug @@ -150,6 +154,7 @@ class Episode extends Entity protected $casts = [ 'id' => 'integer', 'podcast_id' => 'integer', + 'preview_id' => '?string', 'guid' => 'string', 'slug' => 'string', 'title' => 'string', @@ -509,7 +514,7 @@ class Episode extends Entity if ($this->getPodcast()->episode_description_footer_html) { $descriptionHtml .= "
    {$this->getPodcast() - ->episode_description_footer_html}
    "; +->episode_description_footer_html}
    "; } return $descriptionHtml; @@ -667,4 +672,18 @@ class Episode extends Entity urlencode((string) $this->attributes['guid']) . ($serviceSlug !== null ? '&_from=' . $serviceSlug : ''); } + + public function getPreviewLink(): string + { + if ($this->preview_id === null) { + // generate preview id + if (! $previewUUID = (new EpisodeModel())->setEpisodePreviewId($this->id)) { + throw new Exception('Could not set episode preview id'); + } + + $this->preview_id = $previewUUID; + } + + return url_to('episode-preview', (string) $this->preview_id); + } } diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php index 351d2ec0..176e75c7 100644 --- a/app/Helpers/components_helper.php +++ b/app/Helpers/components_helper.php @@ -9,6 +9,7 @@ declare(strict_types=1); */ use App\Entities\Category; +use App\Entities\Episode; use App\Entities\Location; use CodeIgniter\I18n\Time; use CodeIgniter\View\Table; @@ -218,8 +219,8 @@ if (! function_exists('publication_status_banner')) { } return << -

    +

    + HTML; + } +} + +// ------------------------------------------------------------------------ + if (! function_exists('episode_numbering')) { /** * Returns relevant translated episode numbering. @@ -360,7 +413,7 @@ if (! function_exists('relative_time')) { $datetime = $time->format(DateTime::ATOM); return << + @@ -378,10 +431,10 @@ if (! function_exists('local_datetime')) { 'request' )->getLocale(), IntlDateFormatter::MEDIUM, IntlDateFormatter::LONG); $translatedDate = $time->toLocalizedString($formatter->getPattern()); - $datetime = $time->format(DateTime::ISO8601); + $datetime = $time->format(DateTime::ATOM); return <<WriteTags()) { - echo 'Successfully wrote tags
    '; + // Successfully wrote tags if ($tagwriter->warnings !== []) { - echo 'There were some warnings:
    ' . - implode('

    ', $tagwriter->warnings); + log_message('warning', 'There were some warnings:' . PHP_EOL . implode(PHP_EOL, $tagwriter->warnings)); } } else { - echo 'Failed to write tags!
    ' . - implode('

    ', $tagwriter->errors); + log_message('critical', 'Failed to write tags!' . PHP_EOL . implode(PHP_EOL, $tagwriter->errors)); } } } diff --git a/app/Language/en/Episode.php b/app/Language/en/Episode.php index ebe39336..44be8e38 100644 --- a/app/Language/en/Episode.php +++ b/app/Language/en/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php index bedb1949..bde68905 100644 --- a/app/Models/EpisodeModel.php +++ b/app/Models/EpisodeModel.php @@ -14,9 +14,10 @@ use App\Entities\Episode; use CodeIgniter\Database\BaseBuilder; use CodeIgniter\Database\BaseResult; use CodeIgniter\I18n\Time; -use CodeIgniter\Model; +use Michalsn\Uuid\UuidModel; +use Ramsey\Uuid\Lazy\LazyUuidFromString; -class EpisodeModel extends Model +class EpisodeModel extends UuidModel { /** * TODO: remove, shouldn't be here @@ -50,6 +51,11 @@ class EpisodeModel extends Model ], ]; + /** + * @var string[] + */ + protected $uuidFields = ['preview_id']; + /** * @var string */ @@ -61,6 +67,7 @@ class EpisodeModel extends Model protected $allowedFields = [ 'id', 'podcast_id', + 'preview_id', 'guid', 'title', 'slug', @@ -188,6 +195,38 @@ class EpisodeModel extends Model return $found; } + public function getEpisodeByPreviewId(string $previewId): ?Episode + { + $cacheName = "podcast_episode#preview-{$previewId}"; + if (! ($found = cache($cacheName))) { + $builder = $this->where([ + 'preview_id' => $this->uuid->fromString($previewId) + ->getBytes(), + ]); + + $found = $builder->first(); + + cache() + ->save($cacheName, $found, DECADE); + } + + return $found; + } + + public function setEpisodePreviewId(int $episodeId): string|false + { + /** @var LazyUuidFromString $uuid */ + $uuid = $this->uuid->{$this->uuidVersion}(); + + if (! $this->update($episodeId, [ + 'preview_id' => $uuid, + ])) { + return false; + } + + return (string) $uuid; + } + /** * Gets all episodes for a podcast ordered according to podcast type Filtered depending on year or season * diff --git a/app/Resources/styles/custom.css b/app/Resources/styles/custom.css index 25883b74..6dfa93b1 100644 --- a/app/Resources/styles/custom.css +++ b/app/Resources/styles/custom.css @@ -59,7 +59,7 @@ ); } - .bg-stripes-gray { + .bg-stripes-default { background-image: repeating-linear-gradient( -45deg, #f3f4f6, diff --git a/modules/Admin/Language/en/Episode.php b/modules/Admin/Language/en/Episode.php index 5ed5e3ac..1a5e57a4 100644 --- a/modules/Admin/Language/en/Episode.php +++ b/modules/Admin/Language/en/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/themes/cp_admin/_layout.php b/themes/cp_admin/_layout.php index bd006e54..865465fc 100644 --- a/themes/cp_admin/_layout.php +++ b/themes/cp_admin/_layout.php @@ -67,6 +67,9 @@ $isEpisodeArea = isset($podcast) && isset($episode); published_at, $podcast->id, $podcast->publication_status) ?> + publication_status !== 'published'): ?> + +
    renderSection('content') ?> diff --git a/themes/cp_app/episode/_layout-preview.php b/themes/cp_app/episode/_layout-preview.php new file mode 100644 index 00000000..c8caa036 --- /dev/null +++ b/themes/cp_app/episode/_layout-preview.php @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + [<?= lang('Episode.preview.title') ?>] <?= $episode->title ?> + + + ' /> + asset('styles/index.css', 'css') ?> + asset('js/app.ts', 'js') ?> + asset('js/podcast.ts', 'js') ?> + asset('js/audio-player.ts', 'js') ?> + + + + +
    + include('_admin_navbar') ?> +
    + + + +
    +
    +
    +
    +
    + parental_advisory === 'explicit', 'rounded absolute left-0 bottom-0 ml-2 mb-2 bg-black/75 text-accent-contrast') ?> + is_premium): ?> + + + <?= esc($episode->title) ?> +
    +
    + number, $episode->season_number, 'text-sm leading-none font-semibold px-1 py-1 text-white/90 border !no-underline border-subtle', true) ?> +

    title) ?>

    +
    + persons !== []): ?> + + + location): ?> + location, 'text-xs font-semibold p-2') ?> + +
    +
    +
    +
    + +
    + published_at): ?> + published_at) ?> + + + + + +
    +
    +
    +
    +

    + description_markdown, "\n") > 6 || strlen($episode->description) > 500): ?> + getDescriptionHtml('-+Website+-') ?> + +
    getDescriptionHtml('-+Website+-') ?>
    + +
    + include('episode/_partials/navigation') ?> + include('podcast/_partials/premium_banner') ?> + +
    +
    + renderSection('content') ?> +
    + + include('podcast/_partials/sidebar') ?> +
    + lang('Episode.persons_list', [ + 'episodeTitle' => esc($episode->title), + ]), + 'persons' => $episode->persons, + ]) ?> + fundingPlatforms, 'is_visible'), true)): ?> + include('podcast/_partials/funding_links_modal') ?> + + diff --git a/themes/cp_app/episode/_partials/navigation.php b/themes/cp_app/episode/_partials/navigation.php index ddeedac4..73fdcf5b 100644 --- a/themes/cp_app/episode/_partials/navigation.php +++ b/themes/cp_app/episode/_partials/navigation.php @@ -1,17 +1,32 @@ route_to('episode', esc($podcast->handle), esc($episode->slug)), - 'label' => lang('Episode.comments'), - 'labelInfo' => $episode->comments_count, - ], - [ - 'uri' => route_to('episode-activity', esc($podcast->handle), esc($episode->slug)), - 'label' => lang('Episode.activity'), - 'labelInfo' => $episode->posts_count, - ], -] +if ($episode->publication_status === 'published') { + $navigationItems = [ + [ + 'uri' => route_to('episode', esc($podcast->handle), esc($episode->slug)), + 'label' => lang('Episode.comments'), + 'labelInfo' => $episode->comments_count, + ], + [ + 'uri' => route_to('episode-activity', esc($podcast->handle), esc($episode->slug)), + 'label' => lang('Episode.activity'), + 'labelInfo' => $episode->posts_count, + ], + ]; +} else { + $navigationItems = [ + [ + 'uri' => route_to('episode-preview', $episode->preview_id), + 'label' => lang('Episode.comments'), + 'labelInfo' => $episode->comments_count, + ], + [ + 'uri' => route_to('episode-preview-activity', $episode->preview_id), + 'label' => lang('Episode.activity'), + 'labelInfo' => $episode->posts_count, + ], + ]; +} ?> - CODE_SAMPLE), + HTML), ], [ 'type' => 'separator', diff --git a/themes/cp_admin/episode/_card.php b/themes/cp_admin/episode/_card.php index b03be73e..dc32213e 100644 --- a/themes/cp_admin/episode/_card.php +++ b/themes/cp_admin/episode/_card.php @@ -66,9 +66,9 @@ if ($episode->published_at === null) { $title = lang('Episode.messages.unpublishBeforeDeleteTip'); $items[] = [ 'type' => 'html', - 'content' => esc(<< esc(<<{$icon}{$label} - CODE_SAMPLE), + HTML), ]; } ?> diff --git a/themes/cp_admin/episode/list.php b/themes/cp_admin/episode/list.php index 2e603a59..2461c18b 100644 --- a/themes/cp_admin/episode/list.php +++ b/themes/cp_admin/episode/list.php @@ -149,9 +149,9 @@ data_table( $title = lang('Episode.messages.unpublishBeforeDeleteTip'); $items[] = [ 'type' => 'html', - 'content' => esc(<< esc(<<{$icon}{$label} - CODE_SAMPLE), + HTML), ]; } return '
    - CODE_SAMPLE + HTML , 'uri' => route_to('notification-list', $userPodcast->id), ]; @@ -57,9 +57,9 @@ if ($userPodcasts !== []) { $noNotificationsText = lang('Notifications.no_notifications'); $items[] = [ 'type' => 'html', - 'content' => esc(<< esc(<<{$noNotificationsText} - CODE_SAMPLE), + HTML), ]; } ?> @@ -90,11 +90,11 @@ foreach ($userPodcasts as $userPodcast) { $checkMark = interact_as_actor_id() === $userPodcast->actor_id ? icon('check', 'ml-2 bg-accent-base text-accent-contrast rounded-full') : ''; $userPodcastTitle = esc($userPodcast->title); - $interactButtons .= <<
    {$userPodcastTitle}{$checkMark}
    - CODE_SAMPLE; + HTML; } } @@ -127,7 +127,7 @@ if ($userPodcasts !== []) { $menuItems = array_merge([ [ 'type' => 'html', - 'content' => esc(<< esc(<< {$interactAsText}
    @@ -135,7 +135,7 @@ if ($userPodcasts !== []) { {$interactButtons}
    - CODE_SAMPLE), + HTML), ], [ 'type' => 'separator', From ae57601c838a7aa9469bae8038ac1c30d8c9a51e Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sun, 27 Aug 2023 13:26:06 +0000 Subject: [PATCH 208/477] fix: update Router to include latest CI changes with alternate-content logic --- app/Config/App.php | 271 ----------------- app/Config/CURLRequest.php | 2 +- app/Config/Cookie.php | 2 + app/Config/Database.php | 35 +-- app/Config/Events.php | 8 + app/Config/Exceptions.php | 27 ++ app/Config/Fediverse.php | 8 +- app/Config/Filters.php | 8 +- app/Config/Routes.php | 84 ++---- app/Config/Routing.php | 117 ++++++++ app/Config/Services.php | 16 - app/Config/Toolbar.php | 27 ++ app/Controllers/ColorsController.php | 3 +- app/Controllers/EpisodeAudioController.php | 2 +- app/Controllers/EpisodeController.php | 28 +- app/Controllers/HomeController.php | 3 +- app/Entities/Episode.php | 3 +- app/Entities/Person.php | 3 +- app/Entities/Podcast.php | 5 +- app/Helpers/misc_helper.php | 20 +- app/Helpers/page_helper.php | 5 +- app/Helpers/rss_helper.php | 3 +- app/Helpers/seo_helper.php | 14 +- app/Libraries/RouteCollection.php | 280 ------------------ app/Libraries/Router.php | 159 +++++----- .../ViewComponents/ComponentRenderer.php | 2 +- app/Libraries/ViewThemes/Theme.php | 4 +- app/Libraries/Vite/Vite.php | 28 +- app/Models/PlatformModel.php | 3 +- app/Models/PodcastModel.php | 3 +- composer.json | 2 +- composer.lock | 36 +-- modules/Admin/Config/Routes.php | 8 +- modules/Admin/Controllers/AboutController.php | 3 +- .../Admin/Controllers/DashboardController.php | 5 +- .../Admin/Controllers/PodcastController.php | 3 +- .../Controllers/VideoClipsController.php | 8 +- modules/Admin/Language/ar/Breadcrumb.php | 4 +- modules/Admin/Language/br/Breadcrumb.php | 4 +- modules/Admin/Language/ca/Breadcrumb.php | 4 +- modules/Admin/Language/da/Breadcrumb.php | 4 +- modules/Admin/Language/de/Breadcrumb.php | 4 +- modules/Admin/Language/el/Breadcrumb.php | 4 +- modules/Admin/Language/en/Breadcrumb.php | 4 +- modules/Admin/Language/es/Breadcrumb.php | 4 +- modules/Admin/Language/fa/Breadcrumb.php | 4 +- modules/Admin/Language/fr/Breadcrumb.php | 4 +- modules/Admin/Language/fr2/Breadcrumb.php | 4 +- modules/Admin/Language/fr_CA/Breadcrumb.php | 4 +- modules/Admin/Language/fr_trad/Breadcrumb.php | 4 +- modules/Admin/Language/gd/Breadcrumb.php | 4 +- modules/Admin/Language/gl/Breadcrumb.php | 4 +- modules/Admin/Language/id/Breadcrumb.php | 4 +- modules/Admin/Language/it/Breadcrumb.php | 4 +- modules/Admin/Language/ja/Breadcrumb.php | 4 +- modules/Admin/Language/ko/Breadcrumb.php | 4 +- modules/Admin/Language/nl/Breadcrumb.php | 4 +- modules/Admin/Language/nn-NO/Breadcrumb.php | 4 +- modules/Admin/Language/oc/Breadcrumb.php | 4 +- modules/Admin/Language/pl/Breadcrumb.php | 4 +- modules/Admin/Language/pt-BR/Breadcrumb.php | 4 +- modules/Admin/Language/pt/Breadcrumb.php | 4 +- modules/Admin/Language/ro/Breadcrumb.php | 4 +- modules/Admin/Language/ru/Breadcrumb.php | 4 +- modules/Admin/Language/sk/Breadcrumb.php | 4 +- modules/Admin/Language/sr_Latn/Breadcrumb.php | 4 +- modules/Admin/Language/sv/Breadcrumb.php | 4 +- modules/Admin/Language/uk/Breadcrumb.php | 4 +- modules/Admin/Language/zh-Hans/Breadcrumb.php | 4 +- modules/Analytics/Config/Routes.php | 17 +- .../Analytics/Helpers/analytics_helper.php | 3 +- modules/Api/Rest/V1/Config/Routes.php | 8 +- modules/Api/Rest/V1/Config/Services.php | 3 +- .../Rest/V1/Controllers/EpisodeController.php | 3 +- modules/Api/Rest/V1/Filters/ApiFilter.php | 2 +- modules/Auth/Auth.php | 6 +- modules/Auth/Config/Auth.php | 3 +- modules/Auth/Config/Routes.php | 9 +- modules/Auth/Config/Services.php | 4 +- .../Auth/Controllers/MagicLinkController.php | 5 +- modules/Fediverse/Config/Routes.php | 10 +- .../Fediverse/Controllers/ActorController.php | 2 +- .../Controllers/NodeInfo2Controller.php | 3 +- .../Fediverse/Controllers/PostController.php | 2 +- modules/Fediverse/Entities/Actor.php | 9 +- modules/Fediverse/Models/ActivityModel.php | 3 +- modules/Fediverse/Models/ActorModel.php | 19 +- .../Fediverse/Models/BlockedDomainModel.php | 9 +- modules/Fediverse/Models/PostModel.php | 15 +- modules/Fediverse/Models/PreviewCardModel.php | 7 +- modules/Install/Config/Routes.php | 6 +- .../Install/Controllers/InstallController.php | 8 +- modules/Media/Config/Routes.php | 4 +- modules/Media/Config/Services.php | 3 +- modules/Media/Entities/BaseMedia.php | 4 +- modules/Media/Entities/Image.php | 4 +- modules/Media/FileManagers/FS.php | 2 +- modules/MediaClipper/Commands/Generate.php | 3 +- modules/MediaClipper/VideoClipper.php | 13 +- .../PodcastImport/Commands/PodcastImport.php | 3 +- modules/PodcastImport/Config/Routes.php | 4 +- modules/PremiumPodcasts/Config/Routes.php | 9 +- .../Filters/PodcastUnlockFilter.php | 39 ++- modules/WebSub/Commands/Publish.php | 3 +- public/index.php | 22 +- spark | 5 + tests/modules/Api/Rest/V1/EpisodeTest.php | 3 +- tests/modules/Api/Rest/V1/PodcastTest.php | 3 +- themes/cp_admin/episode/embed.php | 5 +- themes/cp_admin/episode/video_clips_new.php | 8 +- themes/cp_admin/settings/general.php | 8 +- themes/cp_admin/settings/theme.php | 8 +- themes/cp_auth/email_2fa_show.php | 8 +- themes/cp_auth/email_2fa_verify.php | 7 +- themes/cp_auth/email_activate_show.php | 7 +- themes/cp_auth/login.php | 7 +- themes/cp_auth/magic_link_form.php | 7 +- themes/cp_auth/magic_link_message.php | 7 +- themes/cp_auth/magic_link_set_password.php | 7 +- themes/cp_auth/register.php | 7 +- themes/cp_install/database_config.php | 15 +- themes/cp_install/instance_config.php | 19 +- 122 files changed, 803 insertions(+), 963 deletions(-) create mode 100644 app/Config/Routing.php delete mode 100644 app/Libraries/RouteCollection.php diff --git a/app/Config/App.php b/app/Config/App.php index ab7efc97..164763a3 100644 --- a/app/Config/App.php +++ b/app/Config/App.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace Config; use CodeIgniter\Config\BaseConfig; -use CodeIgniter\Session\Handlers\FileHandler; class App extends BaseConfig { @@ -138,191 +137,6 @@ class App extends BaseConfig */ public bool $forceGlobalSecureRequests = true; - /** - * -------------------------------------------------------------------------- - * Session Driver - * -------------------------------------------------------------------------- - * - * The session storage driver to use: - * - `CodeIgniter\Session\Handlers\FileHandler` - * - `CodeIgniter\Session\Handlers\DatabaseHandler` - * - `CodeIgniter\Session\Handlers\MemcachedHandler` - * - `CodeIgniter\Session\Handlers\RedisHandler` - * - * @deprecated use Config\Session::$driver instead. - */ - public string $sessionDriver = FileHandler::class; - - /** - * -------------------------------------------------------------------------- - * Session Cookie Name - * -------------------------------------------------------------------------- - * - * The session cookie name, must contain only [0-9a-z_-] characters - * - * @deprecated use Config\Session::$cookieName instead. - */ - public string $sessionCookieName = 'ci_session'; - - /** - * -------------------------------------------------------------------------- - * Session Expiration - * -------------------------------------------------------------------------- - * - * The number of SECONDS you want the session to last. - * Setting to 0 (zero) means expire when the browser is closed. - * - * @deprecated use Config\Session::$expiration instead. - */ - public int $sessionExpiration = 7200; - - /** - * -------------------------------------------------------------------------- - * Session Save Path - * -------------------------------------------------------------------------- - * - * The location to save sessions to and is driver dependent. - * - * For the 'files' driver, it's a path to a writable directory. - * WARNING: Only absolute paths are supported! - * - * For the 'database' driver, it's a table name. - * Please read up the manual for the format with other session drivers. - * - * IMPORTANT: You are REQUIRED to set a valid save path! - * - * @deprecated use Config\Session::$savePath instead. - */ - public string $sessionSavePath = WRITEPATH . 'session'; - - /** - * -------------------------------------------------------------------------- - * Session Match IP - * -------------------------------------------------------------------------- - * - * Whether to match the user's IP address when reading the session data. - * - * WARNING: If you're using the database driver, don't forget to update - * your session table's PRIMARY KEY when changing this setting. - * - * @deprecated use Config\Session::$matchIP instead. - */ - public bool $sessionMatchIP = false; - - /** - * -------------------------------------------------------------------------- - * Session Time to Update - * -------------------------------------------------------------------------- - * - * How many seconds between CI regenerating the session ID. - * - * @deprecated use Config\Session::$timeToUpdate instead. - */ - public int $sessionTimeToUpdate = 300; - - /** - * -------------------------------------------------------------------------- - * Session Regenerate Destroy - * -------------------------------------------------------------------------- - * - * Whether to destroy session data associated with the old session ID - * when auto-regenerating the session ID. When set to FALSE, the data - * will be later deleted by the garbage collector. - * - * @deprecated use Config\Session::$regenerateDestroy instead. - */ - public bool $sessionRegenerateDestroy = false; - - /** - * -------------------------------------------------------------------------- - * Session Database Group - * -------------------------------------------------------------------------- - * - * DB Group for the database session. - * - * @deprecated use Config\Session::$DBGroup instead. - */ - public ?string $sessionDBGroup = null; - - /** - * -------------------------------------------------------------------------- - * Cookie Prefix - * -------------------------------------------------------------------------- - * - * Set a cookie name prefix if you need to avoid collisions. - * - * @deprecated use Config\Cookie::$prefix property instead. - */ - public string $cookiePrefix = ''; - - /** - * -------------------------------------------------------------------------- - * Cookie Domain - * -------------------------------------------------------------------------- - * - * Set to `.your-domain.com` for site-wide cookies. - * - * @deprecated use Config\Cookie::$domain property instead. - */ - public string $cookieDomain = ''; - - /** - * -------------------------------------------------------------------------- - * Cookie Path - * -------------------------------------------------------------------------- - * - * Typically will be a forward slash. - * - * @deprecated use Config\Cookie::$path property instead. - */ - public string $cookiePath = '/'; - - /** - * -------------------------------------------------------------------------- - * Cookie Secure - * -------------------------------------------------------------------------- - * - * Cookie will only be set if a secure HTTPS connection exists. - * - * @deprecated use Config\Cookie::$secure property instead. - */ - public bool $cookieSecure = false; - - /** - * -------------------------------------------------------------------------- - * Cookie HttpOnly - * -------------------------------------------------------------------------- - * - * Cookie will only be accessible via HTTP(S) (no JavaScript). - * - * @deprecated use Config\Cookie::$httponly property instead. - */ - public bool $cookieHTTPOnly = true; - - /** - * -------------------------------------------------------------------------- - * Cookie SameSite - * -------------------------------------------------------------------------- - * - * Configure cookie SameSite setting. Allowed values are: - * - None - * - Lax - * - Strict - * - '' - * - * Alternatively, you can use the constant names: - * - `Cookie::SAMESITE_NONE` - * - `Cookie::SAMESITE_LAX` - * - `Cookie::SAMESITE_STRICT` - * - * Defaults to `Lax` for compatibility with modern browsers. Setting `''` - * (empty string) means default SameSite attribute set by browsers (`Lax`) - * will be set on cookies. If set to `None`, `$cookieSecure` must also be set. - * - * @deprecated `Config\Cookie` $samesite property is used. - */ - public ?string $cookieSameSite = 'Lax'; - /** * -------------------------------------------------------------------------- * Reverse Proxy IPs @@ -346,91 +160,6 @@ class App extends BaseConfig */ public array $proxyIPs = []; - /** - * -------------------------------------------------------------------------- - * CSRF Token Name - * -------------------------------------------------------------------------- - * - * The token name. - * - * @deprecated Use `Config\Security` $tokenName property instead of using this property. - */ - public string $CSRFTokenName = 'csrf_test_name'; - - /** - * -------------------------------------------------------------------------- - * CSRF Header Name - * -------------------------------------------------------------------------- - * - * The header name. - * - * @deprecated Use `Config\Security` $headerName property instead of using this property. - */ - public string $CSRFHeaderName = 'X-CSRF-TOKEN'; - - /** - * -------------------------------------------------------------------------- - * CSRF Cookie Name - * -------------------------------------------------------------------------- - * - * The cookie name. - * - * @deprecated Use `Config\Security` $cookieName property instead of using this property. - */ - public string $CSRFCookieName = 'csrf_cookie_name'; - - /** - * -------------------------------------------------------------------------- - * CSRF Expire - * -------------------------------------------------------------------------- - * - * The number in seconds the token should expire. - * - * @deprecated Use `Config\Security` $expire property instead of using this property. - */ - public int $CSRFExpire = 7200; - - /** - * -------------------------------------------------------------------------- - * CSRF Regenerate - * -------------------------------------------------------------------------- - * - * Regenerate token on every submission? - * - * @deprecated Use `Config\Security` $regenerate property instead of using this property. - */ - public bool $CSRFRegenerate = true; - - /** - * -------------------------------------------------------------------------- - * CSRF Redirect - * -------------------------------------------------------------------------- - * - * Redirect to previous page with error on failure? - * - * @deprecated Use `Config\Security` $redirect property instead of using this property. - */ - public bool $CSRFRedirect = true; - - /** - * -------------------------------------------------------------------------- - * CSRF SameSite - * -------------------------------------------------------------------------- - * - * Setting for CSRF SameSite cookie token. Allowed values are: - * - None - * - Lax - * - Strict - * - '' - * - * Defaults to `Lax` as recommended in this link: - * - * @see https://portswigger.net/web-security/csrf/samesite-cookies - * - * @deprecated Use `Config\Security` $samesite property instead of using this property. - */ - public string $CSRFSameSite = 'Lax'; - /** * -------------------------------------------------------------------------- * Content Security Policy diff --git a/app/Config/CURLRequest.php b/app/Config/CURLRequest.php index a0484ca7..040800df 100644 --- a/app/Config/CURLRequest.php +++ b/app/Config/CURLRequest.php @@ -18,5 +18,5 @@ class CURLRequest extends BaseConfig * If true, all the options won't be reset between requests. * It may cause an error request with unnecessary headers. */ - public bool $shareOptions = true; + public bool $shareOptions = false; } diff --git a/app/Config/Cookie.php b/app/Config/Cookie.php index 0a051c41..26e5da56 100644 --- a/app/Config/Cookie.php +++ b/app/Config/Cookie.php @@ -84,6 +84,8 @@ class Cookie extends BaseConfig * Defaults to `Lax` for compatibility with modern browsers. Setting `''` * (empty string) means default SameSite attribute set by browsers (`Lax`) * will be set on cookies. If set to `None`, `$secure` must also be set. + * + * @phpstan-var 'None'|'Lax'|'Strict'|'' */ public string $samesite = 'Lax'; diff --git a/app/Config/Database.php b/app/Config/Database.php index aca95f04..0f5d9aeb 100644 --- a/app/Config/Database.php +++ b/app/Config/Database.php @@ -27,23 +27,24 @@ class Database extends Config * @var array */ public array $default = [ - 'DSN' => '', - 'hostname' => 'localhost', - 'username' => '', - 'password' => '', - 'database' => '', - 'DBDriver' => 'MySQLi', - 'DBPrefix' => 'cp_', - 'pConnect' => false, - 'DBDebug' => true, - 'charset' => 'utf8mb4', - 'DBCollat' => 'utf8mb4_unicode_ci', - 'swapPre' => '', - 'encrypt' => false, - 'compress' => false, - 'strictOn' => false, - 'failover' => [], - 'port' => 3306, + 'DSN' => '', + 'hostname' => 'localhost', + 'username' => '', + 'password' => '', + 'database' => '', + 'DBDriver' => 'MySQLi', + 'DBPrefix' => 'cp_', + 'pConnect' => false, + 'DBDebug' => true, + 'charset' => 'utf8mb4', + 'DBCollat' => 'utf8mb4_unicode_ci', + 'swapPre' => '', + 'encrypt' => false, + 'compress' => false, + 'strictOn' => false, + 'failover' => [], + 'port' => 3306, + 'numberNative' => false, ]; /** diff --git a/app/Config/Events.php b/app/Config/Events.php index 30419869..bedbc5bd 100644 --- a/app/Config/Events.php +++ b/app/Config/Events.php @@ -10,6 +10,7 @@ use App\Models\EpisodeModel; use CodeIgniter\Debug\Toolbar\Collectors\Database; use CodeIgniter\Events\Events; use CodeIgniter\Exceptions\FrameworkException; +use CodeIgniter\HotReloader\HotReloader; /* * -------------------------------------------------------------------- @@ -50,6 +51,13 @@ Events::on('pre_system', static function () { if (CI_DEBUG && ! is_cli()) { Events::on('DBQuery', Database::class . '::collect'); Services::toolbar()->respond(); + + // Hot Reload route - for framework use on the hot reloader. + if (ENVIRONMENT === 'development') { + Services::routes()->get('__hot-reload', static function (): void { + (new HotReloader())->run(); + }); + } } }); diff --git a/app/Config/Exceptions.php b/app/Config/Exceptions.php index 0c7c681f..248cc3be 100644 --- a/app/Config/Exceptions.php +++ b/app/Config/Exceptions.php @@ -5,7 +5,10 @@ declare(strict_types=1); namespace Config; use CodeIgniter\Config\BaseConfig; +use CodeIgniter\Debug\ExceptionHandler; +use CodeIgniter\Debug\ExceptionHandlerInterface; use Psr\Log\LogLevel; +use Throwable; /** * Setup how the exception handler works. @@ -80,4 +83,28 @@ class Exceptions extends BaseConfig * to capture logging the deprecations. */ public string $deprecationLogLevel = LogLevel::WARNING; + + /* + * DEFINE THE HANDLERS USED + * -------------------------------------------------------------------------- + * Given the HTTP status code, returns exception handler that + * should be used to deal with this error. By default, it will run CodeIgniter's + * default handler and display the error information in the expected format + * for CLI, HTTP, or AJAX requests, as determined by is_cli() and the expected + * response format. + * + * Custom handlers can be returned if you want to handle one or more specific + * error codes yourself like: + * + * if (in_array($statusCode, [400, 404, 500])) { + * return new \App\Libraries\MyExceptionHandler(); + * } + * if ($exception instanceOf PageNotFoundException) { + * return new \App\Libraries\MyExceptionHandler(); + * } + */ + public function handler(int $statusCode, Throwable $exception): ExceptionHandlerInterface + { + return new ExceptionHandler($this); + } } diff --git a/app/Config/Fediverse.php b/app/Config/Fediverse.php index f42d4558..e9f46680 100644 --- a/app/Config/Fediverse.php +++ b/app/Config/Fediverse.php @@ -34,15 +34,15 @@ class Fediverse extends FediverseBaseConfig try { $appTheme = service('settings') ->get('App.theme'); - $defaultBanner = config('Images') - ->podcastBannerDefaultPaths[$appTheme] ?? config('Images')->podcastBannerDefaultPaths['default']; + $defaultBanner = config(Images::class) + ->podcastBannerDefaultPaths[$appTheme] ?? config(Images::class)->podcastBannerDefaultPaths['default']; } catch (Exception) { - $defaultBanner = config('Images') + $defaultBanner = config(Images::class) ->podcastBannerDefaultPaths['default']; } ['dirname' => $dirname, 'extension' => $extension, 'filename' => $filename] = pathinfo( - (string) $defaultBanner['path'] + $defaultBanner['path'] ); $defaultBannerPath = $filename; if ($dirname !== '.') { diff --git a/app/Config/Filters.php b/app/Config/Filters.php index 3f7a47a7..d4bcb168 100644 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -11,6 +11,8 @@ use CodeIgniter\Filters\DebugToolbar; use CodeIgniter\Filters\Honeypot; use CodeIgniter\Filters\InvalidChars; use CodeIgniter\Filters\SecureHeaders; +use Modules\Admin\Config\Admin; +use Modules\Analytics\Config\Analytics; use Modules\Auth\Filters\PermissionFilter; class Filters extends BaseConfig @@ -19,6 +21,7 @@ class Filters extends BaseConfig * Configures aliases for Filter classes to make reading things nicer and simpler. * * @var array + * @phpstan-var array */ public array $aliases = [ 'csrf' => CSRF::class, @@ -32,7 +35,8 @@ class Filters extends BaseConfig /** * List of filter aliases that are always applied before and after every request. * - * @var array + * @var array>>|array> + * @phpstan-var array>|array>> */ public array $globals = [ 'before' => [ @@ -76,7 +80,7 @@ class Filters extends BaseConfig $this->filters = [ 'session' => [ - 'before' => [config('Admin')->gateway . '*', config('Analytics')->gateway . '*'], + 'before' => [config(Admin::class)->gateway . '*', config(Analytics::class)->gateway . '*'], ], 'podcast-unlock' => [ 'before' => ['*@*/episodes/*'], diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 5eaff586..d28a0785 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -2,28 +2,10 @@ declare(strict_types=1); -namespace Config; - -// Create a new instance of our RouteCollection class. -$routes = Services::routes(); +use CodeIgniter\Router\RouteCollection; /** - * -------------------------------------------------------------------- - * Router Setup - * -------------------------------------------------------------------- - */ -$routes->setDefaultNamespace('App\Controllers'); -$routes->setDefaultController('Home'); -$routes->setDefaultMethod('index'); -$routes->setTranslateURIDashes(false); -$routes->set404Override(); - -// The Auto Routing (Legacy) is very dangerous. It is easy to create vulnerable apps -// where controller filters or CSRF protection are bypassed. -// If you don't want to define all routes, please use the Auto Routing (Improved). -// Set `$autoRoutesImproved` to true in `app/Config/Feature.php` and set the following to true. -$routes->setAutoRoute(false); - + * @var RouteCollection $routes /** * -------------------------------------------------------------------- * Placeholder definitions @@ -69,23 +51,14 @@ $routes->get('.well-known/platforms', 'Platform'); // Podcast's Public routes $routes->group('@(:podcastHandle)', static function ($routes): void { - $routes->get('/', 'PodcastController::activity/$1', [ - 'as' => 'podcast-activity', - ]); - $routes->get('manifest.webmanifest', 'WebmanifestController::podcastManifest/$1', [ - 'as' => 'podcast-webmanifest', - ]); - $routes->get('links', 'PodcastController::links/$1', [ - 'as' => 'podcast-links', - ]); // override default Fediverse Library's actor route $routes->options('/', 'ActivityPubController::preflight'); $routes->get('/', 'PodcastController::activity/$1', [ - 'as' => 'actor', + 'as' => 'podcast-activity', 'alternate-content' => [ 'application/activity+json' => [ 'namespace' => 'Modules\Fediverse\Controllers', - 'controller-method' => 'ActorController/$1', + 'controller-method' => 'ActorController::index/$1', ], 'application/podcast-activity+json' => [ 'namespace' => 'App\Controllers', @@ -93,11 +66,17 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { ], 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ 'namespace' => 'Modules\Fediverse\Controllers', - 'controller-method' => 'ActorController/$1', + 'controller-method' => 'ActorController::index/$1', ], ], 'filter' => 'allow-cors', ]); + $routes->get('manifest.webmanifest', 'WebmanifestController::podcastManifest/$1', [ + 'as' => 'podcast-webmanifest', + ]); + $routes->get('links', 'PodcastController::links/$1', [ + 'as' => 'podcast-links', + ]); $routes->get('about', 'PodcastController::about/$1', [ 'as' => 'podcast-about', ]); @@ -106,12 +85,15 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { 'as' => 'podcast-episodes', 'alternate-content' => [ 'application/activity+json' => [ + 'namespace' => 'App\Controllers', 'controller-method' => 'PodcastController::episodeCollection/$1', ], 'application/podcast-activity+json' => [ + 'namespace' => 'App\Controllers', 'controller-method' => 'PodcastController::episodeCollection/$1', ], 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ + 'namespace' => 'App\Controllers', 'controller-method' => 'PodcastController::episodeCollection/$1', ], ], @@ -119,16 +101,19 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { ]); $routes->group('episodes/(:slug)', static function ($routes): void { $routes->options('/', 'ActivityPubController::preflight'); - $routes->get('/', 'EpisodeController/$1/$2', [ + $routes->get('/', 'EpisodeController::index/$1/$2', [ 'as' => 'episode', 'alternate-content' => [ 'application/activity+json' => [ + 'namespace' => 'App\Controllers', 'controller-method' => 'EpisodeController::episodeObject/$1/$2', ], 'application/podcast-activity+json' => [ + 'namespace' => 'App\Controllers', 'controller-method' => 'EpisodeController::episodeObject/$1/$2', ], 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ + 'namespace' => 'App\Controllers', 'controller-method' => 'EpisodeController::episodeObject/$1/$2', ], ], @@ -186,21 +171,21 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { ],); }); }); - $routes->head('feed.xml', 'FeedController/$1', [ + $routes->head('feed.xml', 'FeedController::index/$1', [ 'as' => 'podcast-rss-feed', ]); - $routes->get('feed.xml', 'FeedController/$1', [ + $routes->get('feed.xml', 'FeedController::index/$1', [ 'as' => 'podcast-rss-feed', ]); - $routes->head('feed', 'FeedController/$1'); - $routes->get('feed', 'FeedController/$1'); + $routes->head('feed', 'FeedController::index/$1'); + $routes->get('feed', 'FeedController::index/$1'); }); // audio routes -$routes->head('audio/@(:podcastHandle)/(:slug).(:alphanum)', 'EpisodeAudioController/$1/$2', [ +$routes->head('/audio/@(:podcastHandle)/(:slug).(:alphanum)', 'EpisodeAudioController::index/$1/$2', [ 'as' => 'episode-audio', ], ); -$routes->get('audio/@(:podcastHandle)/(:slug).(:alphanum)', 'EpisodeAudioController/$1/$2', [ +$routes->get('/audio/@(:podcastHandle)/(:slug).(:alphanum)', 'EpisodeAudioController::index/$1/$2', [ 'as' => 'episode-audio', ], ); @@ -223,7 +208,7 @@ $routes->get('/map', 'MapController', [ $routes->get('/episodes-markers', 'MapController::getEpisodesMarkers', [ 'as' => 'episodes-markers', ]); -$routes->get('/pages/(:slug)', 'PageController/$1', [ +$routes->get('/pages/(:slug)', 'PageController::index/$1', [ 'as' => 'page', ]); @@ -253,7 +238,7 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { 'filter' => 'allow-cors', ]); $routes->options('replies', 'ActivityPubController::preflight'); - $routes->get('replies', 'PostController/$1/$2', [ + $routes->get('replies', 'PostController::index/$1/$2', [ 'as' => 'post-replies', 'alternate-content' => [ 'application/activity+json' => [ @@ -308,20 +293,3 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { 'filter' => 'fediverse:verify-activitystream', ]); }); - -/* - * -------------------------------------------------------------------- - * Additional Routing - * -------------------------------------------------------------------- - * - * There will often be times that you need additional routing and you - * need it to be able to override any defaults in this file. Environment - * based routes is one such time. require() additional route files here - * to make that happen. - * - * You will have access to the $routes object within that file without - * needing to reload it. - */ -if (is_file(APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php')) { - require APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php'; -} diff --git a/app/Config/Routing.php b/app/Config/Routing.php new file mode 100644 index 00000000..c0ddd14d --- /dev/null +++ b/app/Config/Routing.php @@ -0,0 +1,117 @@ +set404Override(function() { + * // Do something here + * }); + * + * Example: + * public $override404 = 'App\Errors::show404'; + */ + public ?string $override404 = null; + + /** + * If TRUE, the system will attempt to match the URI against + * Controllers by matching each segment against folders/files + * in APPPATH/Controllers, when a match wasn't found against + * defined routes. + * + * If FALSE, will stop searching and do NO automatic routing. + */ + public bool $autoRoute = false; + + /** + * If TRUE, will enable the use of the 'prioritize' option + * when defining routes. + * + * Default: false + */ + public bool $prioritize = false; + + /** + * Map of URI segments and namespaces. For Auto Routing (Improved). + * + * The key is the first URI segment. The value is the controller namespace. + * E.g., + * [ + * 'blog' => 'Acme\Blog\Controllers', + * ] + * + * @var array [ uri_segment => namespace ] + */ + public array $moduleRoutes = []; +} diff --git a/app/Config/Services.php b/app/Config/Services.php index 70b00cfd..48a3554d 100644 --- a/app/Config/Services.php +++ b/app/Config/Services.php @@ -6,7 +6,6 @@ namespace Config; use App\Libraries\Breadcrumb; use App\Libraries\Negotiate; -use App\Libraries\RouteCollection; use App\Libraries\Router; use CodeIgniter\Config\BaseService; use CodeIgniter\HTTP\Request; @@ -44,21 +43,6 @@ class Services extends BaseService return new Router($routes, $request); } - /** - * The Routes service is a class that allows for easily building - * a collection of routes. - * - * @return RouteCollection - */ - public static function routes(bool $getShared = true) - { - if ($getShared) { - return static::getSharedInstance('routes'); - } - - return new RouteCollection(self::locator(), config('Modules')); - } - /** * The Negotiate class provides the content negotiation features for working the request to determine correct * language, encoding, charset, and more. diff --git a/app/Config/Toolbar.php b/app/Config/Toolbar.php index e1806d6c..1f342434 100644 --- a/app/Config/Toolbar.php +++ b/app/Config/Toolbar.php @@ -90,4 +90,31 @@ class Toolbar extends BaseConfig * `$maxQueries` defines the maximum amount of queries that will be stored. */ public int $maxQueries = 100; + + /** + * -------------------------------------------------------------------------- + * Watched Directories + * -------------------------------------------------------------------------- + * + * Contains an array of directories that will be watched for changes and + * used to determine if the hot-reload feature should reload the page or not. + * We restrict the values to keep performance as high as possible. + * + * NOTE: The ROOTPATH will be prepended to all values. + * + * @var string[] + */ + public array $watchedDirectories = ['app', 'modules', 'themes']; + + /** + * -------------------------------------------------------------------------- + * Watched File Extensions + * -------------------------------------------------------------------------- + * + * Contains an array of file extensions that will be watched for changes and + * used to determine if the hot-reload feature should reload the page or not. + * + * @var string[] + */ + public array $watchedExtensions = ['php', 'css', 'js', 'html', 'svg', 'json', 'env']; } diff --git a/app/Controllers/ColorsController.php b/app/Controllers/ColorsController.php index 82d6eed9..4aa1a47c 100644 --- a/app/Controllers/ColorsController.php +++ b/app/Controllers/ColorsController.php @@ -12,6 +12,7 @@ namespace App\Controllers; use CodeIgniter\Controller; use CodeIgniter\HTTP\Response; +use Config\Colors; class ColorsController extends Controller { @@ -28,7 +29,7 @@ class ColorsController extends Controller if ( ! ($colorsCssBody = cache($cacheName)) ) { - $colorThemes = config('Colors') + $colorThemes = config(Colors::class) ->themes; $colorsCssBody = ''; diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php index a069bb83..fadb311f 100644 --- a/app/Controllers/EpisodeAudioController.php +++ b/app/Controllers/EpisodeAudioController.php @@ -64,7 +64,7 @@ class EpisodeAudioController extends Controller set_user_session_location(); set_user_session_player(); - $this->analyticsConfig = config('Analytics'); + $this->analyticsConfig = config(Analytics::class); } public function _remap(string $method, string ...$params): mixed diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index 46a4f860..7ca30bb1 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -21,6 +21,8 @@ use CodeIgniter\Database\BaseBuilder; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\Response; use CodeIgniter\HTTP\ResponseInterface; +use Config\Embed; +use Config\Images; use Config\Services; use Modules\Analytics\AnalyticsTrait; use Modules\Fediverse\Objects\OrderedCollectionObject; @@ -104,8 +106,8 @@ class EpisodeController extends BaseController // The page cache is set to a decade so it is deleted manually upon podcast update return view('episode/comments', $data, [ 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, + ? $secondsToNextUnpublishedEpisode + : DECADE, 'cache_name' => $cacheName, ]); } @@ -231,15 +233,15 @@ class EpisodeController extends BaseController 'author_url' => $this->podcast->link, 'html' => '', - 'width' => config('Embed') + '" width="100%" height="' . config(Embed::class)->height . '" frameborder="0" scrolling="no">', + 'width' => config(Embed::class) ->width, - 'height' => config('Embed') + 'height' => config(Embed::class) ->height, 'thumbnail_url' => $this->episode->cover->og_url, - 'thumbnail_width' => config('Images') + 'thumbnail_width' => config(Images::class) ->podcastCoverSizes['og']['width'], - 'thumbnail_height' => config('Images') + 'thumbnail_height' => config(Images::class) ->podcastCoverSizes['og']['height'], ]); } @@ -256,18 +258,20 @@ class EpisodeController extends BaseController $oembed->addChild('author_name', $this->podcast->title); $oembed->addChild('author_url', $this->podcast->link); $oembed->addChild('thumbnail', $this->episode->cover->og_url); - $oembed->addChild('thumbnail_width', (string) config('Images')->podcastCoverSizes['og']['width']); - $oembed->addChild('thumbnail_height', (string) config('Images')->podcastCoverSizes['og']['height']); + $oembed->addChild('thumbnail_width', (string) config(Images::class)->podcastCoverSizes['og']['width']); + $oembed->addChild('thumbnail_height', (string) config(Images::class)->podcastCoverSizes['og']['height']); $oembed->addChild( 'html', htmlspecialchars( '', + '" width="100%" height="' . config( + Embed::class + )->height . '" frameborder="0" scrolling="no">', ), ); - $oembed->addChild('width', (string) config('Embed')->width); - $oembed->addChild('height', (string) config('Embed')->height); + $oembed->addChild('width', (string) config(Embed::class)->width); + $oembed->addChild('height', (string) config(Embed::class)->height); // @phpstan-ignore-next-line return $this->response->setXML($oembed); diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php index 515c0d0b..5acdfd16 100644 --- a/app/Controllers/HomeController.php +++ b/app/Controllers/HomeController.php @@ -14,6 +14,7 @@ use App\Models\PodcastModel; use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\ResponseInterface; +use Config\Cache; use Modules\Media\FileManagers\FileManagerInterface; class HomeController extends BaseController @@ -53,7 +54,7 @@ class HomeController extends BaseController } // --- Can Castopod connect to the cache handler - if (config('Cache')->handler !== 'dummy' && cache()->getCacheInfo() === null) { + if (config(Cache::class)->handler !== 'dummy' && cache()->getCacheInfo() === null) { $errors[] = 'Unable connect to the cache handler.'; } diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index c51e1e6d..4adde20e 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -23,6 +23,7 @@ use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; use CodeIgniter\I18n\Time; use Exception; +use Config\Images; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\Autolink\AutolinkExtension; use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; @@ -199,7 +200,7 @@ class Episode extends Entity } else { $cover = new Image([ 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(), - 'sizes' => config('Images') + 'sizes' => config(Images::class) ->podcastCoverSizes, 'uploaded_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'], diff --git a/app/Entities/Person.php b/app/Entities/Person.php index 961f5603..9af5f92c 100644 --- a/app/Entities/Person.php +++ b/app/Entities/Person.php @@ -14,6 +14,7 @@ use App\Models\PersonModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; +use Config\Images; use Modules\Media\Entities\Image; use Modules\Media\Models\MediaModel; use RuntimeException; @@ -71,7 +72,7 @@ class Person extends Entity } else { $avatar = new Image([ 'file_key' => 'persons/' . $this->attributes['unique_name'] . '.' . $file->getExtension(), - 'sizes' => config('Images') + 'sizes' => config(Images::class) ->personAvatarSizes, 'uploaded_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'], diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index d57a1463..23fd04e7 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -21,6 +21,7 @@ use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; use CodeIgniter\I18n\Time; use CodeIgniter\Shield\Entities\User; +use Config\Images; use Exception; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\Autolink\AutolinkExtension; @@ -247,7 +248,7 @@ class Podcast extends Entity } else { $cover = new Image([ 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(), - 'sizes' => config('Images') + 'sizes' => config(Images::class) ->podcastCoverSizes, 'uploaded_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'], @@ -290,7 +291,7 @@ class Podcast extends Entity } else { $banner = new Image([ 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(), - 'sizes' => config('Images') + 'sizes' => config(Images::class) ->podcastBannerSizes, 'uploaded_by' => $this->attributes['updated_by'], 'updated_by' => $this->attributes['updated_by'], diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php index 635a07cb..1b6046e2 100644 --- a/app/Helpers/misc_helper.php +++ b/app/Helpers/misc_helper.php @@ -4,6 +4,8 @@ declare(strict_types=1); use App\Entities\Person; use App\Entities\Podcast; +use Config\App; +use Config\Images; use Modules\Media\Entities\Image; /** @@ -23,7 +25,7 @@ if (! function_exists('get_browser_language')) { function get_browser_language(?string $httpAcceptLanguage = null): string { if ($httpAcceptLanguage === null) { - return config('App')->defaultLocale; + return config(App::class)->defaultLocale; } $langs = explode(',', $httpAcceptLanguage); @@ -290,7 +292,7 @@ if (! function_exists('format_bytes')) { if (! function_exists('get_site_icon_url')) { function get_site_icon_url(string $size): string { - if (config('App')->siteIcon['ico'] === service('settings')->get('App.siteIcon')['ico']) { + if (config(App::class)->siteIcon['ico'] === service('settings')->get('App.siteIcon')['ico']) { // return default site icon url return base_url(service('settings')->get('App.siteIcon')[$size]); } @@ -304,12 +306,12 @@ if (! function_exists('get_podcast_banner')) { function get_podcast_banner_url(Podcast $podcast, string $size): string { if (! $podcast->banner instanceof Image) { - $defaultBanner = config('Images') + $defaultBanner = config(Images::class) ->podcastBannerDefaultPaths[service('settings')->get('App.theme')] ?? config( - 'Images' + Images::class )->podcastBannerDefaultPaths['default']; - $sizes = config('Images') + $sizes = config(Images::class) ->podcastBannerSizes; $sizeConfig = $sizes[$size]; @@ -330,7 +332,7 @@ if (! function_exists('get_podcast_banner_mimetype')) { function get_podcast_banner_mimetype(Podcast $podcast, string $size): string { if (! $podcast->banner instanceof Image) { - $sizes = config('Images') + $sizes = config(Images::class) ->podcastBannerSizes; $sizeConfig = $sizes[$size]; @@ -338,7 +340,7 @@ if (! function_exists('get_podcast_banner_mimetype')) { // return default site icon url return array_key_exists('mimetype', $sizeConfig) ? $sizeConfig['mimetype'] : config( - 'Images' + Images::class )->podcastBannerDefaultMimeType; } @@ -351,10 +353,10 @@ if (! function_exists('get_avatar_url')) { function get_avatar_url(Person $person, string $size): string { if (! $person->avatar instanceof Image) { - $defaultAvatarPath = config('Images') + $defaultAvatarPath = config(Images::class) ->avatarDefaultPath; - $sizes = config('Images') + $sizes = config(Images::class) ->personAvatarSizes; $sizeConfig = $sizes[$size]; diff --git a/app/Helpers/page_helper.php b/app/Helpers/page_helper.php index 253b0135..49d15a79 100644 --- a/app/Helpers/page_helper.php +++ b/app/Helpers/page_helper.php @@ -9,6 +9,7 @@ declare(strict_types=1); */ use App\Models\PageModel; +use Config\App; if (! function_exists('render_page_links')) { /** @@ -41,8 +42,8 @@ if (! function_exists('render_page_links')) { } // if set in .env, add legal notice link at the end of page links - if (config('App')->legalNoticeURL !== null) { - $links .= anchor(config('App')->legalNoticeURL, lang('Common.legal_notice'), [ + if (config(App::class)->legalNoticeURL !== null) { + $links .= anchor(config(App::class)->legalNoticeURL, lang('Common.legal_notice'), [ 'class' => 'px-2 py-1 underline hover:no-underline focus:ring-accent', 'target' => '_blank', 'rel' => 'noopener noreferrer', diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index a20f71a6..4b0d187c 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -17,6 +17,7 @@ use Config\Mimes; use Modules\Media\Entities\Chapters; use Modules\Media\Entities\Transcript; use Modules\PremiumPodcasts\Entities\Subscription; +use Modules\WebSub\Config\WebSub; if (! function_exists('get_rss_feed')) { /** @@ -51,7 +52,7 @@ if (! function_exists('get_rss_feed')) { $atomLink->addAttribute('type', 'application/rss+xml'); // websub: add links to hubs defined in config - $websubHubs = config('WebSub') + $websubHubs = config(WebSub::class) ->hubs; foreach ($websubHubs as $websubHub) { $atomLinkHub = $channel->addChild('link', null, $atomNamespace); diff --git a/app/Helpers/seo_helper.php b/app/Helpers/seo_helper.php index 0fc27244..c5755998 100644 --- a/app/Helpers/seo_helper.php +++ b/app/Helpers/seo_helper.php @@ -9,6 +9,8 @@ use App\Entities\EpisodeComment; use App\Entities\Page; use App\Entities\Podcast; use App\Entities\Post; +use Config\Embed; +use Config\Images; use Melbahja\Seo\MetaTags; use Melbahja\Seo\Schema; use Melbahja\Seo\Schema\Thing; @@ -56,8 +58,8 @@ if (! function_exists('get_podcast_metatags')) { ->description(esc($podcast->description)) ->image((string) $podcast->cover->og_url) ->canonical((string) current_url()) - ->og('image:width', (string) config('Images')->podcastCoverSizes['og']['width']) - ->og('image:height', (string) config('Images')->podcastCoverSizes['og']['height']) + ->og('image:width', (string) config(Images::class)->podcastCoverSizes['og']['width']) + ->og('image:height', (string) config(Images::class)->podcastCoverSizes['og']['height']) ->og('locale', $podcast->language_code) ->og('site_name', esc(service('settings')->get('App.siteName'))) ->push('link', [ @@ -106,8 +108,8 @@ if (! function_exists('get_episode_metatags')) { ->image((string) $episode->cover->og_url, 'player') ->canonical($episode->link) ->og('site_name', esc(service('settings')->get('App.siteName'))) - ->og('image:width', (string) config('Images')->podcastCoverSizes['og']['width']) - ->og('image:height', (string) config('Images')->podcastCoverSizes['og']['height']) + ->og('image:width', (string) config(Images::class)->podcastCoverSizes['og']['width']) + ->og('image:height', (string) config(Images::class)->podcastCoverSizes['og']['height']) ->og('locale', $episode->podcast->language_code) ->og('audio', $episode->audio_opengraph_url) ->og('audio:type', $episode->audio->file_mimetype) @@ -116,8 +118,8 @@ if (! function_exists('get_episode_metatags')) { ->twitter('audio:partner', $episode->podcast->publisher ?? '') ->twitter('audio:artist_name', esc($episode->podcast->owner_name)) ->twitter('player', $episode->getEmbedUrl('light')) - ->twitter('player:width', (string) config('Embed')->width) - ->twitter('player:height', (string) config('Embed')->height) + ->twitter('player:width', (string) config(Embed::class)->width) + ->twitter('player:height', (string) config(Embed::class)->height) ->push('link', [ 'rel' => 'alternate', 'type' => 'application/activity+json', diff --git a/app/Libraries/RouteCollection.php b/app/Libraries/RouteCollection.php deleted file mode 100644 index 75ea4757..00000000 --- a/app/Libraries/RouteCollection.php +++ /dev/null @@ -1,280 +0,0 @@ -|Closure|string $to - * @param array $options - */ - protected function create(string $verb, string $from, $to, ?array $options = null): void - { - $overwrite = false; - $prefix = $this->group === null ? '' : $this->group . '/'; - - $from = esc(strip_tags($prefix . $from)); - - // While we want to add a route within a group of '/', - // it doesn't work with matching, so remove them... - if ($from !== '/') { - $from = trim($from, '/'); - } - - // When redirecting to named route, $to is an array like `['zombies' => '\Zombies::index']`. - if (is_array($to) && count($to) === 2) { - $to = $this->processArrayCallableSyntax($from, $to); - } - - $options = array_merge($this->currentOptions ?? [], $options ?? []); - - // Route priority detect - if (isset($options['priority'])) { - $options['priority'] = abs((int) $options['priority']); - - if ($options['priority'] > 0) { - $this->prioritizeDetected = true; - } - } - - // Hostname limiting? - if (! empty($options['hostname'])) { - // @todo determine if there's a way to whitelist hosts? - if (! $this->checkHostname($options['hostname'])) { - return; - } - - $overwrite = true; - } - // Limiting to subdomains? - elseif (! empty($options['subdomain'])) { - // If we don't match the current subdomain, then - // we don't need to add the route. - if (! $this->checkSubdomains($options['subdomain'])) { - return; - } - - $overwrite = true; - } - - // Are we offsetting the binds? - // If so, take care of them here in one - // fell swoop. - if (isset($options['offset']) && is_string($to)) { - // Get a constant string to work with. - $to = preg_replace('/(\$\d+)/', '$X', $to); - - for ($i = (int) $options['offset'] + 1; $i < (int) $options['offset'] + 7; ++$i) { - $to = preg_replace_callback('/\$X/', static fn ($m): string => '$' . $i, $to, 1); - } - } - - // Replace our regex pattern placeholders with the actual thing - // so that the Router doesn't need to know about any of this. - foreach ($this->placeholders as $tag => $pattern) { - $from = str_ireplace(':' . $tag, $pattern, $from); - } - - // If is redirect, No processing - if (! isset($options['redirect']) && is_string($to)) { - // If no namespace found, add the default namespace - if (strpos($to, '\\') === false || strpos($to, '\\') > 0) { - $namespace = $options['namespace'] ?? $this->defaultNamespace; - $to = trim((string) $namespace, '\\') . '\\' . $to; - } - // Always ensure that we escape our namespace so we're not pointing to - // \CodeIgniter\Routes\Controller::method. - $to = '\\' . ltrim($to, '\\'); - } - - $name = $options['as'] ?? $from; - - helper('array'); - - // Don't overwrite any existing 'froms' so that auto-discovered routes - // do not overwrite any app/Config/Routes settings. The app - // routes should always be the "source of truth". - // this works only because discovered routes are added just prior - // to attempting to route the request. - - // TODO: see how to overwrite routes differently - // restored change that broke Castopod routing with fediverse - // in CI4 v4.2.8 https://github.com/codeigniter4/CodeIgniter4/pull/6644 - if (isset($this->routes[$verb][$name]) && ! $overwrite) { - return; - } - - $this->routes[$verb][$name] = [ - 'route' => [ - $from => $to, - ], - ]; - - $this->routesOptions[$verb][$from] = $options; - - // Is this a redirect? - if (isset($options['redirect']) && is_numeric($options['redirect'])) { - $this->routes['*'][$name]['redirect'] = $options['redirect']; - } - } - - /** - * Compares the hostname passed in against the current hostname - * on this page request. - * - * @param string $hostname Hostname in route options - */ - private function checkHostname($hostname): bool - { - // CLI calls can't be on hostname. - if ($this->httpHost === null) { - return false; - } - - return strtolower($this->httpHost) === strtolower($hostname); - } - - /** - * @param array $to - * - * @return string|array - */ - private function processArrayCallableSyntax(string $from, array $to): string | array - { - // [classname, method] - // eg, [Home::class, 'index'] - if (is_callable($to, true, $callableName)) { - // If the route has placeholders, add params automatically. - $params = $this->getMethodParams($from); - - return '\\' . $callableName . $params; - } - - // [[classname, method], params] - // eg, [[Home::class, 'index'], '$1/$2'] - if ( - isset($to[0], $to[1]) - && is_callable($to[0], true, $callableName) - && is_string($to[1]) - ) { - return '\\' . $callableName . '/' . $to[1]; - } - - return $to; - } - - /** - * Compares the subdomain(s) passed in against the current subdomain - * on this page request. - * - * @param string|string[] $subdomains - */ - private function checkSubdomains($subdomains): bool - { - // CLI calls can't be on subdomain. - if ($this->httpHost === null) { - return false; - } - - if ($this->currentSubdomain === null) { - $this->currentSubdomain = $this->determineCurrentSubdomain(); - } - - if (! is_array($subdomains)) { - $subdomains = [$subdomains]; - } - - // Routes can be limited to any sub-domain. In that case, though, - // it does require a sub-domain to be present. - if (! empty($this->currentSubdomain) && in_array('*', $subdomains, true)) { - return true; - } - - return in_array($this->currentSubdomain, $subdomains, true); - } - - /** - * Returns the method param string like `/$1/$2` for placeholders - */ - private function getMethodParams(string $from): string - { - preg_match_all('/\(.+?\)/', $from, $matches); - $count = is_countable($matches[0]) ? count($matches[0]) : 0; - - $params = ''; - - for ($i = 1; $i <= $count; ++$i) { - $params .= '/$' . $i; - } - - return $params; - } - - /** - * Examines the HTTP_HOST to get the best match for the subdomain. It - * won't be perfect, but should work for our needs. - * - * It's especially not perfect since it's possible to register a domain - * with a period (.) as part of the domain name. - * - * @return false|string the subdomain - */ - private function determineCurrentSubdomain() - { - // We have to ensure that a scheme exists - // on the URL else parse_url will mis-interpret - // 'host' as the 'path'. - $url = $this->httpHost; - if (strpos($url, 'http') !== 0) { - $url = 'http://' . $url; - } - - $parsedUrl = parse_url($url); - - $host = explode('.', $parsedUrl['host']); - - if ($host[0] === 'www') { - unset($host[0]); - } - - // Get rid of any domains, which will be the last - unset($host[count($host) - 1]); - - // Account for .co.uk, .co.nz, etc. domains - if (end($host) === 'co') { - $host = array_slice($host, 0, -1); - } - - // If we only have 1 part left, then we don't have a sub-domain. - if (count($host) === 1) { - // Set it to false so we don't make it back here again. - return false; - } - - return array_shift($host); - } -} diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php index 6bb71997..0dacb8bd 100644 --- a/app/Libraries/Router.php +++ b/app/Libraries/Router.php @@ -14,7 +14,9 @@ declare(strict_types=1); namespace App\Libraries; +use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\Router\Exceptions\RedirectException; +use CodeIgniter\Router\Exceptions\RouterException; use CodeIgniter\Router\Router as CodeIgniterRouter; use Config\Services; @@ -40,26 +42,14 @@ class Router extends CodeIgniterRouter $uri = $uri === '/' ? $uri : trim($uri, '/ '); // Loop through the route array looking for wildcards - foreach ($routes as $routeKey => $val) { - // Reset localeSegment - $localeSegment = null; - + foreach ($routes as $routeKey => $handler) { $routeKey = $routeKey === '/' ? $routeKey : ltrim($routeKey, '/ '); $matchedKey = $routeKey; // Are we dealing with a locale? - if (str_contains($routeKey, '{locale}')) { - $localeSegment = array_search( - '{locale}', - preg_split('~[\/]*((^[a-zA-Z0-9])|\(([^()]*)\))*[\/]+~m', $routeKey), - true, - ); - - // Replace it with a regex so it - // will actually match. - $routeKey = str_replace('/', '\/', $routeKey); - $routeKey = str_replace('{locale}', '[^\/]+', $routeKey); + if (strpos($routeKey, '{locale}') !== false) { + $routeKey = str_replace('{locale}', '[^/]+', $routeKey); } // Does the RegEx match? @@ -68,32 +58,51 @@ class Router extends CodeIgniterRouter // Is this route supposed to redirect to another? if ($this->collection->isRedirect($routeKey)) { + // replacing matched route groups with references: post/([0-9]+) -> post/$1 + $redirectTo = preg_replace_callback('/(\([^\(]+\))/', static function (): string { + static $i = 1; + + return '$' . $i++; + }, (string) (is_array($handler) ? key($handler) : $handler)); + throw new RedirectException( - is_array($val) ? key($val) : $val, - $this->collection->getRedirectCode($routeKey), + preg_replace('#^' . $routeKey . '$#u', $redirectTo, $uri), + $this->collection->getRedirectCode($routeKey) ); } // Store our locale so CodeIgniter object can // assign it to the Request. - if (isset($localeSegment)) { - // The following may be inefficient, but doesn't upset NetBeans :-/ - $temp = explode('/', $uri); - $this->detectedLocale = $temp[$localeSegment]; + if (strpos($matchedKey, '{locale}') !== false) { + preg_match( + '#^' . str_replace('{locale}', '(?[^/]+)', $matchedKey) . '$#u', + $uri, + $matched + ); + + if ($this->collection->shouldUseSupportedLocalesOnly() + && ! in_array($matched['locale'], config(App::class)->supportedLocales, true)) { + // Throw exception to prevent the autorouter, if enabled, + // from trying to find a route + throw PageNotFoundException::forLocaleNotSupported($matched['locale']); + } + + $this->detectedLocale = $matched['locale']; + unset($matched); } // Are we using Closures? If so, then we need // to collect the params into an array // so it can be passed to the controller method later. - if (! is_string($val) && is_callable($val)) { - $this->controller = $val; + if (! is_string($handler) && is_callable($handler)) { + $this->controller = $handler; // Remove the original string from the matches array array_shift($matches); $this->params = $matches; - $this->matchedRoute = [$matchedKey, $val]; + $this->setMatchedRoute($matchedKey, $handler); return true; } @@ -123,62 +132,74 @@ class Router extends CodeIgniterRouter $expectedContentType = $parsedHeader[0]; foreach ($supported as $available) { if ( - $negotiate->callMatch($expectedContentType, $available, true) + ! $negotiate->callMatch($expectedContentType, $available, true) ) { - if ( - array_key_exists( - 'namespace', - $this->matchedRouteOptions[ - 'alternate-content' - ][$available], - ) - ) { - $this->collection->setDefaultNamespace( - $this->matchedRouteOptions[ - 'alternate-content' - ][$available]['namespace'], - ); - } - - $val = - $this->collection->getDefaultNamespace() . - $this->directory . - $this->matchedRouteOptions['alternate-content'][ - $available - ]['controller-method']; - - // no need to continue loop as $val has been overwritten - break; + continue; } + + if ( + array_key_exists( + 'namespace', + $this->matchedRouteOptions[ + 'alternate-content' + ][$available], + ) + ) { + $this->collection->setDefaultNamespace( + $this->matchedRouteOptions[ + 'alternate-content' + ][$available]['namespace'], + ); + } + + $handler = + $this->collection->getDefaultNamespace() . + $this->directory . + $this->matchedRouteOptions['alternate-content'][ + $available + ]['controller-method']; + + // no need to continue loop as $handle has been overwritten + break; } } - // Are we using the default method for back-references? + // Are we using Closures? If so, then we need + // to collect the params into an array + // so it can be passed to the controller method later. + if (! is_string($handler) && is_callable($handler)) { + $this->controller = $handler; - // Support resource route when function with subdirectory - // ex: $routes->resource('Admin/Admins'); - if ( - str_contains((string) $val, '$') && - str_contains($routeKey, '(') && - str_contains($routeKey, '/') - ) { - $replacekey = str_replace('/(.*)', '', $routeKey); - $val = preg_replace('#^' . $routeKey . '$#u', (string) $val, $uri); - $val = str_replace($replacekey, str_replace('/', '\\', $replacekey), $val); - } elseif (str_contains((string) $val, '$') && str_contains($routeKey, '(')) { - $val = preg_replace('#^' . $routeKey . '$#u', (string) $val, $uri); - } elseif (str_contains((string) $val, '/')) { - [$controller, $method] = explode('::', (string) $val); + // Remove the original string from the matches array + array_shift($matches); - // Only replace slashes in the controller, not in the method. - $controller = str_replace('/', '\\', $controller); + $this->params = $matches; - $val = $controller . '::' . $method; + $this->setMatchedRoute($matchedKey, $handler); + + return true; } - $this->setRequest(explode('/', (string) $val)); + [$controller] = explode('::', (string) $handler); - $this->matchedRoute = [$matchedKey, $val]; + // Checks `/` in controller name + if (strpos($controller, '/') !== false) { + throw RouterException::forInvalidControllerName($handler); + } + + if (strpos((string) $handler, '$') !== false && strpos($routeKey, '(') !== false) { + // Checks dynamic controller + if (strpos($controller, '$') !== false) { + throw RouterException::forDynamicController($handler); + } + + // Using back-references + $handler = preg_replace('#^' . $routeKey . '$#u', (string) $handler, $uri); + } + + $this->setRequest(explode('/', (string) $handler)); + + $this->setMatchedRoute($matchedKey, $handler); return true; } diff --git a/app/Libraries/ViewComponents/ComponentRenderer.php b/app/Libraries/ViewComponents/ComponentRenderer.php index f9e916c0..79e1987b 100644 --- a/app/Libraries/ViewComponents/ComponentRenderer.php +++ b/app/Libraries/ViewComponents/ComponentRenderer.php @@ -16,7 +16,7 @@ class ComponentRenderer public function __construct() { - $this->config = config('ViewComponents'); + $this->config = config(ViewComponents::class); } public function render(string $output): string diff --git a/app/Libraries/ViewThemes/Theme.php b/app/Libraries/ViewThemes/Theme.php index 30020dcb..f3d94796 100644 --- a/app/Libraries/ViewThemes/Theme.php +++ b/app/Libraries/ViewThemes/Theme.php @@ -32,7 +32,7 @@ class Theme public function __construct() { - $this->config = config('Themes'); + $this->config = config(Themes::class); } /** @@ -85,7 +85,7 @@ class Theme { $themes = []; - $config = config('Themes'); + $config = config(Themes::class); foreach ($config->themes as $name => $folder) { $themes[] = [ diff --git a/app/Libraries/Vite/Vite.php b/app/Libraries/Vite/Vite.php index 64b4202d..b0dea4ec 100644 --- a/app/Libraries/Vite/Vite.php +++ b/app/Libraries/Vite/Vite.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Vite; use ErrorException; +use Vite\Config\Vite as ViteConfig; class Vite { @@ -20,7 +21,7 @@ class Vite public function asset(string $path, string $type): string { - if (config('Vite')->environment !== 'production') { + if (config(ViteConfig::class)->environment !== 'production') { return $this->loadDev($path, $type); } @@ -29,7 +30,10 @@ class Vite private function loadDev(string $path, string $type): string { - return $this->getHtmlTag(config('Vite')->baseUrl . config('Vite')->assetsRoot . "/{$path}", $type); + return $this->getHtmlTag( + config(ViteConfig::class)->baseUrl . config(ViteConfig::class)->assetsRoot . "/{$path}", + $type + ); } private function loadProd(string $path, string $type): string @@ -37,8 +41,8 @@ class Vite if ($this->manifestData === null) { $cacheName = 'vite-manifest'; if (! ($cachedManifest = cache($cacheName))) { - $manifestPath = config('Vite') - ->assetsRoot . '/' . config('Vite') + $manifestPath = config(ViteConfig::class) + ->assetsRoot . '/' . config(ViteConfig::class) ->manifestFile; try { if (($manifestContents = file_get_contents($manifestPath)) !== false) { @@ -62,7 +66,7 @@ class Vite // import css dependencies if any if (array_key_exists('css', $manifestElement)) { foreach ($manifestElement['css'] as $cssFile) { - $html .= $this->getHtmlTag('/' . config('Vite')->assetsRoot . '/' . $cssFile, 'css'); + $html .= $this->getHtmlTag('/' . config(ViteConfig::class)->assetsRoot . '/' . $cssFile, 'css'); } } @@ -73,19 +77,27 @@ class Vite // import css dependencies if any if (array_key_exists('css', $this->manifestData[$importPath])) { foreach ($this->manifestData[$importPath]['css'] as $cssFile) { - $html .= $this->getHtmlTag('/' . config('Vite')->assetsRoot . '/' . $cssFile, 'css'); + $html .= $this->getHtmlTag( + '/' . config(ViteConfig::class)->assetsRoot . '/' . $cssFile, + 'css' + ); } } $html .= $this->getHtmlTag( - '/' . config('Vite')->assetsRoot . '/' . $this->manifestData[$importPath]['file'], + '/' . config( + ViteConfig::class + )->assetsRoot . '/' . $this->manifestData[$importPath]['file'], 'js' ); } } } - $html .= $this->getHtmlTag('/' . config('Vite')->assetsRoot . '/' . $manifestElement['file'], $type); + $html .= $this->getHtmlTag( + '/' . config(ViteConfig::class)->assetsRoot . '/' . $manifestElement['file'], + $type + ); } return $html; diff --git a/app/Models/PlatformModel.php b/app/Models/PlatformModel.php index 14219f80..7665a6f5 100644 --- a/app/Models/PlatformModel.php +++ b/app/Models/PlatformModel.php @@ -14,6 +14,7 @@ namespace App\Models; use App\Entities\Platform; use CodeIgniter\Model; +use Config\App; class PlatformModel extends Model { @@ -53,7 +54,7 @@ class PlatformModel extends Model public function getPlatforms(): array { if (! ($found = cache('platforms'))) { - $baseUrl = rtrim((string) config('app')->baseURL, '/'); + $baseUrl = rtrim(config(App::class)->baseURL, '/'); $found = $this->select( "*, CONCAT('{$baseUrl}/assets/images/platforms/',`type`,'/',`slug`,'.svg') as icon", )->findAll(); diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index f64d7915..63863b7d 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -14,6 +14,7 @@ use App\Entities\Actor; use App\Entities\Podcast; use CodeIgniter\HTTP\URI; use CodeIgniter\Model; +use Config\Fediverse; use phpseclib\Crypt\RSA; class PodcastModel extends Model @@ -363,7 +364,7 @@ class PodcastModel extends Model // delete all cache for podcast actor cache() - ->deleteMatching(config('Fediverse') ->cachePrefix . "actor#{$podcast->actor_id}*"); + ->deleteMatching(config(Fediverse::class) ->cachePrefix . "actor#{$podcast->actor_id}*"); // delete model requests cache, includes feed / query / episode lists, etc. cache() diff --git a/composer.json b/composer.json index f0a7a3ff..644be9a3 100644 --- a/composer.json +++ b/composer.json @@ -7,7 +7,7 @@ "license": "AGPL-3.0-or-later", "require": { "php": "^8.1", - "codeigniter4/framework": "v4.3.8", + "codeigniter4/framework": "v4.4.0", "james-heinrich/getid3": "^2.0.0-beta5", "whichbrowser/parser": "^v2.1.7", "geoip2/geoip2": "v2.13.0", diff --git a/composer.lock b/composer.lock index 87e62f86..970c6488 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bf2ad79ae7e152da4c25f9dfa59e887f", + "content-hash": "4526c68d78e5abe8e5c86016356e15f9", "packages": [ { "name": "adaures/ipcat-php", @@ -304,16 +304,16 @@ }, { "name": "codeigniter4/framework", - "version": "v4.3.8", + "version": "v4.4.0", "source": { "type": "git", "url": "https://github.com/codeigniter4/framework.git", - "reference": "10c23e96db99171bc7632184d0e986e6eecc242d" + "reference": "30008a0e3c342f2b6e5083927bec49feec95ed53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/10c23e96db99171bc7632184d0e986e6eecc242d", - "reference": "10c23e96db99171bc7632184d0e986e6eecc242d", + "url": "https://api.github.com/repos/codeigniter4/framework/zipball/30008a0e3c342f2b6e5083927bec49feec95ed53", + "reference": "30008a0e3c342f2b6e5083927bec49feec95ed53", "shasum": "" }, "require": { @@ -370,7 +370,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/codeigniter4/CodeIgniter4" }, - "time": "2023-08-25T01:47:10+00:00" + "time": "2023-08-25T07:02:01+00:00" }, { "name": "codeigniter4/settings", @@ -5427,16 +5427,16 @@ }, { "name": "symfony/console", - "version": "v6.3.2", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898" + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/aa5d64ad3f63f2e48964fc81ee45cb318a723898", - "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "shasum": "" }, "require": { @@ -5488,7 +5488,7 @@ "homepage": "https://symfony.com", "keywords": ["cli", "command-line", "console", "terminal"], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.2" + "source": "https://github.com/symfony/console/tree/v6.3.4" }, "funding": [ { @@ -5504,7 +5504,7 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:17:28+00:00" + "time": "2023-08-16T10:10:12+00:00" }, { "name": "symfony/event-dispatcher", @@ -6059,16 +6059,16 @@ }, { "name": "symfony/process", - "version": "v6.3.2", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", - "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { @@ -6096,7 +6096,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.2" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -6112,7 +6112,7 @@ "type": "tidelift" } ], - "time": "2023-07-12T16:00:22+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/service-contracts", diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php index 106fd39f..37edabe4 100644 --- a/modules/Admin/Config/Routes.php +++ b/modules/Admin/Config/Routes.php @@ -7,7 +7,6 @@ namespace Modules\Admin\Config; use CodeIgniter\Router\RouteCollection; /** @var RouteCollection $routes */ -$routes = service('routes'); // video-clips scheduler $routes->add('scheduled-video-clips', 'SchedulerController::generateVideoClips', [ @@ -16,8 +15,7 @@ $routes->add('scheduled-video-clips', 'SchedulerController::generateVideoClips', // Admin area routes $routes->group( - config('Admin') - ->gateway, + config(Admin::class)->gateway, [ 'namespace' => 'Modules\Admin\Controllers', ], @@ -161,7 +159,7 @@ $routes->group( 'filter' => 'permission:podcast#.delete', ]); $routes->group('persons', static function ($routes): void { - $routes->get('/', 'PodcastPersonController/$1', [ + $routes->get('/', 'PodcastPersonController::index/$1', [ 'as' => 'podcast-persons-manage', 'filter' => 'permission:podcast#.manage-persons', ]); @@ -457,7 +455,7 @@ $routes->group( ], ); $routes->group('persons', static function ($routes): void { - $routes->get('/', 'EpisodePersonController/$1/$2', [ + $routes->get('/', 'EpisodePersonController::index/$1/$2', [ 'as' => 'episode-persons-manage', 'filter' => 'permission:podcast#.episodes.manage-persons', ]); diff --git a/modules/Admin/Controllers/AboutController.php b/modules/Admin/Controllers/AboutController.php index b90f2542..b43453fc 100644 --- a/modules/Admin/Controllers/AboutController.php +++ b/modules/Admin/Controllers/AboutController.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Modules\Admin\Controllers; use CodeIgniter\HTTP\RedirectResponse; +use Config\App; use Config\Services; class AboutController extends BaseController @@ -22,7 +23,7 @@ class AboutController extends BaseController 'version' => CP_VERSION, 'php_version' => PHP_VERSION, 'os' => PHP_OS, - 'languages' => implode(', ', config('App')->supportedLocales), + 'languages' => implode(', ', config(App::class)->supportedLocales), ]; return view('about', [ diff --git a/modules/Admin/Controllers/DashboardController.php b/modules/Admin/Controllers/DashboardController.php index 7d6f4821..6ac175af 100644 --- a/modules/Admin/Controllers/DashboardController.php +++ b/modules/Admin/Controllers/DashboardController.php @@ -13,6 +13,7 @@ namespace Modules\Admin\Controllers; use App\Models\EpisodeModel; use App\Models\PodcastModel; use CodeIgniter\I18n\Time; +use Config\App; use Modules\Media\Models\MediaModel; class DashboardController extends BaseController @@ -50,7 +51,7 @@ class DashboardController extends BaseController ->get() ->getResultArray()[0]; - $appStorageLimit = config('App') + $appStorageLimit = config(App::class) ->storageLimit; if ($appStorageLimit === null || $appStorageLimit < 0) { $storageLimitBytes = disk_total_space('./'); @@ -70,7 +71,7 @@ class DashboardController extends BaseController ->id; } - $bandwidthLimit = config('App') + $bandwidthLimit = config(App::class) ->bandwidthLimit; $data = [ diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 75fee3a9..bca38a66 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -32,6 +32,7 @@ use Modules\Analytics\Models\AnalyticsPodcastModel; use Modules\Analytics\Models\AnalyticsWebsiteByBrowserModel; use Modules\Analytics\Models\AnalyticsWebsiteByEntryPageModel; use Modules\Analytics\Models\AnalyticsWebsiteByRefererModel; +use Modules\Auth\Config\AuthGroups; use Modules\Media\Entities\Image; use Modules\Media\FileManagers\FileManagerInterface; use Modules\Media\Models\MediaModel; @@ -255,7 +256,7 @@ class PodcastController extends BaseController // generate podcast roles and permissions // before setting current user as podcast admin - config('AuthGroups') + config(AuthGroups::class) ->generatePodcastAuthorizations($newPodcastId); add_podcast_group(auth()->user(), (int) $newPodcastId, setting('AuthGroups.mostPowerfulPodcastGroup')); diff --git a/modules/Admin/Controllers/VideoClipsController.php b/modules/Admin/Controllers/VideoClipsController.php index d66fffde..a7205003 100644 --- a/modules/Admin/Controllers/VideoClipsController.php +++ b/modules/Admin/Controllers/VideoClipsController.php @@ -18,8 +18,10 @@ use App\Models\EpisodeModel; use App\Models\PodcastModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; +use Config\Colors; use Modules\Media\Entities\Transcript; use Modules\Media\Models\MediaModel; +use Modules\MediaClipper\Config\MediaClipper; class VideoClipsController extends BaseController { @@ -144,8 +146,8 @@ class VideoClipsController extends BaseController 'title' => 'required', 'start_time' => 'required|greater_than_equal_to[0]', 'duration' => 'required|greater_than[0]', - 'format' => 'required|in_list[' . implode(',', array_keys(config('MediaClipper')->formats)) . ']', - 'theme' => 'required|in_list[' . implode(',', array_keys(config('Colors')->themes)) . ']', + 'format' => 'required|in_list[' . implode(',', array_keys(config(MediaClipper::class)->formats)) . ']', + 'theme' => 'required|in_list[' . implode(',', array_keys(config(Colors::class)->themes)) . ']', ]; if (! $this->validate($rules)) { @@ -156,7 +158,7 @@ class VideoClipsController extends BaseController } $themeName = $this->request->getPost('theme'); - $themeColors = config('MediaClipper') + $themeColors = config(MediaClipper::class) ->themes[$themeName]; $theme = [ 'name' => $themeName, diff --git a/modules/Admin/Language/ar/Breadcrumb.php b/modules/Admin/Language/ar/Breadcrumb.php index 66a2065d..f65f731a 100644 --- a/modules/Admin/Language/ar/Breadcrumb.php +++ b/modules/Admin/Language/ar/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'الرئيسية', 'podcasts' => 'بودكاستات', 'episodes' => 'حلقات', diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php index 04072451..2807e934 100644 --- a/modules/Admin/Language/br/Breadcrumb.php +++ b/modules/Admin/Language/br/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'roll-istor', - config('Admin') + config(Admin::class) ->gateway => 'Degemer', 'podcasts' => 'podkastoù', 'episodes' => 'rannoù', diff --git a/modules/Admin/Language/ca/Breadcrumb.php b/modules/Admin/Language/ca/Breadcrumb.php index d16b4eaa..4ccba18f 100644 --- a/modules/Admin/Language/ca/Breadcrumb.php +++ b/modules/Admin/Language/ca/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'Ruta de navegació', - config('Admin') + config(Admin::class) ->gateway => 'Inici', 'podcasts' => 'podcasts', 'episodes' => 'episodis', diff --git a/modules/Admin/Language/da/Breadcrumb.php b/modules/Admin/Language/da/Breadcrumb.php index a67d497b..fcf3d567 100644 --- a/modules/Admin/Language/da/Breadcrumb.php +++ b/modules/Admin/Language/da/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'brødkrumme', - config('Admin') + config(Admin::class) ->gateway => 'Hjem', 'podcasts' => 'podcasts', 'episodes' => 'episoder', diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php index 65ad6b2b..aa060fda 100644 --- a/modules/Admin/Language/de/Breadcrumb.php +++ b/modules/Admin/Language/de/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'Pfad', - config('Admin') + config(Admin::class) ->gateway => 'Startseite', 'podcasts' => 'Podcasts', 'episodes' => 'Folgen', diff --git a/modules/Admin/Language/el/Breadcrumb.php b/modules/Admin/Language/el/Breadcrumb.php index aa52554d..e642116c 100644 --- a/modules/Admin/Language/el/Breadcrumb.php +++ b/modules/Admin/Language/el/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'διαδρομή (Breadcrumb)', - config('Admin') + config(Admin::class) ->gateway => 'Αρχική σελίδα', 'podcasts' => 'podcasts', 'episodes' => 'επεισόδια', diff --git a/modules/Admin/Language/en/Breadcrumb.php b/modules/Admin/Language/en/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/en/Breadcrumb.php +++ b/modules/Admin/Language/en/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/es/Breadcrumb.php b/modules/Admin/Language/es/Breadcrumb.php index cc0b23bc..cace2713 100644 --- a/modules/Admin/Language/es/Breadcrumb.php +++ b/modules/Admin/Language/es/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'ruta de navegación', - config('Admin') + config(Admin::class) ->gateway => 'Inicio', 'podcasts' => 'podcasts', 'episodes' => 'episodios', diff --git a/modules/Admin/Language/fa/Breadcrumb.php b/modules/Admin/Language/fa/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/fa/Breadcrumb.php +++ b/modules/Admin/Language/fa/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php index 69b8205b..a25e678e 100644 --- a/modules/Admin/Language/fr/Breadcrumb.php +++ b/modules/Admin/Language/fr/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'Fil d’Ariane', - config('Admin') + config(Admin::class) ->gateway => 'Accueil', 'podcasts' => 'podcasts', 'episodes' => 'épisodes', diff --git a/modules/Admin/Language/fr2/Breadcrumb.php b/modules/Admin/Language/fr2/Breadcrumb.php index daa88fbb..5588f808 100644 --- a/modules/Admin/Language/fr2/Breadcrumb.php +++ b/modules/Admin/Language/fr2/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'fil d’Ariane', - config('Admin') + config(Admin::class) ->gateway => 'Accueil', 'podcasts' => 'podcasts', 'episodes' => 'épisodes', diff --git a/modules/Admin/Language/fr_CA/Breadcrumb.php b/modules/Admin/Language/fr_CA/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/fr_CA/Breadcrumb.php +++ b/modules/Admin/Language/fr_CA/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/fr_trad/Breadcrumb.php b/modules/Admin/Language/fr_trad/Breadcrumb.php index 558b90f7..896c373c 100644 --- a/modules/Admin/Language/fr_trad/Breadcrumb.php +++ b/modules/Admin/Language/fr_trad/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/gd/Breadcrumb.php b/modules/Admin/Language/gd/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/gd/Breadcrumb.php +++ b/modules/Admin/Language/gd/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php index 4517dad4..15c54937 100644 --- a/modules/Admin/Language/gl/Breadcrumb.php +++ b/modules/Admin/Language/gl/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'menú', - config('Admin') + config(Admin::class) ->gateway => 'Inicio', 'podcasts' => 'podcasts', 'episodes' => 'episodios', diff --git a/modules/Admin/Language/id/Breadcrumb.php b/modules/Admin/Language/id/Breadcrumb.php index d68fe345..38927596 100644 --- a/modules/Admin/Language/id/Breadcrumb.php +++ b/modules/Admin/Language/id/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/it/Breadcrumb.php b/modules/Admin/Language/it/Breadcrumb.php index 60d86070..21988dad 100644 --- a/modules/Admin/Language/it/Breadcrumb.php +++ b/modules/Admin/Language/it/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodi', diff --git a/modules/Admin/Language/ja/Breadcrumb.php b/modules/Admin/Language/ja/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/ja/Breadcrumb.php +++ b/modules/Admin/Language/ja/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/ko/Breadcrumb.php b/modules/Admin/Language/ko/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/ko/Breadcrumb.php +++ b/modules/Admin/Language/ko/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php index ff66e639..4f2591f8 100644 --- a/modules/Admin/Language/nl/Breadcrumb.php +++ b/modules/Admin/Language/nl/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'kruimelpad', - config('Admin') + config(Admin::class) ->gateway => 'Hoofdpagina', 'podcasts' => 'podcasts', 'episodes' => 'afleveringen', diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php index 8e133d91..d7811c3c 100644 --- a/modules/Admin/Language/nn-NO/Breadcrumb.php +++ b/modules/Admin/Language/nn-NO/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'navigeringslenke', - config('Admin') + config(Admin::class) ->gateway => 'Heim', 'podcasts' => 'podkastar', 'episodes' => 'episodar', diff --git a/modules/Admin/Language/oc/Breadcrumb.php b/modules/Admin/Language/oc/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/oc/Breadcrumb.php +++ b/modules/Admin/Language/oc/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php index 4e95f113..d3e718f0 100644 --- a/modules/Admin/Language/pl/Breadcrumb.php +++ b/modules/Admin/Language/pl/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'okruszki', - config('Admin') + config(Admin::class) ->gateway => 'Początek', 'podcasts' => 'podcasty', 'episodes' => 'odcinki', diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-BR/Breadcrumb.php index 0194ee38..63d17e97 100644 --- a/modules/Admin/Language/pt-BR/Breadcrumb.php +++ b/modules/Admin/Language/pt-BR/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Início', 'podcasts' => 'podcasts', 'episodes' => 'episódios', diff --git a/modules/Admin/Language/pt/Breadcrumb.php b/modules/Admin/Language/pt/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/pt/Breadcrumb.php +++ b/modules/Admin/Language/pt/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/ro/Breadcrumb.php b/modules/Admin/Language/ro/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/ro/Breadcrumb.php +++ b/modules/Admin/Language/ro/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/ru/Breadcrumb.php b/modules/Admin/Language/ru/Breadcrumb.php index 956be05f..642f273d 100644 --- a/modules/Admin/Language/ru/Breadcrumb.php +++ b/modules/Admin/Language/ru/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'навигационная цепочка', - config('Admin') + config(Admin::class) ->gateway => 'Главная', 'podcasts' => 'подкасты', 'episodes' => 'выпуски', diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php index c411de81..a3d97f7f 100644 --- a/modules/Admin/Language/sk/Breadcrumb.php +++ b/modules/Admin/Language/sk/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'omrvinky', - config('Admin') + config(Admin::class) ->gateway => 'Úvod', 'podcasts' => 'podcasty', 'episodes' => 'časti', diff --git a/modules/Admin/Language/sr_Latn/Breadcrumb.php b/modules/Admin/Language/sr_Latn/Breadcrumb.php index 678127b0..4f685d60 100644 --- a/modules/Admin/Language/sr_Latn/Breadcrumb.php +++ b/modules/Admin/Language/sr_Latn/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb polja', - config('Admin') + config(Admin::class) ->gateway => 'Početna', 'podcasts' => 'podkasti', 'episodes' => 'epizode', diff --git a/modules/Admin/Language/sv/Breadcrumb.php b/modules/Admin/Language/sv/Breadcrumb.php index a2c81378..a373f4cf 100644 --- a/modules/Admin/Language/sv/Breadcrumb.php +++ b/modules/Admin/Language/sv/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Hem', 'podcasts' => 'podcasts', 'episodes' => 'avsnitt', diff --git a/modules/Admin/Language/uk/Breadcrumb.php b/modules/Admin/Language/uk/Breadcrumb.php index ca682262..593322e6 100644 --- a/modules/Admin/Language/uk/Breadcrumb.php +++ b/modules/Admin/Language/uk/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => 'breadcrumb', - config('Admin') + config(Admin::class) ->gateway => 'Home', 'podcasts' => 'podcasts', 'episodes' => 'episodes', diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-Hans/Breadcrumb.php index df604854..e4c2d8a3 100644 --- a/modules/Admin/Language/zh-Hans/Breadcrumb.php +++ b/modules/Admin/Language/zh-Hans/Breadcrumb.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use Modules\Admin\Config\Admin; + /** * @copyright 2020 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -10,7 +12,7 @@ declare(strict_types=1); return [ 'label' => '面包屑导航', - config('Admin') + config(Admin::class) ->gateway => '主页', 'podcasts' => '播客', 'episodes' => '剧集', diff --git a/modules/Analytics/Config/Routes.php b/modules/Analytics/Config/Routes.php index acc9e49e..f8a925cf 100644 --- a/modules/Analytics/Config/Routes.php +++ b/modules/Analytics/Config/Routes.php @@ -2,13 +2,16 @@ declare(strict_types=1); +use CodeIgniter\Router\RouteCollection; +use Modules\Analytics\Config\Analytics; + /** * @copyright 2021 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ */ -$routes = service('routes'); +/** @var RouteCollection $routes */ /** * Analytics routes file @@ -25,17 +28,17 @@ $routes->addPlaceholder( $routes->group('', [ 'namespace' => 'Modules\Analytics\Controllers', ], static function ($routes): void { - $routes->group(config('Analytics')->gateway . '/(:num)/(:class)', static function ($routes): void { + $routes->group(config(Analytics::class)->gateway . '/(:num)/(:class)', static function ($routes): void { $routes->get('/', 'AnalyticsController::getData/$1/$2', [ 'as' => 'analytics-full-data', - 'filter' => config('Analytics') + 'filter' => config(Analytics::class) ->routeFilters[ 'analytics-full-data' ], ]); $routes->get('(:filter)', 'AnalyticsController::getData/$1/$2/$3', [ 'as' => 'analytics-data', - 'filter' => config('Analytics') + 'filter' => config(Analytics::class) ->routeFilters['analytics-data'], ]); $routes->get( @@ -43,14 +46,14 @@ $routes->group('', [ 'AnalyticsController::getData/$1/$2/$3/$4', [ 'as' => 'analytics-filtered-data', - 'filter' => config('Analytics') + 'filter' => config(Analytics::class) ->routeFilters[ 'analytics-filtered-data' ], ], ); }); - $routes->get(config('Analytics')->gateway . '/(:class)/(:filter)', 'AnalyticsController::getData/$1/$2', [ + $routes->get(config(Analytics::class)->gateway . '/(:class)/(:filter)', 'AnalyticsController::getData/$1/$2', [ 'as' => 'analytics-data-instance', ]); @@ -63,4 +66,4 @@ $routes->group('', [ // Show the Unknown UserAgents $routes->get('.well-known/unknown-useragents', 'UnknownUserAgentsController'); -$routes->get('.well-known/unknown-useragents/(:num)', 'UnknownUserAgentsController/$1'); +$routes->get('.well-known/unknown-useragents/(:num)', 'UnknownUserAgentsController::index/$1'); diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php index a4612ca6..4e6f1240 100644 --- a/modules/Analytics/Helpers/analytics_helper.php +++ b/modules/Analytics/Helpers/analytics_helper.php @@ -11,6 +11,7 @@ declare(strict_types=1); use AdAures\Ipcat\IpDb; use Config\Services; use GeoIp2\Database\Reader; +use Modules\Analytics\Config\Analytics; use Opawg\UserAgentsPhp\UserAgents; use WhichBrowser\Parser; @@ -260,7 +261,7 @@ if (! function_exists('podcast_hit')) { ? $_SERVER['HTTP_RANGE'] : null; - $salt = config('Analytics') + $salt = config(Analytics::class) ->salt; // We create a sha1 hash for this Salt+Current_Date+IP_Address+User_Agent+Episode_ID (used to count only once multiple episode downloads): $episodeListenerHashId = diff --git a/modules/Api/Rest/V1/Config/Routes.php b/modules/Api/Rest/V1/Config/Routes.php index 0a02ebd1..0951a7d5 100644 --- a/modules/Api/Rest/V1/Config/Routes.php +++ b/modules/Api/Rest/V1/Config/Routes.php @@ -4,10 +4,12 @@ declare(strict_types=1); namespace Modules\Api\Rest\V1\Config; -$routes = service('routes'); +use CodeIgniter\Router\RouteCollection; + +/** @var RouteCollection $routes */ $routes->group( - config('RestApi') + config(RestApi::class) ->gateway . 'podcasts', [ 'namespace' => 'Modules\Api\Rest\V1\Controllers', @@ -21,7 +23,7 @@ $routes->group( ); $routes->group( - config('RestApi') + config(RestApi::class) ->gateway . 'episodes', [ 'namespace' => 'Modules\Api\Rest\V1\Controllers', diff --git a/modules/Api/Rest/V1/Config/Services.php b/modules/Api/Rest/V1/Config/Services.php index c4a3d72c..48c94897 100644 --- a/modules/Api/Rest/V1/Config/Services.php +++ b/modules/Api/Rest/V1/Config/Services.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Modules\Api\Rest\V1\Config; use CodeIgniter\Config\BaseService; +use Config\Exceptions as ExceptionsConfig; use Modules\Api\Rest\V1\Core\Exceptions; class Services extends BaseService @@ -15,6 +16,6 @@ class Services extends BaseService return static::getSharedInstance('restApiExceptions'); } - return new Exceptions(config('Exceptions'), static::request(), static::response()); + return new Exceptions(config(ExceptionsConfig::class), static::request(), static::response()); } } diff --git a/modules/Api/Rest/V1/Controllers/EpisodeController.php b/modules/Api/Rest/V1/Controllers/EpisodeController.php index 4e4f08eb..f90e809d 100644 --- a/modules/Api/Rest/V1/Controllers/EpisodeController.php +++ b/modules/Api/Rest/V1/Controllers/EpisodeController.php @@ -9,6 +9,7 @@ use App\Models\EpisodeModel; use CodeIgniter\API\ResponseTrait; use CodeIgniter\Controller; use CodeIgniter\HTTP\Response; +use Modules\Api\Rest\V1\Config\RestApi; use Modules\Api\Rest\V1\Config\Services; class EpisodeController extends Controller @@ -45,7 +46,7 @@ class EpisodeController extends Controller } $data = $builder->findAll( - (int) ($this->request->getGet('limit') ?? config('RestApi')->limit), + (int) ($this->request->getGet('limit') ?? config(RestApi::class)->limit), (int) $this->request->getGet('offset') ); diff --git a/modules/Api/Rest/V1/Filters/ApiFilter.php b/modules/Api/Rest/V1/Filters/ApiFilter.php index c28af65e..9ee8fa5f 100644 --- a/modules/Api/Rest/V1/Filters/ApiFilter.php +++ b/modules/Api/Rest/V1/Filters/ApiFilter.php @@ -20,7 +20,7 @@ class ApiFilter implements FilterInterface public function before(RequestInterface $request, $arguments = null) { /** @var RestApi $restApiConfig */ - $restApiConfig = config('RestApi'); + $restApiConfig = config(RestApi::class); if (! $restApiConfig->enabled) { throw PageNotFoundException::forPageNotFound(); diff --git a/modules/Auth/Auth.php b/modules/Auth/Auth.php index 09e32581..35a5e31d 100644 --- a/modules/Auth/Auth.php +++ b/modules/Auth/Auth.php @@ -6,6 +6,8 @@ namespace Modules\Auth; use CodeIgniter\Router\RouteCollection; use CodeIgniter\Shield\Auth as ShieldAuth; +use Modules\Auth\Config\Auth as AuthConfig; +use Modules\Auth\Config\AuthRoutes; class Auth extends ShieldAuth { @@ -19,10 +21,10 @@ class Auth extends ShieldAuth */ public function routes(RouteCollection &$routes, array $config = []): void { - $authRoutes = config('AuthRoutes') + $authRoutes = config(AuthRoutes::class) ->routes; - $routes->group(config('Auth')->gateway, [ + $routes->group(config(AuthConfig::class)->gateway, [ 'namespace' => 'Modules\Auth\Controllers', ], static function (RouteCollection $routes) use ($authRoutes, $config): void { foreach ($authRoutes as $name => $row) { diff --git a/modules/Auth/Config/Auth.php b/modules/Auth/Config/Auth.php index a537c3ef..d765960a 100644 --- a/modules/Auth/Config/Auth.php +++ b/modules/Auth/Config/Auth.php @@ -7,6 +7,7 @@ namespace Modules\Auth\Config; use CodeIgniter\Shield\Authentication\Actions\ActionInterface; use CodeIgniter\Shield\Authentication\Actions\Email2FA; use CodeIgniter\Shield\Config\Auth as ShieldAuth; +use Modules\Admin\Config\Admin; use Modules\Auth\Models\UserModel; class Auth extends ShieldAuth @@ -119,7 +120,7 @@ class Auth extends ShieldAuth { parent::__construct(); - $adminGateway = config('Admin') + $adminGateway = config(Admin::class) ->gateway; $this->redirects = [ diff --git a/modules/Auth/Config/Routes.php b/modules/Auth/Config/Routes.php index af307640..0bdc30ca 100644 --- a/modules/Auth/Config/Routes.php +++ b/modules/Auth/Config/Routes.php @@ -4,14 +4,19 @@ declare(strict_types=1); namespace Modules\Auth\Config; -$routes = service('routes'); +use CodeIgniter\Router\RouteCollection; +use Modules\Admin\Config\Admin; + +/** + * @var RouteCollection $routes + */ service('auth') ->routes($routes); // Admin routes for users and podcast contributors $routes->group( - config('Admin') + config(Admin::class) ->gateway, [ 'namespace' => 'Modules\Auth\Controllers', diff --git a/modules/Auth/Config/Services.php b/modules/Auth/Config/Services.php index f3dd45f7..5be76591 100644 --- a/modules/Auth/Config/Services.php +++ b/modules/Auth/Config/Services.php @@ -7,6 +7,7 @@ namespace Modules\Auth\Config; use CodeIgniter\Shield\Authentication\Authentication; use Config\Services as BaseService; use Modules\Auth\Auth; +use Modules\Auth\Config\Auth as AuthConfig; class Services extends BaseService { @@ -16,10 +17,11 @@ class Services extends BaseService public static function auth(bool $getShared = true): Auth { if ($getShared) { + /** @var Auth */ return self::getSharedInstance('auth'); } - $config = config('Auth'); + $config = config(AuthConfig::class); return new Auth(new Authentication($config)); } diff --git a/modules/Auth/Controllers/MagicLinkController.php b/modules/Auth/Controllers/MagicLinkController.php index 6033a448..92223de5 100644 --- a/modules/Auth/Controllers/MagicLinkController.php +++ b/modules/Auth/Controllers/MagicLinkController.php @@ -8,6 +8,7 @@ use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\Shield\Controllers\MagicLinkController as ShieldMagicLinkController; +use Modules\Auth\Config\Auth; use Modules\Auth\Models\UserModel; use Psr\Log\LoggerInterface; use ViewThemes\Theme; @@ -32,7 +33,7 @@ class MagicLinkController extends ShieldMagicLinkController public function setPasswordView(): string | RedirectResponse { if (! session('magicLogin')) { - return redirect()->to(config('Auth')->loginRedirect()); + return redirect()->to(config(Auth::class)->loginRedirect()); } return view(setting('Auth.views')['magic-link-set-password']); @@ -70,7 +71,7 @@ class MagicLinkController extends ShieldMagicLinkController } // Success! - return redirect()->to(config('Auth')->loginRedirect()) + return redirect()->to(config(Auth::class)->loginRedirect()) ->with('message', lang('MyAccount.messages.passwordChangeSuccess')); } } diff --git a/modules/Fediverse/Config/Routes.php b/modules/Fediverse/Config/Routes.php index 6aa75a00..7d5770c8 100644 --- a/modules/Fediverse/Config/Routes.php +++ b/modules/Fediverse/Config/Routes.php @@ -2,13 +2,15 @@ declare(strict_types=1); +use CodeIgniter\Router\RouteCollection; + /** * @copyright 2021 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ */ -$routes = service('routes'); +/** @var RouteCollection $routes */ $routes->addPlaceholder('actorUsername', '[a-zA-Z0-9\_]{1,32}'); $routes->addPlaceholder( @@ -35,7 +37,7 @@ $routes->group('', [ // Actor $routes->group('@(:actorUsername)', static function ($routes): void { // Actor - $routes->get('/', 'ActorController/$1', [ + $routes->get('/', 'ActorController::index/$1', [ 'as' => 'actor', ]); $routes->post('inbox', 'ActorController::inbox/$1', [ @@ -61,10 +63,10 @@ $routes->group('', [ $routes->post('posts/new', 'PostController::attemptCreate/$1', [ 'as' => 'post-attempt-create', ]); - $routes->get('posts/(:uuid)', 'PostController/$1', [ + $routes->get('posts/(:uuid)', 'PostController::index/$1', [ 'as' => 'post', ]); - $routes->get('posts/(:uuid)/replies', 'PostController/$1', [ + $routes->get('posts/(:uuid)/replies', 'PostController::index/$1', [ 'as' => 'post-replies', ]); $routes->post( diff --git a/modules/Fediverse/Controllers/ActorController.php b/modules/Fediverse/Controllers/ActorController.php index 52f35e36..8e725dee 100644 --- a/modules/Fediverse/Controllers/ActorController.php +++ b/modules/Fediverse/Controllers/ActorController.php @@ -35,7 +35,7 @@ class ActorController extends Controller public function __construct() { - $this->config = config('Fediverse'); + $this->config = config(Fediverse::class); } public function _remap(string $method, string ...$params): mixed diff --git a/modules/Fediverse/Controllers/NodeInfo2Controller.php b/modules/Fediverse/Controllers/NodeInfo2Controller.php index 4457c600..753f66f3 100644 --- a/modules/Fediverse/Controllers/NodeInfo2Controller.php +++ b/modules/Fediverse/Controllers/NodeInfo2Controller.php @@ -12,6 +12,7 @@ namespace Modules\Fediverse\Controllers; use CodeIgniter\Controller; use CodeIgniter\HTTP\ResponseInterface; +use Modules\Auth\Config\Auth; class NodeInfo2Controller extends Controller { @@ -35,7 +36,7 @@ class NodeInfo2Controller extends Controller 'version' => CP_VERSION, ], 'protocols' => ['activitypub'], - 'openRegistrations' => config('Auth') + 'openRegistrations' => config(Auth::class) ->allowRegistration, 'usage' => [ 'users' => [ diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php index 6141f402..267e818e 100644 --- a/modules/Fediverse/Controllers/PostController.php +++ b/modules/Fediverse/Controllers/PostController.php @@ -45,7 +45,7 @@ class PostController extends Controller public function __construct() { - $this->config = config('Fediverse'); + $this->config = config(Fediverse::class); } public function _remap(string $method, string ...$params): mixed diff --git a/modules/Fediverse/Entities/Actor.php b/modules/Fediverse/Entities/Actor.php index 12d65124..97948796 100644 --- a/modules/Fediverse/Entities/Actor.php +++ b/modules/Fediverse/Entities/Actor.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Modules\Fediverse\Entities; use CodeIgniter\Entity\Entity; +use Modules\Fediverse\Config\Fediverse; use RuntimeException; /** @@ -111,7 +112,7 @@ class Actor extends Entity public function getAvatarImageUrl(): string { if ($this->attributes['avatar_image_url'] === null) { - return base_url(config('Fediverse')->defaultAvatarImagePath); + return base_url(config(Fediverse::class)->defaultAvatarImagePath); } return $this->attributes['avatar_image_url']; @@ -120,7 +121,7 @@ class Actor extends Entity public function getAvatarImageMimetype(): string { if ($this->attributes['avatar_image_mimetype'] === null) { - return config('Fediverse')->defaultAvatarImageMimetype; + return config(Fediverse::class)->defaultAvatarImageMimetype; } return $this->attributes['avatar_image_mimetype']; @@ -129,7 +130,7 @@ class Actor extends Entity public function getCoverImageUrl(): string { if ($this->attributes['cover_image_url'] === null) { - return base_url(config('Fediverse')->defaultCoverImagePath); + return base_url(config(Fediverse::class)->defaultCoverImagePath); } return $this->attributes['cover_image_url']; @@ -138,7 +139,7 @@ class Actor extends Entity public function getCoverImageMimetype(): string { if ($this->attributes['cover_image_mimetype'] === null) { - return config('Fediverse')->defaultCoverImageMimetype; + return config(Fediverse::class)->defaultCoverImageMimetype; } return $this->attributes['cover_image_mimetype']; diff --git a/modules/Fediverse/Models/ActivityModel.php b/modules/Fediverse/Models/ActivityModel.php index cf9181fe..efc4028b 100644 --- a/modules/Fediverse/Models/ActivityModel.php +++ b/modules/Fediverse/Models/ActivityModel.php @@ -14,6 +14,7 @@ use CodeIgniter\Database\BaseResult; use CodeIgniter\I18n\Time; use DateTimeInterface; use Michalsn\Uuid\UuidModel; +use Modules\Fediverse\Config\Fediverse; use Modules\Fediverse\Entities\Activity; class ActivityModel extends UuidModel @@ -77,7 +78,7 @@ class ActivityModel extends UuidModel public function getActivityById(string $activityId): ?Activity { $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "activity#{$activityId}"; if (! ($found = cache($cacheName))) { $found = $this->find($activityId); diff --git a/modules/Fediverse/Models/ActorModel.php b/modules/Fediverse/Models/ActorModel.php index db07c0be..1fe1ed54 100644 --- a/modules/Fediverse/Models/ActorModel.php +++ b/modules/Fediverse/Models/ActorModel.php @@ -12,6 +12,7 @@ namespace Modules\Fediverse\Models; use CodeIgniter\Events\Events; use CodeIgniter\Model; +use Modules\Fediverse\Config\Fediverse; use Modules\Fediverse\Entities\Actor; class ActorModel extends Model @@ -98,7 +99,7 @@ class ActorModel extends Model { $hashedActorUri = md5($actorUri); $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "actor-{$hashedActorUri}"; if (! ($found = cache($cacheName))) { $found = $this->where('uri', $actorUri) @@ -117,7 +118,7 @@ class ActorModel extends Model public function getFollowers(int $actorId): array { $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "actor#{$actorId}_followers"; if (! ($found = cache($cacheName))) { $found = $this->join('fediverse_follows', 'fediverse_follows.actor_id = id', 'inner') @@ -150,7 +151,7 @@ class ActorModel extends Model */ public function getBlockedActors(): array { - $cacheName = config('Fediverse') + $cacheName = config(Fediverse::class) ->cachePrefix . 'blocked_actors'; if (! ($found = cache($cacheName))) { $found = $this->where('is_blocked', 1) @@ -165,7 +166,7 @@ class ActorModel extends Model public function blockActor(int $actorId): void { - $prefix = config('Fediverse') + $prefix = config(Fediverse::class) ->cachePrefix; cache() ->delete($prefix . 'blocked_actors'); @@ -181,7 +182,7 @@ class ActorModel extends Model public function unblockActor(int $actorId): void { - $prefix = config('Fediverse') + $prefix = config(Fediverse::class) ->cachePrefix; cache() ->delete($prefix . 'blocked_actors'); @@ -199,7 +200,7 @@ class ActorModel extends Model { helper('fediverse'); - $cacheName = config('Fediverse') + $cacheName = config(Fediverse::class) ->cachePrefix . 'blocked_actors'; if (! ($found = cache($cacheName))) { $result = $this->select('COUNT(*) as total_local_actors') @@ -220,10 +221,10 @@ class ActorModel extends Model { helper('fediverse'); - $cacheName = config('Fediverse') + $cacheName = config(Fediverse::class) ->cachePrefix . 'blocked_actors'; if (! ($found = cache($cacheName))) { - $tablePrefix = config('Database') + $tablePrefix = config(Database::class) ->default['DBPrefix']; $result = $this->select('COUNT(DISTINCT `cp_fediverse_actors`.`id`) as `total_active_actors`', false) ->join( @@ -297,7 +298,7 @@ class ActorModel extends Model public function clearCache(Actor $actor): void { - $cachePrefix = config('Fediverse') + $cachePrefix = config(Fediverse::class) ->cachePrefix; $hashedActorUri = md5($actor->uri); $cacheDomain = str_replace(':', '', $actor->domain); diff --git a/modules/Fediverse/Models/BlockedDomainModel.php b/modules/Fediverse/Models/BlockedDomainModel.php index e8e4f514..16fbd6a6 100644 --- a/modules/Fediverse/Models/BlockedDomainModel.php +++ b/modules/Fediverse/Models/BlockedDomainModel.php @@ -13,6 +13,7 @@ namespace Modules\Fediverse\Models; use CodeIgniter\Database\BaseResult; use CodeIgniter\Events\Events; use CodeIgniter\Model; +use Modules\Fediverse\Config\Fediverse; use Modules\Fediverse\Entities\BlockedDomain; class BlockedDomainModel extends Model @@ -56,7 +57,7 @@ class BlockedDomainModel extends Model */ public function getBlockedDomains(): array { - $cacheName = config('Fediverse') + $cacheName = config(Fediverse::class) ->cachePrefix . 'blocked_domains'; if (! ($found = cache($cacheName))) { $found = $this->findAll(); @@ -72,7 +73,7 @@ class BlockedDomainModel extends Model { $hashedDomainName = md5($name); $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "domain#{$hashedDomainName}_isBlocked"; if (! ($found = cache($cacheName))) { @@ -88,7 +89,7 @@ class BlockedDomainModel extends Model public function blockDomain(string $name): int | bool { $hashedDomain = md5($name); - $prefix = config('Fediverse') + $prefix = config(Fediverse::class) ->cachePrefix; cache() ->delete($prefix . "domain#{$hashedDomain}_isBlocked"); @@ -120,7 +121,7 @@ class BlockedDomainModel extends Model public function unblockDomain(string $name): BaseResult | bool { $hashedDomain = md5($name); - $prefix = config('Fediverse') + $prefix = config(Fediverse::class) ->cachePrefix; cache() ->delete($prefix . "domain#{$hashedDomain}_isBlocked"); diff --git a/modules/Fediverse/Models/PostModel.php b/modules/Fediverse/Models/PostModel.php index c472a61b..65d5d703 100644 --- a/modules/Fediverse/Models/PostModel.php +++ b/modules/Fediverse/Models/PostModel.php @@ -20,6 +20,7 @@ use Modules\Fediverse\Activities\AnnounceActivity; use Modules\Fediverse\Activities\CreateActivity; use Modules\Fediverse\Activities\DeleteActivity; use Modules\Fediverse\Activities\UndoActivity; +use Modules\Fediverse\Config\Fediverse; use Modules\Fediverse\Entities\Actor; use Modules\Fediverse\Entities\Post; use Modules\Fediverse\Objects\TombstoneObject; @@ -97,7 +98,7 @@ class PostModel extends UuidModel { $hashedPostUri = md5($postUri); $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "post-{$hashedPostUri}"; if (! ($found = cache($cacheName))) { $found = $this->where('uri', $postUri) @@ -118,7 +119,7 @@ class PostModel extends UuidModel public function getActorPublishedPosts(int $actorId): array { $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "actor#{$actorId}_published_posts"; if (! ($found = cache($cacheName))) { @@ -167,7 +168,7 @@ class PostModel extends UuidModel public function getPostReplies(string $postId, bool $withBlocked = false): array { $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "post#{$postId}_replies" . ($withBlocked ? '_withBlocked' : ''); @@ -199,7 +200,7 @@ class PostModel extends UuidModel public function getPostReblogs(string $postId): array { $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "post#{$postId}_reblogs"; if (! ($found = cache($cacheName))) { @@ -276,7 +277,7 @@ class PostModel extends UuidModel $post->uri = url_to('post', esc($post->actor->username), $newPostId); $createActivity = new CreateActivity(); - $noteObjectClass = config('Fediverse') + $noteObjectClass = config(Fediverse::class) ->noteObject; $createActivity ->set('actor', $post->actor->uri) @@ -591,7 +592,7 @@ class PostModel extends UuidModel { helper('fediverse'); - $cacheName = config('Fediverse') + $cacheName = config(Fediverse::class) ->cachePrefix . 'blocked_actors'; if (! ($found = cache($cacheName))) { $result = $this->select('COUNT(*) as total_local_posts') @@ -660,7 +661,7 @@ class PostModel extends UuidModel public function clearCache(Post $post): void { - $cachePrefix = config('Fediverse') + $cachePrefix = config(Fediverse::class) ->cachePrefix; $hashedPostUri = md5($post->uri); diff --git a/modules/Fediverse/Models/PreviewCardModel.php b/modules/Fediverse/Models/PreviewCardModel.php index deedbe3b..ed333b1c 100644 --- a/modules/Fediverse/Models/PreviewCardModel.php +++ b/modules/Fediverse/Models/PreviewCardModel.php @@ -12,6 +12,7 @@ namespace Modules\Fediverse\Models; use CodeIgniter\Database\BaseResult; use CodeIgniter\Model; +use Modules\Fediverse\Config\Fediverse; use Modules\Fediverse\Entities\PreviewCard; class PreviewCardModel extends Model @@ -57,7 +58,7 @@ class PreviewCardModel extends Model { $hashedPreviewCardUrl = md5($url); $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "preview_card-{$hashedPreviewCardUrl}"; if (! ($found = cache($cacheName))) { @@ -73,7 +74,7 @@ class PreviewCardModel extends Model public function getPostPreviewCard(string $postId): ?PreviewCard { $cacheName = - config('Fediverse') + config(Fediverse::class) ->cachePrefix . "post#{$postId}_preview_card"; if (! ($found = cache($cacheName))) { $found = $this->join( @@ -95,7 +96,7 @@ class PreviewCardModel extends Model { $hashedPreviewCardUrl = md5($url); cache() - ->delete(config('Fediverse') ->cachePrefix . "preview_card-{$hashedPreviewCardUrl}"); + ->delete(config(Fediverse::class) ->cachePrefix . "preview_card-{$hashedPreviewCardUrl}"); return $this->delete($id); } diff --git a/modules/Install/Config/Routes.php b/modules/Install/Config/Routes.php index 94a289c5..78012464 100644 --- a/modules/Install/Config/Routes.php +++ b/modules/Install/Config/Routes.php @@ -4,11 +4,13 @@ declare(strict_types=1); namespace Modules\Install\Config; -$routes = service('routes'); +use CodeIgniter\Router\RouteCollection; + +/** @var RouteCollection $routes */ // Install Wizard routes $routes->group( - config('Install') + config(Install::class) ->gateway, [ 'namespace' => 'Modules\Install\Controllers', diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index 54462633..e131ec73 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -17,11 +17,13 @@ use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\Shield\Entities\User; +use Config\App; use Config\Database; use Config\Services; use Dotenv\Dotenv; use Dotenv\Exception\ValidationException; use Modules\Auth\Models\UserModel; +use Modules\Install\Config\Install; use Psr\Log\LoggerInterface; use Throwable; use ViewThemes\Theme; @@ -158,7 +160,9 @@ class InstallController extends Controller if (! $this->validate($rules)) { return redirect() - ->to((host_url() === null ? config('App') ->baseURL : host_url()) . config('Install')->gateway) + ->to( + (host_url() === null ? config(App::class) ->baseURL : host_url()) . config(Install::class)->gateway + ) ->withInput() ->with('errors', $this->validator->getErrors()); } @@ -176,7 +180,7 @@ class InstallController extends Controller helper('text'); // redirect to full install url with new baseUrl input - return redirect()->to(reduce_double_slashes($baseUrl . '/' . config('Install')->gateway)); + return redirect()->to(reduce_double_slashes($baseUrl . '/' . config(Install::class)->gateway)); } public function databaseConfig(): string diff --git a/modules/Media/Config/Routes.php b/modules/Media/Config/Routes.php index 1c7ba01e..c8d4703a 100644 --- a/modules/Media/Config/Routes.php +++ b/modules/Media/Config/Routes.php @@ -2,13 +2,15 @@ declare(strict_types=1); +use CodeIgniter\Router\RouteCollection; + /** * @copyright 2023 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ */ -$routes = service('routes'); +/** @var RouteCollection $routes */ $routes->get('static/(:any)', 'MediaController::serve/$1', [ 'as' => 'media-serve', diff --git a/modules/Media/Config/Services.php b/modules/Media/Config/Services.php index bb66d217..9291c80b 100644 --- a/modules/Media/Config/Services.php +++ b/modules/Media/Config/Services.php @@ -27,8 +27,7 @@ class Services extends BaseService return self::getSharedInstance('file_manager'); } - /** @var MediaConfig $config * */ - $config = config('Media'); + $config = config(MediaConfig::class); $fileManagerClass = $config->fileManagers[$config->fileManager]; $fileManager = new $fileManagerClass($config); diff --git a/modules/Media/Entities/BaseMedia.php b/modules/Media/Entities/BaseMedia.php index 6098edd0..5509296c 100644 --- a/modules/Media/Entities/BaseMedia.php +++ b/modules/Media/Entities/BaseMedia.php @@ -59,9 +59,9 @@ class BaseMedia extends Entity /** * @param array $data */ - public function setAttributes(array $data): self + public function injectRawData(array $data): static { - parent::setAttributes($data); + parent::injectRawData($data); $this->initFileProperties(); diff --git a/modules/Media/Entities/Image.php b/modules/Media/Entities/Image.php index b4b53499..af381455 100644 --- a/modules/Media/Entities/Image.php +++ b/modules/Media/Entities/Image.php @@ -54,9 +54,9 @@ class Image extends BaseMedia /** * @param array $data */ - public function setAttributes(array $data): self + public function injectRawData(array $data): static { - parent::setAttributes($data); + parent::injectRawData($data); if ($this->attributes === []) { return $this; diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index ca31bc23..aa2d2066 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -150,6 +150,6 @@ class FS implements FileManagerInterface $uri = trim($uri, '/'); - return config('Media')->storage . '/' . config('Media')->root . '/' . $uri; + return config(MediaConfig::class)->storage . '/' . config(MediaConfig::class)->root . '/' . $uri; } } diff --git a/modules/MediaClipper/Commands/Generate.php b/modules/MediaClipper/Commands/Generate.php index 9ceb0825..3d625e28 100644 --- a/modules/MediaClipper/Commands/Generate.php +++ b/modules/MediaClipper/Commands/Generate.php @@ -9,6 +9,7 @@ use CodeIgniter\CLI\BaseCommand; use CodeIgniter\Files\File; use CodeIgniter\I18n\Time; use Exception; +use Modules\Admin\Config\Admin; use Modules\MediaClipper\VideoClipper; class Generate extends BaseCommand @@ -24,7 +25,7 @@ class Generate extends BaseCommand // get number of running clips to prevent from having too much running in parallel // TODO: get the number of running ffmpeg processes directly from the machine? $runningVideoClips = (new ClipModel())->getRunningVideoClipsCount(); - if ($runningVideoClips >= config('Admin')->videoClipWorkers) { + if ($runningVideoClips >= config(Admin::class)->videoClipWorkers) { return; } diff --git a/modules/MediaClipper/VideoClipper.php b/modules/MediaClipper/VideoClipper.php index 6a09e53d..ea55c0c6 100644 --- a/modules/MediaClipper/VideoClipper.php +++ b/modules/MediaClipper/VideoClipper.php @@ -15,6 +15,7 @@ use Exception; use GdImage; use Modules\Media\Entities\Transcript; use Modules\Media\FileManagers\FileManagerInterface; +use Modules\MediaClipper\Config\MediaClipper; /** * TODO: refactor this by splitting process modules into different classes (image generation, subtitles clip, video @@ -80,9 +81,9 @@ class VideoClipper ) { $this->duration = $end - $start; $this->episodeNumbering = $this->episodeNumbering($this->episode->number, $this->episode->season_number); - $this->dimensions = config('MediaClipper') + $this->dimensions = config(MediaClipper::class) ->formats[$format]; - $this->colors = config('MediaClipper') + $this->colors = config(MediaClipper::class) ->themes[$theme]; /** @var FileManagerInterface $fileManager */ @@ -238,7 +239,7 @@ class VideoClipper ) . ":text='%{pts\:gmtime\:{$this->start}\:%H\\\\\\\\\\:%M\\\\\\\\\\:%S\}':x={$this->dimensions['timestamp']['x']}:y={$this->dimensions['timestamp']['y']}:fontsize={$this->dimensions['timestamp']['fontsize']}:fontcolor=0x{$this->colors['timestampText']}:box=1:boxcolor=0x{$this->colors['timestampBg']}:boxborderw={$this->dimensions['timestamp']['padding']}[v3]", "color=c=0x{$this->colors['progressbar']}:s={$this->dimensions['width']}x{$this->dimensions['progressbar']['height']}[progressbar]", "[v3][progressbar]overlay=-w+(w/{$this->duration})*t:0:shortest=1:format=rgb,subtitles={$this->subtitlesClipOutput}:fontsdir=" . config( - 'MediaClipper' + MediaClipper::class )->fontsFolder . ":force_style='Fontname=" . self::FONTS['subtitles'] . ",Alignment=5,Fontsize={$this->dimensions['subtitles']['fontsize']},PrimaryColour=&H{$this->colors['subtitles']}&,BorderStyle=1,Outline=0,Shadow=0,MarginL={$this->dimensions['subtitles']['marginL']},MarginR={$this->dimensions['subtitles']['marginR']},MarginV={$this->dimensions['subtitles']['marginV']}'[outv]", "[6:v]scale={$this->dimensions['watermark']['width']}:{$this->dimensions['watermark']['height']}[watermark]", "color=0x{$this->colors['watermarkBg']}:{$this->dimensions['watermark']['width']}x{$this->dimensions['watermark']['height']}[over]", @@ -247,7 +248,7 @@ class VideoClipper '[watermarked]scale=w=-1:h=-1:out_color_matrix=bt709[outfinal]', ]; - $watermark = config('MediaClipper') + $watermark = config(MediaClipper::class) ->watermark; $videoClipCmd = [ @@ -402,7 +403,7 @@ class VideoClipper ); // Add quotes for subtitles - $quotes = imagecreatefrompng(config('MediaClipper')->quotesImage); + $quotes = imagecreatefrompng(config(MediaClipper::class)->quotesImage); if (! $quotes) { return false; @@ -480,7 +481,7 @@ class VideoClipper private function getFont(string $name): string { - return config('MediaClipper')->fontsFolder . self::FONTS[$name]; + return config(MediaClipper::class)->fontsFolder . self::FONTS[$name]; } private function generateBackground(int $width, int $height): ?GdImage diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php index fc7ef61e..cb9f4029 100644 --- a/modules/PodcastImport/Commands/PodcastImport.php +++ b/modules/PodcastImport/Commands/PodcastImport.php @@ -21,6 +21,7 @@ use CodeIgniter\Shield\Entities\User; use Config\Services; use Exception; use League\HTMLToMarkdown\HtmlConverter; +use Modules\Auth\Config\AuthGroups; use Modules\Auth\Models\UserModel; use Modules\PodcastImport\Entities\PodcastImportTask; use Modules\PodcastImport\Entities\TaskStatus; @@ -256,7 +257,7 @@ class PodcastImport extends BaseCommand // set current user as podcast admin // 1. create new group - config('AuthGroups') + config(AuthGroups::class) ->generatePodcastAuthorizations($podcast->id); add_podcast_group($this->user, $podcast->id, 'admin'); diff --git a/modules/PodcastImport/Config/Routes.php b/modules/PodcastImport/Config/Routes.php index f9131da7..28f349d3 100644 --- a/modules/PodcastImport/Config/Routes.php +++ b/modules/PodcastImport/Config/Routes.php @@ -5,13 +5,13 @@ declare(strict_types=1); namespace Modules\PodcastImport\Config; use CodeIgniter\Router\RouteCollection; +use Modules\Admin\Config\Admin; /** @var RouteCollection $routes */ -$routes = service('routes'); // Admin routes for imports $routes->group( - config('Admin') + config(Admin::class) ->gateway, [ 'namespace' => 'Modules\PodcastImport\Controllers', diff --git a/modules/PremiumPodcasts/Config/Routes.php b/modules/PremiumPodcasts/Config/Routes.php index d21c34df..1da50e43 100644 --- a/modules/PremiumPodcasts/Config/Routes.php +++ b/modules/PremiumPodcasts/Config/Routes.php @@ -4,13 +4,16 @@ declare(strict_types=1); namespace Modules\PremiumPodcasts\Config; -$routes = service('routes'); +use CodeIgniter\Router\RouteCollection; +use Modules\Admin\Config\Admin; + +/** @var RouteCollection $routes */ $routes->addPlaceholder('podcastHandle', '[a-zA-Z0-9\_]{1,32}'); // Admin routes for subscriptions $routes->group( - config('Admin') + config(Admin::class) ->gateway, [ 'namespace' => 'Modules\PremiumPodcasts\Controllers', @@ -115,7 +118,7 @@ $routes->group( 'namespace' => 'Modules\PremiumPodcasts\Controllers', ], static function ($routes): void { - $routes->get('unlock', 'LockController/$1', [ + $routes->get('unlock', 'LockController::index/$1', [ 'as' => 'premium-podcast-unlock', ]); $routes->post('unlock', 'LockController::attemptUnlock/$1', [ diff --git a/modules/PremiumPodcasts/Filters/PodcastUnlockFilter.php b/modules/PremiumPodcasts/Filters/PodcastUnlockFilter.php index a4a1d3f8..4d149bee 100644 --- a/modules/PremiumPodcasts/Filters/PodcastUnlockFilter.php +++ b/modules/PremiumPodcasts/Filters/PodcastUnlockFilter.php @@ -4,12 +4,12 @@ declare(strict_types=1); namespace Modules\PremiumPodcasts\Filters; +use App\Entities\Episode; use App\Models\EpisodeModel; use CodeIgniter\Filters\FilterInterface; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\Router\Router; -use Config\App; use Modules\PremiumPodcasts\PremiumPodcasts; class PodcastUnlockFilter implements FilterInterface @@ -17,27 +17,16 @@ class PodcastUnlockFilter implements FilterInterface /** * Verifies that a user is logged in, or redirects to login. * - * @param array|null $params + * @param string[]|null $arguments * * @return mixed */ - public function before(RequestInterface $request, $params = null) + public function before(RequestInterface $request, $arguments = null) { if (! function_exists('is_unlocked')) { helper('premium_podcasts'); } - $current = (string) current_url(true) - ->setHost('') - ->setScheme('') - ->stripQuery('token'); - - $config = config(App::class); - if ($config->forceGlobalSecureRequests) { - // Remove "https:/" - $current = substr($current, 7); - } - /** @var Router $router */ $router = service('router'); $routerParams = $router->params(); @@ -52,20 +41,28 @@ class PodcastUnlockFilter implements FilterInterface } // Make sure this isn't already a premium podcast route - if ($current === route_to('premium-podcast-unlock', $routerParams[0])) { + if (url_is((string) route_to('premium-podcast-unlock', $routerParams[0]))) { + return; + } + + // expect 2 parameters (podcast handle and episode slug) + if (count($routerParams) < 2) { + return; + } + + $episode = (new EpisodeModel())->getEpisodeBySlug($routerParams[0], $routerParams[1]); + + if (! $episode instanceof Episode) { return; } // Make sure that public episodes are still accessible - if ($routerParams >= 2 && ($episode = (new EpisodeModel())->getEpisodeBySlug( - $routerParams[0], - $routerParams[1] - )) && ! $episode->is_premium) { + if (! $episode->is_premium) { return; } // Episode should be embeddable even if it is premium - if ($current === route_to('embed', $episode->podcast->handle, $episode->slug)) { + if (url_is((string) route_to('embed', $episode->podcast->handle, $episode->slug))) { return; } @@ -80,7 +77,7 @@ class PodcastUnlockFilter implements FilterInterface } /** - * @param array|null $arguments + * @param string[]|null $arguments */ public function after(RequestInterface $request, ResponseInterface $response, $arguments = null): void { diff --git a/modules/WebSub/Commands/Publish.php b/modules/WebSub/Commands/Publish.php index ddca5126..58f40fbb 100644 --- a/modules/WebSub/Commands/Publish.php +++ b/modules/WebSub/Commands/Publish.php @@ -9,6 +9,7 @@ use App\Models\PodcastModel; use CodeIgniter\CLI\BaseCommand; use CodeIgniter\HTTP\CURLRequest; use Exception; +use Modules\WebSub\Config\WebSub; class Publish extends BaseCommand { @@ -55,7 +56,7 @@ class Publish extends BaseCommand ], ]; - $hubUrls = config('WebSub') + $hubUrls = config(WebSub::class) ->hubs; foreach ($podcasts as $podcast) { diff --git a/public/index.php b/public/index.php index 4e0739e5..e4827629 100644 --- a/public/index.php +++ b/public/index.php @@ -22,7 +22,9 @@ if (version_compare(PHP_VERSION, $minPhpVersion, '<')) { define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR); // Ensure the current directory is pointing to the front controller's directory -chdir(FCPATH); +if (getcwd() . DIRECTORY_SEPARATOR !== FCPATH) { + chdir(FCPATH); +} /* *--------------------------------------------------------------- @@ -47,6 +49,16 @@ require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstra require_once SYSTEMPATH . 'Config/DotEnv.php'; (new DotEnv(ROOTPATH))->load(); +// Define ENVIRONMENT +if (! defined('ENVIRONMENT')) { + define('ENVIRONMENT', env('CI_ENVIRONMENT', 'production')); +} + +// Load Config Cache +// $factoriesCache = new \CodeIgniter\Cache\FactoriesCache(); +// $factoriesCache->load('config'); +// ^^^ Uncomment these lines if you want to use Config Caching. + /* * --------------------------------------------------------------- * GRAB OUR CODEIGNITER INSTANCE @@ -71,3 +83,11 @@ $app->setContext($context); */ $app->run(); + +// Save Config Cache +// $factoriesCache->save('config'); +// ^^^ Uncomment this line if you want to use Config Caching. + +// Exits the application, setting the exit code for CLI-based applications +// that might be watching. +exit(EXIT_SUCCESS); diff --git a/spark b/spark index 75150a39..f2bf19f4 100644 --- a/spark +++ b/spark @@ -78,6 +78,11 @@ require rtrim($paths->systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstra require_once SYSTEMPATH . 'Config/DotEnv.php'; (new CodeIgniter\Config\DotEnv(ROOTPATH))->load(); +// Define ENVIRONMENT +if (! defined('ENVIRONMENT')) { + define('ENVIRONMENT', env('CI_ENVIRONMENT', 'production')); +} + // Grab our CodeIgniter $app = Config\Services::codeigniter(); $app->initialize(); diff --git a/tests/modules/Api/Rest/V1/EpisodeTest.php b/tests/modules/Api/Rest/V1/EpisodeTest.php index 7a009764..ee389f12 100644 --- a/tests/modules/Api/Rest/V1/EpisodeTest.php +++ b/tests/modules/Api/Rest/V1/EpisodeTest.php @@ -8,6 +8,7 @@ use App\Database\Seeds\FakeSinglePodcastApiSeeder; use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\DatabaseTestTrait; use CodeIgniter\Test\FeatureTestTrait; +use Modules\Api\Rest\V1\Config\RestApi; class EpisodeTest extends CIUnitTestCase { @@ -54,7 +55,7 @@ class EpisodeTest extends CIUnitTestCase $this->episode['created_at'] = []; $this->episode['updated_at'] = []; - $this->apiUrl = config('RestApi') + $this->apiUrl = config(RestApi::class) ->gateway; } diff --git a/tests/modules/Api/Rest/V1/PodcastTest.php b/tests/modules/Api/Rest/V1/PodcastTest.php index e1552224..9f5bd45e 100644 --- a/tests/modules/Api/Rest/V1/PodcastTest.php +++ b/tests/modules/Api/Rest/V1/PodcastTest.php @@ -8,6 +8,7 @@ use App\Database\Seeds\FakeSinglePodcastApiSeeder; use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\DatabaseTestTrait; use CodeIgniter\Test\FeatureTestTrait; +use Modules\Api\Rest\V1\Config\RestApi; class PodcastTest extends CIUnitTestCase { @@ -52,7 +53,7 @@ class PodcastTest extends CIUnitTestCase $this->podcast = FakeSinglePodcastApiSeeder::podcast(); $this->podcast['created_at'] = []; $this->podcast['updated_at'] = []; - $this->podcastApiUrl = config('RestApi') + $this->podcastApiUrl = config(RestApi::class) ->gateway; } diff --git a/themes/cp_admin/episode/embed.php b/themes/cp_admin/episode/embed.php index 821402cb..f45eb4f7 100644 --- a/themes/cp_admin/episode/embed.php +++ b/themes/cp_admin/episode/embed.php @@ -1,7 +1,8 @@ height; +use Config\Embed; + +$embedHeight = config(Embed::class)->height; ?> diff --git a/themes/cp_admin/episode/video_clips_new.php b/themes/cp_admin/episode/video_clips_new.php index 15055c3a..e7cef5c1 100644 --- a/themes/cp_admin/episode/video_clips_new.php +++ b/themes/cp_admin/episode/video_clips_new.php @@ -1,3 +1,9 @@ + + extend('_layout') ?> section('title') ?> @@ -55,7 +61,7 @@
    - themes as $themeName => $colors): ?> + themes as $themeName => $colors): ?> + extend('_layout') ?> section('title') ?> @@ -43,7 +49,7 @@ accept=".png,.jpeg,.jpg" class="flex-1" /> - siteIcon['ico'] !== service('settings')->get('App.siteIcon')['ico']): ?> + siteIcon['ico'] !== service('settings')->get('App.siteIcon')['ico']): ?>
    <?= esc(service('settings')->get('App.siteName')) ?> Favicon diff --git a/themes/cp_admin/settings/theme.php b/themes/cp_admin/settings/theme.php index 4757a214..76f5bf41 100644 --- a/themes/cp_admin/settings/theme.php +++ b/themes/cp_admin/settings/theme.php @@ -1,3 +1,9 @@ + + extend('_layout') ?> section('title') ?> @@ -17,7 +23,7 @@ subtitle="">
    - themes as $themeName => $color): ?> + themes as $themeName => $color): ?> + -extend(config('Auth')->views['layout']) ?> +extend(config(Auth::class)->views['layout']) ?> section('title') ?> endSection() ?> diff --git a/themes/cp_auth/email_2fa_verify.php b/themes/cp_auth/email_2fa_verify.php index 18c67156..4f321b4d 100644 --- a/themes/cp_auth/email_2fa_verify.php +++ b/themes/cp_auth/email_2fa_verify.php @@ -1,5 +1,10 @@ + -extend(config('Auth')->views['layout']) ?> +extend(config(Auth::class)->views['layout']) ?> section('title') ?> endSection() ?> diff --git a/themes/cp_auth/email_activate_show.php b/themes/cp_auth/email_activate_show.php index d0d93d73..d02e3307 100644 --- a/themes/cp_auth/email_activate_show.php +++ b/themes/cp_auth/email_activate_show.php @@ -1,5 +1,10 @@ + -extend(config('Auth')->views['layout']) ?> +extend(config(Auth::class)->views['layout']) ?> section('title') ?>endSection() ?> diff --git a/themes/cp_auth/login.php b/themes/cp_auth/login.php index 34d2849e..d2d86ba9 100644 --- a/themes/cp_auth/login.php +++ b/themes/cp_auth/login.php @@ -1,5 +1,10 @@ + -extend(config('Auth')->views['layout']) ?> +extend(config(Auth::class)->views['layout']) ?> section('title') ?>endSection() ?> diff --git a/themes/cp_auth/magic_link_form.php b/themes/cp_auth/magic_link_form.php index b4f9c978..2d8a47dc 100644 --- a/themes/cp_auth/magic_link_form.php +++ b/themes/cp_auth/magic_link_form.php @@ -1,5 +1,10 @@ + -extend(config('Auth')->views['layout']) ?> +extend(config(Auth::class)->views['layout']) ?> section('title') ?> endSection() ?> diff --git a/themes/cp_auth/magic_link_message.php b/themes/cp_auth/magic_link_message.php index ade1b651..af85d821 100644 --- a/themes/cp_auth/magic_link_message.php +++ b/themes/cp_auth/magic_link_message.php @@ -1,4 +1,9 @@ -extend(config('Auth')->views['layout']) ?> + +extend(config(Auth::class)->views['layout']) ?> section('title') ?> endSection() ?> diff --git a/themes/cp_auth/magic_link_set_password.php b/themes/cp_auth/magic_link_set_password.php index 64d85614..919daa28 100644 --- a/themes/cp_auth/magic_link_set_password.php +++ b/themes/cp_auth/magic_link_set_password.php @@ -1,5 +1,10 @@ + -extend(config('Auth')->views['layout']) ?> +extend(config(Auth::class)->views['layout']) ?> section('title') ?> diff --git a/themes/cp_auth/register.php b/themes/cp_auth/register.php index af5e06df..ab7c6c40 100644 --- a/themes/cp_auth/register.php +++ b/themes/cp_auth/register.php @@ -1,5 +1,10 @@ + -extend(config('Auth')->views['layout']) ?> +extend(config(Auth::class)->views['layout']) ?> section('title') ?> diff --git a/themes/cp_install/database_config.php b/themes/cp_install/database_config.php index 45aa4586..6fa5c2e2 100644 --- a/themes/cp_install/database_config.php +++ b/themes/cp_install/database_config.php @@ -1,3 +1,8 @@ + extend('_layout') ?> section('content') ?> @@ -21,27 +26,27 @@ @@ -50,7 +55,7 @@ name="db_prefix" label="" hint="" - value="default['DBPrefix'] ?>" /> + value="default['DBPrefix'] ?>" /> diff --git a/themes/cp_install/instance_config.php b/themes/cp_install/instance_config.php index 9d613e1f..f51a2859 100644 --- a/themes/cp_install/instance_config.php +++ b/themes/cp_install/instance_config.php @@ -1,8 +1,16 @@ + extend('_layout') ?> section('content') ?> -
    +
    @@ -13,8 +21,7 @@ From 77c2d08b6e0cdf1d8d7fd4661d6ba25ffac3cf98 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 29 Aug 2023 12:58:20 +0000 Subject: [PATCH 209/477] build: add phpstan-codeigniter extension to manage config(), model() and service() functions --- app/Controllers/EpisodeAudioController.php | 6 +- app/Controllers/EpisodeController.php | 4 +- app/Controllers/FeedController.php | 2 +- app/Helpers/url_helper.php | 9 +- composer.json | 10 +- composer.lock | 111 +++++++++++++++++- .../Fediverse/Controllers/ActorController.php | 17 +-- .../Fediverse/Controllers/PostController.php | 2 +- modules/Fediverse/Entities/Actor.php | 2 +- modules/Fediverse/Entities/Post.php | 4 +- .../Fediverse/Helpers/fediverse_helper.php | 18 +-- modules/Fediverse/WebFinger.php | 3 +- modules/PremiumPodcasts/Config/Services.php | 8 +- phpstan.neon | 25 +++- rector.php | 1 + 15 files changed, 181 insertions(+), 41 deletions(-) diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php index fadb311f..4c94cf80 100644 --- a/app/Controllers/EpisodeAudioController.php +++ b/app/Controllers/EpisodeAudioController.php @@ -101,9 +101,9 @@ class EpisodeAudioController extends Controller $subscription = null; // check if podcast is already unlocked before any token validation - if ($this->episode->is_premium && ($subscription = service('premium_podcasts')->subscription( + if ($this->episode->is_premium && ! ($subscription = service('premium_podcasts')->subscription( $this->episode->podcast->handle - )) === null) { + )) instanceof Subscription) { // look for token as GET parameter if (($token = $this->request->getGet('token')) === null) { return $this->response->setStatusCode(401) @@ -164,7 +164,7 @@ class EpisodeAudioController extends Controller $audioDuration, $this->episode->published_at->getTimestamp(), $serviceName, - $subscription !== null ? $subscription->id : null + $subscription instanceof Subscription ? $subscription->id : null ); return redirect()->to($this->analyticsConfig->getAudioUrl($this->episode, $this->request->getGet())); diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index 7ca30bb1..00d87eeb 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -177,8 +177,8 @@ class EpisodeController extends BaseController $session = Services::session(); $session->start(); - if (isset($_SERVER['HTTP_REFERER'])) { - $session->set('embed_domain', parse_url((string) $_SERVER['HTTP_REFERER'], PHP_URL_HOST)); + if (service('superglobals')->server('HTTP_REFERER') !== null) { + $session->set('embed_domain', parse_url(service('superglobals')->server('HTTP_REFERER'), PHP_URL_HOST)); } $cacheName = implode( diff --git a/app/Controllers/FeedController.php b/app/Controllers/FeedController.php index fbf742f9..a99cfcda 100644 --- a/app/Controllers/FeedController.php +++ b/app/Controllers/FeedController.php @@ -43,7 +43,7 @@ class FeedController extends Controller $service = null; try { - $service = UserAgentsRSS::find($_SERVER['HTTP_USER_AGENT']); + $service = UserAgentsRSS::find(service('superglobals')->server('HTTP_USER_AGENT')); } catch (Exception $exception) { // If things go wrong the show must go on and the user must be able to download the file log_message('critical', $exception->getMessage()); diff --git a/app/Helpers/url_helper.php b/app/Helpers/url_helper.php index b5e53c17..656c8459 100644 --- a/app/Helpers/url_helper.php +++ b/app/Helpers/url_helper.php @@ -16,13 +16,14 @@ if (! function_exists('host_url')) { */ function host_url(): ?string { - if (isset($_SERVER['HTTP_HOST'])) { + $superglobals = service('superglobals'); + if ($superglobals->server('HTTP_HOST') !== null) { $protocol = - (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || - $_SERVER['SERVER_PORT'] === 443 + ($superglobals->server('HTTPS') !== null && $superglobals->server('HTTPS') !== 'off') || + (int) $superglobals->server('SERVER_PORT') === 443 ? 'https://' : 'http://'; - return $protocol . $_SERVER['HTTP_HOST'] . '/'; + return $protocol . $superglobals->server('HTTP_HOST') . '/'; } return null; diff --git a/composer.json b/composer.json index 644be9a3..88e8a0d2 100644 --- a/composer.json +++ b/composer.json @@ -29,13 +29,15 @@ "yassinedoghri/podcast-feed": "dev-main" }, "require-dev": { - "mikey179/vfsstream": "^v1.6.11", - "phpunit/phpunit": "^10.3.2", "captainhook/captainhook": "^5.16.4", - "symplify/easy-coding-standard": "^12.0.7", + "codeigniter/phpstan-codeigniter": "^1.0", + "mikey179/vfsstream": "^v1.6.11", + "phpstan/extension-installer": "^1.3", "phpstan/phpstan": "^1.10.32", + "phpunit/phpunit": "^10.3.2", "rector/rector": "^0.18.0", - "symplify/coding-standard": "^12.0.3" + "symplify/coding-standard": "^12.0.3", + "symplify/easy-coding-standard": "^12.0.7" }, "autoload": { "exclude-from-classmap": [ diff --git a/composer.lock b/composer.lock index 970c6488..e4fc770f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4526c68d78e5abe8e5c86016356e15f9", + "content-hash": "02db4cf9b79f67dad431f7d10f5c19f4", "packages": [ { "name": "adaures/ipcat-php", @@ -3224,6 +3224,73 @@ ], "time": "2023-04-17T19:48:47+00:00" }, + { + "name": "codeigniter/phpstan-codeigniter", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/CodeIgniter/phpstan-codeigniter.git", + "reference": "2c6eebd9798e463ea8596493bd068310b7a701d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/2c6eebd9798e463ea8596493bd068310b7a701d9", + "reference": "2c6eebd9798e463ea8596493bd068310b7a701d9", + "shasum": "" + }, + "require": { + "php": "^8.1", + "phpstan/phpstan": "^1.10" + }, + "conflict": { + "codeigniter/framework": "*" + }, + "require-dev": { + "codeigniter/coding-standard": "^1.7", + "codeigniter4/framework": "^4.3", + "friendsofphp/php-cs-fixer": "^3.20", + "nexusphp/cs-config": "^3.12", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "^10.2" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": ["extension.neon"] + } + }, + "autoload": { + "psr-4": { + "CodeIgniter\\PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "John Paul E. Balandan, CPA", + "email": "paulbalandan@gmail.com" + } + ], + "description": "CodeIgniter extensions and rules for PHPStan", + "keywords": [ + "PHPStan", + "codeigniter", + "codeigniter4", + "dev", + "static analysis" + ], + "support": { + "forum": "http://forum.codeigniter.com/", + "issues": "https://github.com/CodeIgniter/phpstan-codeigniter/issues", + "slack": "https://codeigniterchat.slack.com", + "source": "https://github.com/CodeIgniter/phpstan-codeigniter" + }, + "time": "2023-08-27T09:19:23+00:00" + }, { "name": "composer/pcre", "version": "3.1.0", @@ -3905,6 +3972,48 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "phpstan/extension-installer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f45734bfb9984c6c56c4486b71230355f066a58a", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.3.1" + }, + "time": "2023-05-24T08:59:17+00:00" + }, { "name": "phpstan/phpstan", "version": "1.10.32", diff --git a/modules/Fediverse/Controllers/ActorController.php b/modules/Fediverse/Controllers/ActorController.php index 8e725dee..589a3ff8 100644 --- a/modules/Fediverse/Controllers/ActorController.php +++ b/modules/Fediverse/Controllers/ActorController.php @@ -17,6 +17,7 @@ use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\I18n\Time; use Exception; use Modules\Fediverse\Config\Fediverse; +use Modules\Fediverse\Entities\Activity; use Modules\Fediverse\Entities\Actor; use Modules\Fediverse\Entities\Post; use Modules\Fediverse\Objects\OrderedCollectionObject; @@ -45,7 +46,7 @@ class ActorController extends Controller } if ( - ($actor = model('ActorModel', false)->getActorByUsername($params[0])) === null + ! ($actor = model('ActorModel', false)->getActorByUsername($params[0])) instanceof Actor ) { throw PageNotFoundException::forPageNotFound(); } @@ -101,7 +102,7 @@ class ActorController extends Controller ->getPostByUri($payload->object->inReplyTo); $reply = null; - if ($replyToPost !== null) { + if ($replyToPost instanceof Post) { // TODO: strip content from html to retrieve message // remove all html tags and reconstruct message with mentions? $message = get_message_from_object($payload->object); @@ -136,7 +137,7 @@ class ActorController extends Controller $postToDelete = model('PostModel', false) ->getPostByUri($payload->object->id); - if ($postToDelete !== null) { + if ($postToDelete instanceof Post) { model('PostModel', false) ->removePost($postToDelete, false); } @@ -160,7 +161,7 @@ class ActorController extends Controller $post = model('PostModel', false) ->getPostByUri($payload->object); - if ($post !== null) { + if ($post instanceof Post) { // Like side-effect model('FavouriteModel', false) ->addFavourite($payloadActor, $post, false); @@ -177,7 +178,7 @@ class ActorController extends Controller $post = model('PostModel', false) ->getPostByUri($payload->object); - if ($post !== null) { + if ($post instanceof Post) { model('ActivityModel', false) ->update($activityId, [ 'post_id' => $post->id, @@ -205,7 +206,7 @@ class ActorController extends Controller $post = model('PostModel', false) ->getPostByUri($payload->object->object); - if ($post !== null) { + if ($post instanceof Post) { // revert side-effect by removing favourite from database model('FavouriteModel', false) ->removeFavourite($payloadActor, $post, false); @@ -223,7 +224,7 @@ class ActorController extends Controller ->getPostByUri($payload->object->object); $reblogPost = null; - if ($post !== null) { + if ($post instanceof Post) { $reblogPost = model('PostModel', false) ->where([ 'actor_id' => $payloadActor->id, @@ -374,7 +375,7 @@ class ActorController extends Controller public function activity(string $activityId): ResponseInterface { if ( - ! ($activity = model('ActivityModel', false)->getActivityById($activityId)) + ! ($activity = model('ActivityModel', false)->getActivityById($activityId)) instanceof Activity ) { throw PageNotFoundException::forPageNotFound(); } diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php index 267e818e..8837521c 100644 --- a/modules/Fediverse/Controllers/PostController.php +++ b/modules/Fediverse/Controllers/PostController.php @@ -50,7 +50,7 @@ class PostController extends Controller public function _remap(string $method, string ...$params): mixed { - if (($post = model('PostModel', false)->getPostById($params[0])) === null) { + if (! ($post = model('PostModel', false)->getPostById($params[0])) instanceof Post) { throw PageNotFoundException::forPageNotFound(); } diff --git a/modules/Fediverse/Entities/Actor.php b/modules/Fediverse/Entities/Actor.php index 97948796..1a7a3f6c 100644 --- a/modules/Fediverse/Entities/Actor.php +++ b/modules/Fediverse/Entities/Actor.php @@ -102,7 +102,7 @@ class Actor extends Entity } if ($this->followers === null) { - $this->followers = (array) model('ActorModel', false) + $this->followers = model('ActorModel', false) ->getFollowers($this->id); } diff --git a/modules/Fediverse/Entities/Post.php b/modules/Fediverse/Entities/Post.php index 45f43bee..f0990601 100644 --- a/modules/Fediverse/Entities/Post.php +++ b/modules/Fediverse/Entities/Post.php @@ -126,7 +126,7 @@ class Post extends UuidEntity } if ($this->replies === null) { - $this->replies = (array) model('PostModel', false) + $this->replies = model('PostModel', false) ->getPostReplies($this->id); } @@ -162,7 +162,7 @@ class Post extends UuidEntity } if ($this->reblogs === null) { - $this->reblogs = (array) model('PostModel', false) + $this->reblogs = model('PostModel', false) ->getPostReblogs($this->id); } diff --git a/modules/Fediverse/Helpers/fediverse_helper.php b/modules/Fediverse/Helpers/fediverse_helper.php index 53f662f2..5a6a3004 100644 --- a/modules/Fediverse/Helpers/fediverse_helper.php +++ b/modules/Fediverse/Helpers/fediverse_helper.php @@ -212,8 +212,8 @@ if (! function_exists('get_or_create_preview_card_from_url')) { { // check if preview card has already been generated if ( - $previewCard = model('PreviewCardModel', false) - ->getPreviewCardFromUrl((string) $url) + ($previewCard = model('PreviewCardModel', false) + ->getPreviewCardFromUrl((string) $url)) instanceof PreviewCard ) { return $previewCard; } @@ -231,7 +231,7 @@ if (! function_exists('get_or_create_actor_from_uri')) { function get_or_create_actor_from_uri(string $actorUri): ?Actor { // check if actor exists in database already and return it - if ($actor = model('ActorModel', false)->getActorByUri($actorUri)) { + if (($actor = model('ActorModel', false)->getActorByUri($actorUri)) instanceof Actor) { return $actor; } @@ -249,8 +249,8 @@ if (! function_exists('get_or_create_actor')) { { // check if actor exists in database already and return it if ( - $actor = model('ActorModel', false) - ->getActorByUsername($username, $domain) + ($actor = model('ActorModel', false) + ->getActorByUsername($username, $domain)) instanceof Actor ) { return $actor; } @@ -412,9 +412,9 @@ if (! function_exists('linkify')) { // check if host is set and look for actor in database if (isset($match['host'])) { if ( - $actor = model( + ($actor = model( 'ActorModel', - )->getActorByUsername($match['username'], $match['domain']) + )->getActorByUsername($match['username'], $match['domain'])) instanceof Actor ) { // TODO: check that host is local to remove target blank? return '<' . @@ -447,8 +447,8 @@ if (! function_exists('linkify')) { } } else { if ( - $actor = model('ActorModel', false) - ->getActorByUsername($match['username']) + ($actor = model('ActorModel', false) + ->getActorByUsername($match['username'])) instanceof Actor ) { return '<' . array_push($links, anchor($actor->uri, $match[0])) . diff --git a/modules/Fediverse/WebFinger.php b/modules/Fediverse/WebFinger.php index fd731ad8..788e0fdf 100644 --- a/modules/Fediverse/WebFinger.php +++ b/modules/Fediverse/WebFinger.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Modules\Fediverse; use Exception; +use Modules\Fediverse\Entities\Actor; class WebFinger { @@ -62,7 +63,7 @@ class WebFinger } if ( - ! ($actor = model('ActorModel', false)->getActorByUsername($username, $domain)) + ! ($actor = model('ActorModel', false)->getActorByUsername($username, $domain)) instanceof Actor ) { throw new Exception('Could not find actor'); } diff --git a/modules/PremiumPodcasts/Config/Services.php b/modules/PremiumPodcasts/Config/Services.php index c8fb03b4..54250431 100644 --- a/modules/PremiumPodcasts/Config/Services.php +++ b/modules/PremiumPodcasts/Config/Services.php @@ -4,14 +4,16 @@ declare(strict_types=1); namespace Modules\PremiumPodcasts\Config; -use Config\Services as BaseService; +use CodeIgniter\Config\BaseService; use Modules\PremiumPodcasts\Models\SubscriptionModel; use Modules\PremiumPodcasts\PremiumPodcasts; class Services extends BaseService { - public static function premium_podcasts(?SubscriptionModel $subscriptionModel = null, bool $getShared = true) - { + public static function premium_podcasts( + ?SubscriptionModel $subscriptionModel = null, + bool $getShared = true + ): PremiumPodcasts { if ($getShared) { return self::getSharedInstance('premium_podcasts', $subscriptionModel); } diff --git a/phpstan.neon b/phpstan.neon index b5a2a9f5..183ded38 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -16,11 +16,34 @@ parameters: - app/Views/* - modules/*/Views/* - themes/* + codeigniter: + additionalConfigNamespaces: + - Modules\Admin\Config\ + - Modules\Analytics\Config\ + - Modules\Api\Rest\V1\Config\ + - Modules\Auth\Config\ + - Modules\Fediverse\Config\ + - Modules\Install\Config\ + - Modules\Media\Config\ + - Modules\MediaClipper\Config\ + - Modules\PodcastImport\Config\ + - Modules\PremiumPodcasts\Config\ + - Modules\WebSub\Config\ + additionalModelNamespaces: + - Modules\Analytics\Models\ + - Modules\Auth\Models\ + - Modules\Fediverse\Models\ + - Modules\Media\Models\ + - Modules\PremiumPodcasts\Models\ + additionalServices: + - CodeIgniter\Settings\Config\Services + - Michalsn\Uuid\Config\Services + - Modules\PremiumPodcasts\Config\Services + - Modules\Media\Config\Services dynamicConstantNames: - APP_NAMESPACE - CI_DEBUG - ENVIRONMENT - SODIUM_LIBRARY_VERSION ignoreErrors: - - '#^Access to an undefined property Modules\\Media\\Entities\\Image#' - '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#' diff --git a/rector.php b/rector.php index 782fdda8..ef860a13 100644 --- a/rector.php +++ b/rector.php @@ -71,4 +71,5 @@ return static function (RectorConfig $rectorConfig): void { // Path to phpstan with extensions, that PHPStan in Rector uses to determine types $rectorConfig->phpstanConfig(__DIR__ . '/phpstan.neon'); + $rectorConfig->phpstanConfigs(['vendor/codeigniter/phpstan-codeigniter/extension.neon']); }; From 3c357183ca51545787fcfc801b4a5829d9cd8ad6 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 29 Aug 2023 13:29:01 +0000 Subject: [PATCH 210/477] fix: use podcast-activity named route instead of not existing actor route --- app/Models/PodcastModel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 63863b7d..40e94720 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -417,7 +417,7 @@ class PodcastModel extends Model $actorId = (new ActorModel())->insert( [ - 'uri' => url_to('actor', $username), + 'uri' => url_to('podcast-activity', $username), 'username' => $username, 'domain' => $domain, 'private_key' => $privatekey, From ff0e6817631c6819348be6819d86cad4e7805094 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 29 Aug 2023 14:30:12 +0000 Subject: [PATCH 211/477] docs: update php version requirement in install page --- docs/src/getting-started/install.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/getting-started/install.md b/docs/src/getting-started/install.md index af405daf..d2eae5eb 100644 --- a/docs/src/getting-started/install.md +++ b/docs/src/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) From 2c07070b2c873cbb026c374b3e7abafb695833d5 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 29 Aug 2023 15:42:52 +0000 Subject: [PATCH 212/477] refactor: use Validation::getValidated() when using $this->validate() in controllers --- app/Controllers/PostController.php | 14 +++++--- .../Admin/Controllers/EpisodeController.php | 20 +++++++---- .../Controllers/EpisodePersonController.php | 4 ++- .../Admin/Controllers/PodcastController.php | 12 ++++--- .../Controllers/PodcastPersonController.php | 4 ++- .../Admin/Controllers/SoundbiteController.php | 8 +++-- .../Controllers/VideoClipsController.php | 12 ++++--- .../Auth/Controllers/InteractController.php | 4 ++- .../Auth/Controllers/MagicLinkController.php | 4 ++- .../Auth/Controllers/MyAccountController.php | 6 ++-- .../Fediverse/Controllers/ActorController.php | 4 ++- .../Fediverse/Controllers/BlockController.php | 16 ++++++--- .../Fediverse/Controllers/PostController.php | 24 +++++++++---- .../Install/Controllers/InstallController.php | 34 ++++++++++++------- .../Controllers/PodcastImportController.php | 13 ++++--- .../Controllers/LockController.php | 7 ++-- .../Controllers/SubscriptionController.php | 4 ++- public/media/site/index.html | 9 ----- 18 files changed, 129 insertions(+), 70 deletions(-) diff --git a/app/Controllers/PostController.php b/app/Controllers/PostController.php index 9a6fccb2..6148e27c 100644 --- a/app/Controllers/PostController.php +++ b/app/Controllers/PostController.php @@ -125,7 +125,9 @@ class PostController extends FediversePostController ->with('errors', $this->validator->getErrors()); } - $message = $this->request->getPost('message'); + $validData = $this->validator->getValidated(); + + $message = $validData['message']; $newPost = new CastopodPost([ 'actor_id' => interact_as_actor_id(), @@ -134,7 +136,7 @@ class PostController extends FediversePostController ]); // get episode if episodeUrl has been set - $episodeUri = $this->request->getPost('episode_url'); + $episodeUri = $validData['episode_url']; if ( $episodeUri && ($params = extract_params_from_episode_uri(new URI($episodeUri))) && @@ -173,10 +175,12 @@ class PostController extends FediversePostController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $newPost = new CastopodPost([ 'actor_id' => interact_as_actor_id(), 'in_reply_to_id' => $this->post->id, - 'message' => $this->request->getPost('message'), + 'message' => $validData['message'], 'published_at' => Time::now(), 'created_by' => user_id(), ]); @@ -224,7 +228,9 @@ class PostController extends FediversePostController ->with('errors', $this->validator->getErrors()); } - $action = $this->request->getPost('action'); + $validData = $this->validator->getValidated(); + + $action = $validData['action']; return match ($action) { 'favourite' => $this->attemptFavourite(), 'reblog' => $this->attemptReblog(), diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 86d084ee..58933535 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -175,9 +175,11 @@ class EpisodeController extends BaseController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + if ((new EpisodeModel()) ->where([ - 'slug' => $this->request->getPost('slug'), + 'slug' => $validData['slug'], 'podcast_id' => $this->podcast->id, ]) ->first()) { @@ -310,8 +312,10 @@ class EpisodeController extends BaseController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $this->episode->title = $this->request->getPost('title'); - $this->episode->slug = $this->request->getPost('slug'); + $this->episode->slug = $validData['slug']; $this->episode->description_markdown = $this->request->getPost('description'); $this->episode->location = $this->request->getPost('location_name') === '' ? null : new Location( $this->request->getPost('location_name') @@ -745,7 +749,9 @@ class EpisodeController extends BaseController ->with('errors', $this->validator->getErrors()); } - $newPublicationDate = $this->request->getPost('new_publication_date'); + $validData = $this->validator->getValidated(); + + $newPublicationDate = $validData['new_publication_date']; $newPublicationDate = Time::createFromFormat( 'Y-m-d H:i', @@ -994,12 +1000,12 @@ class EpisodeController extends BaseController ->with('errors', $this->validator->getErrors()); } - $message = $this->request->getPost('message'); + $validData = $this->validator->getValidated(); $newComment = new EpisodeComment([ 'actor_id' => interact_as_actor_id(), 'episode_id' => $this->episode->id, - 'message' => $message, + 'message' => $validData['message'], 'created_at' => new Time('now'), 'created_by' => user_id(), ]); @@ -1031,12 +1037,12 @@ class EpisodeController extends BaseController ->with('errors', $this->validator->getErrors()); } - $message = $this->request->getPost('message'); + $validData = $this->validator->getValidated(); $newReply = new EpisodeComment([ 'actor_id' => interact_as_actor_id(), 'episode_id' => $this->episode->id, - 'message' => $message, + 'message' => $validData['message'], 'in_reply_to_id' => $commentId, 'created_at' => new Time('now'), 'created_by' => user_id(), diff --git a/modules/Admin/Controllers/EpisodePersonController.php b/modules/Admin/Controllers/EpisodePersonController.php index b89febe7..8b10ea60 100644 --- a/modules/Admin/Controllers/EpisodePersonController.php +++ b/modules/Admin/Controllers/EpisodePersonController.php @@ -78,10 +78,12 @@ class EpisodePersonController extends BaseController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + (new PersonModel())->addEpisodePersons( $this->podcast->id, $this->episode->id, - $this->request->getPost('persons'), + $validData['persons'], $this->request->getPost('roles') ?? [], ); diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index bca38a66..7cf5618e 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -650,12 +650,14 @@ class PodcastController extends BaseController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $db = db_connect(); $db->transStart(); - $publishMethod = $this->request->getPost('publication_method'); + $publishMethod = $validData['publication_method']; if ($publishMethod === 'schedule') { - $scheduledPublicationDate = $this->request->getPost('scheduled_publication_date'); + $scheduledPublicationDate = $validData['scheduled_publication_date']; if ($scheduledPublicationDate) { $this->podcast->published_at = Time::createFromFormat( 'Y-m-d H:i', @@ -783,12 +785,14 @@ class PodcastController extends BaseController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $db = db_connect(); $db->transStart(); - $publishMethod = $this->request->getPost('publication_method'); + $publishMethod = $validData['publication_method']; if ($publishMethod === 'schedule') { - $scheduledPublicationDate = $this->request->getPost('scheduled_publication_date'); + $scheduledPublicationDate = $validData['scheduled_publication_date']; if ($scheduledPublicationDate) { $this->podcast->published_at = Time::createFromFormat( 'Y-m-d H:i', diff --git a/modules/Admin/Controllers/PodcastPersonController.php b/modules/Admin/Controllers/PodcastPersonController.php index b849fd97..911653c1 100644 --- a/modules/Admin/Controllers/PodcastPersonController.php +++ b/modules/Admin/Controllers/PodcastPersonController.php @@ -65,9 +65,11 @@ class PodcastPersonController extends BaseController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + (new PersonModel())->addPodcastPersons( $this->podcast->id, - $this->request->getPost('persons'), + $validData['persons'], $this->request->getPost('roles') ?? [], ); diff --git a/modules/Admin/Controllers/SoundbiteController.php b/modules/Admin/Controllers/SoundbiteController.php index 61eea65d..e040404a 100644 --- a/modules/Admin/Controllers/SoundbiteController.php +++ b/modules/Admin/Controllers/SoundbiteController.php @@ -114,10 +114,12 @@ class SoundbiteController extends BaseController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $newSoundbite = new Soundbite([ - 'title' => $this->request->getPost('title'), - 'start_time' => (float) $this->request->getPost('start_time'), - 'duration' => (float) $this->request->getPost('duration'), + 'title' => $validData['title'], + 'start_time' => (float) $validData['start_time'], + 'duration' => (float) $validData['duration'], 'type' => 'audio', 'status' => '', 'podcast_id' => $this->podcast->id, diff --git a/modules/Admin/Controllers/VideoClipsController.php b/modules/Admin/Controllers/VideoClipsController.php index a7205003..0d5ff0dc 100644 --- a/modules/Admin/Controllers/VideoClipsController.php +++ b/modules/Admin/Controllers/VideoClipsController.php @@ -157,7 +157,9 @@ class VideoClipsController extends BaseController ->with('errors', $this->validator->getErrors()); } - $themeName = $this->request->getPost('theme'); + $validData = $this->validator->getValidated(); + + $themeName = $validData['theme']; $themeColors = config(MediaClipper::class) ->themes[$themeName]; $theme = [ @@ -166,11 +168,11 @@ class VideoClipsController extends BaseController ]; $videoClip = new VideoClip([ - 'title' => $this->request->getPost('title'), - 'start_time' => (float) $this->request->getPost('start_time'), - 'duration' => (float) $this->request->getPost('duration'), + 'title' => $validData['title'], + 'start_time' => (float) $validData['start_time'], + 'duration' => (float) $validData['duration'], 'theme' => $theme, - 'format' => $this->request->getPost('format'), + 'format' => $validData['format'], 'type' => 'video', 'status' => 'queued', 'podcast_id' => $this->podcast->id, diff --git a/modules/Auth/Controllers/InteractController.php b/modules/Auth/Controllers/InteractController.php index b917149b..58dae0cf 100644 --- a/modules/Auth/Controllers/InteractController.php +++ b/modules/Auth/Controllers/InteractController.php @@ -27,9 +27,11 @@ class InteractController extends Controller ->with('errors', service('validation')->getErrors()); } + $validData = $this->validator->getValidated(); + helper('auth'); - set_interact_as_actor((int) $this->request->getPost('actor_id')); + set_interact_as_actor((int) $validData['actor_id']); return redirect()->back(); } diff --git a/modules/Auth/Controllers/MagicLinkController.php b/modules/Auth/Controllers/MagicLinkController.php index 92223de5..305cfe7b 100644 --- a/modules/Auth/Controllers/MagicLinkController.php +++ b/modules/Auth/Controllers/MagicLinkController.php @@ -53,10 +53,12 @@ class MagicLinkController extends ShieldMagicLinkController ->with('errors', $userModel->errors()); } + $validData = $this->validator->getValidated(); + // set new password to user auth() ->user() - ->password = $this->request->getPost('new_password'); + ->password = $validData['new_password']; if (! $userModel->update(auth()->user()->id, auth()->user())) { return redirect() diff --git a/modules/Auth/Controllers/MyAccountController.php b/modules/Auth/Controllers/MyAccountController.php index d4902575..7fad8a37 100644 --- a/modules/Auth/Controllers/MyAccountController.php +++ b/modules/Auth/Controllers/MyAccountController.php @@ -43,12 +43,14 @@ class MyAccountController extends BaseController ->with('errors', $userModel->errors()); } + $validData = $this->validator->getValidated(); + // check credentials with the old password if logged in without magic link $credentials = [ 'email' => auth() ->user() ->email, - 'password' => $this->request->getPost('password'), + 'password' => $validData['password'], ]; $validCreds = auth() @@ -62,7 +64,7 @@ class MyAccountController extends BaseController // set new password to user auth() ->user() - ->password = $this->request->getPost('new_password'); + ->password = $validData['new_password']; if (! $userModel->update(auth()->user()->id, auth()->user())) { return redirect() diff --git a/modules/Fediverse/Controllers/ActorController.php b/modules/Fediverse/Controllers/ActorController.php index 589a3ff8..813b8f52 100644 --- a/modules/Fediverse/Controllers/ActorController.php +++ b/modules/Fediverse/Controllers/ActorController.php @@ -334,13 +334,15 @@ class ActorController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + helper('text'); // get webfinger data from actor // parse actor id to get actor and domain // check if actor and domain exist - $handle = $this->request->getPost('handle'); + $handle = $validData['handle']; $parts = split_handle($handle); try { diff --git a/modules/Fediverse/Controllers/BlockController.php b/modules/Fediverse/Controllers/BlockController.php index abf6a7c4..6ab44e17 100644 --- a/modules/Fediverse/Controllers/BlockController.php +++ b/modules/Fediverse/Controllers/BlockController.php @@ -34,7 +34,9 @@ class BlockController extends Controller ->with('errors', $this->validator->getErrors()); } - $handle = $this->request->getPost('handle'); + $validData = $this->validator->getValidated(); + + $handle = $validData['handle']; if ($parts = split_handle($handle)) { try { @@ -69,8 +71,10 @@ class BlockController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + model('ActorModel', false) - ->unblockActor((int) $this->request->getPost('actor_id')); + ->unblockActor((int) $validData['actor_id']); return redirect()->back() ->with('message', lang('Fediverse.messages.unblockActorSuccess')); @@ -89,7 +93,9 @@ class BlockController extends Controller ->with('errors', $this->validator->getErrors()); } - $domain = $this->request->getPost('domain'); + $validData = $this->validator->getValidated(); + + $domain = $validData['domain']; model('BlockedDomainModel', false) ->blockDomain($domain); @@ -112,7 +118,9 @@ class BlockController extends Controller ->with('errors', $this->validator->getErrors()); } - $domain = $this->request->getPost('domain'); + $validData = $this->validator->getValidated(); + + $domain = $validData['domain']; model('BlockedDomainModel', false) ->unblockDomain($domain); diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php index 8837521c..a1348642 100644 --- a/modules/Fediverse/Controllers/PostController.php +++ b/modules/Fediverse/Controllers/PostController.php @@ -123,9 +123,11 @@ class PostController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $newPost = new Post([ - 'actor_id' => $this->request->getPost('actor_id'), - 'message' => $this->request->getPost('message'), + 'actor_id' => $validData['actor_id'], + 'message' => $validData['message'], 'published_at' => Time::now(), ]); @@ -155,8 +157,10 @@ class PostController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $actor = model('ActorModel', false) - ->getActorById($this->request->getPost('actor_id')); + ->getActorById($validData['actor_id']); model('FavouriteModel', false) ->toggleFavourite($actor, $this->post->id); @@ -177,8 +181,10 @@ class PostController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $actor = model('ActorModel', false) - ->getActorById($this->request->getPost('actor_id')); + ->getActorById($validData['actor_id']); model('PostModel', false) ->toggleReblog($actor, $this->post); @@ -200,10 +206,12 @@ class PostController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + $newReplyPost = new Post([ - 'actor_id' => $this->request->getPost('actor_id'), + 'actor_id' => $validData['actor_id'], 'in_reply_to_id' => $this->post->id, - 'message' => $this->request->getPost('message'), + 'message' => $validData['message'], 'published_at' => Time::now(), ]); @@ -232,13 +240,15 @@ class PostController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + helper('text'); // get webfinger data from actor // parse actor id to get actor and domain // check if actor and domain exist if ( - ! ($parts = split_handle($this->request->getPost('handle'))) || + ! ($parts = split_handle($validData['handle'])) || ! ($data = get_webfinger_data($parts['username'], $parts['domain'])) ) { return redirect() diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index e131ec73..cb71c817 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -167,14 +167,16 @@ class InstallController extends Controller ->with('errors', $this->validator->getErrors()); } - $baseUrl = $this->request->getPost('hostname'); - $mediaBaseUrl = $this->request->getPost('media_base_url'); + $validData = $this->validator->getValidated(); + + $baseUrl = $validData['hostname']; + $mediaBaseUrl = $validData['media_base_url']; self::writeEnv([ 'app.baseURL' => $baseUrl, 'media.baseURL' => $mediaBaseUrl === '' ? $baseUrl : $mediaBaseUrl, 'analytics.salt' => generate_random_salt(64), - 'admin.gateway' => $this->request->getPost('admin_gateway'), - 'auth.gateway' => $this->request->getPost('auth_gateway'), + 'admin.gateway' => $validData['admin_gateway'], + 'auth.gateway' => $validData['auth_gateway'], ]); helper('text'); @@ -204,11 +206,13 @@ class InstallController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + self::writeEnv([ - 'database.default.hostname' => $this->request->getPost('db_hostname'), - 'database.default.database' => $this->request->getPost('db_name'), - 'database.default.username' => $this->request->getPost('db_username'), - 'database.default.password' => $this->request->getPost('db_password'), + 'database.default.hostname' => $validData['db_hostname'], + 'database.default.database' => $validData['db_name'], + 'database.default.username' => $validData['db_username'], + 'database.default.password' => $validData['db_password'], 'database.default.DBPrefix' => $this->request->getPost('db_prefix'), ]); @@ -233,8 +237,10 @@ class InstallController extends Controller ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + self::writeEnv([ - 'cache.handler' => $this->request->getPost('cache_handler'), + 'cache.handler' => $validData['cache_handler'], ]); return redirect()->back(); @@ -279,6 +285,8 @@ class InstallController extends Controller { // validate user password $rules = [ + 'username' => 'required', + 'email' => 'required', 'password' => 'required|strong_password', ]; @@ -290,11 +298,13 @@ class InstallController extends Controller ->with('errors', $userModel->errors()); } + $validData = $this->validator->getValidated(); + // Save the user $user = new User([ - 'username' => $this->request->getPost('username'), - 'email' => $this->request->getPost('email'), - 'password' => $this->request->getPost('password'), + 'username' => $validData['username'], + 'email' => $validData['email'], + 'password' => $validData['password'], 'is_owner' => true, ]); diff --git a/modules/PodcastImport/Controllers/PodcastImportController.php b/modules/PodcastImport/Controllers/PodcastImportController.php index 3a055040..fc63b143 100644 --- a/modules/PodcastImport/Controllers/PodcastImportController.php +++ b/modules/PodcastImport/Controllers/PodcastImportController.php @@ -71,7 +71,8 @@ class PodcastImportController extends BaseController $rules = [ 'handle' => 'required|regex_match[/^[a-zA-Z0-9\_]{1,32}$/]', 'imported_feed_url' => 'required|valid_url_strict', - 'max_episodes' => 'is_natural_no_zero|permit_empty', + 'language' => 'required', + 'category' => 'required', ]; if (! $this->validate($rules)) { @@ -81,13 +82,15 @@ class PodcastImportController extends BaseController ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + // TODO: check that handle is not already in use $importTask = new PodcastImportTask([ - 'handle' => $this->request->getPost('handle'), - 'feed_url' => $this->request->getPost('imported_feed_url'), - 'language' => $this->request->getPost('language'), - 'category' => $this->request->getPost('category'), + 'handle' => $validData['handle'], + 'feed_url' => $validData['imported_feed_url'], + 'language' => $validData['language'], + 'category' => $validData['category'], 'status' => TaskStatus::Queued, 'created_by' => user_id(), 'updated_by' => user_id(), diff --git a/modules/PremiumPodcasts/Controllers/LockController.php b/modules/PremiumPodcasts/Controllers/LockController.php index 82c29940..bcd53e22 100644 --- a/modules/PremiumPodcasts/Controllers/LockController.php +++ b/modules/PremiumPodcasts/Controllers/LockController.php @@ -70,7 +70,9 @@ class LockController extends BaseController ->with('errors', $this->validator->getErrors()); } - $token = (string) $this->request->getPost('token'); + $validData = $this->validator->getValidated(); + + $token = $validData['token']; // attempt unlocking the podcast with the token if (! $this->premiumPodcasts->unlock($this->podcast->handle, $token)) { @@ -83,7 +85,8 @@ class LockController extends BaseController $redirectURL = session('redirect_url') ?? site_url('/'); unset($_SESSION['redirect_url']); - return redirect()->to($redirectURL) + return redirect() + ->to($redirectURL) ->withCookies() ->with('message', lang('PremiumPodcasts.messages.unlockSuccess')); } diff --git a/modules/PremiumPodcasts/Controllers/SubscriptionController.php b/modules/PremiumPodcasts/Controllers/SubscriptionController.php index 32164321..df6726ca 100644 --- a/modules/PremiumPodcasts/Controllers/SubscriptionController.php +++ b/modules/PremiumPodcasts/Controllers/SubscriptionController.php @@ -77,7 +77,9 @@ class SubscriptionController extends BaseController ->with('errors', $this->validator->getErrors()); } - if (($subscriptionLink = $this->request->getPost('subscription_link')) === '') { + $validData = $this->validator->getValidated(); + + if (($subscriptionLink = $validData['subscription_link']) === '') { service('settings') ->forget('Subscription.link', 'podcast:' . $this->podcast->id); diff --git a/public/media/site/index.html b/public/media/site/index.html index eebf8ecb..e69de29b 100644 --- a/public/media/site/index.html +++ b/public/media/site/index.html @@ -1,9 +0,0 @@ - - - - 403 Forbidden - - -

    Directory access is forbidden.

    - - From d100fe0999def3c20e848d3c4f7655bd7644dd55 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 29 Aug 2023 15:51:44 +0000 Subject: [PATCH 213/477] refactor: fix styling and logic issues --- app/Entities/Episode.php | 2 +- app/Helpers/components_helper.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 4adde20e..bc43df17 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -22,8 +22,8 @@ use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; use CodeIgniter\I18n\Time; -use Exception; use Config\Images; +use Exception; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\Autolink\AutolinkExtension; use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php index fdc77f21..08018f78 100644 --- a/app/Helpers/components_helper.php +++ b/app/Helpers/components_helper.php @@ -263,7 +263,7 @@ if (! function_exists('episode_publication_status_banner')) { 'publication_date' => $episode->published_at instanceof Time ? local_datetime( $episode->published_at ) : null, - ], null, false); + ]); $previewLinkLabel = lang('Episode.publication_status_banner.preview'); return << Date: Wed, 30 Aug 2023 09:12:30 +0000 Subject: [PATCH 214/477] fix(admin): redirect root fediverse route to fediverse-blocked-actors --- modules/Admin/Controllers/FediverseController.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/Admin/Controllers/FediverseController.php b/modules/Admin/Controllers/FediverseController.php index d7cd40f5..889c9958 100644 --- a/modules/Admin/Controllers/FediverseController.php +++ b/modules/Admin/Controllers/FediverseController.php @@ -10,11 +10,13 @@ declare(strict_types=1); namespace Modules\Admin\Controllers; +use CodeIgniter\HTTP\RedirectResponse; + class FediverseController extends BaseController { - public function dashboard(): string + public function dashboard(): RedirectResponse { - return view('fediverse/dashboard'); + return redirect()->route('fediverse-blocked-actors'); } public function blockedActors(): string From b63e953ca8adfbdd381ae85885b6e723f9d62774 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 31 Aug 2023 15:17:27 +0000 Subject: [PATCH 215/477] chore: update codeigniter-uuid to v1.0.2 to fix phpstan error + update js packages to latest --- composer.json | 2 +- composer.lock | 260 +++++++++--------- package.json | 16 +- pnpm-lock.yaml | 732 ++++++++++++++++++++++++------------------------- 4 files changed, 505 insertions(+), 505 deletions(-) diff --git a/composer.json b/composer.json index 88e8a0d2..134f06b2 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.1", "phpseclib/phpseclib": "~2.0.44", - "michalsn/codeigniter4-uuid": "dev-develop", + "michalsn/codeigniter4-uuid": "v1.0.2", "codeigniter4/settings": "v2.1.2", "chrisjean/php-ico": "^1.0.4", "melbahja/seo": "^v2.1.1", diff --git a/composer.lock b/composer.lock index e4fc770f..55668d4c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "02db4cf9b79f67dad431f7d10f5c19f4", + "content-hash": "68bb8f819d4177e3906686536e6b0227", "packages": [ { "name": "adaures/ipcat-php", @@ -120,16 +120,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.279.7", + "version": "3.280.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "223f97f8f12765b42a682569b434ac0210cca93a" + "reference": "bf4f3079bc59af44a752677cfbcd43f7953c4343" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/223f97f8f12765b42a682569b434ac0210cca93a", - "reference": "223f97f8f12765b42a682569b434ac0210cca93a", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bf4f3079bc59af44a752677cfbcd43f7953c4343", + "reference": "bf4f3079bc59af44a752677cfbcd43f7953c4343", "shasum": "" }, "require": { @@ -205,9 +205,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.279.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.280.0" }, - "time": "2023-08-25T18:07:43+00:00" + "time": "2023-08-30T18:19:33+00:00" }, { "name": "brick/math", @@ -494,12 +494,12 @@ "source": { "type": "git", "url": "https://github.com/codeigniter4/tasks.git", - "reference": "595d965edfeb7af6f2d163d343676aed8087dd01" + "reference": "38efc884d1a21d1bc03240447684f505d1fbba7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/595d965edfeb7af6f2d163d343676aed8087dd01", - "reference": "595d965edfeb7af6f2d163d343676aed8087dd01", + "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/38efc884d1a21d1bc03240447684f505d1fbba7e", + "reference": "38efc884d1a21d1bc03240447684f505d1fbba7e", "shasum": "" }, "require": { @@ -510,7 +510,7 @@ "require-dev": { "codeigniter4/devkit": "^1.0", "codeigniter4/framework": "^4.1", - "rector/rector": "0.18.0" + "rector/rector": "0.18.1" }, "default-branch": true, "type": "library", @@ -562,20 +562,20 @@ "source": "https://github.com/codeigniter4/tasks/tree/develop", "issues": "https://github.com/codeigniter4/tasks/issues" }, - "time": "2023-08-20T11:30:33+00:00" + "time": "2023-08-29T11:31:16+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.6", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "90d087e988ff194065333d16bc5cf649872d9cdb" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/90d087e988ff194065333d16bc5cf649872d9cdb", - "reference": "90d087e988ff194065333d16bc5cf649872d9cdb", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -614,7 +614,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.6" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -630,7 +630,7 @@ "type": "tidelift" } ], - "time": "2023-06-06T12:02:59+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "dflydev/dot-access-data", @@ -808,22 +808,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.7.0", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -910,7 +910,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -926,7 +926,7 @@ "type": "tidelift" } ], - "time": "2023-05-21T14:04:53+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", @@ -1009,16 +1009,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", - "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { @@ -1103,7 +1103,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -1119,7 +1119,7 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:06:02+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "james-heinrich/getid3", @@ -1254,16 +1254,16 @@ }, { "name": "league/commonmark", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048" + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d44a24690f16b8c1808bf13b1bd54ae4c63ea048", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5", "shasum": "" }, "require": { @@ -1354,7 +1354,7 @@ "type": "tidelift" } ], - "time": "2023-03-24T15:16:10+00:00" + "time": "2023-08-30T16:55:00+00:00" }, { "name": "league/config", @@ -1684,16 +1684,16 @@ }, { "name": "michalsn/codeigniter4-uuid", - "version": "dev-develop", + "version": "v1.0.2", "source": { "type": "git", "url": "https://github.com/michalsn/codeigniter4-uuid.git", - "reference": "b26512ac4f3f0c772fbfa2c3317346d3c17e2d44" + "reference": "be75ec5d7d2c967e046e7c2091f2cbcf126979f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/michalsn/codeigniter4-uuid/zipball/b26512ac4f3f0c772fbfa2c3317346d3c17e2d44", - "reference": "b26512ac4f3f0c772fbfa2c3317346d3c17e2d44", + "url": "https://api.github.com/repos/michalsn/codeigniter4-uuid/zipball/be75ec5d7d2c967e046e7c2091f2cbcf126979f0", + "reference": "be75ec5d7d2c967e046e7c2091f2cbcf126979f0", "shasum": "" }, "require": { @@ -1704,7 +1704,6 @@ "codeigniter4/codeigniter4": "dev-develop", "phpunit/phpunit": "8.5.*" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -1725,9 +1724,9 @@ "keywords": ["codeigniter4", "entity", "model", "uuid"], "support": { "issues": "https://github.com/michalsn/codeigniter4-uuid/issues", - "source": "https://github.com/michalsn/codeigniter4-uuid/tree/develop" + "source": "https://github.com/michalsn/codeigniter4-uuid/tree/v1.0.2" }, - "time": "2021-05-10T16:28:01+00:00" + "time": "2023-08-30T19:46:01+00:00" }, { "name": "mpratt/embera", @@ -2746,16 +2745,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -2770,7 +2769,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2799,7 +2798,7 @@ "homepage": "https://symfony.com", "keywords": ["compatibility", "ctype", "polyfill", "portable"], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -2815,20 +2814,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -2843,7 +2842,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2872,7 +2871,7 @@ "homepage": "https://symfony.com", "keywords": ["compatibility", "mbstring", "polyfill", "portable", "shim"], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -2888,20 +2887,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -2910,7 +2909,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2944,7 +2943,7 @@ "homepage": "https://symfony.com", "keywords": ["compatibility", "polyfill", "portable", "shim"], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -2960,7 +2959,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "vlucas/phpdotenv", @@ -3226,16 +3225,16 @@ }, { "name": "codeigniter/phpstan-codeigniter", - "version": "v1.0.0", + "version": "v1.0.1", "source": { "type": "git", "url": "https://github.com/CodeIgniter/phpstan-codeigniter.git", - "reference": "2c6eebd9798e463ea8596493bd068310b7a701d9" + "reference": "de64b5e634322f929518d976e5f8cf9303fcd9c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/2c6eebd9798e463ea8596493bd068310b7a701d9", - "reference": "2c6eebd9798e463ea8596493bd068310b7a701d9", + "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/de64b5e634322f929518d976e5f8cf9303fcd9c6", + "reference": "de64b5e634322f929518d976e5f8cf9303fcd9c6", "shasum": "" }, "require": { @@ -3289,7 +3288,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/CodeIgniter/phpstan-codeigniter" }, - "time": "2023-08-27T09:19:23+00:00" + "time": "2023-08-30T06:35:08+00:00" }, { "name": "composer/pcre", @@ -3357,16 +3356,16 @@ }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -3409,9 +3408,9 @@ "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": ["semantic", "semver", "validation", "versioning"], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -3427,7 +3426,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/xdebug-handler", @@ -3631,16 +3630,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.23.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "35af3cbbacfa91e164b252a28ec0b644f1ed4e78" + "reference": "bb6c9d7945dcbf6942e151b018c44d3767e21403" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/35af3cbbacfa91e164b252a28ec0b644f1ed4e78", - "reference": "35af3cbbacfa91e164b252a28ec0b644f1ed4e78", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/bb6c9d7945dcbf6942e151b018c44d3767e21403", + "reference": "bb6c9d7945dcbf6942e151b018c44d3767e21403", "shasum": "" }, "require": { @@ -3712,7 +3711,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.23.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.24.0" }, "funding": [ { @@ -3720,7 +3719,7 @@ "type": "github" } ], - "time": "2023-08-14T12:27:35+00:00" + "time": "2023-08-29T23:18:45+00:00" }, { "name": "mikey179/vfsstream", @@ -4138,16 +4137,16 @@ }, { "name": "phpunit/php-file-iterator", - "version": "4.0.2", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "5647d65443818959172645e7ed999217360654b6" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6", - "reference": "5647d65443818959172645e7ed999217360654b6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { @@ -4180,7 +4179,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -4188,7 +4187,7 @@ "type": "github" } ], - "time": "2023-05-07T09:13:23+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", @@ -4495,21 +4494,21 @@ }, { "name": "rector/rector", - "version": "0.18.0", + "version": "0.18.1", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "758ada29b5c80d933f906735d3026520390a2a1d" + "reference": "ee72ef542680a7f47ed8c6784f78b032c0d2f381" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/758ada29b5c80d933f906735d3026520390a2a1d", - "reference": "758ada29b5c80d933f906735d3026520390a2a1d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/ee72ef542680a7f47ed8c6784f78b032c0d2f381", + "reference": "ee72ef542680a7f47ed8c6784f78b032c0d2f381", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.10.26" + "phpstan/phpstan": "^1.10.31" }, "conflict": { "rector/rector-doctrine": "*", @@ -4528,7 +4527,7 @@ "keywords": ["automation", "dev", "migration", "refactoring"], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.18.0" + "source": "https://github.com/rectorphp/rector/tree/0.18.1" }, "funding": [ { @@ -4536,7 +4535,7 @@ "type": "github" } ], - "time": "2023-08-17T12:53:22+00:00" + "time": "2023-08-28T18:01:58+00:00" }, { "name": "sebastian/cli-parser", @@ -4764,16 +4763,16 @@ }, { "name": "sebastian/complexity", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", "shasum": "" }, "require": { @@ -4805,7 +4804,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" }, "funding": [ { @@ -4813,7 +4813,7 @@ "type": "github" } ], - "time": "2023-02-03T06:59:47+00:00" + "time": "2023-08-31T09:55:53+00:00" }, { "name": "sebastian/diff", @@ -5057,16 +5057,16 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", "shasum": "" }, "require": { @@ -5098,7 +5098,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" }, "funding": [ { @@ -5106,7 +5107,7 @@ "type": "github" } ], - "time": "2023-02-03T07:08:02+00:00" + "time": "2023-08-31T09:25:50+00:00" }, { "name": "sebastian/object-enumerator", @@ -5945,16 +5946,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -5966,7 +5967,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6002,7 +6003,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -6018,20 +6019,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -6043,7 +6044,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6080,7 +6081,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -6096,20 +6097,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { @@ -6118,7 +6119,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6148,7 +6149,7 @@ "homepage": "https://symfony.com", "keywords": ["compatibility", "polyfill", "portable", "shim"], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -6164,7 +6165,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/process", @@ -6648,7 +6649,6 @@ "minimum-stability": "stable", "stability-flags": { "james-heinrich/getid3": 10, - "michalsn/codeigniter4-uuid": 20, "codeigniter4/shield": 10, "codeigniter4/tasks": 20, "yassinedoghri/podcast-feed": 20 diff --git a/package.json b/package.json index c8eea8b2..6580211d 100644 --- a/package.json +++ b/package.json @@ -29,11 +29,11 @@ "dependencies": { "@amcharts/amcharts4": "^4.10.38", "@amcharts/amcharts4-geodata": "^4.1.27", - "@codemirror/commands": "^6.2.4", + "@codemirror/commands": "^6.2.5", "@codemirror/lang-xml": "^6.0.2", "@codemirror/language": "^6.9.0", "@codemirror/state": "^6.2.1", - "@codemirror/view": "^6.16.0", + "@codemirror/view": "^6.17.0", "@floating-ui/dom": "^1.5.1", "@github/clipboard-copy-element": "^1.2.1", "@github/hotkey": "^2.0.1", @@ -47,8 +47,8 @@ "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", "lit": "^2.8.0", - "marked": "^7.0.4", - "wavesurfer.js": "^7.1.5", + "marked": "^7.0.5", + "wavesurfer.js": "^7.2.0", "xml-formatter": "^3.5.0" }, "devDependencies": { @@ -59,9 +59,9 @@ "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", "@semantic-release/gitlab": "^12.0.5", - "@tailwindcss/forms": "^0.5.5", + "@tailwindcss/forms": "^0.5.6", "@tailwindcss/typography": "^0.5.9", - "@types/leaflet": "^1.9.3", + "@types/leaflet": "^1.9.4", "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/parser": "^6.4.1", "all-contributors-cli": "^6.26.1", @@ -75,10 +75,10 @@ "husky": "^8.0.3", "is-ci": "^3.0.1", "lint-staged": "^14.0.1", - "postcss": "^8.4.28", + "postcss": "^8.4.29", "postcss-import": "^15.1.0", "postcss-nesting": "^12.0.1", - "postcss-preset-env": "^9.1.1", + "postcss-preset-env": "^9.1.2", "postcss-reporter": "^7.0.5", "prettier": "2.8.8", "prettier-plugin-organize-imports": "^3.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 050eb542..03d09119 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,11 +12,11 @@ dependencies: specifier: ^4.1.27 version: 4.1.27 "@codemirror/commands": - specifier: ^6.2.4 - version: 6.2.4 + specifier: ^6.2.5 + version: 6.2.5 "@codemirror/lang-xml": specifier: ^6.0.2 - version: 6.0.2(@codemirror/view@6.16.0) + version: 6.0.2(@codemirror/view@6.17.0) "@codemirror/language": specifier: ^6.9.0 version: 6.9.0 @@ -24,8 +24,8 @@ dependencies: specifier: ^6.2.1 version: 6.2.1 "@codemirror/view": - specifier: ^6.16.0 - version: 6.16.0 + specifier: ^6.17.0 + version: 6.17.0 "@floating-ui/dom": specifier: ^1.5.1 version: 1.5.1 @@ -43,7 +43,7 @@ dependencies: version: 4.3.0 "@tailwindcss/nesting": specifier: 0.0.0-insiders.565cd3e - version: 0.0.0-insiders.565cd3e(postcss@8.4.28) + version: 0.0.0-insiders.565cd3e(postcss@8.4.29) "@vime/core": specifier: ^5.4.1 version: 5.4.1 @@ -66,11 +66,11 @@ dependencies: specifier: ^2.8.0 version: 2.8.0 marked: - specifier: ^7.0.4 - version: 7.0.4 + specifier: ^7.0.5 + version: 7.0.5 wavesurfer.js: - specifier: ^7.1.5 - version: 7.1.5 + specifier: ^7.2.0 + version: 7.2.0 xml-formatter: specifier: ^3.5.0 version: 3.5.0 @@ -98,14 +98,14 @@ devDependencies: specifier: ^12.0.5 version: 12.0.5(semantic-release@21.1.1) "@tailwindcss/forms": - specifier: ^0.5.5 - version: 0.5.5(tailwindcss@3.3.3) + specifier: ^0.5.6 + version: 0.5.6(tailwindcss@3.3.3) "@tailwindcss/typography": specifier: ^0.5.9 version: 0.5.9(tailwindcss@3.3.3) "@types/leaflet": - specifier: ^1.9.3 - version: 1.9.3 + specifier: ^1.9.4 + version: 1.9.4 "@typescript-eslint/eslint-plugin": specifier: ^6.4.1 version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.1.6) @@ -123,7 +123,7 @@ devDependencies: version: 7.0.3 cssnano: specifier: ^6.0.1 - version: 6.0.1(postcss@8.4.28) + version: 6.0.1(postcss@8.4.29) cz-conventional-changelog: specifier: ^3.3.0 version: 3.3.0 @@ -146,20 +146,20 @@ devDependencies: specifier: ^14.0.1 version: 14.0.1 postcss: - specifier: ^8.4.28 - version: 8.4.28 + specifier: ^8.4.29 + version: 8.4.29 postcss-import: specifier: ^15.1.0 - version: 15.1.0(postcss@8.4.28) + version: 15.1.0(postcss@8.4.29) postcss-nesting: specifier: ^12.0.1 - version: 12.0.1(postcss@8.4.28) + version: 12.0.1(postcss@8.4.29) postcss-preset-env: - specifier: ^9.1.1 - version: 9.1.1(postcss@8.4.28) + specifier: ^9.1.2 + version: 9.1.2(postcss@8.4.29) postcss-reporter: specifier: ^7.0.5 - version: 7.0.5(postcss@8.4.28) + version: 7.0.5(postcss@8.4.29) prettier: specifier: 2.8.8 version: 2.8.8 @@ -1746,7 +1746,7 @@ packages: to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.16.0)(@lezer/common@1.0.4): + /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.17.0)(@lezer/common@1.0.4): resolution: { integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==, @@ -1759,29 +1759,29 @@ packages: dependencies: "@codemirror/language": 6.9.0 "@codemirror/state": 6.2.1 - "@codemirror/view": 6.16.0 + "@codemirror/view": 6.17.0 "@lezer/common": 1.0.4 dev: false - /@codemirror/commands@6.2.4: + /@codemirror/commands@6.2.5: resolution: { - integrity: sha512-42lmDqVH0ttfilLShReLXsDfASKLXzfyC36bzwcqzox9PlHulMcsUOfHXNo2X2aFMVNUoQ7j+d4q5bnfseYoOA==, + integrity: sha512-dSi7ow2P2YgPBZflR9AJoaTHvqmeGIgkhignYMd5zK5y6DANTvxKxp6eMEpIDUJkRAaOY/TFZ4jP1ADIO/GLVA==, } dependencies: "@codemirror/language": 6.9.0 "@codemirror/state": 6.2.1 - "@codemirror/view": 6.16.0 + "@codemirror/view": 6.17.0 "@lezer/common": 1.0.4 dev: false - /@codemirror/lang-xml@6.0.2(@codemirror/view@6.16.0): + /@codemirror/lang-xml@6.0.2(@codemirror/view@6.17.0): resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.16.0)(@lezer/common@1.0.4) + "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.17.0)(@lezer/common@1.0.4) "@codemirror/language": 6.9.0 "@codemirror/state": 6.2.1 "@lezer/common": 1.0.4 @@ -1797,7 +1797,7 @@ packages: } dependencies: "@codemirror/state": 6.2.1 - "@codemirror/view": 6.16.0 + "@codemirror/view": 6.17.0 "@lezer/common": 1.0.4 "@lezer/highlight": 1.1.6 "@lezer/lr": 1.3.10 @@ -1811,7 +1811,7 @@ packages: } dependencies: "@codemirror/state": 6.2.1 - "@codemirror/view": 6.16.0 + "@codemirror/view": 6.17.0 crelt: 1.0.6 dev: false @@ -1822,7 +1822,7 @@ packages: } dependencies: "@codemirror/state": 6.2.1 - "@codemirror/view": 6.16.0 + "@codemirror/view": 6.17.0 crelt: 1.0.6 dev: false @@ -1833,10 +1833,10 @@ packages: } dev: false - /@codemirror/view@6.16.0: + /@codemirror/view@6.17.0: resolution: { - integrity: sha512-1Z2HkvkC3KR/oEZVuW9Ivmp8TWLzGEd8T8TA04TTwPvqogfkHBdYSlflytDOqmkUxM2d1ywTg7X2dU5mC+SXvg==, + integrity: sha512-0yVhPSyKWwYDy6Xwd7aDoj8ZXtdoHwC7El4z1/JJpIimrtDR5CVGY4lvQ0r2hP11ezB+eCHexZ6Zbz6rPUe06A==, } dependencies: "@codemirror/state": 6.2.1 @@ -2097,10 +2097,10 @@ packages: "@csstools/css-tokenizer": 2.2.0 dev: true - /@csstools/color-helpers@3.0.0: + /@csstools/color-helpers@3.0.1: resolution: { - integrity: sha512-rBODd1rY01QcenD34QxbQxLc1g+Uh7z1X/uzTHNQzJUnFCT9/EZYI7KWq+j0YfWMXJsRJ8lVkqBcB0R/qLr+yg==, + integrity: sha512-Tsp6FcSPaPN/+4T7iBPxBVopJUs7bimnNx4yuWeGXkH084Vro/y8fmrGg1LGSWH8SU6YuH20fP5Rtqtb979jyw==, } engines: { node: ^14 || ^16 || >=18 } dev: true @@ -2119,17 +2119,17 @@ packages: "@csstools/css-tokenizer": 2.2.0 dev: true - /@csstools/css-color-parser@1.2.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0): + /@csstools/css-color-parser@1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0): resolution: { - integrity: sha512-YaEnCoPTdhE4lPQFH3dU4IEk8S+yCnxS88wMv45JzlnMfZp57hpqA6qf2gX8uv7IJTJ/43u6pTQmhy7hCjlz7g==, + integrity: sha512-jgudbE+TXZLssSTGFRCkJF9gAM8ABZ2c9/gbLupwA8Y1SpcddxK2z74/MOSdWuboUHbshei8uSQNbp9Wu1Bx+Q==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: "@csstools/css-parser-algorithms": ^2.3.1 "@csstools/css-tokenizer": ^2.2.0 dependencies: - "@csstools/color-helpers": 3.0.0 + "@csstools/color-helpers": 3.0.1 "@csstools/css-calc": 1.1.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 @@ -2169,7 +2169,7 @@ packages: "@csstools/css-tokenizer": 2.2.0 dev: true - /@csstools/postcss-cascade-layers@4.0.0(postcss@8.4.28): + /@csstools/postcss-cascade-layers@4.0.0(postcss@8.4.29): resolution: { integrity: sha512-dVPVVqQG0FixjM9CG/+8eHTsCAxRKqmNh6H69IpruolPlnEF1611f2AoLK8TijTSAsqBSclKd4WHs1KUb/LdJw==, @@ -2179,43 +2179,43 @@ packages: postcss: ^8.4 dependencies: "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-color-function@3.0.1(postcss@8.4.28): + /@csstools/postcss-color-function@3.0.2(postcss@8.4.29): resolution: { - integrity: sha512-+vrvCQeUifpMeyd42VQ3JPWGQ8cO19+TnGbtfq1SDSgZzRapCQO4aK9h/jhMOKPnxGzbA57oS0aHgP/12N9gSQ==, + integrity: sha512-sfEBBWVMNPE3mHllI+FR43W2qy7eIjqCySAoivPFV068yKbUy6mH8Sra5Gjar54M3p2qvH8S/6KPlvEDBTvrmg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.2.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 dev: true - /@csstools/postcss-color-mix-function@2.0.1(postcss@8.4.28): + /@csstools/postcss-color-mix-function@2.0.2(postcss@8.4.29): resolution: { - integrity: sha512-Z5cXkLiccKIVcUTe+fAfjUD7ZUv0j8rq3dSoBpM6I49dcw+50318eYrwUZa3nyb4xNx7ntNNUPmesAc87kPE2Q==, + integrity: sha512-121MUtL/fv+lO9FQJKP05UAKC6xYl4hZYyWl+pGbfXIa3KkgCbcMfhkIc0zV2JpwsB5uhls81bwl+XJKhKwECw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.2.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 dev: true - /@csstools/postcss-exponential-functions@1.0.0(postcss@8.4.28): + /@csstools/postcss-exponential-functions@1.0.0(postcss@8.4.29): resolution: { integrity: sha512-FPndJ/7oGlML7/4EhLi902wGOukO0Nn37PjwOQGc0BhhjQPy3np3By4d3M8s9Cfmp9EHEKgUHRN2DQ5HLT/hTw==, @@ -2227,10 +2227,10 @@ packages: "@csstools/css-calc": 1.1.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.28): + /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.29): resolution: { integrity: sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==, @@ -2239,42 +2239,42 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.1(postcss@8.4.28): + /@csstools/postcss-gradients-interpolation-method@4.0.2(postcss@8.4.29): resolution: { - integrity: sha512-IHeFIcksjI8xKX7PWLzAyigM3UvJdZ4btejeNa7y/wXxqD5dyPPZuY55y8HGTrS6ETVTRqfIznoCPtTzIX7ygQ==, + integrity: sha512-ogriVRZFMgV/oS4pwuXTdFJ7I+saq0oSHzev/XsvXOoRHXOK9jB2q6zEfl3o1Edl0X2wHmacwtfRk8RBmopnYw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.2.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 dev: true - /@csstools/postcss-hwb-function@3.0.1(postcss@8.4.28): + /@csstools/postcss-hwb-function@3.0.2(postcss@8.4.29): resolution: { - integrity: sha512-FYe2K8EOYlL1BUm2HTXVBo6bWAj0xl4khOk6EFhQHy/C5p3rlr8OcetzQuwMeNQ3v25nB06QTgqUHoOUwoEqhA==, + integrity: sha512-K4W97KaMnCLUS7/hfdxsM10ghPtIwfYP+VGUwpMgNYa7LVwE+9vkL/N/hzwqSShICtWD6doX1yAT0qcKUbgs0w==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.2.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /@csstools/postcss-ic-unit@3.0.0(postcss@8.4.28): + /@csstools/postcss-ic-unit@3.0.0(postcss@8.4.29): resolution: { integrity: sha512-FH3+zfOfsgtX332IIkRDxiYLmgwyNk49tfltpC6dsZaO4RV2zWY6x9VMIC5cjvmjlDO7DIThpzqaqw2icT8RbQ==, @@ -2283,12 +2283,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-is-pseudo-class@4.0.0(postcss@8.4.28): + /@csstools/postcss-is-pseudo-class@4.0.0(postcss@8.4.29): resolution: { integrity: sha512-0I6siRcDymG3RrkNTSvHDMxTQ6mDyYE8awkcaHNgtYacd43msl+4ZWDfQ1yZQ/viczVWjqJkLmPiRHSgxn5nZA==, @@ -2298,11 +2298,11 @@ packages: postcss: ^8.4 dependencies: "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.28): + /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.29): resolution: { integrity: sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==, @@ -2311,10 +2311,10 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.28): + /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.29): resolution: { integrity: sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==, @@ -2323,11 +2323,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.1(postcss@8.4.28): + /@csstools/postcss-logical-viewport-units@2.0.1(postcss@8.4.29): resolution: { integrity: sha512-R5s19SscS7CHoxvdYNMu2Y3WDwG4JjdhsejqjunDB1GqfzhtHSvL7b5XxCkUWqm2KRl35hI6kJ4HEaCDd/3BXg==, @@ -2337,10 +2337,10 @@ packages: postcss: ^8.4 dependencies: "@csstools/css-tokenizer": 2.2.0 - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /@csstools/postcss-media-minmax@1.0.7(postcss@8.4.28): + /@csstools/postcss-media-minmax@1.0.7(postcss@8.4.29): resolution: { integrity: sha512-5LGLdu8cJgRPmvkjUNqOPKIKeHbyQmoGKooB5Rh0mp5mLaNI9bl+IjFZ2keY0cztZYsriJsGf6Lu8R5XetuwoQ==, @@ -2353,10 +2353,10 @@ packages: "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/media-query-list-parser": 2.1.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.2(postcss@8.4.28): + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.2(postcss@8.4.29): resolution: { integrity: sha512-kQJR6NvTRidsaRjCdHGjra2+fLoFiDQOm5B2aZrhmXqng/hweXjruboKzB326rxQO2L0m0T+gCKbZgyuncyhLg==, @@ -2368,10 +2368,10 @@ packages: "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/media-query-list-parser": 2.1.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.28): + /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.29): resolution: { integrity: sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==, @@ -2380,11 +2380,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values@3.0.0(postcss@8.4.28): + /@csstools/postcss-normalize-display-values@3.0.0(postcss@8.4.29): resolution: { integrity: sha512-6Nw55PRXEKEVqn3bzA8gRRPYxr5tf5PssvcE5DRA/nAxKgKtgNZMCHCSd1uxTCWeyLnkf6h5tYRSB0P1Vh/K/A==, @@ -2393,27 +2393,27 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.1(postcss@8.4.28): + /@csstools/postcss-oklab-function@3.0.2(postcss@8.4.29): resolution: { - integrity: sha512-3TIz+dCPlQPzz4yAEYXchUpfuU2gRYK4u1J+1xatNX85Isg4V+IbLyppblWLV4Vb6npFF8qsHN17rNuxOIy/6w==, + integrity: sha512-tr7HjHDaDvRcnzK559l3VcpfhiAd0ga1jhThGR/tONfVzOVssG9x0QLg0LpLrlx7+niGgHL1SdfgHmFiTJjGIw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.2.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 dev: true - /@csstools/postcss-progressive-custom-properties@3.0.0(postcss@8.4.28): + /@csstools/postcss-progressive-custom-properties@3.0.0(postcss@8.4.29): resolution: { integrity: sha512-2/D3CCL9DN2xhuUTP8OKvKnaqJ1j4yZUxuGLsCUOQ16wnDAuMLKLkflOmZF5tsPh/02VPeXRmqIN+U595WAulw==, @@ -2422,27 +2422,27 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-relative-color-syntax@2.0.1(postcss@8.4.28): + /@csstools/postcss-relative-color-syntax@2.0.2(postcss@8.4.29): resolution: { - integrity: sha512-9B8br/7q0bjD1fV3yE22izjc7Oy5hDbDgwdFEz207cdJHYC9yQneJzP3H+/w3RgC7uyfEVhyyhkGRx5YAfJtmg==, + integrity: sha512-sn2zqcM8QPj4wN2okdNbK0JdwhZU506EEmIeSybh2UOJgTorbyQS7ak2sJ+2Y4LDYr4rPGBs/hBFmyYgoostdg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.2.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 dev: true - /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.28): + /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.29): resolution: { integrity: sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==, @@ -2451,11 +2451,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-stepped-value-functions@3.0.1(postcss@8.4.28): + /@csstools/postcss-stepped-value-functions@3.0.1(postcss@8.4.29): resolution: { integrity: sha512-y1sykToXorFE+5cjtp//xAMWEAEple0kcZn2QhzEFIZDDNvGOCp5JvvmmPGsC3eDlj6yQp70l9uXZNLnimEYfA==, @@ -2467,24 +2467,24 @@ packages: "@csstools/css-calc": 1.1.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /@csstools/postcss-text-decoration-shorthand@3.0.0(postcss@8.4.28): + /@csstools/postcss-text-decoration-shorthand@3.0.1(postcss@8.4.29): resolution: { - integrity: sha512-BAa1MIMJmEZlJ+UkPrkyoz3DC7kLlIl2oDya5yXgvUrelpwxddgz8iMp69qBStdXwuMyfPx46oZcSNx8Z0T2eA==, + integrity: sha512-a5Ojrf31XfdsmFhbLR41JG8HD9d7mWeOqROUJpTi9MTJDAHeJstvhrmpHS39C11luwSHanLou4v3PI9xLbWolQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/color-helpers": 3.0.0 - postcss: 8.4.28 + "@csstools/color-helpers": 3.0.1 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-trigonometric-functions@3.0.1(postcss@8.4.28): + /@csstools/postcss-trigonometric-functions@3.0.1(postcss@8.4.29): resolution: { integrity: sha512-hW+JPv0MPQfWC1KARgvJI6bisEUFAZWSvUNq/khGCupYV/h6Z9R2ZFz0Xc633LXBst0ezbXpy7NpnPurSx5Klw==, @@ -2496,10 +2496,10 @@ packages: "@csstools/css-calc": 1.1.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /@csstools/postcss-unset-value@3.0.0(postcss@8.4.28): + /@csstools/postcss-unset-value@3.0.0(postcss@8.4.29): resolution: { integrity: sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==, @@ -2508,7 +2508,7 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13): @@ -3581,10 +3581,10 @@ packages: defer-to-connect: 2.0.1 dev: true - /@tailwindcss/forms@0.5.5(tailwindcss@3.3.3): + /@tailwindcss/forms@0.5.6(tailwindcss@3.3.3): resolution: { - integrity: sha512-03sXK1DcPt44GZ0Yg6AcAfQln89IKdbE79g2OwoKqBm1ukaadLO2AH3EiB3mXHeQnxa3tzm7eE0x7INXSjbuug==, + integrity: sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA==, } peerDependencies: tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1" @@ -3593,7 +3593,7 @@ packages: tailwindcss: 3.3.3(ts-node@10.9.1) dev: true - /@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.28): + /@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.29): resolution: { integrity: sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==, @@ -3601,8 +3601,8 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 - postcss-nested: 5.0.6(postcss@8.4.28) + postcss: 8.4.29 + postcss-nested: 5.0.6(postcss@8.4.29) dev: false /@tailwindcss/typography@0.5.9(tailwindcss@3.3.3): @@ -3691,10 +3691,10 @@ packages: } dev: true - /@types/leaflet@1.9.3: + /@types/leaflet@1.9.4: resolution: { - integrity: sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==, + integrity: sha512-kfwgQf4eOxoe/tD9CaKQrBKHbc7VpyfJOG5sxsQtkH+ML9xYa8hUC3UMa0wU1pKfciJtO0pU9g9XbWhPo7iBCA==, } dependencies: "@types/geojson": 7946.0.10 @@ -4308,7 +4308,7 @@ packages: engines: { node: ">= 4.0.0" } dev: true - /autoprefixer@10.4.15(postcss@8.4.28): + /autoprefixer@10.4.15(postcss@8.4.29): resolution: { integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==, @@ -4323,7 +4323,7 @@ packages: fraction.js: 4.2.1 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true @@ -4880,13 +4880,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.16.0)(@lezer/common@1.0.4) - "@codemirror/commands": 6.2.4 + "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.17.0)(@lezer/common@1.0.4) + "@codemirror/commands": 6.2.5 "@codemirror/language": 6.9.0 "@codemirror/lint": 6.4.0 "@codemirror/search": 6.5.1 "@codemirror/state": 6.2.1 - "@codemirror/view": 6.16.0 + "@codemirror/view": 6.17.0 transitivePeerDependencies: - "@lezer/common" dev: false @@ -5244,7 +5244,7 @@ packages: type-fest: 1.4.0 dev: true - /css-blank-pseudo@6.0.0(postcss@8.4.28): + /css-blank-pseudo@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==, @@ -5253,11 +5253,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /css-declaration-sorter@6.4.1(postcss@8.4.28): + /css-declaration-sorter@6.4.1(postcss@8.4.29): resolution: { integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==, @@ -5266,7 +5266,7 @@ packages: peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true /css-functions-list@3.2.0: @@ -5277,7 +5277,7 @@ packages: engines: { node: ">=12.22" } dev: true - /css-has-pseudo@6.0.0(postcss@8.4.28): + /css-has-pseudo@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==, @@ -5287,12 +5287,12 @@ packages: postcss: ^8.4 dependencies: "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: true - /css-prefers-color-scheme@9.0.0(postcss@8.4.28): + /css-prefers-color-scheme@9.0.0(postcss@8.4.29): resolution: { integrity: sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==, @@ -5301,7 +5301,7 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true /css-select@5.1.0: @@ -5362,7 +5362,7 @@ packages: engines: { node: ">=4" } hasBin: true - /cssnano-preset-default@6.0.1(postcss@8.4.28): + /cssnano-preset-default@6.0.1(postcss@8.4.29): resolution: { integrity: sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==, @@ -5371,39 +5371,39 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.28) - cssnano-utils: 4.0.0(postcss@8.4.28) - postcss: 8.4.28 - postcss-calc: 9.0.1(postcss@8.4.28) - postcss-colormin: 6.0.0(postcss@8.4.28) - postcss-convert-values: 6.0.0(postcss@8.4.28) - postcss-discard-comments: 6.0.0(postcss@8.4.28) - postcss-discard-duplicates: 6.0.0(postcss@8.4.28) - postcss-discard-empty: 6.0.0(postcss@8.4.28) - postcss-discard-overridden: 6.0.0(postcss@8.4.28) - postcss-merge-longhand: 6.0.0(postcss@8.4.28) - postcss-merge-rules: 6.0.1(postcss@8.4.28) - postcss-minify-font-values: 6.0.0(postcss@8.4.28) - postcss-minify-gradients: 6.0.0(postcss@8.4.28) - postcss-minify-params: 6.0.0(postcss@8.4.28) - postcss-minify-selectors: 6.0.0(postcss@8.4.28) - postcss-normalize-charset: 6.0.0(postcss@8.4.28) - postcss-normalize-display-values: 6.0.0(postcss@8.4.28) - postcss-normalize-positions: 6.0.0(postcss@8.4.28) - postcss-normalize-repeat-style: 6.0.0(postcss@8.4.28) - postcss-normalize-string: 6.0.0(postcss@8.4.28) - postcss-normalize-timing-functions: 6.0.0(postcss@8.4.28) - postcss-normalize-unicode: 6.0.0(postcss@8.4.28) - postcss-normalize-url: 6.0.0(postcss@8.4.28) - postcss-normalize-whitespace: 6.0.0(postcss@8.4.28) - postcss-ordered-values: 6.0.0(postcss@8.4.28) - postcss-reduce-initial: 6.0.0(postcss@8.4.28) - postcss-reduce-transforms: 6.0.0(postcss@8.4.28) - postcss-svgo: 6.0.0(postcss@8.4.28) - postcss-unique-selectors: 6.0.0(postcss@8.4.28) + css-declaration-sorter: 6.4.1(postcss@8.4.29) + cssnano-utils: 4.0.0(postcss@8.4.29) + postcss: 8.4.29 + postcss-calc: 9.0.1(postcss@8.4.29) + postcss-colormin: 6.0.0(postcss@8.4.29) + postcss-convert-values: 6.0.0(postcss@8.4.29) + postcss-discard-comments: 6.0.0(postcss@8.4.29) + postcss-discard-duplicates: 6.0.0(postcss@8.4.29) + postcss-discard-empty: 6.0.0(postcss@8.4.29) + postcss-discard-overridden: 6.0.0(postcss@8.4.29) + postcss-merge-longhand: 6.0.0(postcss@8.4.29) + postcss-merge-rules: 6.0.1(postcss@8.4.29) + postcss-minify-font-values: 6.0.0(postcss@8.4.29) + postcss-minify-gradients: 6.0.0(postcss@8.4.29) + postcss-minify-params: 6.0.0(postcss@8.4.29) + postcss-minify-selectors: 6.0.0(postcss@8.4.29) + postcss-normalize-charset: 6.0.0(postcss@8.4.29) + postcss-normalize-display-values: 6.0.0(postcss@8.4.29) + postcss-normalize-positions: 6.0.0(postcss@8.4.29) + postcss-normalize-repeat-style: 6.0.0(postcss@8.4.29) + postcss-normalize-string: 6.0.0(postcss@8.4.29) + postcss-normalize-timing-functions: 6.0.0(postcss@8.4.29) + postcss-normalize-unicode: 6.0.0(postcss@8.4.29) + postcss-normalize-url: 6.0.0(postcss@8.4.29) + postcss-normalize-whitespace: 6.0.0(postcss@8.4.29) + postcss-ordered-values: 6.0.0(postcss@8.4.29) + postcss-reduce-initial: 6.0.0(postcss@8.4.29) + postcss-reduce-transforms: 6.0.0(postcss@8.4.29) + postcss-svgo: 6.0.0(postcss@8.4.29) + postcss-unique-selectors: 6.0.0(postcss@8.4.29) dev: true - /cssnano-utils@4.0.0(postcss@8.4.28): + /cssnano-utils@4.0.0(postcss@8.4.29): resolution: { integrity: sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==, @@ -5412,10 +5412,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /cssnano@6.0.1(postcss@8.4.28): + /cssnano@6.0.1(postcss@8.4.29): resolution: { integrity: sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==, @@ -5424,9 +5424,9 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 6.0.1(postcss@8.4.28) + cssnano-preset-default: 6.0.1(postcss@8.4.29) lilconfig: 2.1.0 - postcss: 8.4.28 + postcss: 8.4.29 dev: true /csso@5.0.5: @@ -8644,10 +8644,10 @@ packages: hasBin: true dev: true - /marked@7.0.4: + /marked@7.0.5: resolution: { - integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==, + integrity: sha512-lwNAFTfXgqpt/XvK17a/8wY9/q6fcSPZT1aP6QW0u74VwaJF/Z9KbRcX23sWE4tODM+AolJNcUtErTkgOeFP/Q==, } engines: { node: ">= 16" } hasBin: true @@ -9700,7 +9700,7 @@ packages: tinyqueue: 2.0.3 dev: false - /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.28): + /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.29): resolution: { integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==, @@ -9709,11 +9709,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-calc@9.0.1(postcss@8.4.28): + /postcss-calc@9.0.1(postcss@8.4.29): resolution: { integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==, @@ -9722,12 +9722,12 @@ packages: peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: true - /postcss-clamp@4.1.0(postcss@8.4.28): + /postcss-clamp@4.1.0(postcss@8.4.29): resolution: { integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, @@ -9736,11 +9736,11 @@ packages: peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.0(postcss@8.4.28): + /postcss-color-functional-notation@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-kaWTgnhRKFtfMF8H0+NQBFxgr5CGg05WGe07Mc1ld6XHwwRWlqSbHOW0zwf+BtkBQpsdVUu7+gl9dtdvhWMedw==, @@ -9749,12 +9749,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-color-hex-alpha@9.0.2(postcss@8.4.28): + /postcss-color-hex-alpha@9.0.2(postcss@8.4.29): resolution: { integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==, @@ -9763,11 +9763,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.0(postcss@8.4.28): + /postcss-color-rebeccapurple@9.0.0(postcss@8.4.29): resolution: { integrity: sha512-RmUFL+foS05AKglkEoqfx+KFdKRVmqUAxlHNz4jLqIi7046drIPyerdl4B6j/RA2BSP8FI8gJcHmLRrwJOMnHw==, @@ -9776,11 +9776,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-colormin@6.0.0(postcss@8.4.28): + /postcss-colormin@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==, @@ -9792,11 +9792,11 @@ packages: browserslist: 4.21.10 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values@6.0.0(postcss@8.4.28): + /postcss-convert-values@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==, @@ -9806,11 +9806,11 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.10 - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@10.0.0(postcss@8.4.28): + /postcss-custom-media@10.0.0(postcss@8.4.29): resolution: { integrity: sha512-NxDn7C6GJ7X8TsWOa8MbCdq9rLERRLcPfQSp856k1jzMreL8X9M6iWk35JjPRIb9IfRnVohmxAylDRx7n4Rv4g==, @@ -9823,10 +9823,10 @@ packages: "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/media-query-list-parser": 2.1.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-custom-properties@13.3.0(postcss@8.4.28): + /postcss-custom-properties@13.3.0(postcss@8.4.29): resolution: { integrity: sha512-q4VgtIKSy5+KcUvQ0WxTjDy9DZjQ5VCXAZ9+tT9+aPMbA0z6s2t1nMw0QHszru1ib5ElkXl9JUpYYU37VVUs7g==, @@ -9838,11 +9838,11 @@ packages: "@csstools/cascade-layer-name-parser": 1.0.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors@7.1.4(postcss@8.4.28): + /postcss-custom-selectors@7.1.4(postcss@8.4.29): resolution: { integrity: sha512-TU2xyUUBTlpiLnwyE2ZYMUIYB41MKMkBZ8X8ntkqRDQ8sdBLhFFsPgNcOliBd5+/zcK51C9hRnSE7hKUJMxQSw==, @@ -9854,11 +9854,11 @@ packages: "@csstools/cascade-layer-name-parser": 1.0.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-dir-pseudo-class@8.0.0(postcss@8.4.28): + /postcss-dir-pseudo-class@8.0.0(postcss@8.4.29): resolution: { integrity: sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==, @@ -9867,11 +9867,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-discard-comments@6.0.0(postcss@8.4.28): + /postcss-discard-comments@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==, @@ -9880,10 +9880,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-discard-duplicates@6.0.0(postcss@8.4.28): + /postcss-discard-duplicates@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==, @@ -9892,10 +9892,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-discard-empty@6.0.0(postcss@8.4.28): + /postcss-discard-empty@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==, @@ -9904,10 +9904,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-discard-overridden@6.0.0(postcss@8.4.28): + /postcss-discard-overridden@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==, @@ -9916,10 +9916,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-double-position-gradients@5.0.0(postcss@8.4.28): + /postcss-double-position-gradients@5.0.0(postcss@8.4.29): resolution: { integrity: sha512-wR8npIkrIVUTicUpCWSSo1f/g7gAEIH70FMqCugY4m4j6TX4E0T2Q5rhfO0gqv00biBZdLyb+HkW8x6as+iJNQ==, @@ -9928,12 +9928,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-focus-visible@9.0.0(postcss@8.4.28): + /postcss-focus-visible@9.0.0(postcss@8.4.29): resolution: { integrity: sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==, @@ -9942,11 +9942,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-focus-within@8.0.0(postcss@8.4.28): + /postcss-focus-within@8.0.0(postcss@8.4.29): resolution: { integrity: sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==, @@ -9955,11 +9955,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-font-variant@5.0.0(postcss@8.4.28): + /postcss-font-variant@5.0.0(postcss@8.4.29): resolution: { integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, @@ -9967,10 +9967,10 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-gap-properties@5.0.0(postcss@8.4.28): + /postcss-gap-properties@5.0.0(postcss@8.4.29): resolution: { integrity: sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==, @@ -9979,10 +9979,10 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-image-set-function@6.0.0(postcss@8.4.28): + /postcss-image-set-function@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-bg58QnJexFpPBU4IGPAugAPKV0FuFtX5rHYNSKVaV91TpHN7iwyEzz1bkIPCiSU5+BUN00e+3fV5KFrwIgRocw==, @@ -9991,11 +9991,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-import@15.1.0(postcss@8.4.28): + /postcss-import@15.1.0(postcss@8.4.29): resolution: { integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, @@ -10004,13 +10004,13 @@ packages: peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.4 dev: true - /postcss-initial@4.0.1(postcss@8.4.28): + /postcss-initial@4.0.1(postcss@8.4.29): resolution: { integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==, @@ -10018,10 +10018,10 @@ packages: peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-js@4.0.1(postcss@8.4.28): + /postcss-js@4.0.1(postcss@8.4.29): resolution: { integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, @@ -10031,26 +10031,26 @@ packages: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-lab-function@6.0.1(postcss@8.4.28): + /postcss-lab-function@6.0.2(postcss@8.4.29): resolution: { - integrity: sha512-/Xl6JitDh7jWkcOLxrHcAlEaqkxyaG3g4iDMy5RyhNaiQPJ9Egf2+Mxp1W2qnH5jB2bj59f3RbdKmC6qx1IcXA==, + integrity: sha512-OfjeI/1rQWtj38Quy3+D9+mpOReOX3vOXfQNCfsmFIl6xK1AAJ1ta1uGjAswYwsN8uJ9Y52K8U53Jk8QJWfJLg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.2.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - postcss: 8.4.28 + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + postcss: 8.4.29 dev: true - /postcss-load-config@4.0.1(postcss@8.4.28)(ts-node@10.9.1): + /postcss-load-config@4.0.1(postcss@8.4.29)(ts-node@10.9.1): resolution: { integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==, @@ -10066,12 +10066,12 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.28 + postcss: 8.4.29 ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.1.6) yaml: 2.3.1 dev: true - /postcss-logical@7.0.0(postcss@8.4.28): + /postcss-logical@7.0.0(postcss@8.4.29): resolution: { integrity: sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==, @@ -10080,11 +10080,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-merge-longhand@6.0.0(postcss@8.4.28): + /postcss-merge-longhand@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==, @@ -10093,12 +10093,12 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 - stylehacks: 6.0.0(postcss@8.4.28) + stylehacks: 6.0.0(postcss@8.4.29) dev: true - /postcss-merge-rules@6.0.1(postcss@8.4.28): + /postcss-merge-rules@6.0.1(postcss@8.4.29): resolution: { integrity: sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==, @@ -10109,12 +10109,12 @@ packages: dependencies: browserslist: 4.21.10 caniuse-api: 3.0.0 - cssnano-utils: 4.0.0(postcss@8.4.28) - postcss: 8.4.28 + cssnano-utils: 4.0.0(postcss@8.4.29) + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-minify-font-values@6.0.0(postcss@8.4.28): + /postcss-minify-font-values@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==, @@ -10123,11 +10123,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients@6.0.0(postcss@8.4.28): + /postcss-minify-gradients@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==, @@ -10137,12 +10137,12 @@ packages: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 4.0.0(postcss@8.4.28) - postcss: 8.4.28 + cssnano-utils: 4.0.0(postcss@8.4.29) + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params@6.0.0(postcss@8.4.28): + /postcss-minify-params@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==, @@ -10152,12 +10152,12 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.10 - cssnano-utils: 4.0.0(postcss@8.4.28) - postcss: 8.4.28 + cssnano-utils: 4.0.0(postcss@8.4.29) + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-selectors@6.0.0(postcss@8.4.28): + /postcss-minify-selectors@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==, @@ -10166,11 +10166,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-nested@5.0.6(postcss@8.4.28): + /postcss-nested@5.0.6(postcss@8.4.29): resolution: { integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, @@ -10179,11 +10179,11 @@ packages: peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: false - /postcss-nested@6.0.1(postcss@8.4.28): + /postcss-nested@6.0.1(postcss@8.4.29): resolution: { integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, @@ -10192,11 +10192,11 @@ packages: peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-nesting@12.0.1(postcss@8.4.28): + /postcss-nesting@12.0.1(postcss@8.4.29): resolution: { integrity: sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==, @@ -10206,11 +10206,11 @@ packages: postcss: ^8.4 dependencies: "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-normalize-charset@6.0.0(postcss@8.4.28): + /postcss-normalize-charset@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==, @@ -10219,10 +10219,10 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-normalize-display-values@6.0.0(postcss@8.4.28): + /postcss-normalize-display-values@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==, @@ -10231,11 +10231,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions@6.0.0(postcss@8.4.28): + /postcss-normalize-positions@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==, @@ -10244,11 +10244,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style@6.0.0(postcss@8.4.28): + /postcss-normalize-repeat-style@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==, @@ -10257,11 +10257,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string@6.0.0(postcss@8.4.28): + /postcss-normalize-string@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==, @@ -10270,11 +10270,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions@6.0.0(postcss@8.4.28): + /postcss-normalize-timing-functions@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==, @@ -10283,11 +10283,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode@6.0.0(postcss@8.4.28): + /postcss-normalize-unicode@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==, @@ -10297,11 +10297,11 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.10 - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url@6.0.0(postcss@8.4.28): + /postcss-normalize-url@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==, @@ -10310,11 +10310,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace@6.0.0(postcss@8.4.28): + /postcss-normalize-whitespace@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==, @@ -10323,11 +10323,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-opacity-percentage@2.0.0(postcss@8.4.28): + /postcss-opacity-percentage@2.0.0(postcss@8.4.29): resolution: { integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==, @@ -10336,10 +10336,10 @@ packages: peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-ordered-values@6.0.0(postcss@8.4.28): + /postcss-ordered-values@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==, @@ -10348,12 +10348,12 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 4.0.0(postcss@8.4.28) - postcss: 8.4.28 + cssnano-utils: 4.0.0(postcss@8.4.29) + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-overflow-shorthand@5.0.0(postcss@8.4.28): + /postcss-overflow-shorthand@5.0.0(postcss@8.4.29): resolution: { integrity: sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==, @@ -10362,11 +10362,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-page-break@3.0.4(postcss@8.4.28): + /postcss-page-break@3.0.4(postcss@8.4.29): resolution: { integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, @@ -10374,10 +10374,10 @@ packages: peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-place@9.0.0(postcss@8.4.28): + /postcss-place@9.0.0(postcss@8.4.29): resolution: { integrity: sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==, @@ -10386,80 +10386,80 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.1.1(postcss@8.4.28): + /postcss-preset-env@9.1.2(postcss@8.4.29): resolution: { - integrity: sha512-rMPEqyTLm8JLbvaHnDAdQg6SN4Z/NDOsm+CRefg4HmSOiNpTcBXaw4RAaQbfTNe8BB75l4NpoQ6sMdrutdEpdQ==, + integrity: sha512-+v7BbUNLgUD1j+dBQw3YRExLnIhroBradExkhDLpkLwZowzhgUQgSYW4PJul2SlST2qyistlEIPaHTJK9tZlEw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-cascade-layers": 4.0.0(postcss@8.4.28) - "@csstools/postcss-color-function": 3.0.1(postcss@8.4.28) - "@csstools/postcss-color-mix-function": 2.0.1(postcss@8.4.28) - "@csstools/postcss-exponential-functions": 1.0.0(postcss@8.4.28) - "@csstools/postcss-font-format-keywords": 3.0.0(postcss@8.4.28) - "@csstools/postcss-gradients-interpolation-method": 4.0.1(postcss@8.4.28) - "@csstools/postcss-hwb-function": 3.0.1(postcss@8.4.28) - "@csstools/postcss-ic-unit": 3.0.0(postcss@8.4.28) - "@csstools/postcss-is-pseudo-class": 4.0.0(postcss@8.4.28) - "@csstools/postcss-logical-float-and-clear": 2.0.0(postcss@8.4.28) - "@csstools/postcss-logical-resize": 2.0.0(postcss@8.4.28) - "@csstools/postcss-logical-viewport-units": 2.0.1(postcss@8.4.28) - "@csstools/postcss-media-minmax": 1.0.7(postcss@8.4.28) - "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.2(postcss@8.4.28) - "@csstools/postcss-nested-calc": 3.0.0(postcss@8.4.28) - "@csstools/postcss-normalize-display-values": 3.0.0(postcss@8.4.28) - "@csstools/postcss-oklab-function": 3.0.1(postcss@8.4.28) - "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.28) - "@csstools/postcss-relative-color-syntax": 2.0.1(postcss@8.4.28) - "@csstools/postcss-scope-pseudo-class": 3.0.0(postcss@8.4.28) - "@csstools/postcss-stepped-value-functions": 3.0.1(postcss@8.4.28) - "@csstools/postcss-text-decoration-shorthand": 3.0.0(postcss@8.4.28) - "@csstools/postcss-trigonometric-functions": 3.0.1(postcss@8.4.28) - "@csstools/postcss-unset-value": 3.0.0(postcss@8.4.28) - autoprefixer: 10.4.15(postcss@8.4.28) + "@csstools/postcss-cascade-layers": 4.0.0(postcss@8.4.29) + "@csstools/postcss-color-function": 3.0.2(postcss@8.4.29) + "@csstools/postcss-color-mix-function": 2.0.2(postcss@8.4.29) + "@csstools/postcss-exponential-functions": 1.0.0(postcss@8.4.29) + "@csstools/postcss-font-format-keywords": 3.0.0(postcss@8.4.29) + "@csstools/postcss-gradients-interpolation-method": 4.0.2(postcss@8.4.29) + "@csstools/postcss-hwb-function": 3.0.2(postcss@8.4.29) + "@csstools/postcss-ic-unit": 3.0.0(postcss@8.4.29) + "@csstools/postcss-is-pseudo-class": 4.0.0(postcss@8.4.29) + "@csstools/postcss-logical-float-and-clear": 2.0.0(postcss@8.4.29) + "@csstools/postcss-logical-resize": 2.0.0(postcss@8.4.29) + "@csstools/postcss-logical-viewport-units": 2.0.1(postcss@8.4.29) + "@csstools/postcss-media-minmax": 1.0.7(postcss@8.4.29) + "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.2(postcss@8.4.29) + "@csstools/postcss-nested-calc": 3.0.0(postcss@8.4.29) + "@csstools/postcss-normalize-display-values": 3.0.0(postcss@8.4.29) + "@csstools/postcss-oklab-function": 3.0.2(postcss@8.4.29) + "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) + "@csstools/postcss-relative-color-syntax": 2.0.2(postcss@8.4.29) + "@csstools/postcss-scope-pseudo-class": 3.0.0(postcss@8.4.29) + "@csstools/postcss-stepped-value-functions": 3.0.1(postcss@8.4.29) + "@csstools/postcss-text-decoration-shorthand": 3.0.1(postcss@8.4.29) + "@csstools/postcss-trigonometric-functions": 3.0.1(postcss@8.4.29) + "@csstools/postcss-unset-value": 3.0.0(postcss@8.4.29) + autoprefixer: 10.4.15(postcss@8.4.29) browserslist: 4.21.10 - css-blank-pseudo: 6.0.0(postcss@8.4.28) - css-has-pseudo: 6.0.0(postcss@8.4.28) - css-prefers-color-scheme: 9.0.0(postcss@8.4.28) + css-blank-pseudo: 6.0.0(postcss@8.4.29) + css-has-pseudo: 6.0.0(postcss@8.4.29) + css-prefers-color-scheme: 9.0.0(postcss@8.4.29) cssdb: 7.7.1 - postcss: 8.4.28 - postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.28) - postcss-clamp: 4.1.0(postcss@8.4.28) - postcss-color-functional-notation: 6.0.0(postcss@8.4.28) - postcss-color-hex-alpha: 9.0.2(postcss@8.4.28) - postcss-color-rebeccapurple: 9.0.0(postcss@8.4.28) - postcss-custom-media: 10.0.0(postcss@8.4.28) - postcss-custom-properties: 13.3.0(postcss@8.4.28) - postcss-custom-selectors: 7.1.4(postcss@8.4.28) - postcss-dir-pseudo-class: 8.0.0(postcss@8.4.28) - postcss-double-position-gradients: 5.0.0(postcss@8.4.28) - postcss-focus-visible: 9.0.0(postcss@8.4.28) - postcss-focus-within: 8.0.0(postcss@8.4.28) - postcss-font-variant: 5.0.0(postcss@8.4.28) - postcss-gap-properties: 5.0.0(postcss@8.4.28) - postcss-image-set-function: 6.0.0(postcss@8.4.28) - postcss-initial: 4.0.1(postcss@8.4.28) - postcss-lab-function: 6.0.1(postcss@8.4.28) - postcss-logical: 7.0.0(postcss@8.4.28) - postcss-nesting: 12.0.1(postcss@8.4.28) - postcss-opacity-percentage: 2.0.0(postcss@8.4.28) - postcss-overflow-shorthand: 5.0.0(postcss@8.4.28) - postcss-page-break: 3.0.4(postcss@8.4.28) - postcss-place: 9.0.0(postcss@8.4.28) - postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.28) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.28) - postcss-selector-not: 7.0.1(postcss@8.4.28) + postcss: 8.4.29 + postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.29) + postcss-clamp: 4.1.0(postcss@8.4.29) + postcss-color-functional-notation: 6.0.0(postcss@8.4.29) + postcss-color-hex-alpha: 9.0.2(postcss@8.4.29) + postcss-color-rebeccapurple: 9.0.0(postcss@8.4.29) + postcss-custom-media: 10.0.0(postcss@8.4.29) + postcss-custom-properties: 13.3.0(postcss@8.4.29) + postcss-custom-selectors: 7.1.4(postcss@8.4.29) + postcss-dir-pseudo-class: 8.0.0(postcss@8.4.29) + postcss-double-position-gradients: 5.0.0(postcss@8.4.29) + postcss-focus-visible: 9.0.0(postcss@8.4.29) + postcss-focus-within: 8.0.0(postcss@8.4.29) + postcss-font-variant: 5.0.0(postcss@8.4.29) + postcss-gap-properties: 5.0.0(postcss@8.4.29) + postcss-image-set-function: 6.0.0(postcss@8.4.29) + postcss-initial: 4.0.1(postcss@8.4.29) + postcss-lab-function: 6.0.2(postcss@8.4.29) + postcss-logical: 7.0.0(postcss@8.4.29) + postcss-nesting: 12.0.1(postcss@8.4.29) + postcss-opacity-percentage: 2.0.0(postcss@8.4.29) + postcss-overflow-shorthand: 5.0.0(postcss@8.4.29) + postcss-page-break: 3.0.4(postcss@8.4.29) + postcss-place: 9.0.0(postcss@8.4.29) + postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.29) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.29) + postcss-selector-not: 7.0.1(postcss@8.4.29) postcss-value-parser: 4.2.0 dev: true - /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.28): + /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.29): resolution: { integrity: sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==, @@ -10468,11 +10468,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true - /postcss-reduce-initial@6.0.0(postcss@8.4.28): + /postcss-reduce-initial@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==, @@ -10483,10 +10483,10 @@ packages: dependencies: browserslist: 4.21.10 caniuse-api: 3.0.0 - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-reduce-transforms@6.0.0(postcss@8.4.28): + /postcss-reduce-transforms@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==, @@ -10495,11 +10495,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.28): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.29): resolution: { integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, @@ -10507,10 +10507,10 @@ packages: peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-reporter@7.0.5(postcss@8.4.28): + /postcss-reporter@7.0.5(postcss@8.4.29): resolution: { integrity: sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==, @@ -10520,7 +10520,7 @@ packages: postcss: ^8.1.0 dependencies: picocolors: 1.0.0 - postcss: 8.4.28 + postcss: 8.4.29 thenby: 1.3.4 dev: true @@ -10531,7 +10531,7 @@ packages: } dev: true - /postcss-safe-parser@6.0.0(postcss@8.4.28): + /postcss-safe-parser@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==, @@ -10540,10 +10540,10 @@ packages: peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 dev: true - /postcss-selector-not@7.0.1(postcss@8.4.28): + /postcss-selector-not@7.0.1(postcss@8.4.29): resolution: { integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==, @@ -10552,7 +10552,7 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true @@ -10577,7 +10577,7 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-svgo@6.0.0(postcss@8.4.28): + /postcss-svgo@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==, @@ -10586,12 +10586,12 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-value-parser: 4.2.0 svgo: 3.0.2 dev: true - /postcss-unique-selectors@6.0.0(postcss@8.4.28): + /postcss-unique-selectors@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==, @@ -10600,7 +10600,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true @@ -10611,10 +10611,10 @@ packages: } dev: true - /postcss@8.4.28: + /postcss@8.4.29: resolution: { - integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==, + integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==, } engines: { node: ^10 || ^12 || >=14 } dependencies: @@ -11930,7 +11930,7 @@ packages: } dev: true - /stylehacks@6.0.0(postcss@8.4.28): + /stylehacks@6.0.0(postcss@8.4.29): resolution: { integrity: sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==, @@ -11940,7 +11940,7 @@ packages: postcss: ^8.2.15 dependencies: browserslist: 4.21.10 - postcss: 8.4.28 + postcss: 8.4.29 postcss-selector-parser: 6.0.13 dev: true @@ -12004,9 +12004,9 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.28 + postcss: 8.4.29 postcss-resolve-nested-selector: 0.1.1 - postcss-safe-parser: 6.0.0(postcss@8.4.28) + postcss-safe-parser: 6.0.0(postcss@8.4.29) postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -12146,11 +12146,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.28 - postcss-import: 15.1.0(postcss@8.4.28) - postcss-js: 4.0.1(postcss@8.4.28) - postcss-load-config: 4.0.1(postcss@8.4.28)(ts-node@10.9.1) - postcss-nested: 6.0.1(postcss@8.4.28) + postcss: 8.4.29 + postcss-import: 15.1.0(postcss@8.4.29) + postcss-js: 4.0.1(postcss@8.4.29) + postcss-load-config: 4.0.1(postcss@8.4.29)(ts-node@10.9.1) + postcss-nested: 6.0.1(postcss@8.4.29) postcss-selector-parser: 6.0.13 resolve: 1.22.4 sucrase: 3.34.0 @@ -12842,7 +12842,7 @@ packages: dependencies: "@types/node": 20.4.7 esbuild: 0.18.20 - postcss: 8.4.28 + postcss: 8.4.29 rollup: 3.28.1 optionalDependencies: fsevents: 2.3.3 @@ -12855,10 +12855,10 @@ packages: } dev: false - /wavesurfer.js@7.1.5: + /wavesurfer.js@7.2.0: resolution: { - integrity: sha512-2zb82LxQzeFn5/O5JhEs1uytdlkksUDALWt7TPN8ppP4jrajuigwcM2g4wx6b+SO4Frweg/r99L1hznr0lsBEg==, + integrity: sha512-wRGFuiE4kRty+LEB6kdmd5OvDOf/r//gGxcCVmJmD7g0njiSvG6xFelGbeL4lo/WTrykigltJjuPDI7RSesRug==, } dev: false From 1c96a6f5da31d2af65bf55717c99589090cb781e Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 9 Sep 2023 10:52:01 +0000 Subject: [PATCH 216/477] build: upgrade CI4 to 4.4.1 + update php and js dependencies to latest --- app/Config/Autoload.php | 2 + app/Config/DocTypes.php | 3 + app/Config/Email.php | 6 +- app/Config/ForeignCharacters.php | 3 + app/Config/Mimes.php | 3 +- app/Config/Modules.php | 8 + app/Resources/js/modules/markdown-preview.ts | 2 - composer.json | 18 +- composer.lock | 271 ++++----------- package.json | 20 +- pnpm-lock.yaml | 328 +++++++++---------- 11 files changed, 272 insertions(+), 392 deletions(-) diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index e1192856..614a9632 100644 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -16,6 +16,8 @@ use CodeIgniter\Config\AutoloadConfig; * * NOTE: If you use an identical key in $psr4 or $classmap, then * the values in this file will overwrite the framework's values. + * + * @immutable */ class Autoload extends AutoloadConfig { diff --git a/app/Config/DocTypes.php b/app/Config/DocTypes.php index 62ad9e07..3d04aaa5 100644 --- a/app/Config/DocTypes.php +++ b/app/Config/DocTypes.php @@ -4,6 +4,9 @@ declare(strict_types=1); namespace Config; +/** + * @immutable + */ class DocTypes { /** diff --git a/app/Config/Email.php b/app/Config/Email.php index 990eb2ef..588d064f 100644 --- a/app/Config/Email.php +++ b/app/Config/Email.php @@ -60,7 +60,11 @@ class Email extends BaseConfig public bool $SMTPKeepAlive = false; /** - * SMTP Encryption. Either tls or ssl + * SMTP Encryption. + * + * @var string '', 'tls' or 'ssl'. 'tls' will issue a STARTTLS command + * to the server. 'ssl' means implicit SSL. Connection on port + * 465 should set this to ''. */ public string $SMTPCrypto = 'tls'; diff --git a/app/Config/ForeignCharacters.php b/app/Config/ForeignCharacters.php index c8fb8ba3..2fe62967 100644 --- a/app/Config/ForeignCharacters.php +++ b/app/Config/ForeignCharacters.php @@ -6,6 +6,9 @@ namespace Config; use CodeIgniter\Config\ForeignCharacters as BaseForeignCharacters; +/** + * @immutable + */ class ForeignCharacters extends BaseForeignCharacters { } diff --git a/app/Config/Mimes.php b/app/Config/Mimes.php index 8e7324f6..83d9e2ae 100644 --- a/app/Config/Mimes.php +++ b/app/Config/Mimes.php @@ -14,8 +14,9 @@ namespace Config; * * When working with mime types, please make sure you have the ´fileinfo´ extension enabled to reliably detect the * media types. + * + * @immutable */ - class Mimes { /** diff --git a/app/Config/Modules.php b/app/Config/Modules.php index fb4c234a..206bb473 100644 --- a/app/Config/Modules.php +++ b/app/Config/Modules.php @@ -6,6 +6,14 @@ namespace Config; use CodeIgniter\Modules\Modules as BaseModules; +/** + * Modules Configuration. + * + * NOTE: This class is required prior to Autoloader instantiation, + * and does not extend BaseConfig. + * + * @immutable + */ class Modules extends BaseModules { /** diff --git a/app/Resources/js/modules/markdown-preview.ts b/app/Resources/js/modules/markdown-preview.ts index 2652f875..d9612415 100644 --- a/app/Resources/js/modules/markdown-preview.ts +++ b/app/Resources/js/modules/markdown-preview.ts @@ -49,8 +49,6 @@ export class MarkdownPreview extends LitElement { return marked(this.escapeHtml(this._textarea.value), { renderer: renderer, - headerIds: false, - mangle: false, }); } diff --git a/composer.json b/composer.json index 134f06b2..1898c033 100644 --- a/composer.json +++ b/composer.json @@ -7,11 +7,11 @@ "license": "AGPL-3.0-or-later", "require": { "php": "^8.1", - "codeigniter4/framework": "v4.4.0", + "codeigniter4/framework": "v4.4.1", "james-heinrich/getid3": "^2.0.0-beta5", "whichbrowser/parser": "^v2.1.7", "geoip2/geoip2": "v2.13.0", - "league/commonmark": "^2.4.0", + "league/commonmark": "^2.4.1", "vlucas/phpdotenv": "v5.5.0", "league/html-to-markdown": "5.1.1", "opawg/user-agents-php": "^v1.0", @@ -23,21 +23,21 @@ "chrisjean/php-ico": "^1.0.4", "melbahja/seo": "^v2.1.1", "codeigniter4/shield": "v1.0.0-beta.6", - "aws/aws-sdk-php": "^3.279.7", + "aws/aws-sdk-php": "^3.281.3", "mpratt/embera": "^2.0.34", "codeigniter4/tasks": "dev-develop", "yassinedoghri/podcast-feed": "dev-main" }, "require-dev": { "captainhook/captainhook": "^5.16.4", - "codeigniter/phpstan-codeigniter": "^1.0", + "codeigniter/phpstan-codeigniter": "^1.0.1", "mikey179/vfsstream": "^v1.6.11", - "phpstan/extension-installer": "^1.3", - "phpstan/phpstan": "^1.10.32", - "phpunit/phpunit": "^10.3.2", - "rector/rector": "^0.18.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.10.33", + "phpunit/phpunit": "^10.3.3", + "rector/rector": "^0.18.2", "symplify/coding-standard": "^12.0.3", - "symplify/easy-coding-standard": "^12.0.7" + "symplify/easy-coding-standard": "^12.0.8" }, "autoload": { "exclude-from-classmap": [ diff --git a/composer.lock b/composer.lock index 55668d4c..ec4f75d0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "68bb8f819d4177e3906686536e6b0227", + "content-hash": "6fe4f69b336852b20244b63f5038f315", "packages": [ { "name": "adaures/ipcat-php", @@ -120,16 +120,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.280.0", + "version": "3.281.3", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "bf4f3079bc59af44a752677cfbcd43f7953c4343" + "reference": "a3cfb20dbfb11117b7174b2594fc597745252e0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bf4f3079bc59af44a752677cfbcd43f7953c4343", - "reference": "bf4f3079bc59af44a752677cfbcd43f7953c4343", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a3cfb20dbfb11117b7174b2594fc597745252e0c", + "reference": "a3cfb20dbfb11117b7174b2594fc597745252e0c", "shasum": "" }, "require": { @@ -205,9 +205,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.280.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.3" }, - "time": "2023-08-30T18:19:33+00:00" + "time": "2023-09-08T18:06:26+00:00" }, { "name": "brick/math", @@ -304,16 +304,16 @@ }, { "name": "codeigniter4/framework", - "version": "v4.4.0", + "version": "v4.4.1", "source": { "type": "git", "url": "https://github.com/codeigniter4/framework.git", - "reference": "30008a0e3c342f2b6e5083927bec49feec95ed53" + "reference": "844616ef291ca07b726c1aaca552e16aadc3ceeb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/30008a0e3c342f2b6e5083927bec49feec95ed53", - "reference": "30008a0e3c342f2b6e5083927bec49feec95ed53", + "url": "https://api.github.com/repos/codeigniter4/framework/zipball/844616ef291ca07b726c1aaca552e16aadc3ceeb", + "reference": "844616ef291ca07b726c1aaca552e16aadc3ceeb", "shasum": "" }, "require": { @@ -370,7 +370,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/codeigniter4/CodeIgniter4" }, - "time": "2023-08-25T07:02:01+00:00" + "time": "2023-09-05T00:46:08+00:00" }, { "name": "codeigniter4/settings", @@ -494,12 +494,12 @@ "source": { "type": "git", "url": "https://github.com/codeigniter4/tasks.git", - "reference": "38efc884d1a21d1bc03240447684f505d1fbba7e" + "reference": "9d898e01bf2c39349c9b2e84512dfbf0f40aaac9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/38efc884d1a21d1bc03240447684f505d1fbba7e", - "reference": "38efc884d1a21d1bc03240447684f505d1fbba7e", + "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/9d898e01bf2c39349c9b2e84512dfbf0f40aaac9", + "reference": "9d898e01bf2c39349c9b2e84512dfbf0f40aaac9", "shasum": "" }, "require": { @@ -510,7 +510,7 @@ "require-dev": { "codeigniter4/devkit": "^1.0", "codeigniter4/framework": "^4.1", - "rector/rector": "0.18.1" + "rector/rector": "0.18.2" }, "default-branch": true, "type": "library", @@ -562,7 +562,7 @@ "source": "https://github.com/codeigniter4/tasks/tree/develop", "issues": "https://github.com/codeigniter4/tasks/issues" }, - "time": "2023-08-29T11:31:16+00:00" + "time": "2023-09-09T10:30:12+00:00" }, { "name": "composer/ca-bundle", @@ -3489,164 +3489,23 @@ ], "time": "2022-02-25T21:32:43+00:00" }, - { - "name": "doctrine/annotations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^2 || ^3", - "ext-tokenizer": "*", - "php": "^7.2 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^2.0", - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": ["annotations", "docblock", "parser"], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/2.0.1" - }, - "time": "2023-02-02T22:02:53+00:00" - }, - { - "name": "doctrine/lexer", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "84a527db05647743d50373e0ec53a152f2cde568" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568", - "reference": "84a527db05647743d50373e0ec53a152f2cde568", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.9", - "phpunit/phpunit": "^9.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": ["annotations", "docblock", "lexer", "parser", "php"], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.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%2Flexer", - "type": "tidelift" - } - ], - "time": "2022-12-15T16:57:16+00:00" - }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.24.0", + "version": "v3.26.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "bb6c9d7945dcbf6942e151b018c44d3767e21403" + "reference": "d023ba6684055f6ea1da1352d8a02baca0426983" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/bb6c9d7945dcbf6942e151b018c44d3767e21403", - "reference": "bb6c9d7945dcbf6942e151b018c44d3767e21403", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d023ba6684055f6ea1da1352d8a02baca0426983", + "reference": "d023ba6684055f6ea1da1352d8a02baca0426983", "shasum": "" }, "require": { "composer/semver": "^3.3", "composer/xdebug-handler": "^3.0.3", - "doctrine/annotations": "^2", - "doctrine/lexer": "^2 || ^3", "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", @@ -3711,7 +3570,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.24.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.26.1" }, "funding": [ { @@ -3719,7 +3578,7 @@ "type": "github" } ], - "time": "2023-08-29T23:18:45+00:00" + "time": "2023-09-08T19:09:07+00:00" }, { "name": "mikey179/vfsstream", @@ -4015,16 +3874,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.32", + "version": "1.10.33", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "c47e47d3ab03137c0e121e77c4d2cb58672f6d44" + "reference": "03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c47e47d3ab03137c0e121e77c4d2cb58672f6d44", - "reference": "c47e47d3ab03137c0e121e77c4d2cb58672f6d44", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1", + "reference": "03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1", "shasum": "" }, "require": { @@ -4063,20 +3922,20 @@ "type": "tidelift" } ], - "time": "2023-08-24T21:54:50+00:00" + "time": "2023-09-04T12:20:53+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.3", + "version": "10.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" + "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", + "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", "shasum": "" }, "require": { @@ -4125,7 +3984,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" }, "funding": [ { @@ -4133,7 +3992,7 @@ "type": "github" } ], - "time": "2023-07-26T13:45:28+00:00" + "time": "2023-08-31T14:04:38+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4248,16 +4107,16 @@ }, { "name": "phpunit/php-text-template", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { @@ -4289,7 +4148,8 @@ "keywords": ["template"], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -4297,7 +4157,7 @@ "type": "github" } ], - "time": "2023-02-03T06:56:46+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", @@ -4354,16 +4214,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.2", + "version": "10.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1" + "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0dafb1175c366dd274eaa9a625e914451506bcd1", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", + "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", "shasum": "" }, "require": { @@ -4423,7 +4283,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.3" }, "funding": [ { @@ -4439,7 +4299,7 @@ "type": "tidelift" } ], - "time": "2023-08-15T05:34:23+00:00" + "time": "2023-09-05T04:34:51+00:00" }, { "name": "psr/container", @@ -4494,16 +4354,16 @@ }, { "name": "rector/rector", - "version": "0.18.1", + "version": "0.18.2", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "ee72ef542680a7f47ed8c6784f78b032c0d2f381" + "reference": "8606564b50ce70f99839d35c67f4536dc2ea090d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/ee72ef542680a7f47ed8c6784f78b032c0d2f381", - "reference": "ee72ef542680a7f47ed8c6784f78b032c0d2f381", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/8606564b50ce70f99839d35c67f4536dc2ea090d", + "reference": "8606564b50ce70f99839d35c67f4536dc2ea090d", "shasum": "" }, "require": { @@ -4527,7 +4387,7 @@ "keywords": ["automation", "dev", "migration", "refactoring"], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.18.1" + "source": "https://github.com/rectorphp/rector/tree/0.18.2" }, "funding": [ { @@ -4535,7 +4395,7 @@ "type": "github" } ], - "time": "2023-08-28T18:01:58+00:00" + "time": "2023-09-06T08:50:38+00:00" }, { "name": "sebastian/cli-parser", @@ -4931,16 +4791,16 @@ }, { "name": "sebastian/exporter", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" + "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/32ff03d078fed1279c4ec9a407d08c5e9febb480", + "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480", "shasum": "" }, "require": { @@ -4989,7 +4849,8 @@ "keywords": ["export", "exporter"], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.1" }, "funding": [ { @@ -4997,7 +4858,7 @@ "type": "github" } ], - "time": "2023-02-03T07:06:49+00:00" + "time": "2023-09-08T04:46:58+00:00" }, { "name": "sebastian/global-state", @@ -6495,16 +6356,16 @@ }, { "name": "symplify/easy-coding-standard", - "version": "12.0.7", + "version": "12.0.8", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "79b5679f0dd758311770543969087b8dc46429ee" + "reference": "99d87d188acc712dd6655ee946569f823cfeff69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/79b5679f0dd758311770543969087b8dc46429ee", - "reference": "79b5679f0dd758311770543969087b8dc46429ee", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/99d87d188acc712dd6655ee946569f823cfeff69", + "reference": "99d87d188acc712dd6655ee946569f823cfeff69", "shasum": "" }, "require": { @@ -6526,7 +6387,7 @@ "keywords": ["Code style", "automation", "fixer", "static analysis"], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.0.7" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.0.8" }, "funding": [ { @@ -6538,7 +6399,7 @@ "type": "github" } ], - "time": "2023-08-24T21:43:33+00:00" + "time": "2023-09-08T10:17:14+00:00" }, { "name": "symplify/rule-doc-generator-contracts", diff --git a/package.json b/package.json index 6580211d..7a7073da 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@codemirror/lang-xml": "^6.0.2", "@codemirror/language": "^6.9.0", "@codemirror/state": "^6.2.1", - "@codemirror/view": "^6.17.0", + "@codemirror/view": "^6.18.0", "@floating-ui/dom": "^1.5.1", "@github/clipboard-copy-element": "^1.2.1", "@github/hotkey": "^2.0.1", @@ -47,8 +47,8 @@ "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", "lit": "^2.8.0", - "marked": "^7.0.5", - "wavesurfer.js": "^7.2.0", + "marked": "^8.0.1", + "wavesurfer.js": "^7.3.0", "xml-formatter": "^3.5.0" }, "devDependencies": { @@ -60,16 +60,16 @@ "@semantic-release/git": "^10.0.1", "@semantic-release/gitlab": "^12.0.5", "@tailwindcss/forms": "^0.5.6", - "@tailwindcss/typography": "^0.5.9", + "@tailwindcss/typography": "^0.5.10", "@types/leaflet": "^1.9.4", - "@typescript-eslint/eslint-plugin": "^6.4.1", - "@typescript-eslint/parser": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^6.6.0", + "@typescript-eslint/parser": "^6.6.0", "all-contributors-cli": "^6.26.1", "commitizen": "^4.3.0", "cross-env": "^7.0.3", "cssnano": "^6.0.1", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-prettier": "^8.10.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.3", @@ -78,7 +78,7 @@ "postcss": "^8.4.29", "postcss-import": "^15.1.0", "postcss-nesting": "^12.0.1", - "postcss-preset-env": "^9.1.2", + "postcss-preset-env": "^9.1.3", "postcss-reporter": "^7.0.5", "prettier": "2.8.8", "prettier-plugin-organize-imports": "^3.2.3", @@ -87,9 +87,9 @@ "stylelint-config-standard": "^34.0.0", "svgo": "^3.0.2", "tailwindcss": "^3.3.3", - "typescript": "^5.1.6", + "typescript": "^5.2.2", "vite": "^4.4.9", - "vite-plugin-pwa": "^0.16.4", + "vite-plugin-pwa": "^0.16.5", "workbox-build": "^7.0.0", "workbox-core": "^7.0.0", "workbox-routing": "^7.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03d09119..a1f4fc58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ dependencies: version: 6.2.5 "@codemirror/lang-xml": specifier: ^6.0.2 - version: 6.0.2(@codemirror/view@6.17.0) + version: 6.0.2(@codemirror/view@6.18.0) "@codemirror/language": specifier: ^6.9.0 version: 6.9.0 @@ -24,8 +24,8 @@ dependencies: specifier: ^6.2.1 version: 6.2.1 "@codemirror/view": - specifier: ^6.17.0 - version: 6.17.0 + specifier: ^6.18.0 + version: 6.18.0 "@floating-ui/dom": specifier: ^1.5.1 version: 1.5.1 @@ -66,11 +66,11 @@ dependencies: specifier: ^2.8.0 version: 2.8.0 marked: - specifier: ^7.0.5 - version: 7.0.5 + specifier: ^8.0.1 + version: 8.0.1 wavesurfer.js: - specifier: ^7.2.0 - version: 7.2.0 + specifier: ^7.3.0 + version: 7.3.0 xml-formatter: specifier: ^3.5.0 version: 3.5.0 @@ -101,17 +101,17 @@ devDependencies: specifier: ^0.5.6 version: 0.5.6(tailwindcss@3.3.3) "@tailwindcss/typography": - specifier: ^0.5.9 - version: 0.5.9(tailwindcss@3.3.3) + specifier: ^0.5.10 + version: 0.5.10(tailwindcss@3.3.3) "@types/leaflet": specifier: ^1.9.4 version: 1.9.4 "@typescript-eslint/eslint-plugin": - specifier: ^6.4.1 - version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.1.6) + specifier: ^6.6.0 + version: 6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.49.0)(typescript@5.2.2) "@typescript-eslint/parser": - specifier: ^6.4.1 - version: 6.4.1(eslint@8.48.0)(typescript@5.1.6) + specifier: ^6.6.0 + version: 6.6.0(eslint@8.49.0)(typescript@5.2.2) all-contributors-cli: specifier: ^6.26.1 version: 6.26.1 @@ -128,14 +128,14 @@ devDependencies: specifier: ^3.3.0 version: 3.3.0 eslint: - specifier: ^8.48.0 - version: 8.48.0 + specifier: ^8.49.0 + version: 8.49.0 eslint-config-prettier: specifier: ^8.10.0 - version: 8.10.0(eslint@8.48.0) + version: 8.10.0(eslint@8.49.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.48.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.49.0)(prettier@2.8.8) husky: specifier: ^8.0.3 version: 8.0.3 @@ -155,8 +155,8 @@ devDependencies: specifier: ^12.0.1 version: 12.0.1(postcss@8.4.29) postcss-preset-env: - specifier: ^9.1.2 - version: 9.1.2(postcss@8.4.29) + specifier: ^9.1.3 + version: 9.1.3(postcss@8.4.29) postcss-reporter: specifier: ^7.0.5 version: 7.0.5(postcss@8.4.29) @@ -165,7 +165,7 @@ devDependencies: version: 2.8.8 prettier-plugin-organize-imports: specifier: ^3.2.3 - version: 3.2.3(prettier@2.8.8)(typescript@5.1.6) + version: 3.2.3(prettier@2.8.8)(typescript@5.2.2) semantic-release: specifier: ^21.1.1 version: 21.1.1 @@ -182,14 +182,14 @@ devDependencies: specifier: ^3.3.3 version: 3.3.3(ts-node@10.9.1) typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.2.2 + version: 5.2.2 vite: specifier: ^4.4.9 version: 4.4.9(@types/node@20.4.7) vite-plugin-pwa: - specifier: ^0.16.4 - version: 0.16.4(vite@4.4.9)(workbox-build@7.0.0)(workbox-window@7.0.0) + specifier: ^0.16.5 + version: 0.16.5(vite@4.4.9)(workbox-build@7.0.0)(workbox-window@7.0.0) workbox-build: specifier: ^7.0.0 version: 7.0.0 @@ -1746,7 +1746,7 @@ packages: to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.17.0)(@lezer/common@1.0.4): + /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.18.0)(@lezer/common@1.0.4): resolution: { integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==, @@ -1759,7 +1759,7 @@ packages: dependencies: "@codemirror/language": 6.9.0 "@codemirror/state": 6.2.1 - "@codemirror/view": 6.17.0 + "@codemirror/view": 6.18.0 "@lezer/common": 1.0.4 dev: false @@ -1771,17 +1771,17 @@ packages: dependencies: "@codemirror/language": 6.9.0 "@codemirror/state": 6.2.1 - "@codemirror/view": 6.17.0 + "@codemirror/view": 6.18.0 "@lezer/common": 1.0.4 dev: false - /@codemirror/lang-xml@6.0.2(@codemirror/view@6.17.0): + /@codemirror/lang-xml@6.0.2(@codemirror/view@6.18.0): resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.17.0)(@lezer/common@1.0.4) + "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.18.0)(@lezer/common@1.0.4) "@codemirror/language": 6.9.0 "@codemirror/state": 6.2.1 "@lezer/common": 1.0.4 @@ -1797,7 +1797,7 @@ packages: } dependencies: "@codemirror/state": 6.2.1 - "@codemirror/view": 6.17.0 + "@codemirror/view": 6.18.0 "@lezer/common": 1.0.4 "@lezer/highlight": 1.1.6 "@lezer/lr": 1.3.10 @@ -1811,7 +1811,7 @@ packages: } dependencies: "@codemirror/state": 6.2.1 - "@codemirror/view": 6.17.0 + "@codemirror/view": 6.18.0 crelt: 1.0.6 dev: false @@ -1822,7 +1822,7 @@ packages: } dependencies: "@codemirror/state": 6.2.1 - "@codemirror/view": 6.17.0 + "@codemirror/view": 6.18.0 crelt: 1.0.6 dev: false @@ -1833,10 +1833,10 @@ packages: } dev: false - /@codemirror/view@6.17.0: + /@codemirror/view@6.18.0: resolution: { - integrity: sha512-0yVhPSyKWwYDy6Xwd7aDoj8ZXtdoHwC7El4z1/JJpIimrtDR5CVGY4lvQ0r2hP11ezB+eCHexZ6Zbz6rPUe06A==, + integrity: sha512-T6q1yYAoU+gSWfJFR4ryvDQcyOqS+Mw5RCvh26y0KiNksOOLYhNvdB3BTyLz8vy4fKaYlzbAOyBU7OQPUGHzjQ==, } dependencies: "@codemirror/state": 6.2.1 @@ -1970,13 +1970,13 @@ packages: "@types/node": 20.4.7 chalk: 4.1.2 cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.2.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.1.6) - typescript: 5.1.6 + ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - "@swc/core" - "@swc/wasm" @@ -2097,10 +2097,10 @@ packages: "@csstools/css-tokenizer": 2.2.0 dev: true - /@csstools/color-helpers@3.0.1: + /@csstools/color-helpers@3.0.2: resolution: { - integrity: sha512-Tsp6FcSPaPN/+4T7iBPxBVopJUs7bimnNx4yuWeGXkH084Vro/y8fmrGg1LGSWH8SU6YuH20fP5Rtqtb979jyw==, + integrity: sha512-NMVs/l7Y9eIKL5XjbCHEgGcG8LOUT2qVcRjX6EzkCdlvftHVKr2tHIPzHavfrULRZ5Q2gxrJ9f44dAlj6fX97Q==, } engines: { node: ^14 || ^16 || >=18 } dev: true @@ -2119,17 +2119,17 @@ packages: "@csstools/css-tokenizer": 2.2.0 dev: true - /@csstools/css-color-parser@1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0): + /@csstools/css-color-parser@1.3.1(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0): resolution: { - integrity: sha512-jgudbE+TXZLssSTGFRCkJF9gAM8ABZ2c9/gbLupwA8Y1SpcddxK2z74/MOSdWuboUHbshei8uSQNbp9Wu1Bx+Q==, + integrity: sha512-cehc/DQCyb4hL4fspvyL7WiY+uAy8Iuaz0yTyndC/AyBmxkNpgtSgCSsr0aR4vkaSFVZfNNVlKbjHFwOsPGB1Q==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: "@csstools/css-parser-algorithms": ^2.3.1 "@csstools/css-tokenizer": ^2.2.0 dependencies: - "@csstools/color-helpers": 3.0.1 + "@csstools/color-helpers": 3.0.2 "@csstools/css-calc": 1.1.3(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 @@ -2183,32 +2183,32 @@ packages: postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-color-function@3.0.2(postcss@8.4.29): + /@csstools/postcss-color-function@3.0.3(postcss@8.4.29): resolution: { - integrity: sha512-sfEBBWVMNPE3mHllI+FR43W2qy7eIjqCySAoivPFV068yKbUy6mH8Sra5Gjar54M3p2qvH8S/6KPlvEDBTvrmg==, + integrity: sha512-5oNUbO89SX7BuSB0ZiUxDaQt4R2K3A+RQZlxNHOvghZJO/UqgomLPII6JkgrywLQ0Y4JDzbyNuwr0OKo2v0RsQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.1(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) postcss: 8.4.29 dev: true - /@csstools/postcss-color-mix-function@2.0.2(postcss@8.4.29): + /@csstools/postcss-color-mix-function@2.0.3(postcss@8.4.29): resolution: { - integrity: sha512-121MUtL/fv+lO9FQJKP05UAKC6xYl4hZYyWl+pGbfXIa3KkgCbcMfhkIc0zV2JpwsB5uhls81bwl+XJKhKwECw==, + integrity: sha512-q/fv8pdRR07GAJTvemXbQ02hwVGmVcOjBJj7+gnlGrAVwSzrPEsJc8zM/EzoqVJTZtm/DwG6TWu+VJIxVpyUBg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.1(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) @@ -2243,32 +2243,32 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.2(postcss@8.4.29): + /@csstools/postcss-gradients-interpolation-method@4.0.3(postcss@8.4.29): resolution: { - integrity: sha512-ogriVRZFMgV/oS4pwuXTdFJ7I+saq0oSHzev/XsvXOoRHXOK9jB2q6zEfl3o1Edl0X2wHmacwtfRk8RBmopnYw==, + integrity: sha512-dEK3WbajX538Zu3lPMtBPAO1pooR7zslJ1mDrWKQzlwQczls3fEz+tlRhd7KWMMlsoIwNGMIGq2W/GqEErDjkg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.1(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) postcss: 8.4.29 dev: true - /@csstools/postcss-hwb-function@3.0.2(postcss@8.4.29): + /@csstools/postcss-hwb-function@3.0.3(postcss@8.4.29): resolution: { - integrity: sha512-K4W97KaMnCLUS7/hfdxsM10ghPtIwfYP+VGUwpMgNYa7LVwE+9vkL/N/hzwqSShICtWD6doX1yAT0qcKUbgs0w==, + integrity: sha512-2TqrRD8JzSwQCRKKNc9BFhSEmsz+mR3RtwSw5mQSGILC+LIYCVWeYwC33cI+saFWv0DGZ0NXLx5VSX2tdJyU6w==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.1(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 postcss: 8.4.29 @@ -2288,10 +2288,10 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-is-pseudo-class@4.0.0(postcss@8.4.29): + /@csstools/postcss-is-pseudo-class@4.0.1(postcss@8.4.29): resolution: { - integrity: sha512-0I6siRcDymG3RrkNTSvHDMxTQ6mDyYE8awkcaHNgtYacd43msl+4ZWDfQ1yZQ/viczVWjqJkLmPiRHSgxn5nZA==, + integrity: sha512-KJGLbjjjg+mdNclLyCfsZaJS4xCaRaxKAnmWKpIp1FarEem3ZdoOxTlIELwvlE5BVg1t3QTmp0+DPSlLTTFMhA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2397,16 +2397,16 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.2(postcss@8.4.29): + /@csstools/postcss-oklab-function@3.0.3(postcss@8.4.29): resolution: { - integrity: sha512-tr7HjHDaDvRcnzK559l3VcpfhiAd0ga1jhThGR/tONfVzOVssG9x0QLg0LpLrlx7+niGgHL1SdfgHmFiTJjGIw==, + integrity: sha512-8Wdpmy8mvVyHsToJkrnNpwpAgqCPNpQMLNqkR62smbEuFcmRHEiDnb0OlkKjErzmiBMr7vjZAQ6e2lA9oVguQQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.1(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) @@ -2426,16 +2426,16 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-relative-color-syntax@2.0.2(postcss@8.4.29): + /@csstools/postcss-relative-color-syntax@2.0.3(postcss@8.4.29): resolution: { - integrity: sha512-sn2zqcM8QPj4wN2okdNbK0JdwhZU506EEmIeSybh2UOJgTorbyQS7ak2sJ+2Y4LDYr4rPGBs/hBFmyYgoostdg==, + integrity: sha512-9MOzad5i0fnkOI6qXzcznuyGhLYARBkR8wDsyqbANkZ20srHJZ6PAy44g5eNw3+B7yvslUK4hx9ehnbbI9x4rw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.1(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) @@ -2470,16 +2470,16 @@ packages: postcss: 8.4.29 dev: true - /@csstools/postcss-text-decoration-shorthand@3.0.1(postcss@8.4.29): + /@csstools/postcss-text-decoration-shorthand@3.0.2(postcss@8.4.29): resolution: { - integrity: sha512-a5Ojrf31XfdsmFhbLR41JG8HD9d7mWeOqROUJpTi9MTJDAHeJstvhrmpHS39C11luwSHanLou4v3PI9xLbWolQ==, + integrity: sha512-vO2onX7/TPU3LMrSvg+FhMxTujhU+LELP9zln7SiB5BJqZi+y/ZOJZRBHFvCfM9J1lnNkskMN96bP5g3yg7Jmw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/color-helpers": 3.0.1 + "@csstools/color-helpers": 3.0.2 postcss: 8.4.29 postcss-value-parser: 4.2.0 dev: true @@ -2787,7 +2787,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -2796,7 +2796,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.48.0 + eslint: 8.49.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2828,10 +2828,10 @@ packages: - supports-color dev: true - /@eslint/js@8.48.0: + /@eslint/js@8.49.0: resolution: { - integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==, + integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true @@ -2938,10 +2938,10 @@ packages: } dev: false - /@humanwhocodes/config-array@0.11.10: + /@humanwhocodes/config-array@0.11.11: resolution: { - integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, + integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==, } engines: { node: ">=10.10.0" } dependencies: @@ -3605,10 +3605,10 @@ packages: postcss-nested: 5.0.6(postcss@8.4.29) dev: false - /@tailwindcss/typography@0.5.9(tailwindcss@3.3.3): + /@tailwindcss/typography@0.5.10(tailwindcss@3.3.3): resolution: { - integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==, + integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==, } peerDependencies: tailwindcss: ">=3.0.0 || insiders" @@ -3750,10 +3750,10 @@ packages: integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==, } - /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.48.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.49.0)(typescript@5.2.2): resolution: { - integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==, + integrity: sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -3765,27 +3765,27 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.8.0 - "@typescript-eslint/parser": 6.4.1(eslint@8.48.0)(typescript@5.1.6) - "@typescript-eslint/scope-manager": 6.4.1 - "@typescript-eslint/type-utils": 6.4.1(eslint@8.48.0)(typescript@5.1.6) - "@typescript-eslint/utils": 6.4.1(eslint@8.48.0)(typescript@5.1.6) - "@typescript-eslint/visitor-keys": 6.4.1 + "@typescript-eslint/parser": 6.6.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/type-utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.6.0 debug: 4.3.4 - eslint: 8.48.0 + eslint: 8.49.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.4.1(eslint@8.48.0)(typescript@5.1.6): + /@typescript-eslint/parser@6.6.0(eslint@8.49.0)(typescript@5.2.2): resolution: { - integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==, + integrity: sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -3795,32 +3795,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.4.1 - "@typescript-eslint/types": 6.4.1 - "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) - "@typescript-eslint/visitor-keys": 6.4.1 + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.6.0 debug: 4.3.4 - eslint: 8.48.0 - typescript: 5.1.6 + eslint: 8.49.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.4.1: + /@typescript-eslint/scope-manager@6.6.0: resolution: { - integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==, + integrity: sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.4.1 - "@typescript-eslint/visitor-keys": 6.4.1 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 dev: true - /@typescript-eslint/type-utils@6.4.1(eslint@8.48.0)(typescript@5.1.6): + /@typescript-eslint/type-utils@6.6.0(eslint@8.49.0)(typescript@5.2.2): resolution: { - integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==, + integrity: sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -3830,28 +3830,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) - "@typescript-eslint/utils": 6.4.1(eslint@8.48.0)(typescript@5.1.6) + "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) + "@typescript-eslint/utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.48.0 - ts-api-utils: 1.0.2(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.49.0 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.4.1: + /@typescript-eslint/types@6.6.0: resolution: { - integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==, + integrity: sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: true - /@typescript-eslint/typescript-estree@6.4.1(typescript@5.1.6): + /@typescript-eslint/typescript-estree@6.6.0(typescript@5.2.2): resolution: { - integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==, + integrity: sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -3860,48 +3860,48 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.4.1 - "@typescript-eslint/visitor-keys": 6.4.1 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.4.1(eslint@8.48.0)(typescript@5.1.6): + /@typescript-eslint/utils@6.6.0(eslint@8.49.0)(typescript@5.2.2): resolution: { - integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==, + integrity: sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.48.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.49.0) "@types/json-schema": 7.0.12 "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 6.4.1 - "@typescript-eslint/types": 6.4.1 - "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) - eslint: 8.48.0 + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) + eslint: 8.49.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.4.1: + /@typescript-eslint/visitor-keys@6.6.0: resolution: { - integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==, + integrity: sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.4.1 + "@typescript-eslint/types": 6.6.0 eslint-visitor-keys: 3.4.3 dev: true @@ -4880,13 +4880,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.17.0)(@lezer/common@1.0.4) + "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.18.0)(@lezer/common@1.0.4) "@codemirror/commands": 6.2.5 "@codemirror/language": 6.9.0 "@codemirror/lint": 6.4.0 "@codemirror/search": 6.5.1 "@codemirror/state": 6.2.1 - "@codemirror/view": 6.17.0 + "@codemirror/view": 6.18.0 transitivePeerDependencies: - "@lezer/common" dev: false @@ -5151,7 +5151,7 @@ packages: integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, } - /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.4.7)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.2.2): resolution: { integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==, @@ -5165,8 +5165,8 @@ packages: dependencies: "@types/node": 20.4.7 cosmiconfig: 8.2.0 - ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.1.6) - typescript: 5.1.6 + ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.2.2) + typescript: 5.2.2 dev: true /cosmiconfig@8.2.0: @@ -6167,7 +6167,7 @@ packages: source-map: 0.1.43 dev: false - /eslint-config-prettier@8.10.0(eslint@8.48.0): + /eslint-config-prettier@8.10.0(eslint@8.49.0): resolution: { integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==, @@ -6176,10 +6176,10 @@ packages: peerDependencies: eslint: ">=7.0.0" dependencies: - eslint: 8.48.0 + eslint: 8.49.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.48.0)(prettier@2.8.8): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.49.0)(prettier@2.8.8): resolution: { integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, @@ -6193,8 +6193,8 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.48.0 - eslint-config-prettier: 8.10.0(eslint@8.48.0) + eslint: 8.49.0 + eslint-config-prettier: 8.10.0(eslint@8.49.0) prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true @@ -6218,19 +6218,19 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /eslint@8.48.0: + /eslint@8.49.0: resolution: { - integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==, + integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.48.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.49.0) "@eslint-community/regexpp": 4.8.0 "@eslint/eslintrc": 2.1.2 - "@eslint/js": 8.48.0 - "@humanwhocodes/config-array": 0.11.10 + "@eslint/js": 8.49.0 + "@humanwhocodes/config-array": 0.11.11 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 ajv: 6.12.6 @@ -8644,10 +8644,10 @@ packages: hasBin: true dev: true - /marked@7.0.5: + /marked@8.0.1: resolution: { - integrity: sha512-lwNAFTfXgqpt/XvK17a/8wY9/q6fcSPZT1aP6QW0u74VwaJF/Z9KbRcX23sWE4tODM+AolJNcUtErTkgOeFP/Q==, + integrity: sha512-eEbeEb/mJwh+sNLEhHOWtxMgjN/NEwZUBs1nkiIH2sTQTq07KmPMQ48ihyvo5+Ya56spVOPhunfGr6406crCVA==, } engines: { node: ">= 16" } hasBin: true @@ -10034,16 +10034,16 @@ packages: postcss: 8.4.29 dev: true - /postcss-lab-function@6.0.2(postcss@8.4.29): + /postcss-lab-function@6.0.3(postcss@8.4.29): resolution: { - integrity: sha512-OfjeI/1rQWtj38Quy3+D9+mpOReOX3vOXfQNCfsmFIl6xK1AAJ1ta1uGjAswYwsN8uJ9Y52K8U53Jk8QJWfJLg==, + integrity: sha512-+0WxmblCb2Khfj9wpJQKd/9QhtHK/ImIqfnXX4HEoTDmjdtI6IUjXnC83bYX0CaHitpPjWnoQjoasW7qb1TCHw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.3.0(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) + "@csstools/css-color-parser": 1.3.1(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.0) "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.0) "@csstools/css-tokenizer": 2.2.0 "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) @@ -10067,7 +10067,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.29 - ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.1.6) + ts-node: 10.9.1(@types/node@20.4.7)(typescript@5.2.2) yaml: 2.3.1 dev: true @@ -10390,24 +10390,24 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.1.2(postcss@8.4.29): + /postcss-preset-env@9.1.3(postcss@8.4.29): resolution: { - integrity: sha512-+v7BbUNLgUD1j+dBQw3YRExLnIhroBradExkhDLpkLwZowzhgUQgSYW4PJul2SlST2qyistlEIPaHTJK9tZlEw==, + integrity: sha512-h8iPXykc4i/MDkbu8GuROt90mQJcj4//P49keGW+mcfs9xWeUZFotsT0m2YV9zpdCvSNJojOww1Os6BpVTpHbA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: "@csstools/postcss-cascade-layers": 4.0.0(postcss@8.4.29) - "@csstools/postcss-color-function": 3.0.2(postcss@8.4.29) - "@csstools/postcss-color-mix-function": 2.0.2(postcss@8.4.29) + "@csstools/postcss-color-function": 3.0.3(postcss@8.4.29) + "@csstools/postcss-color-mix-function": 2.0.3(postcss@8.4.29) "@csstools/postcss-exponential-functions": 1.0.0(postcss@8.4.29) "@csstools/postcss-font-format-keywords": 3.0.0(postcss@8.4.29) - "@csstools/postcss-gradients-interpolation-method": 4.0.2(postcss@8.4.29) - "@csstools/postcss-hwb-function": 3.0.2(postcss@8.4.29) + "@csstools/postcss-gradients-interpolation-method": 4.0.3(postcss@8.4.29) + "@csstools/postcss-hwb-function": 3.0.3(postcss@8.4.29) "@csstools/postcss-ic-unit": 3.0.0(postcss@8.4.29) - "@csstools/postcss-is-pseudo-class": 4.0.0(postcss@8.4.29) + "@csstools/postcss-is-pseudo-class": 4.0.1(postcss@8.4.29) "@csstools/postcss-logical-float-and-clear": 2.0.0(postcss@8.4.29) "@csstools/postcss-logical-resize": 2.0.0(postcss@8.4.29) "@csstools/postcss-logical-viewport-units": 2.0.1(postcss@8.4.29) @@ -10415,12 +10415,12 @@ packages: "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.2(postcss@8.4.29) "@csstools/postcss-nested-calc": 3.0.0(postcss@8.4.29) "@csstools/postcss-normalize-display-values": 3.0.0(postcss@8.4.29) - "@csstools/postcss-oklab-function": 3.0.2(postcss@8.4.29) + "@csstools/postcss-oklab-function": 3.0.3(postcss@8.4.29) "@csstools/postcss-progressive-custom-properties": 3.0.0(postcss@8.4.29) - "@csstools/postcss-relative-color-syntax": 2.0.2(postcss@8.4.29) + "@csstools/postcss-relative-color-syntax": 2.0.3(postcss@8.4.29) "@csstools/postcss-scope-pseudo-class": 3.0.0(postcss@8.4.29) "@csstools/postcss-stepped-value-functions": 3.0.1(postcss@8.4.29) - "@csstools/postcss-text-decoration-shorthand": 3.0.1(postcss@8.4.29) + "@csstools/postcss-text-decoration-shorthand": 3.0.2(postcss@8.4.29) "@csstools/postcss-trigonometric-functions": 3.0.1(postcss@8.4.29) "@csstools/postcss-unset-value": 3.0.0(postcss@8.4.29) autoprefixer: 10.4.15(postcss@8.4.29) @@ -10446,7 +10446,7 @@ packages: postcss-gap-properties: 5.0.0(postcss@8.4.29) postcss-image-set-function: 6.0.0(postcss@8.4.29) postcss-initial: 4.0.1(postcss@8.4.29) - postcss-lab-function: 6.0.2(postcss@8.4.29) + postcss-lab-function: 6.0.3(postcss@8.4.29) postcss-logical: 7.0.0(postcss@8.4.29) postcss-nesting: 12.0.1(postcss@8.4.29) postcss-opacity-percentage: 2.0.0(postcss@8.4.29) @@ -10648,7 +10648,7 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-organize-imports@3.2.3(prettier@2.8.8)(typescript@5.1.6): + /prettier-plugin-organize-imports@3.2.3(prettier@2.8.8)(typescript@5.2.2): resolution: { integrity: sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==, @@ -10665,7 +10665,7 @@ packages: optional: true dependencies: prettier: 2.8.8 - typescript: 5.1.6 + typescript: 5.2.2 dev: true /prettier@2.8.8: @@ -12360,7 +12360,7 @@ packages: engines: { node: ">=12" } dev: true - /ts-api-utils@1.0.2(typescript@5.1.6): + /ts-api-utils@1.0.2(typescript@5.2.2): resolution: { integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==, @@ -12369,7 +12369,7 @@ packages: peerDependencies: typescript: ">=4.2.0" dependencies: - typescript: 5.1.6 + typescript: 5.2.2 dev: true /ts-interface-checker@0.1.13: @@ -12379,7 +12379,7 @@ packages: } dev: true - /ts-node@10.9.1(@types/node@20.4.7)(typescript@5.1.6): + /ts-node@10.9.1(@types/node@20.4.7)(typescript@5.2.2): resolution: { integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, @@ -12408,7 +12408,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.1.6 + typescript: 5.2.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -12597,10 +12597,10 @@ packages: } dev: false - /typescript@5.1.6: + /typescript@5.2.2: resolution: { - integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==, + integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, } engines: { node: ">=14.17" } hasBin: true @@ -12788,10 +12788,10 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-plugin-pwa@0.16.4(vite@4.4.9)(workbox-build@7.0.0)(workbox-window@7.0.0): + /vite-plugin-pwa@0.16.5(vite@4.4.9)(workbox-build@7.0.0)(workbox-window@7.0.0): resolution: { - integrity: sha512-lmwHFIs9zI2H9bXJld/zVTbCqCQHZ9WrpyDMqosICDV0FVnCJwniX1NMDB79HGTIZzOQkY4gSZaVTJTw6maz/Q==, + integrity: sha512-Ahol4dwhMP2UHPQXkllSlXbihOaDFnvBIDPmAxoSZ1EObBUJGP4CMRyCyAVkIHjd6/H+//vH0DM2ON+XxHr81g==, } engines: { node: ">=16.0.0" } peerDependencies: @@ -12855,10 +12855,10 @@ packages: } dev: false - /wavesurfer.js@7.2.0: + /wavesurfer.js@7.3.0: resolution: { - integrity: sha512-wRGFuiE4kRty+LEB6kdmd5OvDOf/r//gGxcCVmJmD7g0njiSvG6xFelGbeL4lo/WTrykigltJjuPDI7RSesRug==, + integrity: sha512-s9lImrWNgpazX8LlRsHuM5q5RmTsaP2YmDtvX7Ky5nTdQwFlcvtRtPabDy6Rpto/diFY0lruD43+BWTtgPVv0A==, } dev: false From d1b35312a4a9540c6634b5a98a91284a843929a5 Mon Sep 17 00:00:00 2001 From: crowdin Date: Sat, 9 Sep 2023 11:48:16 +0000 Subject: [PATCH 217/477] chore(i18n): new Crowdin updates --- app/Language/nn-NO/Episode.php | 12 + app/Language/nn-NO/Podcast.php | 2 +- docs/pnpm-lock.yaml | 1453 ----------------- docs/src/nn-NO/getting-started/docker.md | 111 +- docs/src/nn-NO/getting-started/install.md | 100 +- docs/src/nn-NO/getting-started/update.md | 77 +- docs/src/nn-NO/index.md | 165 +- modules/Admin/Language/nn-NO/Breadcrumb.php | 2 +- modules/Admin/Language/nn-NO/Episode.php | 17 +- modules/Admin/Language/nn-NO/Navigation.php | 4 +- modules/Admin/Language/nn-NO/Podcast.php | 8 +- .../Language/nn-NO/PodcastNavigation.php | 2 +- .../Language/nn-NO/Subscription.php | 18 +- 13 files changed, 270 insertions(+), 1701 deletions(-) delete mode 100644 docs/pnpm-lock.yaml diff --git a/app/Language/nn-NO/Episode.php b/app/Language/nn-NO/Episode.php index e66b3bc2..c6195384 100644 --- a/app/Language/nn-NO/Episode.php +++ b/app/Language/nn-NO/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Alle podkast-episodane', 'back_to_podcast' => 'Gå tilbake til podkasten', + 'preview' => [ + 'title' => 'Førehandsvising', + 'not_published' => 'Ikkje lagt ut', + 'text' => '{publication_status, select, + published {Episoden er ikkje lagt ut enno.} + scheduled {Episoden er planlagt lagt ut på {publication_date}.} + with_podcast {Denne episoden blir lagt ut samstundes som podkasten.} + other {Denne episoden er ikkje lagt ut enno.} + }', + 'publish' => 'Legg ut', + 'publish_edit' => 'Rediger publiseringa', + ], ]; diff --git a/app/Language/nn-NO/Podcast.php b/app/Language/nn-NO/Podcast.php index abcbdf6e..a3161457 100644 --- a/app/Language/nn-NO/Podcast.php +++ b/app/Language/nn-NO/Podcast.php @@ -25,7 +25,7 @@ return [ one {# innlegg} other {# innlegg} }', - 'links' => 'Links', + 'links' => 'Lenker', 'activity' => 'Aktivitet', 'episodes' => 'Episodar', 'episodes_title' => 'Episodar av {podcastTitle}', diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml deleted file mode 100644 index 330234f0..00000000 --- a/docs/pnpm-lock.yaml +++ /dev/null @@ -1,1453 +0,0 @@ -lockfileVersion: "6.0" - -devDependencies: - tailwindcss: - specifier: ^3.2.7 - version: 3.2.7(postcss@8.4.22) - vitepress: - specifier: ^0.22.4 - version: 0.22.4(@algolia/client-search@4.17.0) - -packages: - /@algolia/autocomplete-core@1.7.4: - resolution: - { - integrity: sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==, - } - dependencies: - "@algolia/autocomplete-shared": 1.7.4 - dev: true - - /@algolia/autocomplete-preset-algolia@1.7.4(@algolia/client-search@4.17.0)(algoliasearch@4.17.0): - resolution: - { - integrity: sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==, - } - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - dependencies: - "@algolia/autocomplete-shared": 1.7.4 - "@algolia/client-search": 4.17.0 - algoliasearch: 4.17.0 - dev: true - - /@algolia/autocomplete-shared@1.7.4: - resolution: - { - integrity: sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==, - } - dev: true - - /@algolia/cache-browser-local-storage@4.17.0: - resolution: - { - integrity: sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==, - } - dependencies: - "@algolia/cache-common": 4.17.0 - dev: true - - /@algolia/cache-common@4.17.0: - resolution: - { - integrity: sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==, - } - dev: true - - /@algolia/cache-in-memory@4.17.0: - resolution: - { - integrity: sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==, - } - dependencies: - "@algolia/cache-common": 4.17.0 - dev: true - - /@algolia/client-account@4.17.0: - resolution: - { - integrity: sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==, - } - dependencies: - "@algolia/client-common": 4.17.0 - "@algolia/client-search": 4.17.0 - "@algolia/transporter": 4.17.0 - dev: true - - /@algolia/client-analytics@4.17.0: - resolution: - { - integrity: sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==, - } - dependencies: - "@algolia/client-common": 4.17.0 - "@algolia/client-search": 4.17.0 - "@algolia/requester-common": 4.17.0 - "@algolia/transporter": 4.17.0 - dev: true - - /@algolia/client-common@4.17.0: - resolution: - { - integrity: sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==, - } - dependencies: - "@algolia/requester-common": 4.17.0 - "@algolia/transporter": 4.17.0 - dev: true - - /@algolia/client-personalization@4.17.0: - resolution: - { - integrity: sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==, - } - dependencies: - "@algolia/client-common": 4.17.0 - "@algolia/requester-common": 4.17.0 - "@algolia/transporter": 4.17.0 - dev: true - - /@algolia/client-search@4.17.0: - resolution: - { - integrity: sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==, - } - dependencies: - "@algolia/client-common": 4.17.0 - "@algolia/requester-common": 4.17.0 - "@algolia/transporter": 4.17.0 - dev: true - - /@algolia/logger-common@4.17.0: - resolution: - { - integrity: sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==, - } - dev: true - - /@algolia/logger-console@4.17.0: - resolution: - { - integrity: sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==, - } - dependencies: - "@algolia/logger-common": 4.17.0 - dev: true - - /@algolia/requester-browser-xhr@4.17.0: - resolution: - { - integrity: sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==, - } - dependencies: - "@algolia/requester-common": 4.17.0 - dev: true - - /@algolia/requester-common@4.17.0: - resolution: - { - integrity: sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==, - } - dev: true - - /@algolia/requester-node-http@4.17.0: - resolution: - { - integrity: sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==, - } - dependencies: - "@algolia/requester-common": 4.17.0 - dev: true - - /@algolia/transporter@4.17.0: - resolution: - { - integrity: sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==, - } - dependencies: - "@algolia/cache-common": 4.17.0 - "@algolia/logger-common": 4.17.0 - "@algolia/requester-common": 4.17.0 - dev: true - - /@babel/helper-string-parser@7.19.4: - resolution: - { - integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==, - } - engines: { node: ">=6.9.0" } - dev: true - - /@babel/helper-validator-identifier@7.19.1: - resolution: - { - integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==, - } - engines: { node: ">=6.9.0" } - dev: true - - /@babel/parser@7.21.4: - resolution: - { - integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==, - } - engines: { node: ">=6.0.0" } - hasBin: true - dependencies: - "@babel/types": 7.21.4 - dev: true - - /@babel/types@7.21.4: - resolution: - { - integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==, - } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-string-parser": 7.19.4 - "@babel/helper-validator-identifier": 7.19.1 - to-fast-properties: 2.0.0 - dev: true - - /@docsearch/css@3.3.3: - resolution: - { - integrity: sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==, - } - dev: true - - /@docsearch/js@3.3.3(@algolia/client-search@4.17.0): - resolution: - { - integrity: sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==, - } - dependencies: - "@docsearch/react": 3.3.3(@algolia/client-search@4.17.0) - preact: 10.13.2 - transitivePeerDependencies: - - "@algolia/client-search" - - "@types/react" - - react - - react-dom - dev: true - - /@docsearch/react@3.3.3(@algolia/client-search@4.17.0): - resolution: - { - integrity: sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==, - } - peerDependencies: - "@types/react": ">= 16.8.0 < 19.0.0" - react: ">= 16.8.0 < 19.0.0" - react-dom: ">= 16.8.0 < 19.0.0" - peerDependenciesMeta: - "@types/react": - optional: true - react: - optional: true - react-dom: - optional: true - dependencies: - "@algolia/autocomplete-core": 1.7.4 - "@algolia/autocomplete-preset-algolia": 1.7.4(@algolia/client-search@4.17.0)(algoliasearch@4.17.0) - "@docsearch/css": 3.3.3 - algoliasearch: 4.17.0 - transitivePeerDependencies: - - "@algolia/client-search" - dev: true - - /@esbuild/linux-loong64@0.14.54: - resolution: - { - integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==, - } - engines: { node: ">=12" } - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 - dev: true - - /@vitejs/plugin-vue@2.3.4(vite@2.9.15)(vue@3.2.47): - resolution: - { - integrity: sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==, - } - engines: { node: ">=12.0.0" } - peerDependencies: - vite: ^2.5.10 - vue: ^3.2.25 - dependencies: - vite: 2.9.15 - vue: 3.2.47 - dev: true - - /@vue/compiler-core@3.2.47: - resolution: - { - integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==, - } - dependencies: - "@babel/parser": 7.21.4 - "@vue/shared": 3.2.47 - estree-walker: 2.0.2 - source-map: 0.6.1 - dev: true - - /@vue/compiler-dom@3.2.47: - resolution: - { - integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==, - } - dependencies: - "@vue/compiler-core": 3.2.47 - "@vue/shared": 3.2.47 - dev: true - - /@vue/compiler-sfc@3.2.47: - resolution: - { - integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==, - } - dependencies: - "@babel/parser": 7.21.4 - "@vue/compiler-core": 3.2.47 - "@vue/compiler-dom": 3.2.47 - "@vue/compiler-ssr": 3.2.47 - "@vue/reactivity-transform": 3.2.47 - "@vue/shared": 3.2.47 - estree-walker: 2.0.2 - magic-string: 0.25.9 - postcss: 8.4.22 - source-map: 0.6.1 - dev: true - - /@vue/compiler-ssr@3.2.47: - resolution: - { - integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==, - } - dependencies: - "@vue/compiler-dom": 3.2.47 - "@vue/shared": 3.2.47 - dev: true - - /@vue/reactivity-transform@3.2.47: - resolution: - { - integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==, - } - dependencies: - "@babel/parser": 7.21.4 - "@vue/compiler-core": 3.2.47 - "@vue/shared": 3.2.47 - estree-walker: 2.0.2 - magic-string: 0.25.9 - dev: true - - /@vue/reactivity@3.2.47: - resolution: - { - integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==, - } - dependencies: - "@vue/shared": 3.2.47 - dev: true - - /@vue/runtime-core@3.2.47: - resolution: - { - integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==, - } - dependencies: - "@vue/reactivity": 3.2.47 - "@vue/shared": 3.2.47 - dev: true - - /@vue/runtime-dom@3.2.47: - resolution: - { - integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==, - } - dependencies: - "@vue/runtime-core": 3.2.47 - "@vue/shared": 3.2.47 - csstype: 2.6.21 - dev: true - - /@vue/server-renderer@3.2.47(vue@3.2.47): - resolution: - { - integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==, - } - peerDependencies: - vue: 3.2.47 - dependencies: - "@vue/compiler-ssr": 3.2.47 - "@vue/shared": 3.2.47 - vue: 3.2.47 - dev: true - - /@vue/shared@3.2.47: - resolution: - { - integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==, - } - dev: true - - /acorn-node@1.8.2: - resolution: - { - integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==, - } - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - xtend: 4.0.2 - dev: true - - /acorn-walk@7.2.0: - resolution: - { - integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, - } - engines: { node: ">=0.4.0" } - dev: true - - /acorn@7.4.1: - resolution: - { - integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, - } - engines: { node: ">=0.4.0" } - hasBin: true - dev: true - - /algoliasearch@4.17.0: - resolution: - { - integrity: sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==, - } - dependencies: - "@algolia/cache-browser-local-storage": 4.17.0 - "@algolia/cache-common": 4.17.0 - "@algolia/cache-in-memory": 4.17.0 - "@algolia/client-account": 4.17.0 - "@algolia/client-analytics": 4.17.0 - "@algolia/client-common": 4.17.0 - "@algolia/client-personalization": 4.17.0 - "@algolia/client-search": 4.17.0 - "@algolia/logger-common": 4.17.0 - "@algolia/logger-console": 4.17.0 - "@algolia/requester-browser-xhr": 4.17.0 - "@algolia/requester-common": 4.17.0 - "@algolia/requester-node-http": 4.17.0 - "@algolia/transporter": 4.17.0 - dev: true - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arg@5.0.2: - resolution: - { - integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, - } - dev: true - - /binary-extensions@2.2.0: - resolution: - { - integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, - } - engines: { node: ">=8" } - dev: true - - /braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - dev: true - - /camelcase-css@2.0.1: - resolution: - { - integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, - } - engines: { node: ">= 6" } - dev: true - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - dev: true - - /cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: ">=4" } - hasBin: true - dev: true - - /csstype@2.6.21: - resolution: - { - integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==, - } - dev: true - - /defined@1.0.1: - resolution: - { - integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==, - } - dev: true - - /detective@5.2.1: - resolution: - { - integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==, - } - engines: { node: ">=0.8.0" } - hasBin: true - dependencies: - acorn-node: 1.8.2 - defined: 1.0.1 - minimist: 1.2.8 - dev: true - - /didyoumean@1.2.2: - resolution: - { - integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, - } - dev: true - - /dlv@1.1.3: - resolution: - { - integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, - } - dev: true - - /esbuild-android-64@0.14.54: - resolution: - { - integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-android-arm64@0.14.54: - resolution: - { - integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-64@0.14.54: - resolution: - { - integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-arm64@0.14.54: - resolution: - { - integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-64@0.14.54: - resolution: - { - integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-arm64@0.14.54: - resolution: - { - integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-32@0.14.54: - resolution: - { - integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-64@0.14.54: - resolution: - { - integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm64@0.14.54: - resolution: - { - integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm@0.14.54: - resolution: - { - integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-mips64le@0.14.54: - resolution: - { - integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==, - } - engines: { node: ">=12" } - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-ppc64le@0.14.54: - resolution: - { - integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-riscv64@0.14.54: - resolution: - { - integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==, - } - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-s390x@0.14.54: - resolution: - { - integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==, - } - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-netbsd-64@0.14.54: - resolution: - { - integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-openbsd-64@0.14.54: - resolution: - { - integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-sunos-64@0.14.54: - resolution: - { - integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-32@0.14.54: - resolution: - { - integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-64@0.14.54: - resolution: - { - integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-arm64@0.14.54: - resolution: - { - integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild@0.14.54: - resolution: - { - integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/linux-loong64": 0.14.54 - esbuild-android-64: 0.14.54 - esbuild-android-arm64: 0.14.54 - esbuild-darwin-64: 0.14.54 - esbuild-darwin-arm64: 0.14.54 - esbuild-freebsd-64: 0.14.54 - esbuild-freebsd-arm64: 0.14.54 - esbuild-linux-32: 0.14.54 - esbuild-linux-64: 0.14.54 - esbuild-linux-arm: 0.14.54 - esbuild-linux-arm64: 0.14.54 - esbuild-linux-mips64le: 0.14.54 - esbuild-linux-ppc64le: 0.14.54 - esbuild-linux-riscv64: 0.14.54 - esbuild-linux-s390x: 0.14.54 - esbuild-netbsd-64: 0.14.54 - esbuild-openbsd-64: 0.14.54 - esbuild-sunos-64: 0.14.54 - esbuild-windows-32: 0.14.54 - esbuild-windows-64: 0.14.54 - esbuild-windows-arm64: 0.14.54 - dev: true - - /estree-walker@2.0.2: - resolution: - { - integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, - } - dev: true - - /fast-glob@3.2.12: - resolution: - { - integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - } - dependencies: - reusify: 1.0.4 - dev: true - - /fill-range@7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - } - engines: { node: ">=8" } - dependencies: - to-regex-range: 5.0.1 - dev: true - - /fsevents@2.3.2: - resolution: - { - integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: - { - integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, - } - dev: true - - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - dev: true - - /has@1.0.3: - resolution: - { - integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, - } - engines: { node: ">= 0.4.0" } - dependencies: - function-bind: 1.1.1 - dev: true - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-core-module@2.12.0: - resolution: - { - integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==, - } - dependencies: - has: 1.0.3 - dev: true - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - dev: true - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - dev: true - - /lilconfig@2.1.0: - resolution: - { - integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, - } - engines: { node: ">=10" } - dev: true - - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: true - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - dev: true - - /nanoid@3.3.6: - resolution: - { - integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true - dev: true - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - dev: true - - /object-hash@3.0.0: - resolution: - { - integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, - } - engines: { node: ">= 6" } - dev: true - - /path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - dev: true - - /picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - } - dev: true - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - dev: true - - /pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: ">=0.10.0" } - dev: true - - /postcss-import@14.1.0(postcss@8.4.22): - resolution: - { - integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.22 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.3 - dev: true - - /postcss-js@4.0.1(postcss@8.4.22): - resolution: - { - integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, - } - engines: { node: ^12 || ^14 || >= 16 } - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.22 - dev: true - - /postcss-load-config@3.1.4(postcss@8.4.22): - resolution: - { - integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==, - } - engines: { node: ">= 10" } - peerDependencies: - postcss: ">=8.0.9" - ts-node: ">=9.0.0" - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.22 - yaml: 1.10.2 - dev: true - - /postcss-nested@6.0.0(postcss@8.4.22): - resolution: - { - integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==, - } - engines: { node: ">=12.0" } - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.22 - postcss-selector-parser: 6.0.11 - dev: true - - /postcss-selector-parser@6.0.11: - resolution: - { - integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==, - } - engines: { node: ">=4" } - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } - dev: true - - /postcss@8.4.22: - resolution: - { - integrity: sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==, - } - engines: { node: ^10 || ^12 || >=14 } - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /preact@10.13.2: - resolution: - { - integrity: sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==, - } - dev: true - - /prismjs@1.29.0: - resolution: - { - integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, - } - engines: { node: ">=6" } - dev: true - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - dev: true - - /quick-lru@5.1.1: - resolution: - { - integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, - } - engines: { node: ">=10" } - dev: true - - /read-cache@1.0.0: - resolution: - { - integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, - } - dependencies: - pify: 2.3.0 - dev: true - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: true - - /resolve@1.22.3: - resolution: - { - integrity: sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==, - } - hasBin: true - dependencies: - is-core-module: 2.12.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - dev: true - - /rollup@2.77.3: - resolution: - { - integrity: sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==, - } - engines: { node: ">=10.0.0" } - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - dev: true - - /source-map-js@1.0.2: - resolution: - { - integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, - } - engines: { node: ">=0.10.0" } - dev: true - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - dev: true - - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } - dev: true - - /tailwindcss@3.2.7(postcss@8.4.22): - resolution: - { - integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==, - } - engines: { node: ">=12.13.0" } - hasBin: true - peerDependencies: - postcss: ^8.0.9 - dependencies: - arg: 5.0.2 - chokidar: 3.5.3 - color-name: 1.1.4 - detective: 5.2.1 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.2.12 - glob-parent: 6.0.2 - is-glob: 4.0.3 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.22 - postcss-import: 14.1.0(postcss@8.4.22) - postcss-js: 4.0.1(postcss@8.4.22) - postcss-load-config: 3.1.4(postcss@8.4.22) - postcss-nested: 6.0.0(postcss@8.4.22) - postcss-selector-parser: 6.0.11 - postcss-value-parser: 4.2.0 - quick-lru: 5.1.1 - resolve: 1.22.3 - transitivePeerDependencies: - - ts-node - dev: true - - /to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: ">=4" } - dev: true - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - dev: true - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: true - - /vite@2.9.15: - resolution: - { - integrity: sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==, - } - engines: { node: ">=12.2.0" } - hasBin: true - peerDependencies: - less: "*" - sass: "*" - stylus: "*" - peerDependenciesMeta: - less: - optional: true - sass: - optional: true - stylus: - optional: true - dependencies: - esbuild: 0.14.54 - postcss: 8.4.22 - resolve: 1.22.3 - rollup: 2.77.3 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitepress@0.22.4(@algolia/client-search@4.17.0): - resolution: - { - integrity: sha512-oZUnLO/SpYdThaBKefDeOiVlr0Rie4Ppx3FzMnMyLtJnI5GlBMNjqYqMy/4+umm/iC+ZDJfI+IlDKxv5fZnYzA==, - } - engines: { node: ">=14.0.0" } - hasBin: true - dependencies: - "@docsearch/css": 3.3.3 - "@docsearch/js": 3.3.3(@algolia/client-search@4.17.0) - "@vitejs/plugin-vue": 2.3.4(vite@2.9.15)(vue@3.2.47) - prismjs: 1.29.0 - vite: 2.9.15 - vue: 3.2.47 - transitivePeerDependencies: - - "@algolia/client-search" - - "@types/react" - - less - - react - - react-dom - - sass - - stylus - dev: true - - /vue@3.2.47: - resolution: - { - integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==, - } - dependencies: - "@vue/compiler-dom": 3.2.47 - "@vue/compiler-sfc": 3.2.47 - "@vue/runtime-dom": 3.2.47 - "@vue/server-renderer": 3.2.47(vue@3.2.47) - "@vue/shared": 3.2.47 - dev: true - - /xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: ">=0.4" } - dev: true - - /yaml@1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: ">= 6" } - dev: true diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/nn-NO/getting-started/docker.md index 75158bd6..102aab79 100644 --- a/docs/src/nn-NO/getting-started/docker.md +++ b/docs/src/nn-NO/getting-started/docker.md @@ -1,35 +1,35 @@ --- -title: Official Docker images +title: Offisielle Docker-bilete sidebarDepth: 3 --- -# Official Docker images +# Offisielle Docker-bilete -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: +Castopod plasserer 3 Docker-bilete på Docker Hub som del av den automatiserte +byggjeprosessen: -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - with all of Castopod dependencies -- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - Nginx configuration for Castopod +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): alt i + eitt-løysing med ei nginx-eining +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): app-pakka med alt + Castopod avheng av +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server):eit + nginx-oppsett for Castopod -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. +I tillegg krev Castopod ein MySQL-kompatibel database. Du kan leggja til ein +Redis-database for å handtera mellomlagring. -## Supported tags +## Støtta merkelappar -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) +- `develop` [unstable], det nyaste utviklingsbygget +- `beta` [stable], det nyaste betaversjon-bygget +- `latest` [stable], det nyaste versjonsbygget +- `1.x.x` [stable], bygg av ein spesivikk versjon (sidan `1.0.0`) -## Example usage +## Døme på bruk -1. Install [docker](https://docs.docker.com/get-docker/) and +1. Installer [docker](https://docs.docker.com/get-docker/) og [docker-compose](https://docs.docker.com/compose/install/) -2. Create a `docker-compose.yml` file with the following: +2. Lag ei `docker-compose.yml`-fil som inneheld dette: ```yml version: "3.7" @@ -87,35 +87,36 @@ can be added as a cache handler. castopod-db: ``` - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + Du må tilpassa nokre av variablane til din bruk (td. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` og `CP_ANALYTICS_SALT`). -3. Setup a reverse proxy for TLS (SSL/HTTPS) +3. Set opp ein revers-mellomlagertenar for TLS (SSL/HTTPS) - TLS is mandatory for ActivityPub to work. This job can easily be handled by - a reverse proxy, for example with [Caddy](https://caddyserver.com/): + Du treng TLS for at ActivityPub skal verka. Dette kan du lett handtera med + ein revers-mellomtenar, til dømes [Caddy](https://caddyserver.com/): ``` #castopod - castopod.example.com { + castopod.eksempel.com { reverse_proxy localhost:8000 } ``` -4. Run `docker-compose up -d`, wait for it to initialize and head on to - `https://castopod.example.com/cp-install` to finish setting up Castopod! +4. Køyr `docker-compose up -d`, vent på at han skal starta og gå til + `https://castopod.eksempel.com/cp-install` for å gjera ferdig + Castopod-oppsettet! -5. You're all set, start podcasting! 🎙️🚀 +5. Då er du klar og kan starta å podkasta! 🎙️🚀 -## Environment Variables +## Systemvariablar -- **castopod/castopod** and **castopod/app** +- **castopod/castopod** og **castopod/app** - | Variable name | Type (`default`) | Default | + | Variabelnamn | Type (`standard`) | Standardval | | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_BASEURL`** | streng | `udefinert` | + | **`CP_MEDIA_BASEURL`** | ?streng | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?streng | `"cp-admin"` | | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | | **`CP_ANALYTICS_SALT`** | string | `undefined` | | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | @@ -133,26 +134,26 @@ can be added as a cache handler. | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | - | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | - | **`CP_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` eller `"ssl"`] | `"tls"` | + | **`CP_ENABLE_2FA`** | ?boolsk | `udefinert` | + | **`CP_MEDIA_FILE_MANAGER`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_KEY`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_SECRET`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_REGION`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_BUCKET`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?tal | `udefinert` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolsk | `udefinert` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?streng | `udefinert` | + | **`CP_DISABLE_HTTPS`** | ?[`0` eller `1`] | `udefinert` | + | **`CP_MAX_BODY_SIZE`** | ?tal (med suffiks) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?tal (med suffiks) | `512M` | + | **`CP_TIMEOUT`** | ?tal | `900` | - **castopod/web-server** - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | + | Variabelnamn | Type | Standardval | + | ---------------------- | --------------------- | ----------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md index 188ddeb5..ef0e79a5 100644 --- a/docs/src/nn-NO/getting-started/install.md +++ b/docs/src/nn-NO/getting-started/install.md @@ -20,15 +20,15 @@ Viss du helst vil bruka Docker, kan du hoppa over dette og gå rett til ## Krav -- PHP v8.1 only +- Berre PHP v8.1 - MySQL versjon 5.7 eller nyare, eller MariaDB versjon 10.2 eller nyare - Støtte for HTTPS - Ei [ntp-synkronisert klokke](https://wiki.debian.org/NTP) for å stadfesta innkomande førespurnader frå allheimen -### PHP v8.1 only +### Berre PHP v8.1 -PHP version 8.1 is required, with the following extensions installed: +PHP versjon 8.1 med desse utvidingane krevst: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -92,22 +92,22 @@ filmklypp. Desse utvidingane må vera installerte: vevtenaren din, om du ikkje allereie har gjort det. - ⚠️ Set dokumentrota til vevtenaren til undermappa `public/` i `castopod`-mappa. -4. Add **cron tasks** on your web server for various background processes - (replace the paths accordingly): +4. Lag **cron-oppgåver** på vevtenaren din for ulike bakgrunnsprosessar (byt ut + stiane så dei passar til oppsettet ditt): ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + * * * * * /sti/til/php /sti/til/castopod/spark tasks:run >> /dev/null 2>&1 ``` - **Note** - If you do not add this cron task, the following Castopod features - will not work: + **Hugs** - Viss du ikkje legg til denne cron-oppgåva, vil ikkje dei fylgjande + Castopod-funksjonane verka: - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using + - Å importera ein podkast frå ei eksisterande RSS-kjelde + - Å kringkasta sosiale aktivitetar til fylgjarane dine på allheimen + - Å kringkasta episodane dine til opne nettverk med [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + - Å laga filmklypp - + [krev FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) ### (Tilrådd) Autoinstallering @@ -118,46 +118,46 @@ filmklypp. Desse utvidingane må vera installerte: ::: info Notat -Installasjonsskriptet lagar ei`.env`-fil i rotmappa til pakka. If you cannot go -through the install wizard, you can create and edit the `.env` file manually -based on the `.env.example` file. +Installasjonsskriptet lagar ei`.env`-fil i rotmappa til pakka. Viss du ikkje kan +gå gjennom den rettleidde installeringa, kan du laga og redigera ei `.env`-fil +manuelt basert på `.env.example`-fila. ::: -### Email/SMTP setup +### Epost/SMTP-oppsett -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) +Epostoppsett er naudsynt for at nokre av funksjonane skal verka skikkeleg (td. +epostar for å nullstilla passord, senda rettleiingar til abonnentar oa.) -You may add your email configuration in your instance's `.env` like so: +Du kan skriva inn epostoppsettet for nettstaden din i `.env`-fila slik som +dette: ```ini # […] -email.fromEmail="your_email_address" -email.SMTPHost="your_smtp_host" -email.SMTPUser="your_smtp_user" -email.SMTPPass="your_smtp_password" +email.fromEmail="epostadressa_di" +email.SMTPHost="smtp-tenaren_din" +email.SMTPUser="smtp-brukaren_din" +email.SMTPPass="passordet_ditt" ``` -#### Email config options +#### Val for epostoppsett -| Variable name | Type | Default | -| ---------------- | -------------------- | ------------ | -| **`fromEmail`** | string | `undefined` | -| **`fromName`** | string | `"Castopod"` | -| **`SMTPHost`** | string | `undefined` | -| **`SMTPUser`** | string | `undefined` | -| **`SMTPPass`** | string | `undefined` | -| **`SMTPPort`** | number | `25` | -| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +| Variabelnamn | Type | Standardval | +| ---------------- | ----------------------- | ------------ | +| **`fromEmail`** | streng | `udefinert` | +| **`fromName`** | streng | `"Castopod"` | +| **`SMTPHost`** | streng | `udefinert` | +| **`SMTPUser`** | streng | `udefinert` | +| **`SMTPPass`** | streng | `udefinert` | +| **`SMTPPort`** | tal | `25` | +| **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"` | -### Media storage +### Lagring av media -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: +Mediefiler blir lagra i mappa `public/media` i filsystemet som standard. Viss du +må flytta mappa `media` til ein annan stad, kan du skriva det inn i `.env`-fila +som vist under: ```ini # […] @@ -166,29 +166,29 @@ media.root="media" media.storage="/mnt/storage" ``` -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. +I dette dømet blir filene lagra i mappa /mnt/storage/media Pass på at du +oppdaterer vevtenaroppsettet med denne endringa. ### S3 -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: +Viss du helst vil lagra mediefilene dine på ei S3-kompatibel lagringseining, kan +du skriva det inn i `.env`-fila di: ```ini # […] media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" +media.s3.endpoint="s3_verten_din" +media.s3.key="s3_nykjelen_din" +media.s3.secret="s3_løyndomen_din" +media.s3.region="s3_regionen_din" ``` -#### S3 config options +#### Oppsettsval for S3 -| Variable name | Type | Default | +| Variabelnamn | Type | Standardval | | ------------------- | ------ | ----------- | -| **`endpoint`** | string | `undefined` | +| **`endpoint`** | streng | `udefinert` | | **`nykjel`** | tekst | `udefinert` | | **`løyndom`** | tekst | `udefinert` | | **`region`** | tekst | `udefinert` | diff --git a/docs/src/nn-NO/getting-started/update.md b/docs/src/nn-NO/getting-started/update.md index 7e608808..6a929b1f 100644 --- a/docs/src/nn-NO/getting-started/update.md +++ b/docs/src/nn-NO/getting-started/update.md @@ -13,57 +13,57 @@ siste versjonen for å få nye funksjonar, ✨, feilrettingar 🐛 og betre ytin 0. ⚠️ Før du oppdaterer, rår me sterkt til at du tek ein tryggingskopi av filene og databasen til Castopod. - - cf. - [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + - Les + [bør eg ta ein tryggingskopi før eg oppdaterer?](#should-i-make-a-backup-before-updating) -1. Go to the - [releases page](https://code.castopod.org/adaures/castopod/-/releases) and - see if your instance is up to date with the latest Castopod version +1. Gå til + [utgjevingssida](https://code.castopod.org/adaures/castopod/-/releases) og + sjå om nettstaden din er oppdatert til den siste utgåva av Castopod - - cf. - [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + - Les + [Kvar finn eg Castopod-versjonen min?](#where-can-i-find-my-castopod-version) -2. Download the latest release package named `Castopod Package`, you may choose - between the `zip` or `tar.gz` archives +2. Last ned den siste utgåva som heiter `Castopod Package`, du kan velja mellom + `zip`- eller `tar.gz`-arkiv - - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - - Note that you can also download the latest package from + - ⚠️ Pass på at du lastar ned Castopod-pakka, og **IKKJE** kjeldekoden + - Hugs at du kan lasta ned den nyaste programpakka frå [castopod.org](https://castopod.org/) -3. On your server: +3. Gjer dette på tenaren din: - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server + - Slett alle filene utanom `.env` og `public/media` + - Kopier dei nye filene frå den nedlasta programpakka over til tenaren din - ::: info Note + ::: Hugs - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). + Det kan henda du må nullstilla filtilgangane til det dei var under + installasjonsprosessen. Les [tryggingsspørsmåla](./security.md). ::: -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: +4. Oppdater databaseskjemaet ditt på `Castopod admin` > `Om`-sida, eller ved å + køyra: ```bash php spark castopod:database-update ``` -5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > - `Housekeeping` -6. ✨ Enjoy your fresh instance, you're all done! +5. Tøm mellomlageret på `Castopod admin` > `Innstillingar` > `generelt` > + `Opprydding` +6. ✨ No er du ferdig og kan bruka den flotte nye nettstaden din! -::: info Note +::: Hugs -Releases may come with additional update instructions (see -[releases page](https://code.castopod.org/adaures/castopod/-/releases)). +Det hender at ugjevingar har sine eigne oppdateringsinstruksar (sjå +[utgjevingssida](https://code.castopod.org/adaures/castopod/-/releases)). -- cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) +- sjå + [Eg har ikkje oppdatert nettstaden min på lenge… Kva bør eg gjera?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) ::: -## Fully Automated updates +## Heilautomatiske oppdateringar > Kjem snart... 👀 @@ -71,23 +71,20 @@ Releases may come with additional update instructions (see ### Kvar finn eg Castopod-versjonsnummeret? -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. +Gå til styringspanelet for Castopod. Versjonsnummeret står nede i venstre +hjørna. -Alternatively, you can find the version in the `app > Config > Constants.php` -file. +Eventuelt kan du finna versjonsnummeret i `app > Oppsett > Constants.php`-fila. ### Eg har ikkje oppdatert på lenge… Kva skal eg gjera? -No problem! Just get the latest release as described above. Only, when going -through the release instructions (4), perform them sequentially, from the oldest -to the newest. +Ingen problem! Berre få tak i siste utgåva som skildra over. Hugs berre å utføra +utgjevingsinstruksjonane (4) i rekkjefylgje frå eldst til nyast. > Du bør truleg tryggingskopiera nettstaden din, avhengig av kor lenge sidan det > er du oppdaterte Castopod. -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: +Viss du til dømes er på `v1.0.0-alpha.42` og vil oppgradera til `v1.0.0-beta.1`: 0. (stekt tilrådd) Ta ein tryggingskopi av filene og databasen din. @@ -100,7 +97,7 @@ For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to ### Bør eg tryggingskopiera før eg oppdaterer? -We advise you do, so you don't lose everything if anything goes wrong! +Gjer det, slik at du ikkje mistar alt viss noko går gale! -More generally, we advise you make regular backups of your Castopod files and -database to prevent you from losing it all… +Generelt rår me til at du tek tryggingskopi av Castopod-filene og databasen din +slik at du ikkje mistar alt… diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md index 77aed99d..9b5fbbdb 100644 --- a/docs/src/nn-NO/index.md +++ b/docs/src/nn-NO/index.md @@ -23,8 +23,8 @@ systemkrav. - 🌱  Fri og open (AGPL v3-lisens) - 🔐  Legg vekt på at du eig dine eigne data: innhaldet, publikum og analysedata høyrer deg til, og berre deg -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … +- 🪄  Podkasting 2.0-funksjonar: GUID, låsing, transkripsjonar, + finansiering, kapittel, plassering, personar, lydbetar, … - 💬  Innebygd sosialt nettverk: - 🚀  Castopod er ein del av fødiverset, som er eit desentralisert sosialt nettverk @@ -45,7 +45,7 @@ systemkrav. - 🔗  Donasjonslenker - 📲  lytt-for-å-klikka-annonsar - 🤝  value4value / WebMonetization - - 💎  Premium podcasts + - 💎  Betalte podkastar - 📡  Kringkast episodane dine kvar som helst med RSS: - 📱  På alle indeksar og appar: Podcast Index, Apple Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … @@ -54,91 +54,93 @@ systemkrav. - 📤  Flytt podkasten din bort frå Castopod - 🔀  For fleire: Ver vertskap for så mange podkastar du vil - 👥  Fleirbrukar: legg til bidragsytarar og lag roller for dei -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](https://translate.castopod.org)! +- 🌎  i18n-støtte: Omsett til nynorsk, engelsk, fransk, polsk, tysk, + brasiliansk portugisisk & spansk… med + [fleire språk på veg](https://translate.castopod.org)! ## Kvifor Castopod? -The podcasting ecosystem is decentralized by nature: you can create your podcast -as an RSS file, publish it on the web and have it shared everywhere online. +Podkasting-økosystemet er desentralt av natur: Du kan laga podkasten din som ei +RSS-fil, leggja han ut på nettet, og få delt han overalt. -It is in fact one of the only media to have stayed this way for a long time. +Det er faktisk det einaste mediet som har vore slik i lang tid. -As usages are evolving, more and more people are getting into podcasts: whether -it is creators finding new ways to share their ideas, or listeners in the search -for better content. +Ettersom bruken av podkastar utviklar seg, er det fleire som startar med +podkasting; anten det er produsentar som leitar etter nye måtar å dela ideane +sine på, eller det er lyttarar som leitar etter betre podkastar å høyra på. -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized medium. +Når podkasting no har vorte meir populært, er det fleire firma som prøver å +gjera det til eit kontrollert og sentralisert medium. -Castopod was created in an effort to provide an open and sustainable alternative -to hosting your podcasts, promoting decentralization to ensure that podcasters -creativity can express itself. +Castopod vart laga som ein freistnad på å gje eit ope og framhaldande alternativ +til å leggja ut podkastane dine, med vekt på desentralisering slik at +podkastarar kan uttrykkja seg utan å binda seg til ei bestemt løysing. -This project is pushed by the open-source community, and specifically by the -[Fediverse](https://fediverse.party/en/fediverse/) and -[Podcasting 2.0](https://podcastindex.org/) movements. +Prosjektet er støtta av brukarmiljøa bak open kjeldekode, særleg +[Allheimen](https://tanketom.no/teknologi/mastodon-og-the-fediverse) og +[Podcasting 2.0](https://podcastindex.org/)-rørslene. ## Samanlikning med andre løysingar -We believe that a solution is not necessarily right for everyone, it highly -depends on your needs. So, here are comparisons with other tools to help you to -gauge whether Castopod is the right fit for you. +Me trur at ingen løysingar er perfekt for alle, det kjem an på kva du treng. +Difor får du her samanlikningar med andre verktøy, slik at du kan finna ut om +Castopod passar for deg. ### Castopod og Wordpress -Castopod is often referred to as "the Wordpress for podcasts" because of the -similarities between the two. In some ways this is true. And actually, Castopod -was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption -from the community and the number of websites running it. +Castopod blir ofte kalla "Wordpress for podkastar" fordi det er ein del +likskapar mellm dei to. Det er delvis sant. Faktum er at Castopod har henta +mykje inspirasjon frå Wordpress-økosystemet. Me såg kor lett Wordpress var å ta +i bruk, og kor mange nettstader og nettsamfunn som bruker det. -Just like Wordpress, Castopod is free & open source, built using PHP with a -MySQL database and is packaged in a way that you can easily install on most web -servers. +Til liks med Wordpress er Castopod gratis og open programvare, laga med PHP og +ein MySQL-database, og pakka saman på ein slik måte at du lett kan installera +det på dei fleste vevtentarar. -Wordpress is a great way to create your website and extend it with plugins to -get what you want. It is a full fledged CMS that helps you get any type of -website online. +Worpress er ein flott måte å laga din eigen nettstad på, samt utvida han med +tillegg slik at han gjer det du ynskjer. Det er eit komplett +innhaldsstyringssystem for å laga kva som helst type nettstad. -On the other hand, Castopod is meant to address the podcasters needs -specifically, focusing on podcasting, and nothing else. You don't need any -plugin to get you started on your podcasting journey. +Castopod er derimot meint som ei løysing for dei som lagar podkastar, og legg +difor vekt på podkasting og ingenting anna. Du treng ingen programtillegg for å +starta på den vedunderlege podkastreisa di. -This allows optimizing the processes specific to podcasting: ranging from the -creation of your podcasts and the publication of new episodes all the way to -broadcasting, marketing and analytics. +På denne måten kan me laga program som passar spesielt til podkasting, alt frå å +laga podkastar til å publisera nye episodar til å kringkasta, marknadsføra og +analysera dei. -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! +Til slutt: Wordpress og Castopod kan leva side om side på nettstaden din om du +treng det, sidan dei har same systemkrava! ### Castopod og Funkwhale -Funkwhale is a self-hosted, modern free and open-source music server. Just as -Castopod, Funkwhale is on the fediverse, a decentralized social network allowing -interoperability between the two. +Funkwhale er ein musikktenar du kan køyra sjølv på din eigen vevtenar. Akkurat +som Castopod er Funkwhale ein del av allheimen, som er eit sosialt nettverk +spreidd over mange nettstader som kan samhandla med kvarandre. -Funkwhale was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. +Funkwhale vart fyrst laga for musikk. Seinare, etter kvart som prosjektet +utvikla seg, vart det mogleg å leggja ut podkastar òg. -Unlike Funkwhale, Castopod has been designed and built around podcasting -exclusively. This allows easier implementation for features related to the -podcasting ecosystem, such as the podcasting 2.0 features (transcripts, -chapters, locations, persons, …). +Til skilnad frå Funkwhale er Castopod utforma og utvikla berre for podkastar. +Det tyder at det er lettare å ta i bruk funksjonar tilknytt podkast-økosystemet, +slik som podkasting 2.0-funksjonar (transkripsjonar, kapittel, plasseringar, +personmerking …). -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. +Det tyder at du truleg bør bruka Funkwhale om du vil ha ein stad til musikken +din, og Castopod dersom du vil ha ein stad til podkastane dine. ### Castopod og andre podkastvertar -There are many solutions for you to host your podcasts, some of which are really -great and [a lot of them](https://podcastindex.org/apps) are jumping into the -Podcasting 2.0 wagon just like Castopod! +Det er mange løysingar for deg som vil ha ein eigen nettstad til podkastar. +Nokre av dei er verkeleg flotte, og +[mange av dei](https://podcastindex.org/apps) hoppar på podkastin 2.0-toget, +nett som Castopod! -Each of these solutions differ from one another, you may compare with the -[list of features](#features). +Kvar av desse løysingane er ulike, og du kan +[samanlikna kva funksjonar dei har](#features). -That being said, there are two main differences with other podcasting solutions: +Når det er sagt, er det to hovudskilnader mellom Castopod og andre +podkastløysingar: - Du kan køyra Castopod på di eiga tenarmaskin, og det er den einaste løysinga som gjev deg full kontroll over det du lagar. Og fordi Castopod er open @@ -150,25 +152,25 @@ That being said, there are two main differences with other podcasting solutions: ## Bidra til Castopod -Love Castopod and would like to help? Take a look at the following documentation -to get you started. +Likar du Castopod og kunne tenkja deg å hjelpa til? Les denne dokumentasjonen +for å koma i gang. ### Ordensreglar -Castopod has adopted a Code of Conduct that we expect project participants to -adhere to. Please read the -[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -so that you can understand what actions will and will not be tolerated. +Castopod har laga retningsliner for åtferd som me ventar at prosjektdeltakarar +held seg til. Les gjerne +[CODE_OF_CONDUCT-retninglinene](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +så du veit kva slags åtferd me godtek og ikkje. ### Korleis bidra -Read our [contributing guide](./contributing/guidelines.md) to learn about our -development process, how to propose bugfixes and improvements, and how to build -and test your changes to Castopod. +Les gjerne [korleis du bidreg](./contributing/guidelines.md) for å læra korleis +me utviklar Castopod, korleis me føreslær rettingar og forbetringar, og korleis +me byggjer og prøver ut endringar i programmet. -## Contributors ✨ +## Bidragsytarar ✨ -Thanks goes to these wonderful people +Mange takk til dei flotte folka på ([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -177,9 +179,9 @@ Thanks goes to these wonderful people - - - + + + @@ -256,37 +258,36 @@ specification. Contributions of any kind welcome! ## Contact -You may reach us for help or ask any question you have on: +Du kan spørja om hjelp eller kva som helst andre spørsmål på: - [Discord](https://castopod.org/discord) (for å prata direkte med utviklarane og brukarmiljøet) - [Feilmeldinga](https://code.castopod.org/adaures/castopod/-/issues) (for å føreslå nye funksjonar og melda feil) -Alternatively, you can follow us on social media platforms to get news about -Castopod: +Alternativt kan du fylgja oss på sosiale media for å få nytt om Castopod: - [podlibre.social](https://podlibre.social/@Castopod) (Mastodon-nettstad) - [Twitter](https://twitter.com/castopod) - [LinkedIn](https://linkedin.com/company/castopod) - [Facebook](https://www.facebook.com/castopod) -## Sponsors +## Sponsorar -The ongoing development of Castopod is made possible with the support of its -backers. If you'd like to help, please consider -[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). +Utviklinga av Castopod er mogleg på grunn av bidrag frå sponsorar og +bidragsytarar. Viss du vil hjelpa til, bed me deg vurdera å +[sponsa utviklinga av Castopod](https://opencollective.com/castopod/contribute).
    Ad Aures Logo NLnet Logo
    -## License +## Lisens -[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) +[GNU Affero General Public-lisensen v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-present, [Ad Aures](https://adaures.com/). +Copyright © 2020-d.d., [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php index d7811c3c..17dfc79c 100644 --- a/modules/Admin/Language/nn-NO/Breadcrumb.php +++ b/modules/Admin/Language/nn-NO/Breadcrumb.php @@ -38,7 +38,7 @@ return [ 'users' => 'brukarar', 'my-account' => 'kontoen min', 'change-password' => 'endre passord', - 'imports' => 'imports', + 'imports' => 'importar', 'platforms' => 'plattformer', 'social' => 'sosiale nettverk', 'funding' => 'finansiering', diff --git a/modules/Admin/Language/nn-NO/Episode.php b/modules/Admin/Language/nn-NO/Episode.php index a53ecc92..7c074911 100644 --- a/modules/Admin/Language/nn-NO/Episode.php +++ b/modules/Admin/Language/nn-NO/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Alle podkast-episodane', 'back_to_podcast' => 'Gå tilbake til podkasten', 'edit' => 'Rediger', + 'preview' => 'Førehandsvising', 'publish' => 'Legg ut', 'publish_edit' => 'Rediger publiseringa', 'publish_date_edit' => 'Rediger publiseringsdatoen', @@ -81,12 +82,12 @@ return [ other {media} } for episoden.', 'deleteFileError' => 'Greidde ikkje sletta {type, select, - transcript {transkripsjonen} + transcript {transkripsjons} chapters {kapittel} - image {omslag} + image {omslags} audio {lyd} other {media} - } i fila {file_path}. Du kan fjerna det manuelt.', + }fila {file_key}. Du kan fjerna ho manuelt.', 'sameSlugError' => 'Ei episode med denne kortadressa finst allereie.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Lys', 'light-transparent' => 'Lys gjennomsiktig', ], + 'publication_status_banner' => [ + 'draft_mode' => 'kladdemodus', + 'text' => '{publication_status, select, + published {Episoden er ikkje lagt ut enno.} + scheduled {Episoden er planlagt lagt ut på {publication_date}.} + with_podcast {Denne episoden blir lagt ut samstundes som podkasten.} + other {Denne episoden er ikkje lagt ut enno.} + }', + 'preview' => 'Førehandsvising', + ], ]; diff --git a/modules/Admin/Language/nn-NO/Navigation.php b/modules/Admin/Language/nn-NO/Navigation.php index 808c5a52..0a7a5972 100644 --- a/modules/Admin/Language/nn-NO/Navigation.php +++ b/modules/Admin/Language/nn-NO/Navigation.php @@ -17,8 +17,8 @@ return [ 'podcasts' => 'Podkastar', 'podcast-list' => 'Alle podkastar', 'podcast-create' => 'Ny podkast', - 'all-podcast-imports' => 'All Podcast imports', - 'podcast-imports-add' => 'Import a podcast', + 'all-podcast-imports' => 'Alle podkast-importar', + 'podcast-imports-add' => 'Importer ein podkast', 'persons' => 'Personar', 'person-list' => 'Alle personar', 'person-create' => 'Ny person', diff --git a/modules/Admin/Language/nn-NO/Podcast.php b/modules/Admin/Language/nn-NO/Podcast.php index 65394f72..e4765352 100644 --- a/modules/Admin/Language/nn-NO/Podcast.php +++ b/modules/Admin/Language/nn-NO/Podcast.php @@ -13,7 +13,7 @@ return [ 'no_podcast' => 'Fann ingen podkast!', 'create' => 'Lag ein podcast', 'import' => 'Importer ein podkast', - 'all_imports' => 'Podcast imports', + 'all_imports' => 'Podkast-importar', 'new_episode' => 'Ny episode', 'view' => 'Sjå podkasten', 'edit' => 'Rediger podkasten', @@ -26,8 +26,8 @@ return [ 'latest_episodes' => 'Dei nyaste episodane', 'see_all_episodes' => 'Sjå alle episodane', 'draft' => 'Kladd', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', + 'sync_feed' => 'Synkroniser straumen', + 'sync_feed_hint' => 'Importer dei nyaste episodane til denne podkasten', 'messages' => [ 'createSuccess' => 'Podkasten er oppretta!', 'editSuccess' => 'Podkasten er oppdatert!', @@ -113,7 +113,7 @@ return [ 'premium_by_default' => 'Episodane må ha premium som standardval', 'premium_by_default_hint' => 'Podkastepisodane vil få premium som standardmerking. Du kan likevel ha nokre episodar, trailerar eller bonusar som offentlege.', 'op3' => 'Open Podcast Prefix-prosjekt (OP3)', - 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_hint' => 'Verdiset analysedataa dine med OP3, som er ein tredjeparts analyseteneste med open kjeldekode. Del, stadfest og samanlikne analysedataa dine med det opne podkast-økosystemet.', 'op3_enable' => 'Bruk OP3-analysetenesta', 'op3_enable_hint' => 'Av tryggleiksgrunnar deler me ikkje analysedata for premium-episodar med OP3.', 'payment_pointer' => 'Betalingspunkt for nettkommersialisering', diff --git a/modules/Admin/Language/nn-NO/PodcastNavigation.php b/modules/Admin/Language/nn-NO/PodcastNavigation.php index bc4a10eb..78a25745 100644 --- a/modules/Admin/Language/nn-NO/PodcastNavigation.php +++ b/modules/Admin/Language/nn-NO/PodcastNavigation.php @@ -14,7 +14,7 @@ return [ 'podcast-view' => 'Heim', 'podcast-edit' => 'Rediger podkasten', 'podcast-persons-manage' => 'Handter personar', - 'podcast-imports' => 'Podcast imports', + 'podcast-imports' => 'Podkast-importar', 'episodes' => 'Episodar', 'episode-list' => 'Alle episodane', 'episode-create' => 'Ny episode', diff --git a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php index f8af256f..41d2e89c 100644 --- a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php +++ b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php @@ -64,17 +64,17 @@ return [ 'deleteError' => 'Subscription could not be removed.', 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + 'resumeSuccess' => 'Abonnementet er starta att! Me sende ein epost til {subscriber}.', + 'resumeError' => 'Greidde ikkje starta abonnementet att.', + 'linkSaveSuccess' => 'Abonnementslenka er lagra. Ho vil visa på nettstaden som ei handlingsvarsling.', + 'linkRemoveSuccess' => 'Abonnementslenka vart fjerna.', ], 'emails' => [ - 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'greeting' => 'Hei', + 'token' => 'Teiknet ditt: {0}', + 'unique_feed_link' => 'Den unike lenka til straumen: {0}', + 'how_to_use' => 'Korleis skal eg bruka dette?', + 'two_ways' => 'Du kan låsa opp betalte episodar på to måtar:', 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', 'welcome_subject' => 'Welcome to {podcastTitle}', From daa11eb9c1c6cf7aaad8247e722ce892b015afc3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 9 Sep 2023 12:30:01 +0000 Subject: [PATCH 218/477] chore(release): 1.6.1 [skip ci] ## [1.6.1](https://code.castopod.org/adaures/castopod/compare/v1.6.0...v1.6.1) (2023-09-09) ### Bug Fixes * **admin:** redirect root fediverse route to fediverse-blocked-actors ([ba5324e](https://code.castopod.org/adaures/castopod/commit/ba5324ea1942a3939f186e974d29fb393c54b253)) * **analytics:** show full referrer domain in web pages visits reports ([6be38e9](https://code.castopod.org/adaures/castopod/commit/6be38e9fda3d1436d81686e1a3a5e5b173e390a0)), closes [#367](https://code.castopod.org/adaures/castopod/issues/367) * **auth:** overwrite Shield's PermissionFilter ([c6e8000](https://code.castopod.org/adaures/castopod/commit/c6e8000bab54f4a32068578f750f4cf9d91bad89)) * **auth:** update shield from v1.0.0-beta.3 to v1.0.0-beta.6 ([23842df](https://code.castopod.org/adaures/castopod/commit/23842df03ae28e416390e2436442b8e7c8340333)) * **platforms:** add missing tiktok to social platforms seed ([8dfdaf3](https://code.castopod.org/adaures/castopod/commit/8dfdaf321566050e9c53683e70864871eb55d618)) * remove fediverse prefix to prevent migration error + load routes during podcast import ([7ff1dbe](https://code.castopod.org/adaures/castopod/commit/7ff1dbe9030768074b2fe7c7f570bfb9e7336f62)) * **routes:** overwrite RouteCollection to include all routes + update js and php dependencies ([b4f1b91](https://code.castopod.org/adaures/castopod/commit/b4f1b916bfec53f071e8d0d900081c6d74486e53)) * update Router to include latest CI changes with alternate-content logic ([ae57601](https://code.castopod.org/adaures/castopod/commit/ae57601c838a7aa9469bae8038ac1c30d8c9a51e)) * use podcast-activity named route instead of not existing actor route ([3c35718](https://code.castopod.org/adaures/castopod/commit/3c357183ca51545787fcfc801b4a5829d9cd8ad6)) --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f2d82f5..c8d88451 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +## [1.6.1](https://code.castopod.org/adaures/castopod/compare/v1.6.0...v1.6.1) (2023-09-09) + +### Bug Fixes + +- **admin:** redirect root fediverse route to fediverse-blocked-actors + ([ba5324e](https://code.castopod.org/adaures/castopod/commit/ba5324ea1942a3939f186e974d29fb393c54b253)) +- **analytics:** show full referrer domain in web pages visits reports + ([6be38e9](https://code.castopod.org/adaures/castopod/commit/6be38e9fda3d1436d81686e1a3a5e5b173e390a0)), + closes [#367](https://code.castopod.org/adaures/castopod/issues/367) +- **auth:** overwrite Shield's PermissionFilter + ([c6e8000](https://code.castopod.org/adaures/castopod/commit/c6e8000bab54f4a32068578f750f4cf9d91bad89)) +- **auth:** update shield from v1.0.0-beta.3 to v1.0.0-beta.6 + ([23842df](https://code.castopod.org/adaures/castopod/commit/23842df03ae28e416390e2436442b8e7c8340333)) +- **platforms:** add missing tiktok to social platforms seed + ([8dfdaf3](https://code.castopod.org/adaures/castopod/commit/8dfdaf321566050e9c53683e70864871eb55d618)) +- remove fediverse prefix to prevent migration error + load routes during + podcast import + ([7ff1dbe](https://code.castopod.org/adaures/castopod/commit/7ff1dbe9030768074b2fe7c7f570bfb9e7336f62)) +- **routes:** overwrite RouteCollection to include all routes + update js and + php dependencies + ([b4f1b91](https://code.castopod.org/adaures/castopod/commit/b4f1b916bfec53f071e8d0d900081c6d74486e53)) +- update Router to include latest CI changes with alternate-content logic + ([ae57601](https://code.castopod.org/adaures/castopod/commit/ae57601c838a7aa9469bae8038ac1c30d8c9a51e)) +- use podcast-activity named route instead of not existing actor route + ([3c35718](https://code.castopod.org/adaures/castopod/commit/3c357183ca51545787fcfc801b4a5829d9cd8ad6)) + # [1.6.0](https://code.castopod.org/adaures/castopod/compare/v1.5.2...v1.6.0) (2023-08-28) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 36fb4453..444123ef 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.6.0'); +defined('CP_VERSION') || define('CP_VERSION', '1.6.1'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 1898c033..497ba93f 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.6.0", + "version": "1.6.1", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 7a7073da..4bc4250a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.6.0", + "version": "1.6.1", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 82013c9cde901c54fdb3a833890aa693e8542627 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 11 Sep 2023 15:43:14 +0000 Subject: [PATCH 219/477] fix(migrations): remove if exists modifier for drop index fixes #382 --- .../2023-06-12-010000_add_full_text_search_indexes.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Database/Migrations/2023-06-12-010000_add_full_text_search_indexes.php b/app/Database/Migrations/2023-06-12-010000_add_full_text_search_indexes.php index 310ce8f3..8b4c3d24 100644 --- a/app/Database/Migrations/2023-06-12-010000_add_full_text_search_indexes.php +++ b/app/Database/Migrations/2023-06-12-010000_add_full_text_search_indexes.php @@ -11,7 +11,7 @@ class AddFullTextSearchIndexes extends BaseMigration $prefix = $this->db->getPrefix(); $createQuery = <<db->query($createQuery); @@ -37,14 +37,14 @@ class AddFullTextSearchIndexes extends BaseMigration $createQuery = <<db->query($createQuery); $createQuery = <<db->query($createQuery); From 27a04bd0df1c01522fe22ed8175b9fbfeb302a68 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 11 Sep 2023 15:52:31 +0000 Subject: [PATCH 220/477] chore(release): 1.6.2 [skip ci] ## [1.6.2](https://code.castopod.org/adaures/castopod/compare/v1.6.1...v1.6.2) (2023-09-11) ### Bug Fixes * **migrations:** remove if exists modifier for drop index ([82013c9](https://code.castopod.org/adaures/castopod/commit/82013c9cde901c54fdb3a833890aa693e8542627)), closes [#382](https://code.castopod.org/adaures/castopod/issues/382) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8d88451..efe027d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.6.2](https://code.castopod.org/adaures/castopod/compare/v1.6.1...v1.6.2) (2023-09-11) + +### Bug Fixes + +- **migrations:** remove if exists modifier for drop index + ([82013c9](https://code.castopod.org/adaures/castopod/commit/82013c9cde901c54fdb3a833890aa693e8542627)), + closes [#382](https://code.castopod.org/adaures/castopod/issues/382) + ## [1.6.1](https://code.castopod.org/adaures/castopod/compare/v1.6.0...v1.6.1) (2023-09-09) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 444123ef..d21e4090 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.6.1'); +defined('CP_VERSION') || define('CP_VERSION', '1.6.2'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 497ba93f..59e8fd5c 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.6.1", + "version": "1.6.2", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 4bc4250a..f91c05a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.6.1", + "version": "1.6.2", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 35142d8e565e828a977ba2b4de77c1b47a633beb Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 14 Sep 2023 13:23:19 +0000 Subject: [PATCH 221/477] fix(fediverse): add `index` to post controller-method to access post's jsonld contents --- app/Config/Routes.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Config/Routes.php b/app/Config/Routes.php index d28a0785..9ed603dc 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -228,11 +228,11 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { 'alternate-content' => [ 'application/activity+json' => [ 'namespace' => 'Modules\Fediverse\Controllers', - 'controller-method' => 'PostController/$2', + 'controller-method' => 'PostController::index/$2', ], 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ - 'namespace' => 'Modules\Fediverse\Controllers', - 'controller-method' => 'PostController/$2', + 'namespace' => 'Modules/Fediverse/Controllers', + 'controller-method' => 'PostController::index\$2', ], ], 'filter' => 'allow-cors', From 3c4df01d1800e1b4271e0295304d8bb0fa419a13 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 14 Sep 2023 13:46:11 +0000 Subject: [PATCH 222/477] docs(.env.example): add missing analytics.salt env variable --- .env.example | 1 + 1 file changed, 1 insertion(+) diff --git a/.env.example b/.env.example index cf389c40..40e4c336 100644 --- a/.env.example +++ b/.env.example @@ -17,6 +17,7 @@ app.baseURL="https://YOUR_DOMAIN_NAME/" media.baseURL="https://YOUR_MEDIA_DOMAIN_NAME/" admin.gateway="cp-admin" auth.gateway="cp-auth" +analytics.salt="RANDOM_STRING_OF_64_CHARACTERS" #-------------------------------------------------------------------- # Database configuration From 18fcb5ba3e4f158f326c3542ecf38ee9638d17d1 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 14 Sep 2023 13:59:36 +0000 Subject: [PATCH 223/477] chore(release): 1.6.3 [skip ci] ## [1.6.3](https://code.castopod.org/adaures/castopod/compare/v1.6.2...v1.6.3) (2023-09-14) ### Bug Fixes * **fediverse:** add `index` to post controller-method to access post's jsonld contents ([35142d8](https://code.castopod.org/adaures/castopod/commit/35142d8e565e828a977ba2b4de77c1b47a633beb)) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efe027d4..96fa7d7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.6.3](https://code.castopod.org/adaures/castopod/compare/v1.6.2...v1.6.3) (2023-09-14) + +### Bug Fixes + +- **fediverse:** add `index` to post controller-method to access post's jsonld + contents + ([35142d8](https://code.castopod.org/adaures/castopod/commit/35142d8e565e828a977ba2b4de77c1b47a633beb)) + ## [1.6.2](https://code.castopod.org/adaures/castopod/compare/v1.6.1...v1.6.2) (2023-09-11) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index d21e4090..4e80fe89 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.6.2'); +defined('CP_VERSION') || define('CP_VERSION', '1.6.3'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 59e8fd5c..898aea09 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.6.2", + "version": "1.6.3", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index f91c05a4..24386738 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.6.2", + "version": "1.6.3", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 3189f122067dc47d6de93c3185aca66d7df95e1a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 15 Sep 2023 16:40:07 +0000 Subject: [PATCH 224/477] fix(fediverse): update post controller namespace in routes --- app/Config/Routes.php | 2 +- modules/Fediverse/Controllers/PostController.php | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 9ed603dc..ef5b7db2 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -231,7 +231,7 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { 'controller-method' => 'PostController::index/$2', ], 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ - 'namespace' => 'Modules/Fediverse/Controllers', + 'namespace' => 'Modules\Fediverse\Controllers', 'controller-method' => 'PostController::index\$2', ], ], diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php index a1348642..2a7069b3 100644 --- a/modules/Fediverse/Controllers/PostController.php +++ b/modules/Fediverse/Controllers/PostController.php @@ -50,6 +50,10 @@ class PostController extends Controller public function _remap(string $method, string ...$params): mixed { + if (count($params) === 0) { + throw PageNotFoundException::forPageNotFound(); + } + if (! ($post = model('PostModel', false)->getPostById($params[0])) instanceof Post) { throw PageNotFoundException::forPageNotFound(); } From 4ecb42f7c82eb8d41d27c7b9705b3278ea04ab79 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sun, 17 Sep 2023 10:07:59 +0000 Subject: [PATCH 225/477] fix(fediverse): do not cache remote action form + fix typo on post routes for passing post uuid + remove unnecessary session->start() directive --- app/Config/Cache.php | 11 ++++--- app/Config/Routes.php | 4 +-- app/Controllers/EpisodeAudioController.php | 1 - app/Controllers/EpisodeController.php | 2 +- app/Controllers/PostController.php | 31 ++++++------------- modules/Analytics/AnalyticsTrait.php | 1 - .../Analytics/Helpers/analytics_helper.php | 7 ----- .../Fediverse/Controllers/PostController.php | 2 +- 8 files changed, 20 insertions(+), 39 deletions(-) diff --git a/app/Config/Cache.php b/app/Config/Cache.php index ffa3c07b..7a938005 100644 --- a/app/Config/Cache.php +++ b/app/Config/Cache.php @@ -55,11 +55,11 @@ class Cache extends BaseConfig * Whether to take the URL query string into consideration when generating * output cache files. Valid options are: * - * false = Disabled - * true = Enabled, take all query parameters into account. - * Please be aware that this may result in numerous cache - * files generated for the same page over and over again. - * array('q') = Enabled, but only take into account the specified list + * false = Disabled + * true = Enabled, take all query parameters into account. + * Please be aware that this may result in numerous cache + * files generated for the same page over and over again. + * ['q'] = Enabled, but only take into account the specified list * of query parameters. * * @var boolean|string[] @@ -97,6 +97,7 @@ class Cache extends BaseConfig * A string of reserved characters that will not be allowed in keys or tags. * Strings that violate this restriction will cause handlers to throw. * Default: {}()/\@: + * * Note: The default set is required for PSR-6 compliance. */ public string $reservedCharacters = '{}()/\@:'; diff --git a/app/Config/Routes.php b/app/Config/Routes.php index ef5b7db2..6339fad3 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -6,7 +6,7 @@ use CodeIgniter\Router\RouteCollection; /** * @var RouteCollection $routes -/** + * * -------------------------------------------------------------------- * Placeholder definitions * -------------------------------------------------------------------- @@ -232,7 +232,7 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { ], 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ 'namespace' => 'Modules\Fediverse\Controllers', - 'controller-method' => 'PostController::index\$2', + 'controller-method' => 'PostController::index/$2', ], ], 'filter' => 'allow-cors', diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php index 4c94cf80..d65294ac 100644 --- a/app/Controllers/EpisodeAudioController.php +++ b/app/Controllers/EpisodeAudioController.php @@ -133,7 +133,6 @@ class EpisodeAudioController extends Controller } $session = Services::session(); - $session->start(); $serviceName = ''; if ($this->request->getGet('_from')) { diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index 00d87eeb..cda684aa 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -176,7 +176,7 @@ class EpisodeController extends BaseController } $session = Services::session(); - $session->start(); + if (service('superglobals')->server('HTTP_REFERER') !== null) { $session->set('embed_domain', parse_url(service('superglobals')->server('HTTP_REFERER'), PHP_URL_HOST)); } diff --git a/app/Controllers/PostController.php b/app/Controllers/PostController.php index 6148e27c..23d68882 100644 --- a/app/Controllers/PostController.php +++ b/app/Controllers/PostController.php @@ -249,28 +249,17 @@ class PostController extends FediversePostController $this->registerPodcastWebpageHit($this->podcast->id); } - $cacheName = implode( - '_', - array_filter(['page', "post#{$this->post->id}", "remote_{$action}", service('request') ->getLocale()]), - ); + $data = [ + 'metatags' => get_remote_actions_metatags($this->post, $action), + 'podcast' => $this->podcast, + 'actor' => $this->actor, + 'post' => $this->post, + 'action' => $action, + ]; - if (! ($cachedView = cache($cacheName))) { - $data = [ - 'metatags' => get_remote_actions_metatags($this->post, $action), - 'podcast' => $this->podcast, - 'actor' => $this->actor, - 'post' => $this->post, - 'action' => $action, - ]; + helper('form'); - helper('form'); - - return view('post/remote_action', $data, [ - 'cache' => DECADE, - 'cache_name' => $cacheName, - ]); - } - - return (string) $cachedView; + // NO VIEW CACHING: form has a CSRF token which should change on each request + return view('post/remote_action', $data); } } diff --git a/modules/Analytics/AnalyticsTrait.php b/modules/Analytics/AnalyticsTrait.php index 12cdde88..6e02e721 100644 --- a/modules/Analytics/AnalyticsTrait.php +++ b/modules/Analytics/AnalyticsTrait.php @@ -24,7 +24,6 @@ trait AnalyticsTrait set_user_session_entry_page(); $session = Services::session(); - $session->start(); if (! $session->get('denyListIp')) { $db = db_connect(); diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php index 4e6f1240..3c294c58 100644 --- a/modules/Analytics/Helpers/analytics_helper.php +++ b/modules/Analytics/Helpers/analytics_helper.php @@ -56,7 +56,6 @@ if (! function_exists('set_user_session_deny_list_ip')) { function set_user_session_deny_list_ip(): void { $session = Services::session(); - $session->start(); if (! $session->has('denyListIp')) { $session->set('denyListIp', IpDb::find(client_ip()) !== null); @@ -71,7 +70,6 @@ if (! function_exists('set_user_session_location')) { function set_user_session_location(): void { $session = Services::session(); - $session->start(); $location = [ 'countryCode' => 'N/A', @@ -112,7 +110,6 @@ if (! function_exists('set_user_session_player')) { function set_user_session_player(): void { $session = Services::session(); - $session->start(); if (! $session->has('player')) { $playerFound = null; @@ -155,7 +152,6 @@ if (! function_exists('set_user_session_browser')) { function set_user_session_browser(): void { $session = Services::session(); - $session->start(); if (! $session->has('browser')) { $browserName = '- Other -'; @@ -182,7 +178,6 @@ if (! function_exists('set_user_session_referer')) { function set_user_session_referer(): void { $session = Services::session(); - $session->start(); $newreferer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] @@ -205,7 +200,6 @@ if (! function_exists('set_user_session_entry_page')) { function set_user_session_entry_page(): void { $session = Services::session(); - $session->start(); $entryPage = $_SERVER['REQUEST_URI']; if (! $session->has('entryPage')) { @@ -245,7 +239,6 @@ if (! function_exists('podcast_hit')) { ?int $subscriptionId, ): void { $session = Services::session(); - $session->start(); $clientIp = client_ip(); diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php index 2a7069b3..f188d013 100644 --- a/modules/Fediverse/Controllers/PostController.php +++ b/modules/Fediverse/Controllers/PostController.php @@ -50,7 +50,7 @@ class PostController extends Controller public function _remap(string $method, string ...$params): mixed { - if (count($params) === 0) { + if ($params === []) { throw PageNotFoundException::forPageNotFound(); } From cc19c2466894eb29fff3eeeb605ea87ef296cdd0 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 17 Sep 2023 12:35:30 +0000 Subject: [PATCH 226/477] chore(release): 1.6.4 [skip ci] ## [1.6.4](https://code.castopod.org/adaures/castopod/compare/v1.6.3...v1.6.4) (2023-09-17) ### Bug Fixes * **fediverse:** do not cache remote action form + fix typo on post routes for passing post uuid ([4ecb42f](https://code.castopod.org/adaures/castopod/commit/4ecb42f7c82eb8d41d27c7b9705b3278ea04ab79)) * **fediverse:** update post controller namespace in routes ([3189f12](https://code.castopod.org/adaures/castopod/commit/3189f122067dc47d6de93c3185aca66d7df95e1a)) --- CHANGELOG.md | 10 ++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96fa7d7b..b891e197 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## [1.6.4](https://code.castopod.org/adaures/castopod/compare/v1.6.3...v1.6.4) (2023-09-17) + +### Bug Fixes + +- **fediverse:** do not cache remote action form + fix typo on post routes for + passing post uuid + ([4ecb42f](https://code.castopod.org/adaures/castopod/commit/4ecb42f7c82eb8d41d27c7b9705b3278ea04ab79)) +- **fediverse:** update post controller namespace in routes + ([3189f12](https://code.castopod.org/adaures/castopod/commit/3189f122067dc47d6de93c3185aca66d7df95e1a)) + ## [1.6.3](https://code.castopod.org/adaures/castopod/compare/v1.6.2...v1.6.3) (2023-09-14) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 4e80fe89..5ee4fe5d 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.6.3'); +defined('CP_VERSION') || define('CP_VERSION', '1.6.4'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 898aea09..474065a9 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.6.3", + "version": "1.6.4", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 24386738..1dc2537f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.6.3", + "version": "1.6.4", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 2dd9cc9ef502d9a5788fe2ba5160f0b9a848d9c4 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 23 Sep 2023 14:27:40 +0000 Subject: [PATCH 227/477] chore(phpstan): remove redundant dynamicConstantNames + update quality tools --- app/Config/Events.php | 2 +- app/Models/ClipModel.php | 7 +- app/Models/LikeModel.php | 2 +- composer.json | 12 +- composer.lock | 160 +++++++++--------- .../Admin/Controllers/EpisodeController.php | 4 +- .../Controllers/NotificationController.php | 2 +- modules/Admin/Controllers/PageController.php | 2 +- .../Admin/Controllers/PodcastController.php | 8 +- .../Admin/Controllers/SoundbiteController.php | 2 +- .../Controllers/VideoClipsController.php | 2 +- modules/Auth/Controllers/UserController.php | 2 +- .../Fediverse/Controllers/ActorController.php | 2 +- modules/Fediverse/Models/FavouriteModel.php | 2 +- modules/Fediverse/Models/PostModel.php | 2 +- .../Install/Controllers/InstallController.php | 2 +- phpstan.neon | 5 - rector.php | 2 - 18 files changed, 110 insertions(+), 110 deletions(-) diff --git a/app/Config/Events.php b/app/Config/Events.php index bedbc5bd..8da203d0 100644 --- a/app/Config/Events.php +++ b/app/Config/Events.php @@ -29,7 +29,7 @@ use CodeIgniter\HotReloader\HotReloader; * Events::on('create', [$myInstance, 'myMethod']); */ -Events::on('pre_system', static function () { +Events::on('pre_system', static function (): void { if (ENVIRONMENT !== 'testing') { if (ini_get('zlib.output_compression')) { throw FrameworkException::forEnabledZlibOutputCompression(); diff --git a/app/Models/ClipModel.php b/app/Models/ClipModel.php index 68f531f4..819d8e42 100644 --- a/app/Models/ClipModel.php +++ b/app/Models/ClipModel.php @@ -91,11 +91,10 @@ class ClipModel extends Model if (! ($found = cache($cacheName))) { $clip = $this->find($videoClipId); - if ($clip === null) { + if (! $clip instanceof BaseClip) { return null; } - // @phpstan-ignore-next-line $found = new VideoClip($clip->toArray()); cache() @@ -123,6 +122,7 @@ class ClipModel extends Model $found[$key] = new VideoClip($videoClip->toArray()); } + // @phpstan-ignore-next-line return $found; } @@ -185,11 +185,10 @@ class ClipModel extends Model if (! ($found = cache($cacheName))) { $clip = $this->find($soundbiteId); - if ($clip === null) { + if (! $clip instanceof BaseClip) { return null; } - // @phpstan-ignore-next-line $found = new Soundbite($clip->toArray()); cache() diff --git a/app/Models/LikeModel.php b/app/Models/LikeModel.php index a2b100aa..b0b222ff 100644 --- a/app/Models/LikeModel.php +++ b/app/Models/LikeModel.php @@ -162,7 +162,7 @@ class LikeModel extends UuidModel 'comment_id' => service('uuid') ->fromString($comment->id) ->getBytes(), - ])->first() + ])->first() instanceof Like ) { $this->removeLike($actor, $comment); } else { diff --git a/composer.json b/composer.json index 474065a9..7a3e0a0a 100644 --- a/composer.json +++ b/composer.json @@ -17,25 +17,25 @@ "opawg/user-agents-php": "^v1.0", "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.1", - "phpseclib/phpseclib": "~2.0.44", + "phpseclib/phpseclib": "~2.0.45", "michalsn/codeigniter4-uuid": "v1.0.2", "codeigniter4/settings": "v2.1.2", "chrisjean/php-ico": "^1.0.4", "melbahja/seo": "^v2.1.1", "codeigniter4/shield": "v1.0.0-beta.6", - "aws/aws-sdk-php": "^3.281.3", + "aws/aws-sdk-php": "^3.281.12", "mpratt/embera": "^2.0.34", "codeigniter4/tasks": "dev-develop", "yassinedoghri/podcast-feed": "dev-main" }, "require-dev": { "captainhook/captainhook": "^5.16.4", - "codeigniter/phpstan-codeigniter": "^1.0.1", + "codeigniter/phpstan-codeigniter": "^v1.3.0", "mikey179/vfsstream": "^v1.6.11", "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.10.33", - "phpunit/phpunit": "^10.3.3", - "rector/rector": "^0.18.2", + "phpstan/phpstan": "^1.10.35", + "phpunit/phpunit": "^10.3.5", + "rector/rector": "^0.18.3", "symplify/coding-standard": "^12.0.3", "symplify/easy-coding-standard": "^12.0.8" }, diff --git a/composer.lock b/composer.lock index ec4f75d0..308671d8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6fe4f69b336852b20244b63f5038f315", + "content-hash": "2f7475f224d54face5bb527c0edc893a", "packages": [ { "name": "adaures/ipcat-php", @@ -120,16 +120,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.281.3", + "version": "3.281.12", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "a3cfb20dbfb11117b7174b2594fc597745252e0c" + "reference": "22a92f08758db2b152843ea0875eeee5a467d8ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a3cfb20dbfb11117b7174b2594fc597745252e0c", - "reference": "a3cfb20dbfb11117b7174b2594fc597745252e0c", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/22a92f08758db2b152843ea0875eeee5a467d8ff", + "reference": "22a92f08758db2b152843ea0875eeee5a467d8ff", "shasum": "" }, "require": { @@ -205,9 +205,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.281.3" + "source": "https://github.com/aws/aws-sdk-php/tree/3.281.12" }, - "time": "2023-09-08T18:06:26+00:00" + "time": "2023-09-22T18:12:27+00:00" }, { "name": "brick/math", @@ -494,12 +494,12 @@ "source": { "type": "git", "url": "https://github.com/codeigniter4/tasks.git", - "reference": "9d898e01bf2c39349c9b2e84512dfbf0f40aaac9" + "reference": "72d8f02a4293949f5aaeb80897eb431663c2293a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/9d898e01bf2c39349c9b2e84512dfbf0f40aaac9", - "reference": "9d898e01bf2c39349c9b2e84512dfbf0f40aaac9", + "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/72d8f02a4293949f5aaeb80897eb431663c2293a", + "reference": "72d8f02a4293949f5aaeb80897eb431663c2293a", "shasum": "" }, "require": { @@ -510,7 +510,7 @@ "require-dev": { "codeigniter4/devkit": "^1.0", "codeigniter4/framework": "^4.1", - "rector/rector": "0.18.2" + "rector/rector": "0.18.3" }, "default-branch": true, "type": "library", @@ -527,24 +527,30 @@ }, "scripts": { "post-update-cmd": ["bash admin/setup.sh"], - "analyze": ["phpstan analyze", "psalm"], + "analyze": [ + "Composer\\Config::disableProcessTimeout", + "phpstan analyze", + "psalm", + "rector process --dry-run" + ], + "sa": ["@analyze"], "ci": [ "Composer\\Config::disableProcessTimeout", + "@cs", "@deduplicate", - "@analyze", - "@test", "@inspect", - "rector process", - "@style" + "@analyze", + "@test" ], - "deduplicate": ["phpcpd app/ src/"], + "cs": ["php-cs-fixer fix --ansi --verbose --dry-run --diff"], + "cs-fix": ["php-cs-fixer fix --ansi --verbose --diff"], + "style": ["@cs-fix"], + "deduplicate": ["phpcpd src/ tests/"], "inspect": ["deptrac analyze --cache-file=build/deptrac.cache"], "mutate": [ "infection --threads=2 --skip-initial-tests --coverage=build/phpunit" ], "retool": ["retool"], - "style": ["php-cs-fixer fix --verbose --ansi --using-cache=no"], - "cs-fix": ["@style"], "test": ["phpunit"] }, "license": ["MIT"], @@ -562,7 +568,7 @@ "source": "https://github.com/codeigniter4/tasks/tree/develop", "issues": "https://github.com/codeigniter4/tasks/issues" }, - "time": "2023-09-09T10:30:12+00:00" + "time": "2023-09-13T12:19:31+00:00" }, { "name": "composer/ca-bundle", @@ -2092,16 +2098,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.44", + "version": "2.0.45", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "149f608243f8133c61926aae26ce67d2b22b37e5" + "reference": "28d8f438a0064c9de80857e3270d071495544640" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/149f608243f8133c61926aae26ce67d2b22b37e5", - "reference": "149f608243f8133c61926aae26ce67d2b22b37e5", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/28d8f438a0064c9de80857e3270d071495544640", + "reference": "28d8f438a0064c9de80857e3270d071495544640", "shasum": "" }, "require": { @@ -2178,7 +2184,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.44" + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.45" }, "funding": [ { @@ -2194,7 +2200,7 @@ "type": "tidelift" } ], - "time": "2023-06-13T08:41:47+00:00" + "time": "2023-09-15T20:55:47+00:00" }, { "name": "psr/cache", @@ -2285,16 +2291,16 @@ }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -2324,9 +2330,9 @@ "homepage": "https://github.com/php-fig/http-client", "keywords": ["http", "http-client", "psr", "psr-18"], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -3225,20 +3231,20 @@ }, { "name": "codeigniter/phpstan-codeigniter", - "version": "v1.0.1", + "version": "v1.3.0.70400", "source": { "type": "git", "url": "https://github.com/CodeIgniter/phpstan-codeigniter.git", - "reference": "de64b5e634322f929518d976e5f8cf9303fcd9c6" + "reference": "efa4ebc6afca005619849f34f8ea2d16442bd33e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/de64b5e634322f929518d976e5f8cf9303fcd9c6", - "reference": "de64b5e634322f929518d976e5f8cf9303fcd9c6", + "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/efa4ebc6afca005619849f34f8ea2d16442bd33e", + "reference": "efa4ebc6afca005619849f34f8ea2d16442bd33e", "shasum": "" }, "require": { - "php": "^8.1", + "php": "^7.4 || ^8.0", "phpstan/phpstan": "^1.10" }, "conflict": { @@ -3247,13 +3253,15 @@ "require-dev": { "codeigniter/coding-standard": "^1.7", "codeigniter4/framework": "^4.3", + "codeigniter4/shield": "^1.0@beta", "friendsofphp/php-cs-fixer": "^3.20", "nexusphp/cs-config": "^3.12", "phpstan/extension-installer": "^1.3", "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.3", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "^10.2" + "phpunit/phpunit": "^10.2", + "rector/rector": "^0.18.2" }, "type": "phpstan-extension", "extra": { @@ -3288,7 +3296,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/CodeIgniter/phpstan-codeigniter" }, - "time": "2023-08-30T06:35:08+00:00" + "time": "2023-09-18T09:38:34+00:00" }, { "name": "composer/pcre", @@ -3491,16 +3499,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.26.1", + "version": "v3.28.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "d023ba6684055f6ea1da1352d8a02baca0426983" + "reference": "113e09fea3d2306319ffaa2423fe3de768b28cff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d023ba6684055f6ea1da1352d8a02baca0426983", - "reference": "d023ba6684055f6ea1da1352d8a02baca0426983", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/113e09fea3d2306319ffaa2423fe3de768b28cff", + "reference": "113e09fea3d2306319ffaa2423fe3de768b28cff", "shasum": "" }, "require": { @@ -3570,7 +3578,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.26.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.28.0" }, "funding": [ { @@ -3578,7 +3586,7 @@ "type": "github" } ], - "time": "2023-09-08T19:09:07+00:00" + "time": "2023-09-22T20:43:40+00:00" }, { "name": "mikey179/vfsstream", @@ -3874,16 +3882,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.33", + "version": "1.10.35", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1" + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1", - "reference": "03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e730e5facb75ffe09dfb229795e8c01a459f26c3", + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3", "shasum": "" }, "require": { @@ -3922,20 +3930,20 @@ "type": "tidelift" } ], - "time": "2023-09-04T12:20:53+00:00" + "time": "2023-09-19T15:27:56+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.4", + "version": "10.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" + "reference": "56f33548fe522c8d82da7ff3824b42829d324364" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/56f33548fe522c8d82da7ff3824b42829d324364", + "reference": "56f33548fe522c8d82da7ff3824b42829d324364", "shasum": "" }, "require": { @@ -3984,7 +3992,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.6" }, "funding": [ { @@ -3992,7 +4000,7 @@ "type": "github" } ], - "time": "2023-08-31T14:04:38+00:00" + "time": "2023-09-19T04:59:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4214,16 +4222,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.3.3", + "version": "10.3.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4" + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", - "reference": "241ed4dd0db1c096984e62d414c4e1ac8d5dbff4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/747c3b2038f1139e3dcd9886a3f5a948648b7503", + "reference": "747c3b2038f1139e3dcd9886a3f5a948648b7503", "shasum": "" }, "require": { @@ -4237,7 +4245,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-code-coverage": "^10.1.5", "phpunit/php-file-iterator": "^4.0", "phpunit/php-invoker": "^4.0", "phpunit/php-text-template": "^3.0", @@ -4247,7 +4255,7 @@ "sebastian/comparator": "^5.0", "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.0", + "sebastian/exporter": "^5.1", "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", @@ -4283,7 +4291,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.5" }, "funding": [ { @@ -4299,7 +4307,7 @@ "type": "tidelift" } ], - "time": "2023-09-05T04:34:51+00:00" + "time": "2023-09-19T05:42:37+00:00" }, { "name": "psr/container", @@ -4354,16 +4362,16 @@ }, { "name": "rector/rector", - "version": "0.18.2", + "version": "0.18.3", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "8606564b50ce70f99839d35c67f4536dc2ea090d" + "reference": "ba7988e3e028e68e07191d75b0d5473ac320c5e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/8606564b50ce70f99839d35c67f4536dc2ea090d", - "reference": "8606564b50ce70f99839d35c67f4536dc2ea090d", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/ba7988e3e028e68e07191d75b0d5473ac320c5e7", + "reference": "ba7988e3e028e68e07191d75b0d5473ac320c5e7", "shasum": "" }, "require": { @@ -4387,7 +4395,7 @@ "keywords": ["automation", "dev", "migration", "refactoring"], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.18.2" + "source": "https://github.com/rectorphp/rector/tree/0.18.3" }, "funding": [ { @@ -4395,7 +4403,7 @@ "type": "github" } ], - "time": "2023-09-06T08:50:38+00:00" + "time": "2023-09-12T20:18:14+00:00" }, { "name": "sebastian/cli-parser", @@ -4791,16 +4799,16 @@ }, { "name": "sebastian/exporter", - "version": "5.0.1", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480" + "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/32ff03d078fed1279c4ec9a407d08c5e9febb480", - "reference": "32ff03d078fed1279c4ec9a407d08c5e9febb480", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c3fa8483f9539b190f7cd4bfc4a07631dd1df344", + "reference": "c3fa8483f9539b190f7cd4bfc4a07631dd1df344", "shasum": "" }, "require": { @@ -4850,7 +4858,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.0" }, "funding": [ { @@ -4858,7 +4866,7 @@ "type": "github" } ], - "time": "2023-09-08T04:46:58+00:00" + "time": "2023-09-18T07:15:37+00:00" }, { "name": "sebastian/global-state", diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 58933535..4b60b4fd 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -50,7 +50,7 @@ class EpisodeController extends BaseController 'id' => $params[1], 'podcast_id' => $params[0], ]) - ->first()) + ->first()) instanceof Episode ) { throw PageNotFoundException::forPageNotFound(); } @@ -182,7 +182,7 @@ class EpisodeController extends BaseController 'slug' => $validData['slug'], 'podcast_id' => $this->podcast->id, ]) - ->first()) { + ->first() instanceof Episode) { return redirect() ->back() ->withInput() diff --git a/modules/Admin/Controllers/NotificationController.php b/modules/Admin/Controllers/NotificationController.php index f4c2c64a..33c7d9ac 100644 --- a/modules/Admin/Controllers/NotificationController.php +++ b/modules/Admin/Controllers/NotificationController.php @@ -41,7 +41,7 @@ class NotificationController extends BaseController ->where([ 'id' => $params[1], ]) - ->first()) + ->first()) instanceof Notification ) { throw PageNotFoundException::forPageNotFound(); } diff --git a/modules/Admin/Controllers/PageController.php b/modules/Admin/Controllers/PageController.php index fbd909d9..f589f64c 100644 --- a/modules/Admin/Controllers/PageController.php +++ b/modules/Admin/Controllers/PageController.php @@ -25,7 +25,7 @@ class PageController extends BaseController return $this->{$method}(); } - if ($this->page = (new PageModel())->find($params[0])) { + if (($this->page = (new PageModel())->find($params[0])) instanceof Page) { return $this->{$method}(); } diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 7cf5618e..3eece8b7 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -716,7 +716,7 @@ class PodcastController extends BaseController $post = (new PostModel())->where('episode_id', $episode->id) ->first(); - if ($post !== null) { + if ($post instanceof Post) { $post->published_at = $episode->published_at; $postModel = new PostModel(); if (! $postModel->update($post->id, $post)) { @@ -819,7 +819,7 @@ class PodcastController extends BaseController $newPostMessage = $this->request->getPost('message'); - if ($post !== null) { + if ($post instanceof Post) { if ($newPostMessage !== '') { // edit post if post exists and message is not empty $post->message = $newPostMessage; @@ -884,7 +884,7 @@ class PodcastController extends BaseController $post = (new PostModel())->where('episode_id', $episode->id) ->first(); - if ($post !== null) { + if ($post instanceof Post) { $post->published_at = $episode->published_at; $postModel = new PostModel(); if (! $postModel->update($post->id, $post)) { @@ -927,7 +927,7 @@ class PodcastController extends BaseController 'episode_id' => null, ]) ->first(); - if ($post !== null) { + if ($post instanceof Post) { $postModel->removePost($post); } diff --git a/modules/Admin/Controllers/SoundbiteController.php b/modules/Admin/Controllers/SoundbiteController.php index e040404a..ca96f56b 100644 --- a/modules/Admin/Controllers/SoundbiteController.php +++ b/modules/Admin/Controllers/SoundbiteController.php @@ -43,7 +43,7 @@ class SoundbiteController extends BaseController 'id' => $params[1], 'podcast_id' => $params[0], ]) - ->first()) + ->first()) instanceof Episode ) { throw PageNotFoundException::forPageNotFound(); } diff --git a/modules/Admin/Controllers/VideoClipsController.php b/modules/Admin/Controllers/VideoClipsController.php index 0d5ff0dc..ddece561 100644 --- a/modules/Admin/Controllers/VideoClipsController.php +++ b/modules/Admin/Controllers/VideoClipsController.php @@ -46,7 +46,7 @@ class VideoClipsController extends BaseController 'id' => $params[1], 'podcast_id' => $params[0], ]) - ->first()) + ->first()) instanceof Episode ) { throw PageNotFoundException::forPageNotFound(); } diff --git a/modules/Auth/Controllers/UserController.php b/modules/Auth/Controllers/UserController.php index 9da5d0ed..31b7ea99 100644 --- a/modules/Auth/Controllers/UserController.php +++ b/modules/Auth/Controllers/UserController.php @@ -30,7 +30,7 @@ class UserController extends BaseController return $this->{$method}(); } - if ($this->user = (new UserModel())->find($params[0])) { + if (($this->user = (new UserModel())->find($params[0])) instanceof User) { return $this->{$method}(); } diff --git a/modules/Fediverse/Controllers/ActorController.php b/modules/Fediverse/Controllers/ActorController.php index 813b8f52..dd13c638 100644 --- a/modules/Fediverse/Controllers/ActorController.php +++ b/modules/Fediverse/Controllers/ActorController.php @@ -235,7 +235,7 @@ class ActorController extends Controller ->first(); } - if ($reblogPost !== null) { + if ($reblogPost instanceof \App\Entities\Post) { model('PostModel', false) ->undoReblog($reblogPost, false); diff --git a/modules/Fediverse/Models/FavouriteModel.php b/modules/Fediverse/Models/FavouriteModel.php index 72afc5a0..ed5af480 100644 --- a/modules/Fediverse/Models/FavouriteModel.php +++ b/modules/Fediverse/Models/FavouriteModel.php @@ -169,7 +169,7 @@ class FavouriteModel extends UuidModel 'post_id' => service('uuid') ->fromString($post->id) ->getBytes(), - ])->first() + ])->first() instanceof Favourite ) { $this->removeFavourite($actor, $post); } else { diff --git a/modules/Fediverse/Models/PostModel.php b/modules/Fediverse/Models/PostModel.php index 65d5d703..b2eedd6d 100644 --- a/modules/Fediverse/Models/PostModel.php +++ b/modules/Fediverse/Models/PostModel.php @@ -580,7 +580,7 @@ class PostModel extends UuidModel 'reblog_of_id' => $this->uuid ->fromString($post->id) ->getBytes(), - ])->first()) + ])->first()) instanceof Post ) { $this->reblog($actor, $post); } else { diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index cb71c817..edd7f465 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -121,7 +121,7 @@ class InstallController extends Controller // Check if instance owner has been created, meaning install was completed if ($db->tableExists('users') && (new UserModel())->where('is_owner', true) - ->first() !== null + ->first() instanceof User ) { // if so, show a 404 page throw PageNotFoundException::forPageNotFound(); diff --git a/phpstan.neon b/phpstan.neon index 183ded38..58b86925 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -40,10 +40,5 @@ parameters: - Michalsn\Uuid\Config\Services - Modules\PremiumPodcasts\Config\Services - Modules\Media\Config\Services - dynamicConstantNames: - - APP_NAMESPACE - - CI_DEBUG - - ENVIRONMENT - - SODIUM_LIBRARY_VERSION ignoreErrors: - '#^Call to an undefined method CodeIgniter\\Cache\\CacheInterface\:\:deleteMatching\(\)#' diff --git a/rector.php b/rector.php index ef860a13..c4ada50e 100644 --- a/rector.php +++ b/rector.php @@ -2,7 +2,6 @@ declare(strict_types=1); -use Rector\CodingStyle\Rector\ClassMethod\UnSpreadOperatorRector; use Rector\CodingStyle\Rector\Encapsed\EncapsedStringsToSprintfRector; use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector; use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector; @@ -49,7 +48,6 @@ return static function (RectorConfig $rectorConfig): void { // skip rules from used sets ChangeOrIfContinueToMultiContinueRector::class, EncapsedStringsToSprintfRector::class, - UnSpreadOperatorRector::class, RemoveExtraParametersRector::class, UnwrapFutureCompatibleIfPhpVersionRector::class, From ffa530e187ff6488648a7cf749ca0173765a5d87 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 26 Sep 2023 15:20:25 +0000 Subject: [PATCH 228/477] fix(fediverse): use NoteObject including episode link in content (hotfix) --- modules/Fediverse/Config/Fediverse.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/Fediverse/Config/Fediverse.php b/modules/Fediverse/Config/Fediverse.php index 835567e0..a35e88dd 100644 --- a/modules/Fediverse/Config/Fediverse.php +++ b/modules/Fediverse/Config/Fediverse.php @@ -10,9 +10,9 @@ declare(strict_types=1); namespace Modules\Fediverse\Config; +use App\Libraries\NoteObject; use CodeIgniter\Config\BaseConfig; use Modules\Fediverse\Objects\ActorObject; -use Modules\Fediverse\Objects\NoteObject; class Fediverse extends BaseConfig { @@ -23,6 +23,7 @@ class Fediverse extends BaseConfig */ public string $actorObject = ActorObject::class; + // FIXME: hotfix applied to have episodes show up in posts public string $noteObject = NoteObject::class; /** From fcad25a551962fefc3fe43764430231d5cfdf872 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 26 Sep 2023 15:33:41 +0000 Subject: [PATCH 229/477] chore(release): 1.6.5 [skip ci] ## [1.6.5](https://code.castopod.org/adaures/castopod/compare/v1.6.4...v1.6.5) (2023-09-26) ### Bug Fixes * **fediverse:** use NoteObject including episode link in content (hotfix) ([ffa530e](https://code.castopod.org/adaures/castopod/commit/ffa530e187ff6488648a7cf749ca0173765a5d87)) --- CHANGELOG.md | 7 +++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b891e197..d1ad0610 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.6.5](https://code.castopod.org/adaures/castopod/compare/v1.6.4...v1.6.5) (2023-09-26) + +### Bug Fixes + +- **fediverse:** use NoteObject including episode link in content (hotfix) + ([ffa530e](https://code.castopod.org/adaures/castopod/commit/ffa530e187ff6488648a7cf749ca0173765a5d87)) + ## [1.6.4](https://code.castopod.org/adaures/castopod/compare/v1.6.3...v1.6.4) (2023-09-17) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 5ee4fe5d..7c3ca92a 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.6.4'); +defined('CP_VERSION') || define('CP_VERSION', '1.6.5'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 7a3e0a0a..2c793165 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.6.4", + "version": "1.6.5", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 1dc2537f..4ed79830 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.6.4", + "version": "1.6.5", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 5a834c0f8957fc016e73325a3c3ff05e524d0755 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 3 Oct 2023 16:21:08 +0000 Subject: [PATCH 230/477] fix(auth): display error messages from validator --- modules/Auth/Controllers/InteractController.php | 2 +- modules/Auth/Controllers/MagicLinkController.php | 4 ++-- modules/Auth/Controllers/MyAccountController.php | 4 ++-- modules/Install/Controllers/InstallController.php | 4 ++-- themes/cp_auth/login.php | 2 +- themes/cp_install/create_superadmin.php | 1 + 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/Auth/Controllers/InteractController.php b/modules/Auth/Controllers/InteractController.php index 58dae0cf..d3a387b7 100644 --- a/modules/Auth/Controllers/InteractController.php +++ b/modules/Auth/Controllers/InteractController.php @@ -24,7 +24,7 @@ class InteractController extends Controller return redirect() ->back() ->withInput() - ->with('errors', service('validation')->getErrors()); + ->with('errors', $this->validator->getErrors()); } $validData = $this->validator->getValidated(); diff --git a/modules/Auth/Controllers/MagicLinkController.php b/modules/Auth/Controllers/MagicLinkController.php index 305cfe7b..46170271 100644 --- a/modules/Auth/Controllers/MagicLinkController.php +++ b/modules/Auth/Controllers/MagicLinkController.php @@ -45,12 +45,11 @@ class MagicLinkController extends ShieldMagicLinkController 'new_password' => 'required|strong_password', ]; - $userModel = new UserModel(); if (! $this->validate($rules)) { return redirect() ->back() ->withInput() - ->with('errors', $userModel->errors()); + ->with('errors', $this->validator->getErrors()); } $validData = $this->validator->getValidated(); @@ -60,6 +59,7 @@ class MagicLinkController extends ShieldMagicLinkController ->user() ->password = $validData['new_password']; + $userModel = new UserModel(); if (! $userModel->update(auth()->user()->id, auth()->user())) { return redirect() ->back() diff --git a/modules/Auth/Controllers/MyAccountController.php b/modules/Auth/Controllers/MyAccountController.php index 7fad8a37..4e0d2687 100644 --- a/modules/Auth/Controllers/MyAccountController.php +++ b/modules/Auth/Controllers/MyAccountController.php @@ -35,12 +35,11 @@ class MyAccountController extends BaseController 'new_password' => 'required|strong_password|differs[password]', ]; - $userModel = new UserModel(); if (! $this->validate($rules)) { return redirect() ->back() ->withInput() - ->with('errors', $userModel->errors()); + ->with('errors', $this->validator->getErrors()); } $validData = $this->validator->getValidated(); @@ -66,6 +65,7 @@ class MyAccountController extends BaseController ->user() ->password = $validData['new_password']; + $userModel = new UserModel(); if (! $userModel->update(auth()->user()->id, auth()->user())) { return redirect() ->back() diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index edd7f465..fa52f73d 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -290,12 +290,11 @@ class InstallController extends Controller 'password' => 'required|strong_password', ]; - $userModel = new UserModel(); if (! $this->validate($rules)) { return redirect() ->back() ->withInput() - ->with('errors', $userModel->errors()); + ->with('errors', $this->validator->getErrors()); } $validData = $this->validator->getValidated(); @@ -308,6 +307,7 @@ class InstallController extends Controller 'is_owner' => true, ]); + $userModel = new UserModel(); try { $userModel->save($user); } catch (ValidationException) { diff --git a/themes/cp_auth/login.php b/themes/cp_auth/login.php index d2d86ba9..23851be6 100644 --- a/themes/cp_auth/login.php +++ b/themes/cp_auth/login.php @@ -20,7 +20,7 @@ use Modules\Auth\Config\Auth; required="true" type="email" inputmode="email" - autocomplete="email" + autocomplete="username" autofocus="autofocus" /> diff --git a/themes/cp_install/create_superadmin.php b/themes/cp_install/create_superadmin.php index 9fe28fa7..543ffec2 100644 --- a/themes/cp_install/create_superadmin.php +++ b/themes/cp_install/create_superadmin.php @@ -19,6 +19,7 @@ name="email" label="" type="email" + autocomplete="username" required="true" /> Date: Mon, 23 Oct 2023 11:04:51 +0000 Subject: [PATCH 231/477] build(docker): update nginx unit image to 1.31.0 --- docker/production/castopod/Dockerfile | 37 ++++++++----------- .../production/castopod/config.template.json | 21 +++++++++++ docker/production/castopod/entrypoint.sh | 4 +- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/docker/production/castopod/Dockerfile b/docker/production/castopod/Dockerfile index f549bb0d..77700f5e 100644 --- a/docker/production/castopod/Dockerfile +++ b/docker/production/castopod/Dockerfile @@ -1,6 +1,6 @@ -FROM docker.io/golang:1.20-bookworm AS CRON_BUILDER +FROM docker.io/golang:1.21-bookworm AS CRON_BUILDER -ARG SUPERCRONIC_VERSION=v0.2.25 +ARG SUPERCRONIC_VERSION=v0.2.26 RUN apt-get update && \ apt-get install -y git && \ @@ -11,26 +11,10 @@ RUN apt-get update && \ mv supercronic /usr/local/bin -FROM docker.io/php:8.1-cli AS UNIT_BUILDER +FROM docker.io/php:8.2-cli -ARG UNIT_VERSION=1.29.0 +ARG UNIT_VERSION=1.31.1 -RUN apt-get update && \ - apt-get install -y libpcre2-dev git && \ - mkdir -p /usr/lib/unit/modules && \ - git clone https://github.com/nginx/unit.git && \ - cd unit && \ - git checkout $UNIT_VERSION && \ - ./configure --prefix=/usr --state=/var/lib/unit --control=unix:/var/run/control.unit.sock --log=/var/log/unit.log --user=www-data --group=www-data --tmp=/tmp --modules=/usr/lib/unit/modules && \ - ./configure php && \ - make && \ - make install - - -FROM docker.io/php:8.1-cli - -COPY --from=UNIT_BUILDER /usr/sbin/unitd /usr/sbin/unitd -COPY --from=UNIT_BUILDER /usr/lib/unit/ /usr/lib/unit/ COPY --from=CRON_BUILDER /usr/local/bin/supercronic /usr/local/bin/supercronic COPY docker/production/common/prepare_environment.sh /prepare_environment.sh @@ -42,15 +26,24 @@ COPY docker/production/common/crontab.txt /crontab.txt COPY docker/production/castopod/supervisord.conf /etc/supervisor/conf.d/supervisord.conf RUN apt-get update && \ - apt-get install -y supervisor ffmpeg curl gettext-base libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev libpcre2-8-0 libicu-dev && \ + apt-get install -y supervisor ffmpeg curl gettext-base libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev libpcre2-dev libicu-dev git && \ rm -rf /var/lib/apt/lists/* && \ + git clone https://github.com/nginx/unit.git && \ + cd unit && \ + git checkout $UNIT_VERSION && \ + ./configure --user=www-data --group=www-data && \ + ./configure php && \ + make && \ + make install && \ + cd .. && \ + rm -rf unit && \ pecl install -o -f redis && \ rm -rf /tmp/pear && \ docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-xpm && \ docker-php-ext-install mysqli gd intl exif && \ docker-php-ext-enable mysqli gd intl exif redis && \ ln -s /dev/stdout /var/log/unit.log && \ - mkdir -p /var/lib/unit && \ + mkdir -p /usr/local/var/lib/unit /usr/local/var/run/unit /usr/local/var/log/unit && \ chmod 544 /entrypoint.sh && \ chmod -R 750 /var/www/castopod && \ chown -R root:www-data /var/www/castopod && \ diff --git a/docker/production/castopod/config.template.json b/docker/production/castopod/config.template.json index 8b980172..e165e1fc 100644 --- a/docker/production/castopod/config.template.json +++ b/docker/production/castopod/config.template.json @@ -6,8 +6,29 @@ }, "routes": [ { + "match": { + "uri": "~^.+\\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf|map)$" + }, "action": { "share": "/var/www/castopod/public$uri", + "response_headers": { + "X-Content-Type-Options": "nosniff", + "Access-Control-Allow-Origin": "*", + "Cache-Control": "max-age=604800" + }, + "fallback": { + "pass": "applications/castopod" + } + } + }, + { + "action": { + "share": "/var/www/castopod/public$uri", + "response_headers": { + "X-Frame-Options": "sameorigin", + "X-Content-Type-Options": "nosniff", + "Access-Control-Allow-Origin": "*" + }, "fallback": { "pass": "applications/castopod" } diff --git a/docker/production/castopod/entrypoint.sh b/docker/production/castopod/entrypoint.sh index c6fd2a02..51516b14 100644 --- a/docker/production/castopod/entrypoint.sh +++ b/docker/production/castopod/entrypoint.sh @@ -3,8 +3,6 @@ ENV_FILE_LOCATION=/var/www/castopod/.env . /prepare_environment.sh -cat /config.template.json | envsubst '$CP_MAX_BODY_SIZE_BYTES$CP_TIMEOUT' > /config.json +cat /config.template.json | envsubst '$CP_MAX_BODY_SIZE_BYTES$CP_TIMEOUT' > /usr/local/var/lib/unit/conf.json -#Apply configuration after unit is started -(sleep 2 && curl -X PUT --data-binary @/config.json --unix-socket /var/run/control.unit.sock http://localhost/config/) & supervisord From 4ca7f9ccae1e352bf26a3b6db4de73bac7b84382 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 8 Nov 2023 13:51:06 +0000 Subject: [PATCH 232/477] fix(import): use cocur/slugify library to handle non latin text --- app/Helpers/misc_helper.php | 102 +----------------- composer.json | 31 +++--- composer.lock | 73 ++++++++++++- .../PodcastImport/Commands/PodcastImport.php | 12 +-- 4 files changed, 96 insertions(+), 122 deletions(-) diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php index 1b6046e2..b1eacfdb 100644 --- a/app/Helpers/misc_helper.php +++ b/app/Helpers/misc_helper.php @@ -4,6 +4,7 @@ declare(strict_types=1); use App\Entities\Person; use App\Entities\Podcast; +use Cocur\Slugify\Slugify; use Config\App; use Config\Images; use Modules\Media\Entities\Image; @@ -42,105 +43,8 @@ if (! function_exists('slugify')) { $text = substr($text, 0, strrpos(substr($text, 0, $maxLength), ' ')); } - // replace non letter or digits by - - $text = preg_replace('~[^\pL\d]+~u', '-', $text); - - $unwanted = [ - 'Š' => 'S', - 'š' => 's', - 'Đ' => 'Dj', - 'đ' => 'dj', - 'Ž' => 'Z', - 'ž' => 'z', - 'Č' => 'C', - 'č' => 'c', - 'Ć' => 'C', - 'ć' => 'c', - 'À' => 'A', - 'Á' => 'A', - 'Â' => 'A', - 'Ã' => 'A', - 'Ä' => 'A', - 'Å' => 'A', - 'Æ' => 'AE', - 'Ç' => 'C', - 'È' => 'E', - 'É' => 'E', - 'Ê' => 'E', - 'Ë' => 'E', - 'Ì' => 'I', - 'Í' => 'I', - 'Î' => 'I', - 'Ï' => 'I', - 'Ñ' => 'N', - 'Ò' => 'O', - 'Ó' => 'O', - 'Ô' => 'O', - 'Õ' => 'O', - 'Ö' => 'O', - 'Ø' => 'O', - 'Œ' => 'OE', - 'Ù' => 'U', - 'Ú' => 'U', - 'Û' => 'U', - 'Ü' => 'U', - 'Ý' => 'Y', - 'Þ' => 'B', - 'ß' => 'Ss', - 'à' => 'a', - 'á' => 'a', - 'â' => 'a', - 'ã' => 'a', - 'ä' => 'a', - 'å' => 'a', - 'æ' => 'ae', - 'ç' => 'c', - 'è' => 'e', - 'é' => 'e', - 'ê' => 'e', - 'ë' => 'e', - 'ì' => 'i', - 'í' => 'i', - 'î' => 'i', - 'ï' => 'i', - 'ð' => 'o', - 'ñ' => 'n', - 'ò' => 'o', - 'ó' => 'o', - 'ô' => 'o', - 'õ' => 'o', - 'ö' => 'o', - 'ø' => 'o', - 'œ' => 'OE', - 'ù' => 'u', - 'ú' => 'u', - 'û' => 'u', - 'ý' => 'y', - 'þ' => 'b', - 'ÿ' => 'y', - 'Ŕ' => 'R', - 'ŕ' => 'r', - '/' => '-', - ' ' => '-', - ]; - $text = strtr($text, $unwanted); - - // transliterate - $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); - - // remove unwanted characters - $text = preg_replace('~[^\-\w]+~', '', $text); - - // trim - $text = trim($text, '-'); - - // remove duplicate - - $text = preg_replace('~-+~', '-', $text); - - // lowercase - $text = strtolower($text); - - return $text; + $slugify = new Slugify(); + return $slugify->slugify($text); } } diff --git a/composer.json b/composer.json index 2c793165..663c02c6 100644 --- a/composer.json +++ b/composer.json @@ -7,25 +7,26 @@ "license": "AGPL-3.0-or-later", "require": { "php": "^8.1", - "codeigniter4/framework": "v4.4.1", - "james-heinrich/getid3": "^2.0.0-beta5", - "whichbrowser/parser": "^v2.1.7", - "geoip2/geoip2": "v2.13.0", - "league/commonmark": "^2.4.1", - "vlucas/phpdotenv": "v5.5.0", - "league/html-to-markdown": "5.1.1", - "opawg/user-agents-php": "^v1.0", "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.1", - "phpseclib/phpseclib": "~2.0.45", - "michalsn/codeigniter4-uuid": "v1.0.2", - "codeigniter4/settings": "v2.1.2", - "chrisjean/php-ico": "^1.0.4", - "melbahja/seo": "^v2.1.1", - "codeigniter4/shield": "v1.0.0-beta.6", "aws/aws-sdk-php": "^3.281.12", - "mpratt/embera": "^2.0.34", + "chrisjean/php-ico": "^1.0.4", + "cocur/slugify": "^4.5", + "codeigniter4/framework": "v4.4.1", + "codeigniter4/settings": "v2.1.2", + "codeigniter4/shield": "v1.0.0-beta.6", "codeigniter4/tasks": "dev-develop", + "geoip2/geoip2": "v2.13.0", + "james-heinrich/getid3": "^2.0.0-beta5", + "league/commonmark": "^2.4.1", + "league/html-to-markdown": "5.1.1", + "melbahja/seo": "^v2.1.1", + "michalsn/codeigniter4-uuid": "v1.0.2", + "mpratt/embera": "^2.0.34", + "opawg/user-agents-php": "^v1.0", + "phpseclib/phpseclib": "~2.0.45", + "vlucas/phpdotenv": "v5.5.0", + "whichbrowser/parser": "^v2.1.7", "yassinedoghri/podcast-feed": "dev-main" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 308671d8..ed144cf1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2f7475f224d54face5bb527c0edc893a", + "content-hash": "b7d9181ef215329ee3c3d2c52e23b2d1", "packages": [ { "name": "adaures/ipcat-php", @@ -302,6 +302,75 @@ }, "time": "2016-09-27T22:00:56+00:00" }, + { + "name": "cocur/slugify", + "version": "v4.5.1", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "7c6e088228b9f082050876ae8b0cd287b117b840" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/7c6e088228b9f082050876ae8b0cd287b117b840", + "reference": "7c6e088228b9f082050876ae8b0cd287b117b840", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "symfony/config": "<3.4 || >=4,<4.3", + "symfony/dependency-injection": "<3.4 || >=4,<4.3", + "symfony/http-kernel": "<3.4 || >=4,<4.3", + "twig/twig": "<2.12.1" + }, + "require-dev": { + "laravel/framework": "^5.0|^6.0|^7.0|^8.0", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6.8", + "mockery/mockery": "^1.3", + "nette/di": "~2.4", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "symfony/config": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/dependency-injection": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/http-kernel": "^3.4 || ^4.3 || ^5.0 || ^6.0", + "symfony/phpunit-bridge": "^5.4 || ^6.0", + "twig/twig": "^2.12.1 || ~3.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + }, + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + } + ], + "description": "Converts a string into a slug.", + "keywords": ["slug", "slugify"], + "support": { + "issues": "https://github.com/cocur/slugify/issues", + "source": "https://github.com/cocur/slugify/tree/v4.5.1" + }, + "time": "2023-09-17T07:26:20+00:00" + }, { "name": "codeigniter4/framework", "version": "v4.4.1", @@ -6517,9 +6586,9 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "james-heinrich/getid3": 10, "codeigniter4/shield": 10, "codeigniter4/tasks": 20, + "james-heinrich/getid3": 10, "yassinedoghri/podcast-feed": 20 }, "prefer-stable": true, diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php index cb9f4029..e751c95f 100644 --- a/modules/PodcastImport/Commands/PodcastImport.php +++ b/modules/PodcastImport/Commands/PodcastImport.php @@ -162,7 +162,7 @@ class PodcastImport extends BaseCommand $podcastModel = new PodcastModel(); if (! $podcastModel->update($this->podcast->id, $this->podcast)) { - throw new Exception(print_r($podcastModel->errors())); + throw new Exception((string) print_r($podcastModel->errors())); } CLI::showProgress(false); @@ -250,7 +250,7 @@ class PodcastImport extends BaseCommand $podcastModel = new PodcastModel(); if (! ($podcastId = $podcastModel->insert($podcast, true))) { $db->transRollback(); - throw new Exception(print_r($podcastModel->errors())); + throw new Exception((string) print_r($podcastModel->errors())); } $podcast->id = $podcastId; @@ -347,7 +347,7 @@ class PodcastImport extends BaseCommand $personGroupSlug, $personRoleSlug )) { - throw new Exception(print_r($podcastPersonModel->errors())); + throw new Exception((string) print_r($podcastPersonModel->errors())); } } @@ -485,7 +485,7 @@ class PodcastImport extends BaseCommand if (! ($episodeId = $episodeModel->insert($episode, true))) { $db->transRollback(); - throw new Exception(print_r($episodeModel->errors())); + throw new Exception((string) print_r($episodeModel->errors())); } $this->importEpisodePersons($episodeId, $item->podcast_persons); @@ -535,7 +535,7 @@ class PodcastImport extends BaseCommand ]); if (! ($newPersonId = $personModel->insert($newPerson))) { - throw new Exception(print_r($personModel->errors())); + throw new Exception((string) print_r($personModel->errors())); } } @@ -567,7 +567,7 @@ class PodcastImport extends BaseCommand $personGroupSlug, $personRoleSlug )) { - throw new Exception(print_r($episodePersonModel->errors())); + throw new Exception((string) print_r($episodePersonModel->errors())); } } } From f2d5b272ac385a978d7e173121faafe03d7a7200 Mon Sep 17 00:00:00 2001 From: Benjamin Bellamy Date: Sun, 12 Nov 2023 20:06:53 +0100 Subject: [PATCH 233/477] feat(icons): update new Deezer logo --- app/Resources/icons/podcasting/deezer.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Resources/icons/podcasting/deezer.svg b/app/Resources/icons/podcasting/deezer.svg index a22f53bf..9ac367b1 100755 --- a/app/Resources/icons/podcasting/deezer.svg +++ b/app/Resources/icons/podcasting/deezer.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file From 5f8d413b84b236077a75934da9409f37d34cb4a5 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 5 Oct 2023 15:40:51 +0000 Subject: [PATCH 234/477] feat(ux): add episode description to episode cards --- themes/cp_app/episode/_partials/card.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/themes/cp_app/episode/_partials/card.php b/themes/cp_app/episode/_partials/card.php index d2e4e878..3e306a93 100644 --- a/themes/cp_app/episode/_partials/card.php +++ b/themes/cp_app/episode/_partials/card.php @@ -1,5 +1,5 @@
    -
    +
    @@ -7,7 +7,7 @@ <?= esc($episode->title) ?> + ->thumbnail_url ?>" alt="title) ?>" class="object-cover w-full rounded-lg shadow-inner aspect-square" loading="lazy" />
    @@ -15,7 +15,8 @@ number, $episode->season_number, 'text-xs font-semibold border-subtle text-skin-muted px-1 border mr-2 !no-underline', true) ?> published_at, 'text-xs whitespace-nowrap text-skin-muted') ?>
    -

    title) ?>

    +

    title) ?>

    +

    description ?>

    is_premium && ! is_unlocked($podcast->handle)): ?> From b047a3c6707114d04c276758f2e543eef90d72f5 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 10 Oct 2023 15:55:39 +0000 Subject: [PATCH 235/477] fix(admin-ux): hide navigation submenus in details panel for easier scanning --- app/Resources/icons/rocket-tilted.svg | 6 ++ app/Resources/icons/star-smile.svg | 6 -- app/Resources/styles/colors.css | 1 + modules/Admin/Language/ar/Navigation.php | 2 +- modules/Admin/Language/br/Navigation.php | 2 +- modules/Admin/Language/ca/Navigation.php | 2 +- modules/Admin/Language/da/Navigation.php | 2 +- modules/Admin/Language/de/Navigation.php | 2 +- modules/Admin/Language/el/Navigation.php | 2 +- modules/Admin/Language/en/Navigation.php | 2 +- modules/Admin/Language/es/Navigation.php | 2 +- modules/Admin/Language/fa/Navigation.php | 2 +- modules/Admin/Language/fr/Navigation.php | 2 +- modules/Admin/Language/fr2/Navigation.php | 2 +- modules/Admin/Language/fr_CA/Navigation.php | 2 +- modules/Admin/Language/fr_trad/Navigation.php | 2 +- modules/Admin/Language/gd/Navigation.php | 2 +- modules/Admin/Language/gl/Navigation.php | 2 +- modules/Admin/Language/id/Navigation.php | 2 +- modules/Admin/Language/it/Navigation.php | 2 +- modules/Admin/Language/ja/Navigation.php | 2 +- modules/Admin/Language/ko/Navigation.php | 2 +- modules/Admin/Language/nl/Navigation.php | 2 +- modules/Admin/Language/nn-NO/Navigation.php | 2 +- modules/Admin/Language/oc/Navigation.php | 2 +- modules/Admin/Language/pl/Navigation.php | 2 +- modules/Admin/Language/pt-BR/Navigation.php | 2 +- modules/Admin/Language/pt/Navigation.php | 2 +- modules/Admin/Language/ro/Navigation.php | 2 +- modules/Admin/Language/ru/Navigation.php | 2 +- modules/Admin/Language/sk/Navigation.php | 2 +- modules/Admin/Language/sr_Latn/Navigation.php | 2 +- modules/Admin/Language/sv/Navigation.php | 2 +- modules/Admin/Language/uk/Navigation.php | 2 +- modules/Admin/Language/zh-Hans/Navigation.php | 2 +- tailwind.config.js | 7 +- themes/cp_admin/_partials/_nav_aside.php | 2 +- themes/cp_admin/_partials/_nav_menu.php | 42 +++++++++++ themes/cp_admin/_sidebar.php | 75 +++++++++---------- themes/cp_admin/episode/_sidebar.php | 31 +++----- themes/cp_admin/podcast/_sidebar.php | 56 +++++--------- 41 files changed, 155 insertions(+), 135 deletions(-) create mode 100644 app/Resources/icons/rocket-tilted.svg delete mode 100755 app/Resources/icons/star-smile.svg create mode 100644 themes/cp_admin/_partials/_nav_menu.php diff --git a/app/Resources/icons/rocket-tilted.svg b/app/Resources/icons/rocket-tilted.svg new file mode 100644 index 00000000..627e4772 --- /dev/null +++ b/app/Resources/icons/rocket-tilted.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/Resources/icons/star-smile.svg b/app/Resources/icons/star-smile.svg deleted file mode 100755 index 05014c31..00000000 --- a/app/Resources/icons/star-smile.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/app/Resources/styles/colors.css b/app/Resources/styles/colors.css index b11ae602..d59e79ba 100644 --- a/app/Resources/styles/colors.css +++ b/app/Resources/styles/colors.css @@ -9,6 +9,7 @@ --color-background-elevated: 0 0% 100%; --color-background-base: 173 44% 96%; --color-background-navigation: 172 100% 17%; + --color-background-navigation-active: 131 100% 12%; --color-background-header: 172 100% 17%; --color-background-highlight: 111 64% 94%; --color-background-backdrop: 0 0% 50%; diff --git a/modules/Admin/Language/ar/Navigation.php b/modules/Admin/Language/ar/Navigation.php index e87f69c6..ebe70420 100644 --- a/modules/Admin/Language/ar/Navigation.php +++ b/modules/Admin/Language/ar/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'الإعدادات', 'settings-general' => 'العامة', 'settings-theme' => 'الحلة', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'حسابي', 'change-password' => 'تغيير الكلمة السرية', diff --git a/modules/Admin/Language/br/Navigation.php b/modules/Admin/Language/br/Navigation.php index 80783da7..aebeac33 100644 --- a/modules/Admin/Language/br/Navigation.php +++ b/modules/Admin/Language/br/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Arventennoù', 'settings-general' => 'Hollek', 'settings-theme' => 'Neuz', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'Ma c\'hont', 'change-password' => 'Kemmañ ar ger-tremen', diff --git a/modules/Admin/Language/ca/Navigation.php b/modules/Admin/Language/ca/Navigation.php index 1141ea25..0482c760 100644 --- a/modules/Admin/Language/ca/Navigation.php +++ b/modules/Admin/Language/ca/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Preferències', 'settings-general' => 'General', 'settings-theme' => 'Tema', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'El meu compte', 'change-password' => 'Canviar la contrasenya', diff --git a/modules/Admin/Language/da/Navigation.php b/modules/Admin/Language/da/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/da/Navigation.php +++ b/modules/Admin/Language/da/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/de/Navigation.php b/modules/Admin/Language/de/Navigation.php index 47d74d1e..943c27f2 100644 --- a/modules/Admin/Language/de/Navigation.php +++ b/modules/Admin/Language/de/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Einstellungen', 'settings-general' => 'Allgemein', 'settings-theme' => 'Erscheinungsbild', - 'about' => 'Über', + 'admin-about' => 'Über', 'account' => [ 'my-account' => 'Mein Konto', 'change-password' => 'Passwort ändern', diff --git a/modules/Admin/Language/el/Navigation.php b/modules/Admin/Language/el/Navigation.php index 8a163b0d..0bd1357a 100644 --- a/modules/Admin/Language/el/Navigation.php +++ b/modules/Admin/Language/el/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Ρυθμίσεις', 'settings-general' => 'Γενικά', 'settings-theme' => 'Θέμα', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'Ο λογαριασμός μου', 'change-password' => 'Αλλαγή κωδικού πρόσβασης', diff --git a/modules/Admin/Language/en/Navigation.php b/modules/Admin/Language/en/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/en/Navigation.php +++ b/modules/Admin/Language/en/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/es/Navigation.php b/modules/Admin/Language/es/Navigation.php index 52648483..8393cb8a 100644 --- a/modules/Admin/Language/es/Navigation.php +++ b/modules/Admin/Language/es/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Configuración', 'settings-general' => 'General', 'settings-theme' => 'Tema', - 'about' => 'Acerca de', + 'admin-about' => 'Acerca de', 'account' => [ 'my-account' => 'Mi cuenta', 'change-password' => 'Cambiar contraseña', diff --git a/modules/Admin/Language/fa/Navigation.php b/modules/Admin/Language/fa/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/fa/Navigation.php +++ b/modules/Admin/Language/fa/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/fr/Navigation.php b/modules/Admin/Language/fr/Navigation.php index b15f2bc0..5eaeffd3 100644 --- a/modules/Admin/Language/fr/Navigation.php +++ b/modules/Admin/Language/fr/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Paramètres', 'settings-general' => 'Général', 'settings-theme' => 'Thème', - 'about' => 'À propos', + 'admin-about' => 'À propos', 'account' => [ 'my-account' => 'Mon compte', 'change-password' => 'Modifier le mot de passe', diff --git a/modules/Admin/Language/fr2/Navigation.php b/modules/Admin/Language/fr2/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/fr2/Navigation.php +++ b/modules/Admin/Language/fr2/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/fr_CA/Navigation.php b/modules/Admin/Language/fr_CA/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/fr_CA/Navigation.php +++ b/modules/Admin/Language/fr_CA/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/fr_trad/Navigation.php b/modules/Admin/Language/fr_trad/Navigation.php index 610f1434..f158bccd 100644 --- a/modules/Admin/Language/fr_trad/Navigation.php +++ b/modules/Admin/Language/fr_trad/Navigation.php @@ -33,7 +33,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/gd/Navigation.php b/modules/Admin/Language/gd/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/gd/Navigation.php +++ b/modules/Admin/Language/gd/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/gl/Navigation.php b/modules/Admin/Language/gl/Navigation.php index 94fa5483..bf5026af 100644 --- a/modules/Admin/Language/gl/Navigation.php +++ b/modules/Admin/Language/gl/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Axustes', 'settings-general' => 'Xeral', 'settings-theme' => 'Decorado', - 'about' => 'Acerca de', + 'admin-about' => 'Acerca de', 'account' => [ 'my-account' => 'A miña conta', 'change-password' => 'Cambiar contrasinal', diff --git a/modules/Admin/Language/id/Navigation.php b/modules/Admin/Language/id/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/id/Navigation.php +++ b/modules/Admin/Language/id/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/it/Navigation.php b/modules/Admin/Language/it/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/it/Navigation.php +++ b/modules/Admin/Language/it/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/ja/Navigation.php b/modules/Admin/Language/ja/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/ja/Navigation.php +++ b/modules/Admin/Language/ja/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/ko/Navigation.php b/modules/Admin/Language/ko/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/ko/Navigation.php +++ b/modules/Admin/Language/ko/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/nl/Navigation.php b/modules/Admin/Language/nl/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/nl/Navigation.php +++ b/modules/Admin/Language/nl/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/nn-NO/Navigation.php b/modules/Admin/Language/nn-NO/Navigation.php index 0a7a5972..39f24642 100644 --- a/modules/Admin/Language/nn-NO/Navigation.php +++ b/modules/Admin/Language/nn-NO/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Innstillingar', 'settings-general' => 'Generelt', 'settings-theme' => 'Bunad', - 'about' => 'Om', + 'admin-about' => 'Om', 'account' => [ 'my-account' => 'Kontoen min', 'change-password' => 'Endre passord', diff --git a/modules/Admin/Language/oc/Navigation.php b/modules/Admin/Language/oc/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/oc/Navigation.php +++ b/modules/Admin/Language/oc/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/pl/Navigation.php b/modules/Admin/Language/pl/Navigation.php index cacec2c9..210e9c89 100644 --- a/modules/Admin/Language/pl/Navigation.php +++ b/modules/Admin/Language/pl/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Ustawienia', 'settings-general' => 'Ogólne', 'settings-theme' => 'Motyw', - 'about' => 'Informacje', + 'admin-about' => 'Informacje', 'account' => [ 'my-account' => 'Moje konto', 'change-password' => 'Zmień hasło', diff --git a/modules/Admin/Language/pt-BR/Navigation.php b/modules/Admin/Language/pt-BR/Navigation.php index 1d772b3c..bfa6f9e2 100644 --- a/modules/Admin/Language/pt-BR/Navigation.php +++ b/modules/Admin/Language/pt-BR/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Confirgurações', 'settings-general' => 'Geral', 'settings-theme' => 'Tema', - 'about' => 'Sobre', + 'admin-about' => 'Sobre', 'account' => [ 'my-account' => 'Minha conta', 'change-password' => 'Alterar senha', diff --git a/modules/Admin/Language/pt/Navigation.php b/modules/Admin/Language/pt/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/pt/Navigation.php +++ b/modules/Admin/Language/pt/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/ro/Navigation.php b/modules/Admin/Language/ro/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/ro/Navigation.php +++ b/modules/Admin/Language/ro/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/ru/Navigation.php b/modules/Admin/Language/ru/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/ru/Navigation.php +++ b/modules/Admin/Language/ru/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/sk/Navigation.php b/modules/Admin/Language/sk/Navigation.php index cf13a993..4039ab46 100644 --- a/modules/Admin/Language/sk/Navigation.php +++ b/modules/Admin/Language/sk/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Nastavenia', 'settings-general' => 'Všeobecné', 'settings-theme' => 'Vzhľad', - 'about' => 'O', + 'admin-about' => 'O', 'account' => [ 'my-account' => 'Môj účet', 'change-password' => 'Zmeniť heslo', diff --git a/modules/Admin/Language/sr_Latn/Navigation.php b/modules/Admin/Language/sr_Latn/Navigation.php index 0f790cf1..fe7e6c68 100644 --- a/modules/Admin/Language/sr_Latn/Navigation.php +++ b/modules/Admin/Language/sr_Latn/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Podešavanja', 'settings-general' => 'Opšte', 'settings-theme' => 'Tema', - 'about' => 'Osnovni podaci', + 'admin-about' => 'Osnovni podaci', 'account' => [ 'my-account' => 'Moj nalog', 'change-password' => 'Promenite lozinku', diff --git a/modules/Admin/Language/sv/Navigation.php b/modules/Admin/Language/sv/Navigation.php index 783d3145..77a05b35 100644 --- a/modules/Admin/Language/sv/Navigation.php +++ b/modules/Admin/Language/sv/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Inställningar', 'settings-general' => 'Allmänt', 'settings-theme' => 'Tema', - 'about' => 'Om', + 'admin-about' => 'Om', 'account' => [ 'my-account' => 'Mitt konto', 'change-password' => 'Ändra lösenord', diff --git a/modules/Admin/Language/uk/Navigation.php b/modules/Admin/Language/uk/Navigation.php index d0ddb4c4..5d1b4583 100644 --- a/modules/Admin/Language/uk/Navigation.php +++ b/modules/Admin/Language/uk/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => 'Settings', 'settings-general' => 'General', 'settings-theme' => 'Theme', - 'about' => 'About', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'My account', 'change-password' => 'Change password', diff --git a/modules/Admin/Language/zh-Hans/Navigation.php b/modules/Admin/Language/zh-Hans/Navigation.php index fb0685c2..66e2c290 100644 --- a/modules/Admin/Language/zh-Hans/Navigation.php +++ b/modules/Admin/Language/zh-Hans/Navigation.php @@ -34,7 +34,7 @@ return [ 'settings' => '设置', 'settings-general' => '通用', 'settings-theme' => '主题', - 'about' => '关于', + 'admin-about' => '关于', 'account' => [ 'my-account' => '我的帐户', 'change-password' => '修改密码', diff --git a/tailwind.config.js b/tailwind.config.js index b9ae5b2c..db8c0789 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,6 +1,5 @@ /* eslint-disable */ const defaultTheme = require("tailwindcss/defaultTheme"); -const { nodeModuleNameResolver } = require("typescript"); /** @type {import('tailwindcss').Config} */ module.exports = { @@ -13,6 +12,10 @@ module.exports = { ], theme: { extend: { + content: { + chevronRightIcon: + "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 24 24'%3E%3Cpath d='M13.17 12 8.22 7.05l1.42-1.41L16 12l-6.36 6.36-1.42-1.41L13.17 12Z'/%3E%3C/svg%3E%0A\")", + }, fontFamily: { sans: ["Inter", ...defaultTheme.fontFamily.sans], display: ["Kumbh Sans", ...defaultTheme.fontFamily.sans], @@ -37,6 +40,8 @@ module.exports = { base: "hsl(var(--color-background-base) / )", elevated: "hsl(var(--color-background-elevated) / )", navigation: "hsl(var(--color-background-navigation) / )", + "navigation-active": + "hsl(var(--color-background-navigation-active) / )", backdrop: "hsl(var(--color-background-backdrop) / )", header: "hsl(var(--color-background-header) / )", accent: { diff --git a/themes/cp_admin/_partials/_nav_aside.php b/themes/cp_admin/_partials/_nav_aside.php index d243a540..ed1f0f2a 100644 --- a/themes/cp_admin/_partials/_nav_aside.php +++ b/themes/cp_admin/_partials/_nav_aside.php @@ -19,4 +19,4 @@ $isEpisodeArea = isset($podcast) && isset($episode); CP_VERSION, ], null, false) ?> - \ No newline at end of file + diff --git a/themes/cp_admin/_partials/_nav_menu.php b/themes/cp_admin/_partials/_nav_menu.php new file mode 100644 index 00000000..507df80b --- /dev/null +++ b/themes/cp_admin/_partials/_nav_menu.php @@ -0,0 +1,42 @@ + diff --git a/themes/cp_admin/_sidebar.php b/themes/cp_admin/_sidebar.php index e5a8d271..0eae7858 100644 --- a/themes/cp_admin/_sidebar.php +++ b/themes/cp_admin/_sidebar.php @@ -1,60 +1,59 @@ [ 'icon' => 'dashboard', 'items' => ['admin'], ], 'podcasts' => [ - 'icon' => 'mic', - 'items' => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'], + 'icon' => 'mic', + 'items' => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'], + 'add-cta' => 'podcast-create', + 'count-route' => 'podcast-list', ], 'persons' => [ - 'icon' => 'folder-user', - 'items' => ['person-list', 'person-create'], + 'icon' => 'folder-user', + 'items' => ['person-list', 'person-create'], + 'add-cta' => 'person-create', + 'count' => (new PersonModel())->countAllResults(), + 'count-route' => 'person-list', ], 'fediverse' => [ - 'icon' => 'star-smile', + 'icon' => 'rocket-tilted', 'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'], ], 'users' => [ - 'icon' => 'group', - 'items' => ['user-list', 'user-create'], + 'icon' => 'group', + 'items' => ['user-list', 'user-create'], + 'add-cta' => 'user-create', + 'count' => (new UserModel())->countAllResults(), + 'count-route' => 'user-list', ], 'pages' => [ - 'icon' => 'pages', - 'items' => ['page-list', 'page-create'], - + 'icon' => 'pages', + 'items' => ['page-list', 'page-create'], + 'add-cta' => 'page-create', + 'count' => (new PageModel())->countAllResults(), + 'count-route' => 'page-list', ], 'settings' => [ 'icon' => 'settings', - 'items' => ['settings-general', 'settings-theme'], + 'items' => ['settings-general', 'settings-theme', 'admin-about'], ], -]; ?> +]; - +if (auth()->user()->can('podcasts.view')) { + $navigation['podcasts']['count'] = (new PodcastModel())->countAllResults(); +} else { + $navigation['podcasts']['count'] = count(get_user_podcasts(auth()->user())); +} ?> + + $navigation, + 'langKey' => 'Navigation', +]) ?> diff --git a/themes/cp_admin/episode/_sidebar.php b/themes/cp_admin/episode/_sidebar.php index 966a9930..52b07631 100644 --- a/themes/cp_admin/episode/_sidebar.php +++ b/themes/cp_admin/episode/_sidebar.php @@ -1,13 +1,14 @@ [ 'icon' => 'dashboard', 'items' => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'], ], 'clips' => [ - 'icon' => 'clapperboard', - 'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'], + 'icon' => 'clapperboard', + 'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'], + 'add-cta' => 'video-clips-create', ], ]; ?> @@ -44,20 +45,10 @@ $podcastNavigation = [
    - + + $episodeNavigation, + 'langKey' => 'EpisodeNavigation', + 'podcastId' => $podcast->id, + 'episodeId' => $episode->id, + ]) ?> diff --git a/themes/cp_admin/podcast/_sidebar.php b/themes/cp_admin/podcast/_sidebar.php index caa93d53..2895ab47 100644 --- a/themes/cp_admin/podcast/_sidebar.php +++ b/themes/cp_admin/podcast/_sidebar.php @@ -6,12 +6,16 @@ $podcastNavigation = [ 'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports'], ], 'episodes' => [ - 'icon' => 'play-circle', - 'items' => ['episode-list', 'episode-create'], + 'icon' => 'play-circle', + 'items' => ['episode-list', 'episode-create'], + 'add-cta' => 'episode-create', + 'count' => $podcast->getEpisodesCount(), + 'count-route' => 'episode-list', ], 'premium' => [ - 'icon' => 'exchange-dollar', - 'items' => ['subscription-list', 'subscription-add'], + 'icon' => 'exchange-dollar', + 'add-cta' => 'subscription-create', + 'items' => ['subscription-list', 'subscription-create'], ], 'analytics' => [ 'icon' => 'line-chart', @@ -26,8 +30,11 @@ $podcastNavigation = [ ], ], 'contributors' => [ - 'icon' => 'group', - 'items' => ['contributor-list', 'contributor-add'], + 'icon' => 'group', + 'items' => ['contributor-list', 'contributor-add'], + 'add-cta' => 'contributor-add', + 'count' => count($podcast->contributors), + 'count-route' => 'contributor-list', ], 'platforms' => [ 'icon' => 'link', @@ -39,10 +46,6 @@ $podcastNavigation = [ ], ]; -$counts = [ - 'episode-list' => $podcast->getEpisodesCount(), -]; - ?>
    @@ -68,30 +71,9 @@ $counts = [
    - + + $podcastNavigation, + 'langKey' => 'PodcastNavigation', + 'podcastId' => $podcast->id, + ]) ?> From 2d52fa1046faf1b8d81304e35fc24a7874315e6e Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 12 Oct 2023 15:52:20 +0000 Subject: [PATCH 236/477] fix: reorder podcast form fields + extract sync feeds to its own form - update fields' styling - update icons contents --- app/Helpers/components_helper.php | 2 +- app/Resources/icons/account-circle.svg | 7 +-- app/Resources/icons/add-box.svg | 7 +-- app/Resources/icons/add.svg | 7 +-- app/Resources/icons/alert.svg | 7 +-- app/Resources/icons/arrow-left.svg | 7 +-- app/Resources/icons/arrow-right.svg | 7 +-- app/Resources/icons/at.svg | 7 +-- app/Resources/icons/bold.svg | 7 +-- app/Resources/icons/bookmark.svg | 6 -- app/Resources/icons/calendar.svg | 7 +-- app/Resources/icons/caret-down.svg | 7 +-- app/Resources/icons/caret-right.svg | 7 +-- app/Resources/icons/chat.svg | 7 +-- app/Resources/icons/check.svg | 7 +-- app/Resources/icons/chevron-left.svg | 7 +-- app/Resources/icons/chevron-right.svg | 7 +-- app/Resources/icons/clapperboard.svg | 7 +-- app/Resources/icons/clipboard.svg | 7 +-- app/Resources/icons/close.svg | 7 +-- app/Resources/icons/cloud-off.svg | 7 +-- app/Resources/icons/dashboard.svg | 7 +-- app/Resources/icons/database.svg | 7 +-- app/Resources/icons/delete-bin.svg | 7 +-- app/Resources/icons/disc.svg | 7 +-- app/Resources/icons/download.svg | 7 +-- app/Resources/icons/edit.svg | 7 +-- app/Resources/icons/error-warning.svg | 4 +- app/Resources/icons/exchange-dollar.svg | 7 +-- app/Resources/icons/external-link.svg | 7 +-- app/Resources/icons/eye.svg | 7 +-- app/Resources/icons/file-copy.svg | 7 +-- app/Resources/icons/file-download.svg | 7 +-- app/Resources/icons/folder-user.svg | 7 +-- app/Resources/icons/forbid.svg | 7 +-- app/Resources/icons/group.svg | 7 +-- app/Resources/icons/heading.svg | 7 +-- app/Resources/icons/heart.svg | 7 +-- app/Resources/icons/history.svg | 5 +- app/Resources/icons/home-gear.svg | 7 +-- app/Resources/icons/image-add.svg | 7 +-- app/Resources/icons/information.svg | 5 +- app/Resources/icons/italic.svg | 7 +-- app/Resources/icons/line-chart.svg | 7 +-- app/Resources/icons/link.svg | 7 +-- app/Resources/icons/list-ordered.svg | 7 +-- app/Resources/icons/list-unordered.svg | 7 +-- app/Resources/icons/loader.svg | 7 +-- app/Resources/icons/lock-unlock.svg | 7 +-- app/Resources/icons/lock.svg | 7 +-- app/Resources/icons/loop-left.svg | 1 + app/Resources/icons/map-pin.svg | 7 +-- app/Resources/icons/markdown.svg | 7 +-- app/Resources/icons/menu.svg | 7 +-- app/Resources/icons/mic.svg | 7 +-- app/Resources/icons/more.svg | 7 +-- app/Resources/icons/movie.svg | 7 +-- app/Resources/icons/notification-bell.svg | 6 -- app/Resources/icons/notification.svg | 1 + app/Resources/icons/pages.svg | 7 +-- app/Resources/icons/pause.svg | 7 +-- app/Resources/icons/play-circle.svg | 7 +-- app/Resources/icons/play.svg | 2 +- app/Resources/icons/question.svg | 7 +-- app/Resources/icons/quote.svg | 7 +-- app/Resources/icons/refresh.svg | 7 +-- app/Resources/icons/repeat.svg | 7 +-- app/Resources/icons/rocket-tilted.svg | 7 +-- app/Resources/icons/rss.svg | 7 +-- app/Resources/icons/scales.svg | 7 +-- app/Resources/icons/search.svg | 7 +-- app/Resources/icons/send-plane.svg | 7 +-- app/Resources/icons/settings.svg | 7 +-- app/Resources/icons/shield-user.svg | 5 +- app/Resources/icons/sort.svg | 7 +-- app/Resources/icons/timer.svg | 7 +-- app/Resources/icons/upload-cloud.svg | 7 +-- app/Resources/icons/user-add.svg | 7 +-- app/Resources/icons/user-follow.svg | 7 +-- app/Resources/icons/volume-high.svg | 7 +-- app/Resources/icons/volume-low.svg | 7 +-- app/Resources/icons/volume-mute.svg | 7 +-- app/Resources/icons/warning.svg | 6 -- app/Views/Components/Forms/Field.php | 7 ++- app/Views/Components/Forms/Input.php | 8 ++- app/Views/Components/Forms/Label.php | 4 +- app/Views/Components/Forms/MultiSelect.php | 2 +- app/Views/Components/Forms/Select.php | 2 +- modules/Admin/Config/Routes.php | 4 +- modules/Admin/Controllers/AboutController.php | 2 +- .../Controllers/EpisodePersonController.php | 2 +- .../Controllers/PodcastPersonController.php | 2 +- modules/Admin/Language/ar/Podcast.php | 2 - .../Admin/Language/ar/PodcastNavigation.php | 2 +- modules/Admin/Language/br/Podcast.php | 2 - .../Admin/Language/br/PodcastNavigation.php | 2 +- modules/Admin/Language/ca/Podcast.php | 2 - .../Admin/Language/ca/PodcastNavigation.php | 2 +- modules/Admin/Language/da/Podcast.php | 2 - .../Admin/Language/da/PodcastNavigation.php | 2 +- modules/Admin/Language/de/Podcast.php | 2 - .../Admin/Language/de/PodcastNavigation.php | 2 +- modules/Admin/Language/el/Podcast.php | 2 - .../Admin/Language/el/PodcastNavigation.php | 2 +- modules/Admin/Language/en/Breadcrumb.php | 1 + modules/Admin/Language/en/Podcast.php | 5 +- .../Admin/Language/en/PodcastNavigation.php | 3 +- modules/Admin/Language/es/Podcast.php | 2 - .../Admin/Language/es/PodcastNavigation.php | 2 +- .../Admin/Language/fa/PodcastNavigation.php | 2 +- modules/Admin/Language/fr/Podcast.php | 2 - .../Admin/Language/fr/PodcastNavigation.php | 2 +- modules/Admin/Language/fr2/Podcast.php | 2 - .../Admin/Language/fr2/PodcastNavigation.php | 2 +- modules/Admin/Language/fr_CA/Podcast.php | 2 - .../Language/fr_CA/PodcastNavigation.php | 2 +- modules/Admin/Language/fr_trad/Podcast.php | 2 - .../Language/fr_trad/PodcastNavigation.php | 2 +- modules/Admin/Language/gd/Podcast.php | 2 - .../Admin/Language/gd/PodcastNavigation.php | 2 +- modules/Admin/Language/gl/Podcast.php | 2 - .../Admin/Language/gl/PodcastNavigation.php | 2 +- modules/Admin/Language/id/Podcast.php | 2 - .../Admin/Language/id/PodcastNavigation.php | 2 +- modules/Admin/Language/it/Podcast.php | 2 - .../Admin/Language/it/PodcastNavigation.php | 2 +- modules/Admin/Language/ja/Podcast.php | 2 - .../Admin/Language/ja/PodcastNavigation.php | 2 +- modules/Admin/Language/ko/Podcast.php | 2 - .../Admin/Language/ko/PodcastNavigation.php | 2 +- modules/Admin/Language/nl/Podcast.php | 2 - .../Admin/Language/nl/PodcastNavigation.php | 2 +- .../Language/nn-NO/PodcastNavigation.php | 2 +- modules/Admin/Language/oc/Podcast.php | 2 - .../Admin/Language/oc/PodcastNavigation.php | 2 +- modules/Admin/Language/pl/Podcast.php | 2 - .../Admin/Language/pl/PodcastNavigation.php | 2 +- .../Language/pt-BR/PodcastNavigation.php | 2 +- modules/Admin/Language/pt/Podcast.php | 2 - .../Admin/Language/pt/PodcastNavigation.php | 2 +- modules/Admin/Language/ro/Podcast.php | 2 - .../Admin/Language/ro/PodcastNavigation.php | 2 +- modules/Admin/Language/ru/Podcast.php | 2 - .../Admin/Language/ru/PodcastNavigation.php | 2 +- modules/Admin/Language/sk/Podcast.php | 2 - .../Admin/Language/sk/PodcastNavigation.php | 2 +- modules/Admin/Language/sr_Latn/Podcast.php | 2 - .../Language/sr_Latn/PodcastNavigation.php | 2 +- modules/Admin/Language/sv/Podcast.php | 2 - .../Admin/Language/sv/PodcastNavigation.php | 2 +- modules/Admin/Language/uk/Podcast.php | 2 - .../Admin/Language/uk/PodcastNavigation.php | 2 +- .../Language/zh-Hans/PodcastNavigation.php | 2 +- modules/Auth/Config/Routes.php | 2 +- .../Controllers/ContributorController.php | 6 +- modules/Fediverse/Config/Routes.php | 2 +- modules/PodcastImport/Config/Routes.php | 6 +- .../Controllers/PodcastImportController.php | 31 ++++++++-- .../Language/ar/PodcastImport.php | 1 - .../Language/br/PodcastImport.php | 1 - .../Language/ca/PodcastImport.php | 1 - .../Language/da/PodcastImport.php | 1 - .../Language/de/PodcastImport.php | 1 - .../Language/el/PodcastImport.php | 1 - .../Language/en/PodcastImport.php | 7 ++- .../Language/es/PodcastImport.php | 1 - .../Language/fa/PodcastImport.php | 1 - .../Language/fr/PodcastImport.php | 1 - .../Language/fr2/PodcastImport.php | 1 - .../Language/fr_CA/PodcastImport.php | 1 - .../Language/gd/PodcastImport.php | 1 - .../Language/gl/PodcastImport.php | 1 - .../Language/id/PodcastImport.php | 1 - .../Language/it/PodcastImport.php | 1 - .../Language/ja/PodcastImport.php | 1 - .../Language/ko/PodcastImport.php | 1 - .../Language/nl/PodcastImport.php | 1 - .../Language/nn-NO/PodcastImport.php | 1 - .../Language/oc/PodcastImport.php | 1 - .../Language/pl/PodcastImport.php | 1 - .../Language/pt-BR/PodcastImport.php | 1 - .../Language/pt/PodcastImport.php | 1 - .../Language/ro/PodcastImport.php | 1 - .../Language/ru/PodcastImport.php | 1 - .../Language/sk/PodcastImport.php | 1 - .../Language/sr_Latn/PodcastImport.php | 1 - .../Language/sv/PodcastImport.php | 1 - .../Language/uk/PodcastImport.php | 1 - .../Language/zh-Hans/PodcastImport.php | 1 - modules/PremiumPodcasts/Config/Routes.php | 8 +-- .../Controllers/SubscriptionController.php | 6 +- .../Language/ar/Subscription.php | 2 +- .../Language/br/Subscription.php | 2 +- .../Language/ca/Subscription.php | 2 +- .../Language/da/Subscription.php | 2 +- .../Language/el/Subscription.php | 2 +- .../Language/en/Subscription.php | 2 +- .../Language/fa/Subscription.php | 2 +- .../Language/fr2/Subscription.php | 2 +- .../Language/fr_CA/Subscription.php | 2 +- .../Language/fr_trad/Subscription.php | 2 +- .../Language/gl/Subscription.php | 2 +- .../Language/id/Subscription.php | 2 +- .../Language/it/Subscription.php | 2 +- .../Language/ja/Subscription.php | 2 +- .../Language/ko/Subscription.php | 2 +- .../Language/nn-NO/Subscription.php | 2 +- .../Language/oc/Subscription.php | 2 +- .../Language/pt-BR/Subscription.php | 2 +- .../Language/pt/Subscription.php | 2 +- .../Language/ru/Subscription.php | 2 +- .../Language/sk/Subscription.php | 2 +- .../Language/sr_Latn/Subscription.php | 2 +- .../Language/uk/Subscription.php | 2 +- themes/cp_admin/_partials/_nav_header.php | 2 +- .../contributor/{add.php => create.php} | 0 themes/cp_admin/import/podcast_queue.php | 3 +- themes/cp_admin/import/podcast_sync.php | 24 ++++++++ themes/cp_admin/podcast/_sidebar.php | 2 +- themes/cp_admin/podcast/create.php | 59 ++++++++++--------- themes/cp_admin/podcast/edit.php | 44 +++++++------- themes/cp_admin/{ => settings}/about.php | 0 .../subscription/{add.php => create.php} | 4 +- themes/cp_admin/subscription/list.php | 2 +- themes/cp_app/_admin_navbar.php | 2 +- 225 files changed, 292 insertions(+), 699 deletions(-) delete mode 100755 app/Resources/icons/bookmark.svg create mode 100644 app/Resources/icons/loop-left.svg delete mode 100644 app/Resources/icons/notification-bell.svg create mode 100644 app/Resources/icons/notification.svg delete mode 100644 app/Resources/icons/warning.svg rename themes/cp_admin/contributor/{add.php => create.php} (100%) create mode 100644 themes/cp_admin/import/podcast_sync.php rename themes/cp_admin/{ => settings}/about.php (100%) rename themes/cp_admin/subscription/{add.php => create.php} (82%) diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php index 08018f78..eaec82c9 100644 --- a/app/Helpers/components_helper.php +++ b/app/Helpers/components_helper.php @@ -136,7 +136,7 @@ if (! function_exists('publication_pill')) { $customClass . '">' . $label . - ($publicationStatus === 'with_podcast' ? '' : '') . + ($publicationStatus === 'with_podcast' ? '' : '') . ''; } } diff --git a/app/Resources/icons/account-circle.svg b/app/Resources/icons/account-circle.svg index c825dc5a..110027bd 100644 --- a/app/Resources/icons/account-circle.svg +++ b/app/Resources/icons/account-circle.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/add-box.svg b/app/Resources/icons/add-box.svg index 5a6fd80c..f4b1942f 100755 --- a/app/Resources/icons/add-box.svg +++ b/app/Resources/icons/add-box.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/add.svg b/app/Resources/icons/add.svg index 8f3f5a20..4fed9cd0 100755 --- a/app/Resources/icons/add.svg +++ b/app/Resources/icons/add.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/alert.svg b/app/Resources/icons/alert.svg index 7dd74af7..ba526a18 100755 --- a/app/Resources/icons/alert.svg +++ b/app/Resources/icons/alert.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/arrow-left.svg b/app/Resources/icons/arrow-left.svg index d10d02b5..29f6b7d0 100644 --- a/app/Resources/icons/arrow-left.svg +++ b/app/Resources/icons/arrow-left.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/arrow-right.svg b/app/Resources/icons/arrow-right.svg index f46779f7..6fc0e9d5 100644 --- a/app/Resources/icons/arrow-right.svg +++ b/app/Resources/icons/arrow-right.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/at.svg b/app/Resources/icons/at.svg index 80191b5f..6a14a65b 100644 --- a/app/Resources/icons/at.svg +++ b/app/Resources/icons/at.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/bold.svg b/app/Resources/icons/bold.svg index b5fb5947..8502e2f5 100644 --- a/app/Resources/icons/bold.svg +++ b/app/Resources/icons/bold.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/bookmark.svg b/app/Resources/icons/bookmark.svg deleted file mode 100755 index d3bde5f3..00000000 --- a/app/Resources/icons/bookmark.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/app/Resources/icons/calendar.svg b/app/Resources/icons/calendar.svg index fe9bf8d9..91497005 100644 --- a/app/Resources/icons/calendar.svg +++ b/app/Resources/icons/calendar.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/caret-down.svg b/app/Resources/icons/caret-down.svg index e2138c8d..54e5fe04 100644 --- a/app/Resources/icons/caret-down.svg +++ b/app/Resources/icons/caret-down.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/caret-right.svg b/app/Resources/icons/caret-right.svg index 346cb156..e3079866 100644 --- a/app/Resources/icons/caret-right.svg +++ b/app/Resources/icons/caret-right.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/chat.svg b/app/Resources/icons/chat.svg index 594b1503..316f488d 100755 --- a/app/Resources/icons/chat.svg +++ b/app/Resources/icons/chat.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/check.svg b/app/Resources/icons/check.svg index a28368fc..a195ed05 100644 --- a/app/Resources/icons/check.svg +++ b/app/Resources/icons/check.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/chevron-left.svg b/app/Resources/icons/chevron-left.svg index 6d82f7ba..087efae4 100644 --- a/app/Resources/icons/chevron-left.svg +++ b/app/Resources/icons/chevron-left.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/chevron-right.svg b/app/Resources/icons/chevron-right.svg index f33dff5e..48dcbb05 100644 --- a/app/Resources/icons/chevron-right.svg +++ b/app/Resources/icons/chevron-right.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/clapperboard.svg b/app/Resources/icons/clapperboard.svg index c5d7d121..1e8cca28 100644 --- a/app/Resources/icons/clapperboard.svg +++ b/app/Resources/icons/clapperboard.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/clipboard.svg b/app/Resources/icons/clipboard.svg index 4e4214b2..143af421 100644 --- a/app/Resources/icons/clipboard.svg +++ b/app/Resources/icons/clipboard.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/close.svg b/app/Resources/icons/close.svg index 0ef4f305..ddd46522 100644 --- a/app/Resources/icons/close.svg +++ b/app/Resources/icons/close.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/cloud-off.svg b/app/Resources/icons/cloud-off.svg index 7177145a..34abcff2 100755 --- a/app/Resources/icons/cloud-off.svg +++ b/app/Resources/icons/cloud-off.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/dashboard.svg b/app/Resources/icons/dashboard.svg index a25c9e47..7fb04d5a 100644 --- a/app/Resources/icons/dashboard.svg +++ b/app/Resources/icons/dashboard.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/database.svg b/app/Resources/icons/database.svg index 6dc449b4..fe928126 100644 --- a/app/Resources/icons/database.svg +++ b/app/Resources/icons/database.svg @@ -1,6 +1 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/delete-bin.svg b/app/Resources/icons/delete-bin.svg index bd1f9b30..6203485e 100755 --- a/app/Resources/icons/delete-bin.svg +++ b/app/Resources/icons/delete-bin.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/disc.svg b/app/Resources/icons/disc.svg index 095d2cda..de14b2b5 100644 --- a/app/Resources/icons/disc.svg +++ b/app/Resources/icons/disc.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/download.svg b/app/Resources/icons/download.svg index b3ea2a9f..84d71589 100755 --- a/app/Resources/icons/download.svg +++ b/app/Resources/icons/download.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/edit.svg b/app/Resources/icons/edit.svg index d9efb56c..92484f4d 100755 --- a/app/Resources/icons/edit.svg +++ b/app/Resources/icons/edit.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/error-warning.svg b/app/Resources/icons/error-warning.svg index 993f6e29..04bc9aff 100644 --- a/app/Resources/icons/error-warning.svg +++ b/app/Resources/icons/error-warning.svg @@ -1,3 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/exchange-dollar.svg b/app/Resources/icons/exchange-dollar.svg index 85cc6af0..9e0271c0 100644 --- a/app/Resources/icons/exchange-dollar.svg +++ b/app/Resources/icons/exchange-dollar.svg @@ -1,6 +1 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/external-link.svg b/app/Resources/icons/external-link.svg index 2efc6259..f5017634 100755 --- a/app/Resources/icons/external-link.svg +++ b/app/Resources/icons/external-link.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/eye.svg b/app/Resources/icons/eye.svg index f14a8b7d..93969ca9 100755 --- a/app/Resources/icons/eye.svg +++ b/app/Resources/icons/eye.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/file-copy.svg b/app/Resources/icons/file-copy.svg index 0b907436..4c1511b9 100755 --- a/app/Resources/icons/file-copy.svg +++ b/app/Resources/icons/file-copy.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/file-download.svg b/app/Resources/icons/file-download.svg index 0202c99a..d0a0c930 100644 --- a/app/Resources/icons/file-download.svg +++ b/app/Resources/icons/file-download.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/folder-user.svg b/app/Resources/icons/folder-user.svg index 6dcd37c4..57be0618 100755 --- a/app/Resources/icons/folder-user.svg +++ b/app/Resources/icons/folder-user.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/forbid.svg b/app/Resources/icons/forbid.svg index dbc2632c..311f5ed3 100644 --- a/app/Resources/icons/forbid.svg +++ b/app/Resources/icons/forbid.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/group.svg b/app/Resources/icons/group.svg index 5c2f10ee..e8cc1a1d 100755 --- a/app/Resources/icons/group.svg +++ b/app/Resources/icons/group.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/heading.svg b/app/Resources/icons/heading.svg index 0ae177f1..a0d8a6c1 100644 --- a/app/Resources/icons/heading.svg +++ b/app/Resources/icons/heading.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/heart.svg b/app/Resources/icons/heart.svg index f10aafa4..67c57616 100755 --- a/app/Resources/icons/heart.svg +++ b/app/Resources/icons/heart.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/history.svg b/app/Resources/icons/history.svg index 684091df..eae809d5 100644 --- a/app/Resources/icons/history.svg +++ b/app/Resources/icons/history.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/app/Resources/icons/home-gear.svg b/app/Resources/icons/home-gear.svg index 2504da6d..ef1a6de0 100644 --- a/app/Resources/icons/home-gear.svg +++ b/app/Resources/icons/home-gear.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/image-add.svg b/app/Resources/icons/image-add.svg index dca9aa8b..2b5ada85 100644 --- a/app/Resources/icons/image-add.svg +++ b/app/Resources/icons/image-add.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/information.svg b/app/Resources/icons/information.svg index 39f02fbd..37f63f52 100644 --- a/app/Resources/icons/information.svg +++ b/app/Resources/icons/information.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/app/Resources/icons/italic.svg b/app/Resources/icons/italic.svg index 4203e07e..9cad6165 100644 --- a/app/Resources/icons/italic.svg +++ b/app/Resources/icons/italic.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/line-chart.svg b/app/Resources/icons/line-chart.svg index dc43cd7d..0af14c94 100755 --- a/app/Resources/icons/line-chart.svg +++ b/app/Resources/icons/line-chart.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/link.svg b/app/Resources/icons/link.svg index 3b7c8e06..e70aba7b 100755 --- a/app/Resources/icons/link.svg +++ b/app/Resources/icons/link.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/list-ordered.svg b/app/Resources/icons/list-ordered.svg index be282082..bc95fbf0 100644 --- a/app/Resources/icons/list-ordered.svg +++ b/app/Resources/icons/list-ordered.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/list-unordered.svg b/app/Resources/icons/list-unordered.svg index 41809a3a..6d4fe2e1 100644 --- a/app/Resources/icons/list-unordered.svg +++ b/app/Resources/icons/list-unordered.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/loader.svg b/app/Resources/icons/loader.svg index 55da7bdb..b3bbd916 100644 --- a/app/Resources/icons/loader.svg +++ b/app/Resources/icons/loader.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/lock-unlock.svg b/app/Resources/icons/lock-unlock.svg index 0ea4517c..fc58eead 100644 --- a/app/Resources/icons/lock-unlock.svg +++ b/app/Resources/icons/lock-unlock.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/lock.svg b/app/Resources/icons/lock.svg index a54f3e42..33fd4a7a 100644 --- a/app/Resources/icons/lock.svg +++ b/app/Resources/icons/lock.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/loop-left.svg b/app/Resources/icons/loop-left.svg new file mode 100644 index 00000000..ceddcd67 --- /dev/null +++ b/app/Resources/icons/loop-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/Resources/icons/map-pin.svg b/app/Resources/icons/map-pin.svg index 5950f056..e3d636be 100644 --- a/app/Resources/icons/map-pin.svg +++ b/app/Resources/icons/map-pin.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/markdown.svg b/app/Resources/icons/markdown.svg index ab3edd2b..c52fbbfa 100644 --- a/app/Resources/icons/markdown.svg +++ b/app/Resources/icons/markdown.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/menu.svg b/app/Resources/icons/menu.svg index 666764dc..caeaa246 100755 --- a/app/Resources/icons/menu.svg +++ b/app/Resources/icons/menu.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/mic.svg b/app/Resources/icons/mic.svg index becff50c..9ae8b850 100755 --- a/app/Resources/icons/mic.svg +++ b/app/Resources/icons/mic.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/more.svg b/app/Resources/icons/more.svg index 5f6b5dba..8d891a89 100755 --- a/app/Resources/icons/more.svg +++ b/app/Resources/icons/more.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/movie.svg b/app/Resources/icons/movie.svg index f92dd60f..4eaa280e 100755 --- a/app/Resources/icons/movie.svg +++ b/app/Resources/icons/movie.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/notification-bell.svg b/app/Resources/icons/notification-bell.svg deleted file mode 100644 index ea792a4d..00000000 --- a/app/Resources/icons/notification-bell.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/Resources/icons/notification.svg b/app/Resources/icons/notification.svg new file mode 100644 index 00000000..4e46ee6f --- /dev/null +++ b/app/Resources/icons/notification.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/Resources/icons/pages.svg b/app/Resources/icons/pages.svg index 3d28c400..689353cc 100755 --- a/app/Resources/icons/pages.svg +++ b/app/Resources/icons/pages.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/pause.svg b/app/Resources/icons/pause.svg index 81cffce1..86832243 100644 --- a/app/Resources/icons/pause.svg +++ b/app/Resources/icons/pause.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/play-circle.svg b/app/Resources/icons/play-circle.svg index 5d5f7039..4f6a4f34 100644 --- a/app/Resources/icons/play-circle.svg +++ b/app/Resources/icons/play-circle.svg @@ -1,6 +1 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/play.svg b/app/Resources/icons/play.svg index 4978d3d5..726dfb60 100644 --- a/app/Resources/icons/play.svg +++ b/app/Resources/icons/play.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/question.svg b/app/Resources/icons/question.svg index b7fd91ed..b93b2920 100755 --- a/app/Resources/icons/question.svg +++ b/app/Resources/icons/question.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/quote.svg b/app/Resources/icons/quote.svg index a83df6c4..d60624ec 100644 --- a/app/Resources/icons/quote.svg +++ b/app/Resources/icons/quote.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/refresh.svg b/app/Resources/icons/refresh.svg index 08b0dba0..7d63f939 100644 --- a/app/Resources/icons/refresh.svg +++ b/app/Resources/icons/refresh.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/repeat.svg b/app/Resources/icons/repeat.svg index c5a26047..d68cd86c 100644 --- a/app/Resources/icons/repeat.svg +++ b/app/Resources/icons/repeat.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/rocket-tilted.svg b/app/Resources/icons/rocket-tilted.svg index 627e4772..3b9bab8b 100644 --- a/app/Resources/icons/rocket-tilted.svg +++ b/app/Resources/icons/rocket-tilted.svg @@ -1,6 +1 @@ - - - - - - + diff --git a/app/Resources/icons/rss.svg b/app/Resources/icons/rss.svg index 723552d9..ffdfe81c 100755 --- a/app/Resources/icons/rss.svg +++ b/app/Resources/icons/rss.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/scales.svg b/app/Resources/icons/scales.svg index 7383e06a..65a37635 100755 --- a/app/Resources/icons/scales.svg +++ b/app/Resources/icons/scales.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/search.svg b/app/Resources/icons/search.svg index 4d61f480..1f7398f4 100644 --- a/app/Resources/icons/search.svg +++ b/app/Resources/icons/search.svg @@ -1,6 +1 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/send-plane.svg b/app/Resources/icons/send-plane.svg index 74ffbcf9..288e73c5 100644 --- a/app/Resources/icons/send-plane.svg +++ b/app/Resources/icons/send-plane.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/settings.svg b/app/Resources/icons/settings.svg index 893c92d2..81e150cf 100755 --- a/app/Resources/icons/settings.svg +++ b/app/Resources/icons/settings.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/shield-user.svg b/app/Resources/icons/shield-user.svg index 37cf8289..34088fca 100644 --- a/app/Resources/icons/shield-user.svg +++ b/app/Resources/icons/shield-user.svg @@ -1,4 +1 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/sort.svg b/app/Resources/icons/sort.svg index 51df3545..0d67ac0c 100644 --- a/app/Resources/icons/sort.svg +++ b/app/Resources/icons/sort.svg @@ -1,6 +1 @@ - - - - - - + diff --git a/app/Resources/icons/timer.svg b/app/Resources/icons/timer.svg index 21ab4767..17530985 100755 --- a/app/Resources/icons/timer.svg +++ b/app/Resources/icons/timer.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/upload-cloud.svg b/app/Resources/icons/upload-cloud.svg index b87c7581..a2974743 100755 --- a/app/Resources/icons/upload-cloud.svg +++ b/app/Resources/icons/upload-cloud.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/user-add.svg b/app/Resources/icons/user-add.svg index 2d56227f..ddaef56c 100755 --- a/app/Resources/icons/user-add.svg +++ b/app/Resources/icons/user-add.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/user-follow.svg b/app/Resources/icons/user-follow.svg index e8892f28..f4616326 100644 --- a/app/Resources/icons/user-follow.svg +++ b/app/Resources/icons/user-follow.svg @@ -1,6 +1 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/volume-high.svg b/app/Resources/icons/volume-high.svg index 0aa5be36..c4befea0 100644 --- a/app/Resources/icons/volume-high.svg +++ b/app/Resources/icons/volume-high.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/volume-low.svg b/app/Resources/icons/volume-low.svg index 6acfade5..b61ab667 100644 --- a/app/Resources/icons/volume-low.svg +++ b/app/Resources/icons/volume-low.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/volume-mute.svg b/app/Resources/icons/volume-mute.svg index 79bd55ac..f3323c1f 100644 --- a/app/Resources/icons/volume-mute.svg +++ b/app/Resources/icons/volume-mute.svg @@ -1,6 +1 @@ - - - - - - + \ No newline at end of file diff --git a/app/Resources/icons/warning.svg b/app/Resources/icons/warning.svg deleted file mode 100644 index e01de7fb..00000000 --- a/app/Resources/icons/warning.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/Views/Components/Forms/Field.php b/app/Views/Components/Forms/Field.php index fb65ed33..40d219cb 100644 --- a/app/Views/Components/Forms/Field.php +++ b/app/Views/Components/Forms/Field.php @@ -26,6 +26,7 @@ class Field extends FormComponent $labelAttributes = [ 'for' => $this->id, 'isOptional' => $this->required ? 'false' : 'true', + 'class' => '-mb-1', ]; if ($this->hint) { $labelAttributes['hint'] = $this->hint; @@ -40,16 +41,16 @@ class Field extends FormComponent unset($fieldComponentAttributes['helper']); unset($fieldComponentAttributes['hint']); - $fieldComponentAttributes['class'] = 'mb-1'; - $element = __NAMESPACE__ . '\\' . $this->as; $fieldElement = new $element($fieldComponentAttributes); return << {$this->label} - {$fieldElement->render()} {$helperText} +
    + {$fieldElement->render()} +
    HTML; } diff --git a/app/Views/Components/Forms/Input.php b/app/Views/Components/Forms/Input.php index 83712071..6ba0ffdb 100644 --- a/app/Views/Components/Forms/Input.php +++ b/app/Views/Components/Forms/Input.php @@ -10,7 +10,7 @@ class Input extends FormComponent public function render(): string { - $baseClass = 'w-full bg-elevated border-contrast rounded-lg focus:border-contrast border-3 focus:ring-accent focus-within:ring-accent ' . $this->class; + $baseClass = 'w-full border-contrast rounded-lg focus:border-contrast border-3 focus:ring-accent focus-within:ring-accent ' . $this->class; $this->attributes['class'] = $baseClass; @@ -20,6 +20,12 @@ class Input extends FormComponent $this->attributes['class'] .= ' px-3 py-2'; } + if ($this->readonly) { + $this->attributes['class'] .= ' bg-base'; + } else { + $this->attributes['class'] .= ' bg-elevated'; + } + return form_input($this->attributes, old($this->name, $this->value)); } } diff --git a/app/Views/Components/Forms/Label.php b/app/Views/Components/Forms/Label.php index 49bbac3e..1c7ef093 100644 --- a/app/Views/Components/Forms/Label.php +++ b/app/Views/Components/Forms/Label.php @@ -21,10 +21,10 @@ class Label extends Component public function render(): string { - $labelClass = 'text-sm ' . $this->attributes['class']; + $labelClass = 'text-sm font-semibold ' . $this->attributes['class']; unset($this->attributes['class']); - $optionalText = $this->isOptional ? '(' . + $optionalText = $this->isOptional ? '(' . lang('Common.optional') . ')' : ''; $hint = $this->hint === null ? '' : hint_tooltip($this->hint, 'ml-1'); diff --git a/app/Views/Components/Forms/MultiSelect.php b/app/Views/Components/Forms/MultiSelect.php index df60aa74..81450a32 100644 --- a/app/Views/Components/Forms/MultiSelect.php +++ b/app/Views/Components/Forms/MultiSelect.php @@ -37,7 +37,7 @@ class MultiSelect extends FormComponent 'data-no-choices-text' => lang('Common.forms.multiSelect.noChoicesText'), 'data-max-item-text' => lang('Common.forms.multiSelect.maxItemText'), ]; - $this->attributes['class'] .= ' bg-elevated border-3 border-contrast rounded-lg'; + $this->attributes['class'] .= ' w-full bg-elevated border-3 border-contrast rounded-lg'; $extra = array_merge($defaultAttributes, $this->attributes); return form_dropdown($this->name, $this->options, $this->selected, $extra); diff --git a/app/Views/Components/Forms/Select.php b/app/Views/Components/Forms/Select.php index 6615b2e9..0740beef 100644 --- a/app/Views/Components/Forms/Select.php +++ b/app/Views/Components/Forms/Select.php @@ -21,7 +21,7 @@ class Select extends FormComponent public function render(): string { $defaultAttributes = [ - 'class' => 'focus:border-contrast focus:ring-accent border-3 rounded-lg bg-elevated border-contrast ' . $this->class, + 'class' => 'w-full focus:border-contrast focus:ring-accent border-3 rounded-lg bg-elevated border-contrast ' . $this->class, 'data-class' => $this->class, 'data-select-text' => lang('Common.forms.multiSelect.selectText'), 'data-loading-text' => lang('Common.forms.multiSelect.loadingText'), diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php index 37edabe4..dc32143a 100644 --- a/modules/Admin/Config/Routes.php +++ b/modules/Admin/Config/Routes.php @@ -165,7 +165,7 @@ $routes->group( ]); $routes->post( '/', - 'PodcastPersonController::attemptAdd/$1', + 'PodcastPersonController::attemptCreate/$1', [ 'filter' => 'permission:podcast#.manage-persons', ], @@ -461,7 +461,7 @@ $routes->group( ]); $routes->post( '/', - 'EpisodePersonController::attemptAdd/$1/$2', + 'EpisodePersonController::attemptCreate/$1/$2', [ 'filter' => 'permission:podcast#.episodes.manage-persons', ], diff --git a/modules/Admin/Controllers/AboutController.php b/modules/Admin/Controllers/AboutController.php index b43453fc..f7cba14d 100644 --- a/modules/Admin/Controllers/AboutController.php +++ b/modules/Admin/Controllers/AboutController.php @@ -26,7 +26,7 @@ class AboutController extends BaseController 'languages' => implode(', ', config(App::class)->supportedLocales), ]; - return view('about', [ + return view('settings/about', [ 'info' => $instanceInfo, ]); } diff --git a/modules/Admin/Controllers/EpisodePersonController.php b/modules/Admin/Controllers/EpisodePersonController.php index 8b10ea60..8a6bcae5 100644 --- a/modules/Admin/Controllers/EpisodePersonController.php +++ b/modules/Admin/Controllers/EpisodePersonController.php @@ -65,7 +65,7 @@ class EpisodePersonController extends BaseController return view('episode/persons', $data); } - public function attemptAdd(): RedirectResponse + public function attemptCreate(): RedirectResponse { $rules = [ 'persons' => 'required', diff --git a/modules/Admin/Controllers/PodcastPersonController.php b/modules/Admin/Controllers/PodcastPersonController.php index 911653c1..ec02c393 100644 --- a/modules/Admin/Controllers/PodcastPersonController.php +++ b/modules/Admin/Controllers/PodcastPersonController.php @@ -52,7 +52,7 @@ class PodcastPersonController extends BaseController return view('podcast/persons', $data); } - public function attemptAdd(): RedirectResponse + public function attemptCreate(): RedirectResponse { $rules = [ 'persons' => 'required', diff --git a/modules/Admin/Language/ar/Podcast.php b/modules/Admin/Language/ar/Podcast.php index 949479d4..1404cc1a 100644 --- a/modules/Admin/Language/ar/Podcast.php +++ b/modules/Admin/Language/ar/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'أحدث الحلقات', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/ar/PodcastNavigation.php b/modules/Admin/Language/ar/PodcastNavigation.php index 1f34f48c..dc39cf23 100644 --- a/modules/Admin/Language/ar/PodcastNavigation.php +++ b/modules/Admin/Language/ar/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'المساهمون', 'contributor-list' => 'كل المساهمين', 'contributor-add' => 'إضافة مساهم', diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php index 0ef55dbf..cf39ee7a 100644 --- a/modules/Admin/Language/br/Podcast.php +++ b/modules/Admin/Language/br/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Rannoù diwezhañ', 'see_all_episodes' => 'Gwelet an holl rannoù', 'draft' => 'Brouilhed', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Krouet eo bet ar podkast gant berzh!', 'editSuccess' => 'Hizivaet eo bet ar podkast gant berzh!', diff --git a/modules/Admin/Language/br/PodcastNavigation.php b/modules/Admin/Language/br/PodcastNavigation.php index 928b6a9f..9590aea0 100644 --- a/modules/Admin/Language/br/PodcastNavigation.php +++ b/modules/Admin/Language/br/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Mareoù ar selaou', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Perzhidi, perzhiadezed', 'contributor-list' => 'An holl berzhidi ha perzhiadezed', 'contributor-add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez', diff --git a/modules/Admin/Language/ca/Podcast.php b/modules/Admin/Language/ca/Podcast.php index 514112d8..c31998b2 100644 --- a/modules/Admin/Language/ca/Podcast.php +++ b/modules/Admin/Language/ca/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Darrers episodis', 'see_all_episodes' => 'Veure tots els episodis', 'draft' => 'Esborrany', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast creat correctament.', 'editSuccess' => 'El podcast s´ha actualitzat correctament.', diff --git a/modules/Admin/Language/ca/PodcastNavigation.php b/modules/Admin/Language/ca/PodcastNavigation.php index d8cb6e3e..a30d12c7 100644 --- a/modules/Admin/Language/ca/PodcastNavigation.php +++ b/modules/Admin/Language/ca/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Períodes de temps', 'premium' => 'Prèmium', 'subscription-list' => 'Totes les subscripcions', - 'subscription-add' => 'Afegiu una subscripció', + 'subscription-create' => 'Afegiu una subscripció', 'contributors' => 'Col·laboradors', 'contributor-list' => 'Tots els col·laboradors', 'contributor-add' => 'Afegir un col·laborador', diff --git a/modules/Admin/Language/da/Podcast.php b/modules/Admin/Language/da/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/da/Podcast.php +++ b/modules/Admin/Language/da/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/da/PodcastNavigation.php b/modules/Admin/Language/da/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/da/PodcastNavigation.php +++ b/modules/Admin/Language/da/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php index c50c8df9..7fc92d32 100644 --- a/modules/Admin/Language/de/Podcast.php +++ b/modules/Admin/Language/de/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Neueste Folgen', 'see_all_episodes' => 'Alle Folgen anzeigen', 'draft' => 'Entwurf', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast erfolgreich erstellt!', 'editSuccess' => 'Der Podcast wurde erfolgreich aktualisiert!', diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php index 974a157e..0ddccc4a 100644 --- a/modules/Admin/Language/de/PodcastNavigation.php +++ b/modules/Admin/Language/de/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Zeiträume', 'premium' => 'Premium', 'subscription-list' => 'Alle Abonnements', - 'subscription-add' => 'Abonnement hinzufügen', + 'subscription-create' => 'Abonnement hinzufügen', 'contributors' => 'Mitwirkende', 'contributor-list' => 'Alle Unterstützer', 'contributor-add' => 'Mitwirkenden hinzufügen', diff --git a/modules/Admin/Language/el/Podcast.php b/modules/Admin/Language/el/Podcast.php index f1f26c73..a04effe4 100644 --- a/modules/Admin/Language/el/Podcast.php +++ b/modules/Admin/Language/el/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Τελευταία επεισόδια', 'see_all_episodes' => 'Δείτε όλα τα επεισόδια', 'draft' => 'Πρόχειρο', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Το επεισόδιο δημιουργήθηκε με επιτυχία!', 'editSuccess' => 'Το Podcast ενημερώθηκε με επιτυχία!', diff --git a/modules/Admin/Language/el/PodcastNavigation.php b/modules/Admin/Language/el/PodcastNavigation.php index 735dc9ac..3e97a3a3 100644 --- a/modules/Admin/Language/el/PodcastNavigation.php +++ b/modules/Admin/Language/el/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Χρονικές περίοδοι', 'premium' => 'Premium', 'subscription-list' => 'Όλες οι συνδρομές', - 'subscription-add' => 'Προσθέστε συνδρομή', + 'subscription-create' => 'Προσθέστε συνδρομή', 'contributors' => 'Συντελεστές', 'contributor-list' => 'Όλοι οι συντελεστές', 'contributor-add' => 'Προσθήκη συντελεστή', diff --git a/modules/Admin/Language/en/Breadcrumb.php b/modules/Admin/Language/en/Breadcrumb.php index 593322e6..8a52be1c 100644 --- a/modules/Admin/Language/en/Breadcrumb.php +++ b/modules/Admin/Language/en/Breadcrumb.php @@ -39,6 +39,7 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', diff --git a/modules/Admin/Language/en/Podcast.php b/modules/Admin/Language/en/Podcast.php index 08768f1b..5ad5ec2e 100644 --- a/modules/Admin/Language/en/Podcast.php +++ b/modules/Admin/Language/en/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', @@ -59,6 +57,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -134,7 +134,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/en/PodcastNavigation.php b/modules/Admin/Language/en/PodcastNavigation.php index a5c98b6c..ef7ce917 100644 --- a/modules/Admin/Language/en/PodcastNavigation.php +++ b/modules/Admin/Language/en/PodcastNavigation.php @@ -15,6 +15,7 @@ return [ 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -28,7 +29,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/es/Podcast.php b/modules/Admin/Language/es/Podcast.php index 24c05c1f..2fc372f4 100644 --- a/modules/Admin/Language/es/Podcast.php +++ b/modules/Admin/Language/es/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Últimos Episodios', 'see_all_episodes' => 'Mostrar todos los episodios', 'draft' => 'Borrador', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => '¡El Podcast ha sido creado con éxito!', 'editSuccess' => 'El Podcast se ha actualizado correctamente!', diff --git a/modules/Admin/Language/es/PodcastNavigation.php b/modules/Admin/Language/es/PodcastNavigation.php index a9accfab..8f9ee8d1 100644 --- a/modules/Admin/Language/es/PodcastNavigation.php +++ b/modules/Admin/Language/es/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Periodos de tiempo', 'premium' => 'Premium', 'subscription-list' => 'Todas las suscripciones', - 'subscription-add' => 'Añadir suscripción', + 'subscription-create' => 'Añadir suscripción', 'contributors' => 'Colaboradores', 'contributor-list' => 'Todos los colaboradores', 'contributor-add' => 'Añadir colaborador', diff --git a/modules/Admin/Language/fa/PodcastNavigation.php b/modules/Admin/Language/fa/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/fa/PodcastNavigation.php +++ b/modules/Admin/Language/fa/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php index fd8ce6db..2a3c5e4c 100644 --- a/modules/Admin/Language/fr/Podcast.php +++ b/modules/Admin/Language/fr/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Derniers épisodes', 'see_all_episodes' => 'Voir tous les épisodes', 'draft' => 'Brouillon', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Le podcast a été créé avec succès !', 'editSuccess' => 'Le podcast a bien été mis à jour !', diff --git a/modules/Admin/Language/fr/PodcastNavigation.php b/modules/Admin/Language/fr/PodcastNavigation.php index 9edb8e80..8043fc9d 100644 --- a/modules/Admin/Language/fr/PodcastNavigation.php +++ b/modules/Admin/Language/fr/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Périodes', 'premium' => 'Premium', 'subscription-list' => 'Tous les abonnements', - 'subscription-add' => 'Ajouter un abonnement', + 'subscription-create' => 'Ajouter un abonnement', 'contributors' => 'Contributeurs', 'contributor-list' => 'Tous les contributeurs', 'contributor-add' => 'Ajouter un contributeur', diff --git a/modules/Admin/Language/fr2/Podcast.php b/modules/Admin/Language/fr2/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/fr2/Podcast.php +++ b/modules/Admin/Language/fr2/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/fr2/PodcastNavigation.php b/modules/Admin/Language/fr2/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/fr2/PodcastNavigation.php +++ b/modules/Admin/Language/fr2/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/fr_CA/Podcast.php b/modules/Admin/Language/fr_CA/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/fr_CA/Podcast.php +++ b/modules/Admin/Language/fr_CA/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/fr_CA/PodcastNavigation.php b/modules/Admin/Language/fr_CA/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/fr_CA/PodcastNavigation.php +++ b/modules/Admin/Language/fr_CA/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/fr_trad/Podcast.php b/modules/Admin/Language/fr_trad/Podcast.php index 2d46aff5..63c5b613 100644 --- a/modules/Admin/Language/fr_trad/Podcast.php +++ b/modules/Admin/Language/fr_trad/Podcast.php @@ -47,8 +47,6 @@ return [ one {# episode was} other {# episodes were} } added to the podcast!', - 'podcastFeedUpToDate' => 'Podcast is already up to date.', - 'podcastNotImported' => 'Podcast could not be updated as it was not imported.', 'publishError' => 'This podcast is either already published or scheduled for publication.', 'publishEditError' => 'This podcast is not scheduled for publication.', 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', diff --git a/modules/Admin/Language/fr_trad/PodcastNavigation.php b/modules/Admin/Language/fr_trad/PodcastNavigation.php index b4d7ddc0..5bf37b42 100644 --- a/modules/Admin/Language/fr_trad/PodcastNavigation.php +++ b/modules/Admin/Language/fr_trad/PodcastNavigation.php @@ -27,7 +27,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/gd/Podcast.php b/modules/Admin/Language/gd/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/gd/Podcast.php +++ b/modules/Admin/Language/gd/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/gd/PodcastNavigation.php b/modules/Admin/Language/gd/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/gd/PodcastNavigation.php +++ b/modules/Admin/Language/gd/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php index 5cc869da..6abc8e1d 100644 --- a/modules/Admin/Language/gl/Podcast.php +++ b/modules/Admin/Language/gl/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Últimos episodios', 'see_all_episodes' => 'Ver tódolos episodios', 'draft' => 'Borrador', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast creado correctamente!', 'editSuccess' => 'Episodio actualizado correctamente!', diff --git a/modules/Admin/Language/gl/PodcastNavigation.php b/modules/Admin/Language/gl/PodcastNavigation.php index c5adbf2b..4be04cdf 100644 --- a/modules/Admin/Language/gl/PodcastNavigation.php +++ b/modules/Admin/Language/gl/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Período de tempo', 'premium' => 'Premium', 'subscription-list' => 'Todas as subscricións', - 'subscription-add' => 'Engadir unha subscrición', + 'subscription-create' => 'Engadir unha subscrición', 'contributors' => 'Contribúen', 'contributor-list' => 'Todas as contribucións', 'contributor-add' => 'Engadir colaboración', diff --git a/modules/Admin/Language/id/Podcast.php b/modules/Admin/Language/id/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/id/Podcast.php +++ b/modules/Admin/Language/id/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/id/PodcastNavigation.php b/modules/Admin/Language/id/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/id/PodcastNavigation.php +++ b/modules/Admin/Language/id/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/it/Podcast.php b/modules/Admin/Language/it/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/it/Podcast.php +++ b/modules/Admin/Language/it/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/it/PodcastNavigation.php b/modules/Admin/Language/it/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/it/PodcastNavigation.php +++ b/modules/Admin/Language/it/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/ja/Podcast.php b/modules/Admin/Language/ja/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/ja/Podcast.php +++ b/modules/Admin/Language/ja/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/ja/PodcastNavigation.php b/modules/Admin/Language/ja/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/ja/PodcastNavigation.php +++ b/modules/Admin/Language/ja/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/ko/Podcast.php b/modules/Admin/Language/ko/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/ko/Podcast.php +++ b/modules/Admin/Language/ko/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/ko/PodcastNavigation.php b/modules/Admin/Language/ko/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/ko/PodcastNavigation.php +++ b/modules/Admin/Language/ko/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/nl/Podcast.php b/modules/Admin/Language/nl/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/nl/Podcast.php +++ b/modules/Admin/Language/nl/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/nl/PodcastNavigation.php b/modules/Admin/Language/nl/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/nl/PodcastNavigation.php +++ b/modules/Admin/Language/nl/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/nn-NO/PodcastNavigation.php b/modules/Admin/Language/nn-NO/PodcastNavigation.php index 78a25745..cbbfedaa 100644 --- a/modules/Admin/Language/nn-NO/PodcastNavigation.php +++ b/modules/Admin/Language/nn-NO/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Tidsperiodar', 'premium' => 'Premium', 'subscription-list' => 'Alle abonnement', - 'subscription-add' => 'Legg til abonnement', + 'subscription-create' => 'Legg til abonnement', 'contributors' => 'Bidragsytarar', 'contributor-list' => 'Alle bidragsytarane', 'contributor-add' => 'Legg til bidragsytar', diff --git a/modules/Admin/Language/oc/Podcast.php b/modules/Admin/Language/oc/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/oc/Podcast.php +++ b/modules/Admin/Language/oc/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/oc/PodcastNavigation.php b/modules/Admin/Language/oc/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/oc/PodcastNavigation.php +++ b/modules/Admin/Language/oc/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/pl/Podcast.php b/modules/Admin/Language/pl/Podcast.php index d1d1b7c4..0a617a2f 100644 --- a/modules/Admin/Language/pl/Podcast.php +++ b/modules/Admin/Language/pl/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Najnowsze odcinki', 'see_all_episodes' => 'Zobacz wszystkie odcinki', 'draft' => 'Wersja robocza', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast został pomyślnie utworzony!', 'editSuccess' => 'Podcast został pomyślnie zaktualizowany!', diff --git a/modules/Admin/Language/pl/PodcastNavigation.php b/modules/Admin/Language/pl/PodcastNavigation.php index fe8d119b..6226fc2a 100644 --- a/modules/Admin/Language/pl/PodcastNavigation.php +++ b/modules/Admin/Language/pl/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Okresy czasu', 'premium' => 'Premium', 'subscription-list' => 'Wszystkie subskrypcje', - 'subscription-add' => 'Dodaj subskrypcję', + 'subscription-create' => 'Dodaj subskrypcję', 'contributors' => 'Kontrybutorzy', 'contributor-list' => 'Wszyscy kontrybutorzy', 'contributor-add' => 'Dodaj kontrybutora', diff --git a/modules/Admin/Language/pt-BR/PodcastNavigation.php b/modules/Admin/Language/pt-BR/PodcastNavigation.php index 7841e71a..94d7a7a4 100644 --- a/modules/Admin/Language/pt-BR/PodcastNavigation.php +++ b/modules/Admin/Language/pt-BR/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Períodos de tempo', 'premium' => 'Premium', 'subscription-list' => 'Todas as assinaturas', - 'subscription-add' => 'Adicionar assinatura', + 'subscription-create' => 'Adicionar assinatura', 'contributors' => 'Contribuidores', 'contributor-list' => 'Todos os contribuidores', 'contributor-add' => 'Adicionar contribuidor', diff --git a/modules/Admin/Language/pt/Podcast.php b/modules/Admin/Language/pt/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/pt/Podcast.php +++ b/modules/Admin/Language/pt/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/pt/PodcastNavigation.php b/modules/Admin/Language/pt/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/pt/PodcastNavigation.php +++ b/modules/Admin/Language/pt/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/ro/Podcast.php b/modules/Admin/Language/ro/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/ro/Podcast.php +++ b/modules/Admin/Language/ro/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/ro/PodcastNavigation.php b/modules/Admin/Language/ro/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/ro/PodcastNavigation.php +++ b/modules/Admin/Language/ro/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/ru/Podcast.php b/modules/Admin/Language/ru/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/ru/Podcast.php +++ b/modules/Admin/Language/ru/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/ru/PodcastNavigation.php b/modules/Admin/Language/ru/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/ru/PodcastNavigation.php +++ b/modules/Admin/Language/ru/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php index bd1979ed..1db0f269 100644 --- a/modules/Admin/Language/sk/Podcast.php +++ b/modules/Admin/Language/sk/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Posledné časti', 'see_all_episodes' => 'Pozrieť všetky časti', 'draft' => 'Koncept', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast úspešne vytvorený!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/sk/PodcastNavigation.php b/modules/Admin/Language/sk/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/sk/PodcastNavigation.php +++ b/modules/Admin/Language/sk/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/sr_Latn/Podcast.php b/modules/Admin/Language/sr_Latn/Podcast.php index d11c96fa..1b08fcf5 100644 --- a/modules/Admin/Language/sr_Latn/Podcast.php +++ b/modules/Admin/Language/sr_Latn/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Najnovije epizode', 'see_all_episodes' => 'Prikaži sve epizode', 'draft' => 'Nacrt', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podkast uspešno kreiran!', 'editSuccess' => 'Podkast je uspešno ažuriran!', diff --git a/modules/Admin/Language/sr_Latn/PodcastNavigation.php b/modules/Admin/Language/sr_Latn/PodcastNavigation.php index 2cee8017..9ea142e2 100644 --- a/modules/Admin/Language/sr_Latn/PodcastNavigation.php +++ b/modules/Admin/Language/sr_Latn/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/sv/Podcast.php b/modules/Admin/Language/sv/Podcast.php index fa2c50d1..32505fbc 100644 --- a/modules/Admin/Language/sv/Podcast.php +++ b/modules/Admin/Language/sv/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Senaste avsnitt', 'see_all_episodes' => 'Se alla avsnitt', 'draft' => 'Utkast', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast har skapats!', 'editSuccess' => 'Podcasten har uppdaterats!', diff --git a/modules/Admin/Language/sv/PodcastNavigation.php b/modules/Admin/Language/sv/PodcastNavigation.php index 4774ba9e..848c577c 100644 --- a/modules/Admin/Language/sv/PodcastNavigation.php +++ b/modules/Admin/Language/sv/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Tidsperioder', 'premium' => 'Premium', 'subscription-list' => 'Alla prenumerationer', - 'subscription-add' => 'Lägg till en prenumeration', + 'subscription-create' => 'Lägg till en prenumeration', 'contributors' => 'Bidragsgivare', 'contributor-list' => 'Alla bidragsgivare', 'contributor-add' => 'Lägg till bidragsgivare', diff --git a/modules/Admin/Language/uk/Podcast.php b/modules/Admin/Language/uk/Podcast.php index 08768f1b..ab84e4ff 100644 --- a/modules/Admin/Language/uk/Podcast.php +++ b/modules/Admin/Language/uk/Podcast.php @@ -26,8 +26,6 @@ return [ 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', 'draft' => 'Draft', - 'sync_feed' => 'Synchronize feed', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', diff --git a/modules/Admin/Language/uk/PodcastNavigation.php b/modules/Admin/Language/uk/PodcastNavigation.php index a5c98b6c..efc00e5b 100644 --- a/modules/Admin/Language/uk/PodcastNavigation.php +++ b/modules/Admin/Language/uk/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => 'Time periods', 'premium' => 'Premium', 'subscription-list' => 'All subscriptions', - 'subscription-add' => 'Add subscription', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', diff --git a/modules/Admin/Language/zh-Hans/PodcastNavigation.php b/modules/Admin/Language/zh-Hans/PodcastNavigation.php index 9a50d223..cd1913a0 100644 --- a/modules/Admin/Language/zh-Hans/PodcastNavigation.php +++ b/modules/Admin/Language/zh-Hans/PodcastNavigation.php @@ -28,7 +28,7 @@ return [ 'podcast-analytics-time-periods' => '时间段', 'premium' => '高级版', 'subscription-list' => '所有订阅', - 'subscription-add' => '添加订阅', + 'subscription-create' => '添加订阅', 'contributors' => '贡献者', 'contributor-list' => '所有贡献者', 'contributor-add' => '添加贡献者', diff --git a/modules/Auth/Config/Routes.php b/modules/Auth/Config/Routes.php index 0bdc30ca..ff718079 100644 --- a/modules/Auth/Config/Routes.php +++ b/modules/Auth/Config/Routes.php @@ -90,7 +90,7 @@ $routes->group( ]); $routes->post( 'add', - 'ContributorController::attemptAdd/$1', + 'ContributorController::attemptCreate/$1', [ 'filter' => 'permission:podcast#.manage-contributors', ], diff --git a/modules/Auth/Controllers/ContributorController.php b/modules/Auth/Controllers/ContributorController.php index d976bb41..84005c0b 100644 --- a/modules/Auth/Controllers/ContributorController.php +++ b/modules/Auth/Controllers/ContributorController.php @@ -76,7 +76,7 @@ class ContributorController extends BaseController return view('contributor/view', $data); } - public function add(): string + public function create(): string { helper('form'); @@ -110,10 +110,10 @@ class ContributorController extends BaseController replace_breadcrumb_params([ 0 => $this->podcast->at_handle, ]); - return view('contributor/add', $data); + return view('contributor/create', $data); } - public function attemptAdd(): RedirectResponse + public function attemptCreate(): RedirectResponse { $user = (new UserModel())->find((int) $this->request->getPost('user')); diff --git a/modules/Fediverse/Config/Routes.php b/modules/Fediverse/Config/Routes.php index 7d5770c8..b4c469fc 100644 --- a/modules/Fediverse/Config/Routes.php +++ b/modules/Fediverse/Config/Routes.php @@ -60,7 +60,7 @@ $routes->group('', [ ]); }); // Post - $routes->post('posts/new', 'PostController::attemptCreate/$1', [ + $routes->post('posts/create', 'PostController::attemptCreate/$1', [ 'as' => 'post-attempt-create', ]); $routes->get('posts/(:uuid)', 'PostController::index/$1', [ diff --git a/modules/PodcastImport/Config/Routes.php b/modules/PodcastImport/Config/Routes.php index 28f349d3..b99c885f 100644 --- a/modules/PodcastImport/Config/Routes.php +++ b/modules/PodcastImport/Config/Routes.php @@ -38,7 +38,11 @@ $routes->group( 'as' => 'podcast-imports', 'filter' => 'permission:podcast#.manage-import', ]); - $routes->get('sync-feed', 'PodcastImportController::syncImport/$1', [ + $routes->get('sync-feeds', 'PodcastImportController::syncImport/$1', [ + 'as' => 'podcast-imports-sync', + 'filter' => 'permission:podcast#.manage-import', + ]); + $routes->post('sync-feeds', 'PodcastImportController::syncImportAttempt/$1', [ 'as' => 'podcast-imports-sync', 'filter' => 'permission:podcast#.manage-import', ]); diff --git a/modules/PodcastImport/Controllers/PodcastImportController.php b/modules/PodcastImport/Controllers/PodcastImportController.php index fc63b143..3eb0f652 100644 --- a/modules/PodcastImport/Controllers/PodcastImportController.php +++ b/modules/PodcastImport/Controllers/PodcastImportController.php @@ -104,22 +104,45 @@ class PodcastImportController extends BaseController ->with('message', lang('PodcastImport.messages.importTaskQueued')); } - public function syncImport(int $podcastId): RedirectResponse + public function syncImport(int $podcastId): string { if (! ($podcast = (new PodcastModel())->getPodcastById($podcastId)) instanceof Podcast) { throw PageNotFoundException::forPageNotFound(); } - if ($podcast->imported_feed_url === null) { + helper('form'); + + replace_breadcrumb_params([ + 0 => $podcast->at_handle, + ]); + return view('import/podcast_sync', [ + 'podcast' => $podcast, + ]); + } + + public function syncImportAttempt(int $podcastId): RedirectResponse + { + if (! ($podcast = (new PodcastModel())->getPodcastById($podcastId)) instanceof Podcast) { + throw PageNotFoundException::forPageNotFound(); + } + + $rules = [ + 'feed_url' => 'valid_url_strict', + ]; + + if (! $this->validate($rules)) { return redirect() ->back() - ->with('error', lang('PodcastImport.messages.podcastNotImported')); + ->withInput() + ->with('errors', $this->validator->getErrors()); } + $validData = $this->validator->getValidated(); + // create update task in podcastImport $importTask = new PodcastImportTask([ 'handle' => $podcast->handle, - 'feed_url' => $podcast->imported_feed_url, + 'feed_url' => $validData['feed_url'], 'language' => $podcast->language_code, 'category' => $podcast->category_id, 'status' => TaskStatus::Queued, diff --git a/modules/PodcastImport/Language/ar/PodcastImport.php b/modules/PodcastImport/Language/ar/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/ar/PodcastImport.php +++ b/modules/PodcastImport/Language/ar/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/br/PodcastImport.php b/modules/PodcastImport/Language/br/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/br/PodcastImport.php +++ b/modules/PodcastImport/Language/br/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/ca/PodcastImport.php b/modules/PodcastImport/Language/ca/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/ca/PodcastImport.php +++ b/modules/PodcastImport/Language/ca/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/da/PodcastImport.php b/modules/PodcastImport/Language/da/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/da/PodcastImport.php +++ b/modules/PodcastImport/Language/da/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/de/PodcastImport.php b/modules/PodcastImport/Language/de/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/de/PodcastImport.php +++ b/modules/PodcastImport/Language/de/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/el/PodcastImport.php b/modules/PodcastImport/Language/el/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/el/PodcastImport.php +++ b/modules/PodcastImport/Language/el/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/en/PodcastImport.php b/modules/PodcastImport/Language/en/PodcastImport.php index e7503eef..8bf494d3 100644 --- a/modules/PodcastImport/Language/en/PodcastImport.php +++ b/modules/PodcastImport/Language/en/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', @@ -55,7 +61,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/es/PodcastImport.php b/modules/PodcastImport/Language/es/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/es/PodcastImport.php +++ b/modules/PodcastImport/Language/es/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/fa/PodcastImport.php b/modules/PodcastImport/Language/fa/PodcastImport.php index 34c55dc9..ac6779ab 100644 --- a/modules/PodcastImport/Language/fa/PodcastImport.php +++ b/modules/PodcastImport/Language/fa/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'وظیفهٔ درون‌ریزی صف شد. به زودی دوباره انجام خواهد شد!', 'deleted' => 'وظیفهٔ درون‌ریزی با موفّقیت حذف شد!', 'importTaskQueued' => 'وظیفه‌ای جدید صف شد. درون‌ریزی به زودی آغاز خواهد شد!', - 'podcastNotImported' => 'از آن‌جا که پادکست درون‌ریزی نشده، قابل هم‌گام سازی نیست.', 'syncTaskQueued' => 'وظیفهٔ درون‌ریزی جدیدی صف شد. هم‌گام سازی به زودی آغاز خواهد شد!', ], ]; diff --git a/modules/PodcastImport/Language/fr/PodcastImport.php b/modules/PodcastImport/Language/fr/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/fr/PodcastImport.php +++ b/modules/PodcastImport/Language/fr/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/fr2/PodcastImport.php b/modules/PodcastImport/Language/fr2/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/fr2/PodcastImport.php +++ b/modules/PodcastImport/Language/fr2/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/fr_CA/PodcastImport.php b/modules/PodcastImport/Language/fr_CA/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/fr_CA/PodcastImport.php +++ b/modules/PodcastImport/Language/fr_CA/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/gd/PodcastImport.php b/modules/PodcastImport/Language/gd/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/gd/PodcastImport.php +++ b/modules/PodcastImport/Language/gd/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/gl/PodcastImport.php b/modules/PodcastImport/Language/gl/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/gl/PodcastImport.php +++ b/modules/PodcastImport/Language/gl/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/id/PodcastImport.php b/modules/PodcastImport/Language/id/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/id/PodcastImport.php +++ b/modules/PodcastImport/Language/id/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/it/PodcastImport.php b/modules/PodcastImport/Language/it/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/it/PodcastImport.php +++ b/modules/PodcastImport/Language/it/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/ja/PodcastImport.php b/modules/PodcastImport/Language/ja/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/ja/PodcastImport.php +++ b/modules/PodcastImport/Language/ja/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/ko/PodcastImport.php b/modules/PodcastImport/Language/ko/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/ko/PodcastImport.php +++ b/modules/PodcastImport/Language/ko/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/nl/PodcastImport.php b/modules/PodcastImport/Language/nl/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/nl/PodcastImport.php +++ b/modules/PodcastImport/Language/nl/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/nn-NO/PodcastImport.php b/modules/PodcastImport/Language/nn-NO/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/nn-NO/PodcastImport.php +++ b/modules/PodcastImport/Language/nn-NO/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/oc/PodcastImport.php b/modules/PodcastImport/Language/oc/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/oc/PodcastImport.php +++ b/modules/PodcastImport/Language/oc/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/pl/PodcastImport.php b/modules/PodcastImport/Language/pl/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/pl/PodcastImport.php +++ b/modules/PodcastImport/Language/pl/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/pt-BR/PodcastImport.php b/modules/PodcastImport/Language/pt-BR/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/pt-BR/PodcastImport.php +++ b/modules/PodcastImport/Language/pt-BR/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/pt/PodcastImport.php b/modules/PodcastImport/Language/pt/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/pt/PodcastImport.php +++ b/modules/PodcastImport/Language/pt/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/ro/PodcastImport.php b/modules/PodcastImport/Language/ro/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/ro/PodcastImport.php +++ b/modules/PodcastImport/Language/ro/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/ru/PodcastImport.php b/modules/PodcastImport/Language/ru/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/ru/PodcastImport.php +++ b/modules/PodcastImport/Language/ru/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/sk/PodcastImport.php b/modules/PodcastImport/Language/sk/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/sk/PodcastImport.php +++ b/modules/PodcastImport/Language/sk/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/sr_Latn/PodcastImport.php b/modules/PodcastImport/Language/sr_Latn/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/sr_Latn/PodcastImport.php +++ b/modules/PodcastImport/Language/sr_Latn/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/sv/PodcastImport.php b/modules/PodcastImport/Language/sv/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/sv/PodcastImport.php +++ b/modules/PodcastImport/Language/sv/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/uk/PodcastImport.php b/modules/PodcastImport/Language/uk/PodcastImport.php index e7503eef..3708fb06 100644 --- a/modules/PodcastImport/Language/uk/PodcastImport.php +++ b/modules/PodcastImport/Language/uk/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => 'Import task has been queued, it will be retried shortly!', 'deleted' => 'Import task has been successfully deleted!', 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'podcastNotImported' => 'Podcast cannot be synched as it was not imported.', 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', ], ]; diff --git a/modules/PodcastImport/Language/zh-Hans/PodcastImport.php b/modules/PodcastImport/Language/zh-Hans/PodcastImport.php index bc46c816..7572a396 100644 --- a/modules/PodcastImport/Language/zh-Hans/PodcastImport.php +++ b/modules/PodcastImport/Language/zh-Hans/PodcastImport.php @@ -55,7 +55,6 @@ return [ 'retried' => '导入任务已排队,稍后将重试!', 'deleted' => '导入任务已成功删除!', 'importTaskQueued' => '新任务已排队,导入即将开始!', - 'podcastNotImported' => '播客无法同步,因为未导入。', 'syncTaskQueued' => '新的导入任务已排队,即将开始同步!', ], ]; diff --git a/modules/PremiumPodcasts/Config/Routes.php b/modules/PremiumPodcasts/Config/Routes.php index 1da50e43..3b98b09b 100644 --- a/modules/PremiumPodcasts/Config/Routes.php +++ b/modules/PremiumPodcasts/Config/Routes.php @@ -24,13 +24,13 @@ $routes->group( 'as' => 'subscription-list', 'filter' => 'permission:podcast#.manage-subscriptions', ]); - $routes->get('add', 'SubscriptionController::add/$1', [ - 'as' => 'subscription-add', + $routes->get('new', 'SubscriptionController::create/$1', [ + 'as' => 'subscription-create', 'filter' => 'permission:podcast#.manage-subscriptions', ]); $routes->post( - 'add', - 'SubscriptionController::attemptAdd/$1', + 'new', + 'SubscriptionController::attemptCreate/$1', [ 'filter' => 'permission:podcast#.manage-subscriptions', ], diff --git a/modules/PremiumPodcasts/Controllers/SubscriptionController.php b/modules/PremiumPodcasts/Controllers/SubscriptionController.php index df6726ca..afece7fd 100644 --- a/modules/PremiumPodcasts/Controllers/SubscriptionController.php +++ b/modules/PremiumPodcasts/Controllers/SubscriptionController.php @@ -116,7 +116,7 @@ class SubscriptionController extends BaseController return view('subscription/view', $data); } - public function add(): string + public function create(): string { helper('form'); @@ -127,10 +127,10 @@ class SubscriptionController extends BaseController replace_breadcrumb_params([ 0 => $this->podcast->at_handle, ]); - return view('subscription/add', $data); + return view('subscription/create', $data); } - public function attemptAdd(): RedirectResponse + public function attemptCreate(): RedirectResponse { helper('text'); diff --git a/modules/PremiumPodcasts/Language/ar/Subscription.php b/modules/PremiumPodcasts/Language/ar/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/ar/Subscription.php +++ b/modules/PremiumPodcasts/Language/ar/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/br/Subscription.php b/modules/PremiumPodcasts/Language/br/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/br/Subscription.php +++ b/modules/PremiumPodcasts/Language/br/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/ca/Subscription.php b/modules/PremiumPodcasts/Language/ca/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/ca/Subscription.php +++ b/modules/PremiumPodcasts/Language/ca/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/da/Subscription.php b/modules/PremiumPodcasts/Language/da/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/da/Subscription.php +++ b/modules/PremiumPodcasts/Language/da/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/el/Subscription.php b/modules/PremiumPodcasts/Language/el/Subscription.php index af4ae3db..a8f8f923 100644 --- a/modules/PremiumPodcasts/Language/el/Subscription.php +++ b/modules/PremiumPodcasts/Language/el/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Ημερομηνία λήξης', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/en/Subscription.php b/modules/PremiumPodcasts/Language/en/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/en/Subscription.php +++ b/modules/PremiumPodcasts/Language/en/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/fa/Subscription.php b/modules/PremiumPodcasts/Language/fa/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/fa/Subscription.php +++ b/modules/PremiumPodcasts/Language/fa/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/fr2/Subscription.php b/modules/PremiumPodcasts/Language/fr2/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/fr2/Subscription.php +++ b/modules/PremiumPodcasts/Language/fr2/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/fr_CA/Subscription.php b/modules/PremiumPodcasts/Language/fr_CA/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/fr_CA/Subscription.php +++ b/modules/PremiumPodcasts/Language/fr_CA/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/fr_trad/Subscription.php b/modules/PremiumPodcasts/Language/fr_trad/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/fr_trad/Subscription.php +++ b/modules/PremiumPodcasts/Language/fr_trad/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/gl/Subscription.php b/modules/PremiumPodcasts/Language/gl/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/gl/Subscription.php +++ b/modules/PremiumPodcasts/Language/gl/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/id/Subscription.php b/modules/PremiumPodcasts/Language/id/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/id/Subscription.php +++ b/modules/PremiumPodcasts/Language/id/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/it/Subscription.php b/modules/PremiumPodcasts/Language/it/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/it/Subscription.php +++ b/modules/PremiumPodcasts/Language/it/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/ja/Subscription.php b/modules/PremiumPodcasts/Language/ja/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/ja/Subscription.php +++ b/modules/PremiumPodcasts/Language/ja/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/ko/Subscription.php b/modules/PremiumPodcasts/Language/ko/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/ko/Subscription.php +++ b/modules/PremiumPodcasts/Language/ko/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php index 41d2e89c..f08fe770 100644 --- a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php +++ b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/oc/Subscription.php b/modules/PremiumPodcasts/Language/oc/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/oc/Subscription.php +++ b/modules/PremiumPodcasts/Language/oc/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/pt-BR/Subscription.php b/modules/PremiumPodcasts/Language/pt-BR/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/pt-BR/Subscription.php +++ b/modules/PremiumPodcasts/Language/pt-BR/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/pt/Subscription.php b/modules/PremiumPodcasts/Language/pt/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/pt/Subscription.php +++ b/modules/PremiumPodcasts/Language/pt/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/ru/Subscription.php b/modules/PremiumPodcasts/Language/ru/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/ru/Subscription.php +++ b/modules/PremiumPodcasts/Language/ru/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/sk/Subscription.php b/modules/PremiumPodcasts/Language/sk/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/sk/Subscription.php +++ b/modules/PremiumPodcasts/Language/sk/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php b/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php +++ b/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/uk/Subscription.php b/modules/PremiumPodcasts/Language/uk/Subscription.php index f8af256f..e83f0cb2 100644 --- a/modules/PremiumPodcasts/Language/uk/Subscription.php +++ b/modules/PremiumPodcasts/Language/uk/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Expiration date', 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_add' => 'Add subscription', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edit subscription', ], 'form_link_add' => [ diff --git a/themes/cp_admin/_partials/_nav_header.php b/themes/cp_admin/_partials/_nav_header.php index 59c92b27..7acb9e45 100644 --- a/themes/cp_admin/_partials/_nav_header.php +++ b/themes/cp_admin/_partials/_nav_header.php @@ -21,7 +21,7 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?>
    + endSection() ?> - section('content') ?> include('import/_queue_table'); ?> diff --git a/themes/cp_admin/import/podcast_sync.php b/themes/cp_admin/import/podcast_sync.php new file mode 100644 index 00000000..21470707 --- /dev/null +++ b/themes/cp_admin/import/podcast_sync.php @@ -0,0 +1,24 @@ +extend('_layout') ?> + +section('title') ?> + +endSection() ?> + +section('pageTitle') ?> + +endSection() ?> + +section('content') ?> + + + + + + +endSection() ?> diff --git a/themes/cp_admin/podcast/_sidebar.php b/themes/cp_admin/podcast/_sidebar.php index 2895ab47..b0b02291 100644 --- a/themes/cp_admin/podcast/_sidebar.php +++ b/themes/cp_admin/podcast/_sidebar.php @@ -3,7 +3,7 @@ $podcastNavigation = [ 'dashboard' => [ 'icon' => 'dashboard', - 'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports'], + 'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports', 'podcast-imports-sync'], ], 'episodes' => [ 'icon' => 'play-circle', diff --git a/themes/cp_admin/podcast/create.php b/themes/cp_admin/podcast/create.php index 330f9426..4615021e 100644 --- a/themes/cp_admin/podcast/create.php +++ b/themes/cp_admin/podcast/create.php @@ -29,26 +29,11 @@ required="true" accept=".jpg,.jpeg,.png" /> - - -
    - -
    - - -
    -
    - + + +
    + +
    + + +
    +
    + + +
    + @@ -201,8 +206,7 @@ + title="" > - + + + + + + + + + - - - - - - - - - - diff --git a/themes/cp_admin/podcast/edit.php b/themes/cp_admin/podcast/edit.php index e8d12775..9afbf98e 100644 --- a/themes/cp_admin/podcast/edit.php +++ b/themes/cp_admin/podcast/edit.php @@ -49,17 +49,9 @@ type="file" accept=".jpg,.jpeg,.png" /> - - @@ -89,6 +81,26 @@ + + +
    + +
    + + +
    +
    + + + +
    + @@ -235,26 +247,14 @@ hint="" content="custom_rss_string) ?>" /> - + /> -imported_feed_url !== null): ?> -
    - - -
    - - - -
    - - diff --git a/themes/cp_admin/about.php b/themes/cp_admin/settings/about.php similarity index 100% rename from themes/cp_admin/about.php rename to themes/cp_admin/settings/about.php diff --git a/themes/cp_admin/subscription/add.php b/themes/cp_admin/subscription/create.php similarity index 82% rename from themes/cp_admin/subscription/add.php rename to themes/cp_admin/subscription/create.php index 0cd956bf..19fbd198 100644 --- a/themes/cp_admin/subscription/add.php +++ b/themes/cp_admin/subscription/create.php @@ -11,7 +11,7 @@ section('content') ?> -
    + @@ -28,7 +28,7 @@ hint="" /> - + diff --git a/themes/cp_admin/subscription/list.php b/themes/cp_admin/subscription/list.php index 67ae8533..fdd50a5d 100644 --- a/themes/cp_admin/subscription/list.php +++ b/themes/cp_admin/subscription/list.php @@ -9,7 +9,7 @@ endSection() ?> section('headerRight') ?> - + endSection() ?> diff --git a/themes/cp_app/_admin_navbar.php b/themes/cp_app/_admin_navbar.php index 16d28933..771aae9f 100644 --- a/themes/cp_app/_admin_navbar.php +++ b/themes/cp_app/_admin_navbar.php @@ -15,7 +15,7 @@ $userPodcasts = get_podcasts_user_can_interact_with(auth()->user()); ?>
    diff --git a/themes/cp_admin/podcast/persons.php b/themes/cp_admin/podcast/persons.php index b87bcccb..6d66001d 100644 --- a/themes/cp_admin/podcast/persons.php +++ b/themes/cp_admin/podcast/persons.php @@ -31,7 +31,7 @@ options="" selected="" required="true" /> - + + /> From f4ffa30ec4341f43e22b1f983781ad04c956aa25 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 15 Nov 2023 14:24:08 +0000 Subject: [PATCH 240/477] fix(admin): remove episode title truncation + display description in two lines in episode list fixes #386 --- themes/cp_admin/episode/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/themes/cp_admin/episode/list.php b/themes/cp_admin/episode/list.php index 2461c18b..7842da15 100644 --- a/themes/cp_admin/episode/list.php +++ b/themes/cp_admin/episode/list.php @@ -47,8 +47,8 @@ data_table( $premiumBadge = ''; } - return '
    ' . - '
    ' . + return '
    ' . + '
    ' . '
    '; }, From 3d5fc14d5e5a66effc9baad2c2a203f65f03c12c Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 15 Nov 2023 16:17:43 +0000 Subject: [PATCH 241/477] build: upgrade CI4 + php and js dependencies to latest closes #396 --- .gitignore | 1 + app/Config/Boot/development.php | 2 + app/Config/Boot/production.php | 2 + app/Config/Boot/testing.php | 6 + app/Config/Filters.php | 9 +- app/Config/Migrations.php | 4 +- app/Config/Routes.php | 3 + app/Config/View.php | 10 +- app/Controllers/BaseController.php | 4 +- app/Controllers/EpisodeAudioController.php | 2 +- app/Controllers/PostController.php | 3 +- app/Database/Seeds/PlatformSeeder.php | 2 +- app/Helpers/rss_helper.php | 2 +- app/Libraries/ViewComponents/Component.php | 2 +- .../ViewComponents/ComponentRenderer.php | 2 +- app/Libraries/ViewThemes/Theme.php | 4 +- app/Libraries/Vite/Vite.php | 25 +- app/Models/EpisodeCommentModel.php | 15 +- app/Models/LikeModel.php | 11 +- app/Views/Components/Forms/Select.php | 2 +- app/Views/Components/IconButton.php | 2 +- app/Views/errors/html/error_exception.php | 7 +- composer.json | 18 +- composer.lock | 349 ++- modules/Admin/Controllers/BaseController.php | 2 +- modules/Auth/Config/AuthToken.php | 57 + package.json | 62 +- phpstan.neon | 3 + pnpm-lock.yaml | 2316 ++++++++++------- writable/debugbar/.gitkeep | 0 30 files changed, 1677 insertions(+), 1250 deletions(-) create mode 100644 modules/Auth/Config/AuthToken.php create mode 100644 writable/debugbar/.gitkeep diff --git a/.gitignore b/.gitignore index 75d7aa6e..b76b146f 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,7 @@ writable/uploads/* !writable/uploads/index.html writable/debugbar/* +!writable/debugbar/.gitkeep php_errors.log diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php index 8193a56a..3f6dd938 100644 --- a/app/Config/Boot/development.php +++ b/app/Config/Boot/development.php @@ -9,6 +9,8 @@ declare(strict_types=1); * In development, we want to show as many errors as possible to help * make sure they don't make it to production. And save us hours of * painful debugging. + * + * If you set 'display_errors' to '1', CI4's detailed error report will show. */ error_reporting(-1); ini_set('display_errors', '1'); diff --git a/app/Config/Boot/production.php b/app/Config/Boot/production.php index 4cf210d8..701bf31e 100644 --- a/app/Config/Boot/production.php +++ b/app/Config/Boot/production.php @@ -8,6 +8,8 @@ declare(strict_types=1); * -------------------------------------------------------------------------- * Don't show ANY in production environments. Instead, let the system catch * it and display a generic error message. + * + * If you set 'display_errors' to '1', CI4's detailed error report will show. */ ini_set('display_errors', '0'); error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED); diff --git a/app/Config/Boot/testing.php b/app/Config/Boot/testing.php index 56c22a9c..ae8eb6b4 100644 --- a/app/Config/Boot/testing.php +++ b/app/Config/Boot/testing.php @@ -2,6 +2,12 @@ declare(strict_types=1); +/* + * The environment testing is reserved for PHPUnit testing. It has special + * conditions built into the framework at various places to assist with that. + * You can’t use it for your development. + */ + /** * -------------------------------------------------------------------------- * ERROR DISPLAY diff --git a/app/Config/Filters.php b/app/Config/Filters.php index d4bcb168..632aec72 100644 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -11,8 +11,6 @@ use CodeIgniter\Filters\DebugToolbar; use CodeIgniter\Filters\Honeypot; use CodeIgniter\Filters\InvalidChars; use CodeIgniter\Filters\SecureHeaders; -use Modules\Admin\Config\Admin; -use Modules\Analytics\Config\Analytics; use Modules\Auth\Filters\PermissionFilter; class Filters extends BaseConfig @@ -20,8 +18,9 @@ class Filters extends BaseConfig /** * Configures aliases for Filter classes to make reading things nicer and simpler. * - * @var array - * @phpstan-var array + * @var array|string> [filter_name => classname] + * or [filter_name => [classname1, classname2, ...]] + * @phpstan-var array> */ public array $aliases = [ 'csrf' => CSRF::class, @@ -80,7 +79,7 @@ class Filters extends BaseConfig $this->filters = [ 'session' => [ - 'before' => [config(Admin::class)->gateway . '*', config(Analytics::class)->gateway . '*'], + 'before' => [config('Admin')->gateway . '*', config('Analytics')->gateway . '*'], ], 'podcast-unlock' => [ 'before' => ['*@*/episodes/*'], diff --git a/app/Config/Migrations.php b/app/Config/Migrations.php index d4e7731b..c30ad993 100644 --- a/app/Config/Migrations.php +++ b/app/Config/Migrations.php @@ -27,9 +27,7 @@ class Migrations extends BaseConfig * * This is the name of the table that will store the current migrations state. * When migrations runs it will store in a database table which migration - * level the system is at. It then compares the migration level in this - * table to the $config['migration_version'] if they are not the same it - * will migrate up. This must be set. + * files have already been run. */ public string $table = 'migrations'; diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 6339fad3..f9e06943 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -49,6 +49,9 @@ $routes->get('/', 'HomeController', [ $routes->get('.well-known/platforms', 'Platform'); +service('auth') + ->routes($routes); + // Podcast's Public routes $routes->group('@(:podcastHandle)', static function ($routes): void { // override default Fediverse Library's actor route diff --git a/app/Config/View.php b/app/Config/View.php index ae4d7475..e69d19b0 100644 --- a/app/Config/View.php +++ b/app/Config/View.php @@ -8,6 +8,10 @@ use CodeIgniter\Config\View as BaseView; use CodeIgniter\View\ViewDecoratorInterface; use ViewComponents\Decorator; +/** + * @phpstan-type ParserCallable (callable(mixed): mixed) + * @phpstan-type ParserCallableString (callable(mixed): mixed)&string + */ class View extends BaseView { /** @@ -28,7 +32,7 @@ class View extends BaseView * Examples: { title|esc(js) } { created_on|date(Y-m-d)|esc(attr) } * * @var array - * @phpstan-var array + * @phpstan-var array */ public $filters = []; @@ -36,8 +40,8 @@ class View extends BaseView * Parser Plugins provide a way to extend the functionality provided by the core Parser by creating aliases that * will be replaced with any callable. Can be single or tag pair. * - * @var array - * @phpstan-var array + * @var array|callable|string> + * @phpstan-var array|ParserCallableString|ParserCallable> */ public $plugins = []; diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php index 7bfc7c21..6c87b000 100644 --- a/app/Controllers/BaseController.php +++ b/app/Controllers/BaseController.php @@ -59,13 +59,13 @@ abstract class BaseController extends Controller ResponseInterface $response, LoggerInterface $logger ): void { - $this->helpers = array_merge($this->helpers, ['auth', 'svg', 'components', 'misc', 'seo', 'premium_podcasts']); + $this->helpers = [...$this->helpers, 'auth', 'svg', 'components', 'misc', 'seo', 'premium_podcasts']; // Do Not Edit This Line parent::initController($request, $response, $logger); Theme::setTheme('app'); - $this->helpers = array_merge($this->helpers, ['setting']); + $this->helpers = [...$this->helpers, 'setting']; } } diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php index d65294ac..fbf66d76 100644 --- a/app/Controllers/EpisodeAudioController.php +++ b/app/Controllers/EpisodeAudioController.php @@ -64,7 +64,7 @@ class EpisodeAudioController extends Controller set_user_session_location(); set_user_session_player(); - $this->analyticsConfig = config(Analytics::class); + $this->analyticsConfig = config('Analytics'); } public function _remap(string $method, string ...$params): mixed diff --git a/app/Controllers/PostController.php b/app/Controllers/PostController.php index 23d68882..7e0ea87e 100644 --- a/app/Controllers/PostController.php +++ b/app/Controllers/PostController.php @@ -22,7 +22,6 @@ use CodeIgniter\HTTP\URI; use CodeIgniter\I18n\Time; use Modules\Analytics\AnalyticsTrait; use Modules\Fediverse\Controllers\PostController as FediversePostController; -use Modules\Fediverse\Models\FavouriteModel; class PostController extends FediversePostController { @@ -203,7 +202,7 @@ class PostController extends FediversePostController public function attemptFavourite(): RedirectResponse { - model(FavouriteModel::class)->toggleFavourite(interact_as_actor(), $this->post); + model('FavouriteModel')->toggleFavourite(interact_as_actor(), $this->post); return redirect()->back(); } diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index 0fb5ab0d..00b2b000 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -622,7 +622,7 @@ class PlatformSeeder extends Seeder ], ]; - $data = array_merge($podcastingData, $fundingData, $socialData); + $data = [...$podcastingData, ...$fundingData, ...$socialData]; $this->db ->table('platforms') ->ignore(true) diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 4b0d187c..cde17a2d 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -52,7 +52,7 @@ if (! function_exists('get_rss_feed')) { $atomLink->addAttribute('type', 'application/rss+xml'); // websub: add links to hubs defined in config - $websubHubs = config(WebSub::class) + $websubHubs = config('WebSub') ->hubs; foreach ($websubHubs as $websubHub) { $atomLinkHub = $channel->addChild('link', null, $atomNamespace); diff --git a/app/Libraries/ViewComponents/Component.php b/app/Libraries/ViewComponents/Component.php index 47dc2625..b86e4a85 100644 --- a/app/Libraries/ViewComponents/Component.php +++ b/app/Libraries/ViewComponents/Component.php @@ -25,7 +25,7 @@ class Component implements ComponentInterface helper('viewcomponents'); // overwrite default attributes if set - $this->attributes = array_merge($this->attributes, $attributes); + $this->attributes = [...$this->attributes, ...$attributes]; if ($attributes !== []) { $this->hydrate($attributes); diff --git a/app/Libraries/ViewComponents/ComponentRenderer.php b/app/Libraries/ViewComponents/ComponentRenderer.php index 79e1987b..f9e916c0 100644 --- a/app/Libraries/ViewComponents/ComponentRenderer.php +++ b/app/Libraries/ViewComponents/ComponentRenderer.php @@ -16,7 +16,7 @@ class ComponentRenderer public function __construct() { - $this->config = config(ViewComponents::class); + $this->config = config('ViewComponents'); } public function render(string $output): string diff --git a/app/Libraries/ViewThemes/Theme.php b/app/Libraries/ViewThemes/Theme.php index f3d94796..30020dcb 100644 --- a/app/Libraries/ViewThemes/Theme.php +++ b/app/Libraries/ViewThemes/Theme.php @@ -32,7 +32,7 @@ class Theme public function __construct() { - $this->config = config(Themes::class); + $this->config = config('Themes'); } /** @@ -85,7 +85,7 @@ class Theme { $themes = []; - $config = config(Themes::class); + $config = config('Themes'); foreach ($config->themes as $name => $folder) { $themes[] = [ diff --git a/app/Libraries/Vite/Vite.php b/app/Libraries/Vite/Vite.php index b0dea4ec..4ff6fa6e 100644 --- a/app/Libraries/Vite/Vite.php +++ b/app/Libraries/Vite/Vite.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace Vite; use ErrorException; -use Vite\Config\Vite as ViteConfig; class Vite { @@ -21,7 +20,7 @@ class Vite public function asset(string $path, string $type): string { - if (config(ViteConfig::class)->environment !== 'production') { + if (config('Vite')->environment !== 'production') { return $this->loadDev($path, $type); } @@ -30,10 +29,7 @@ class Vite private function loadDev(string $path, string $type): string { - return $this->getHtmlTag( - config(ViteConfig::class)->baseUrl . config(ViteConfig::class)->assetsRoot . "/{$path}", - $type - ); + return $this->getHtmlTag(config('Vite') ->baseUrl . config('Vite')->assetsRoot . "/{$path}", $type); } private function loadProd(string $path, string $type): string @@ -41,8 +37,8 @@ class Vite if ($this->manifestData === null) { $cacheName = 'vite-manifest'; if (! ($cachedManifest = cache($cacheName))) { - $manifestPath = config(ViteConfig::class) - ->assetsRoot . '/' . config(ViteConfig::class) + $manifestPath = config('Vite') + ->assetsRoot . '/' . config('Vite') ->manifestFile; try { if (($manifestContents = file_get_contents($manifestPath)) !== false) { @@ -66,7 +62,7 @@ class Vite // import css dependencies if any if (array_key_exists('css', $manifestElement)) { foreach ($manifestElement['css'] as $cssFile) { - $html .= $this->getHtmlTag('/' . config(ViteConfig::class)->assetsRoot . '/' . $cssFile, 'css'); + $html .= $this->getHtmlTag('/' . config('Vite')->assetsRoot . '/' . $cssFile, 'css'); } } @@ -78,26 +74,21 @@ class Vite if (array_key_exists('css', $this->manifestData[$importPath])) { foreach ($this->manifestData[$importPath]['css'] as $cssFile) { $html .= $this->getHtmlTag( - '/' . config(ViteConfig::class)->assetsRoot . '/' . $cssFile, + '/' . config('Vite')->assetsRoot . '/' . $cssFile, 'css' ); } } $html .= $this->getHtmlTag( - '/' . config( - ViteConfig::class - )->assetsRoot . '/' . $this->manifestData[$importPath]['file'], + '/' . config('Vite')->assetsRoot . '/' . $this->manifestData[$importPath]['file'], 'js' ); } } } - $html .= $this->getHtmlTag( - '/' . config(ViteConfig::class)->assetsRoot . '/' . $manifestElement['file'], - $type - ); + $html .= $this->getHtmlTag('/' . config('Vite')->assetsRoot . '/' . $manifestElement['file'], $type); } return $html; diff --git a/app/Models/EpisodeCommentModel.php b/app/Models/EpisodeCommentModel.php index bbceb48f..beefbd53 100644 --- a/app/Models/EpisodeCommentModel.php +++ b/app/Models/EpisodeCommentModel.php @@ -20,7 +20,6 @@ use CodeIgniter\I18n\Time; use Michalsn\Uuid\UuidModel; use Modules\Fediverse\Activities\CreateActivity; use Modules\Fediverse\Activities\DeleteActivity; -use Modules\Fediverse\Models\ActivityModel; use Modules\Fediverse\Objects\TombstoneObject; class EpisodeCommentModel extends UuidModel @@ -111,7 +110,7 @@ class EpisodeCommentModel extends UuidModel ->set('actor', $comment->actor->uri) ->set('object', new CommentObject($comment)); - $activityId = model(ActivityModel::class, false) + $activityId = model('ActivityModel', false) ->newActivity( 'Create', $comment->actor_id, @@ -124,7 +123,7 @@ class EpisodeCommentModel extends UuidModel $createActivity->set('id', url_to('activity', esc($comment->actor->username), $activityId)); - model(ActivityModel::class, false) + model('ActivityModel', false) ->update($activityId, [ 'payload' => $createActivity->toJSON(), ]); @@ -154,7 +153,7 @@ class EpisodeCommentModel extends UuidModel ->set('actor', $comment->actor->uri) ->set('object', $tombstoneObject); - $activityId = model(ActivityModel::class, false) + $activityId = model('ActivityModel', false) ->newActivity( 'Delete', $comment->actor_id, @@ -167,7 +166,7 @@ class EpisodeCommentModel extends UuidModel $deleteActivity->set('id', url_to('activity', esc($comment->actor->username), $activityId)); - model(ActivityModel::class, false) + model('ActivityModel', false) ->update($activityId, [ 'payload' => $deleteActivity->toJSON(), ]); @@ -177,7 +176,7 @@ class EpisodeCommentModel extends UuidModel ->delete($comment->id); if ($comment->in_reply_to_id === null) { - model(EpisodeModel::class, false)->builder() + model('EpisodeModel', false)->builder() ->where('id', $comment->episode_id) ->decrement('comments_count'); } else { @@ -294,9 +293,9 @@ class EpisodeCommentModel extends UuidModel $data['data']['id'] = $uuid4->toString(); if (! isset($data['data']['uri'])) { - $actor = model(ActorModel::class, false) + $actor = model('ActorModel', false) ->getActorById((int) $data['data']['actor_id']); - $episode = model(EpisodeModel::class, false) + $episode = model('EpisodeModel', false) ->find((int) $data['data']['episode_id']); if (! $episode instanceof Episode) { diff --git a/app/Models/LikeModel.php b/app/Models/LikeModel.php index b0b222ff..b7929684 100644 --- a/app/Models/LikeModel.php +++ b/app/Models/LikeModel.php @@ -17,7 +17,6 @@ use Modules\Fediverse\Activities\LikeActivity; use Modules\Fediverse\Activities\UndoActivity; use Modules\Fediverse\Entities\Activity; use Modules\Fediverse\Entities\Actor; -use Modules\Fediverse\Models\ActivityModel; class LikeModel extends UuidModel { @@ -66,7 +65,7 @@ class LikeModel extends UuidModel $likeActivity->set('actor', $actor->uri) ->set('object', $comment->uri); - $activityId = model(ActivityModel::class) + $activityId = model('ActivityModel') ->newActivity( 'Like', $actor->id, @@ -79,7 +78,7 @@ class LikeModel extends UuidModel $likeActivity->set('id', url_to('activity', esc($actor->username), $activityId)); - model(ActivityModel::class) + model('ActivityModel') ->update($activityId, [ 'payload' => $likeActivity->toJSON(), ]); @@ -107,7 +106,7 @@ class LikeModel extends UuidModel if ($registerActivity) { $undoActivity = new UndoActivity(); // FIXME: get like activity associated with the deleted like - $activity = model(ActivityModel::class) + $activity = model('ActivityModel') ->where([ 'type' => 'Like', 'actor_id' => $actor->id, @@ -129,7 +128,7 @@ class LikeModel extends UuidModel ->set('actor', $actor->uri) ->set('object', $likeActivity); - $activityId = model(ActivityModel::class) + $activityId = model('ActivityModel') ->newActivity( 'Undo', $actor->id, @@ -142,7 +141,7 @@ class LikeModel extends UuidModel $undoActivity->set('id', url_to('activity', esc($actor->username), $activityId)); - model(ActivityModel::class) + model('ActivityModel') ->update($activityId, [ 'payload' => $undoActivity->toJSON(), ]); diff --git a/app/Views/Components/Forms/Select.php b/app/Views/Components/Forms/Select.php index 0740beef..8f112c90 100644 --- a/app/Views/Components/Forms/Select.php +++ b/app/Views/Components/Forms/Select.php @@ -32,7 +32,7 @@ class Select extends FormComponent unset($this->attributes['name']); unset($this->attributes['options']); unset($this->attributes['selected']); - $extra = array_merge($this->attributes, $defaultAttributes); + $extra = [...$this->attributes, ...$defaultAttributes]; return form_dropdown($this->name, $this->options, old($this->name, $this->selected !== '' ? [$this->selected] : []), $extra); } diff --git a/app/Views/Components/IconButton.php b/app/Views/Components/IconButton.php index fc6bc318..57afa1a4 100644 --- a/app/Views/Components/IconButton.php +++ b/app/Views/Components/IconButton.php @@ -22,7 +22,7 @@ class IconButton extends Button 'large' => 'text-2xl', ]; - $allAttributes = array_merge($attributes, $iconButtonAttributes); + $allAttributes = [...$attributes, ...$iconButtonAttributes]; parent::__construct($allAttributes); diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php index a50dfe81..6f9383a3 100644 --- a/app/Views/errors/html/error_exception.php +++ b/app/Views/errors/html/error_exception.php @@ -47,6 +47,7 @@ $errorId = uniqid('error', true);
    +
      @@ -69,7 +70,7 @@ $errorId = uniqid('error', true);
    • - + setStatusCode(http_response_code());

    +
    - endSection() ?> -section('subtitle') ?> -

    Lorem ipsum dolor sit, amet consectetur adipisicing elit. Quod ex corporis sed et tenetur, doloremque nihil autem odio! Similique nemo in est magnam aspernatur temporibus a architecto quod cupiditate vitae!

    -endSection() ?> - section('content') ?> - + -
    -
    - submit_url === ''): ?> - slug), - 'text-skin-muted text-4xl', - $platform->type - ) ?> - - submit_url, - icon( - esc($platform->slug), - 'text-skin-muted text-4xl', - $platform->type - ), - [ - 'class' => 'text-skin-muted hover:text-skin-base', - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'data-tooltip' => 'bottom', - 'title' => lang('Platforms.submit_url', [ - 'platformName' => $platform->label, - ]), - ], - ) ?> - -
    - home_url, icon('external-link', 'mx-auto'), [ - 'class' => 'flex-1 text-skin-muted hover:text-skin-base', - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'data-tooltip' => 'bottom', - 'title' => lang('Platforms.home_url', [ - 'platformName' => $platform->label, - ]), - ]) ?> - submit_url ? anchor( - $platform->submit_url, - icon('add', 'mx-auto'), - [ - 'class' => 'flex-1 text-skin-muted hover:text-skin-base', - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'data-tooltip' => 'bottom', - 'title' => lang('Platforms.submit_url', [ - 'platformName' => $platform->label, - ]), - ] - ) : '' ?> -
    +
    -
    <?= esc($podcast->title) ?> -

    title) ?>@handle) ?>

    + +

    title) ?>@handle) ?>

    +
    fundingPlatforms, 'is_visible'), true)): ?> @@ -66,8 +68,14 @@
    + + podcastingPlatforms as $podcastingPlatform): ?> - is_visible): ?> + is_visible && $podcastingPlatform->slug !== 'castopod'): ?> Date: Tue, 21 Nov 2023 17:15:04 +0000 Subject: [PATCH 246/477] feat(admin): add rss feed link to podcast side navigation --- modules/Admin/Language/en/PodcastNavigation.php | 1 + themes/cp_admin/podcast/_sidebar.php | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/Admin/Language/en/PodcastNavigation.php b/modules/Admin/Language/en/PodcastNavigation.php index f9c1fdc3..bb777707 100644 --- a/modules/Admin/Language/en/PodcastNavigation.php +++ b/modules/Admin/Language/en/PodcastNavigation.php @@ -10,6 +10,7 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', diff --git a/themes/cp_admin/podcast/_sidebar.php b/themes/cp_admin/podcast/_sidebar.php index ef3c9e19..c2083f1e 100644 --- a/themes/cp_admin/podcast/_sidebar.php +++ b/themes/cp_admin/podcast/_sidebar.php @@ -32,9 +32,8 @@ $podcastNavigation = [ ], ], 'monetization' => [ - 'icon' => 'money-dollar-circle', - 'add-cta' => 'subscription-create', - 'items' => [ + 'icon' => 'money-dollar-circle', + 'items' => [ 'subscription-list', 'subscription-create', 'platforms-funding', @@ -52,14 +51,14 @@ $podcastNavigation = [ ?> -
    + From 1861d67971e2cc0c20ace091f037f6436437a50d Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 29 Nov 2023 16:00:28 +0000 Subject: [PATCH 247/477] fix(podcast-form): move fediverse section below author section --- app/Entities/Episode.php | 12 ++++++++ app/Models/ClipModel.php | 10 +++++++ themes/cp_admin/episode/_sidebar.php | 8 ++++-- themes/cp_admin/podcast/create.php | 40 +++++++++++++-------------- themes/cp_admin/podcast/edit.php | 41 ++++++++++++++-------------- 5 files changed, 66 insertions(+), 45 deletions(-) diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index bc43df17..3fc08e5f 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -688,4 +688,16 @@ class Episode extends Entity return url_to('episode-preview', (string) $this->preview_id); } + + /** + * Returns the episode's clip count + */ + public function getClipCount(): int|string + { + if ($this->id === null) { + throw new RuntimeException('Episode must be created before getting number of video clips.'); + } + + return (new ClipModel())->getClipCount($this->podcast_id, $this->id); + } } diff --git a/app/Models/ClipModel.php b/app/Models/ClipModel.php index 819d8e42..0e372614 100644 --- a/app/Models/ClipModel.php +++ b/app/Models/ClipModel.php @@ -173,6 +173,16 @@ class ClipModel extends Model ]); } + public function getClipCount(int $podcastId, int $episodeId): int + { + return $this + ->where([ + 'podcast_id' => $podcastId, + 'episode_id' => $episodeId, + ]) + ->countAllResults(); + } + public function clearVideoClipCache(int $clipId): void { cache() diff --git a/themes/cp_admin/episode/_sidebar.php b/themes/cp_admin/episode/_sidebar.php index 52b07631..d5c7f83e 100644 --- a/themes/cp_admin/episode/_sidebar.php +++ b/themes/cp_admin/episode/_sidebar.php @@ -6,9 +6,11 @@ $episodeNavigation = [ 'items' => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'], ], 'clips' => [ - 'icon' => 'clapperboard', - 'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'], - 'add-cta' => 'video-clips-create', + 'icon' => 'clapperboard', + 'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'], + 'count' => $episode->getClipCount(), + 'count-route' => 'video-clips-list', + 'add-cta' => 'video-clips-create', ], ]; ?> diff --git a/themes/cp_admin/podcast/create.php b/themes/cp_admin/podcast/create.php index a14f0950..62c3b642 100644 --- a/themes/cp_admin/podcast/create.php +++ b/themes/cp_admin/podcast/create.php @@ -56,27 +56,6 @@ isChecked="false" >
    - - - - - -
    - -
    - - -
    -
    - -
    + + +
    + +
    + + +
    +
    + + +
    + diff --git a/themes/cp_admin/podcast/edit.php b/themes/cp_admin/podcast/edit.php index 930b4a4d..4de46ec0 100644 --- a/themes/cp_admin/podcast/edit.php +++ b/themes/cp_admin/podcast/edit.php @@ -78,27 +78,6 @@ isChecked="type === 'serial' ? 'true' : 'false' ?>" >
    - - - - - -
    - -
    - - -
    -
    - - -
    + + +
    + +
    + + +
    +
    + + + +
    + From 2f1a5eb294bd30689cc8f3c730e090a755cf9968 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 29 Nov 2023 16:33:18 +0000 Subject: [PATCH 248/477] build: update shield to beta.8 + php and js dependencies to latest --- app/Config/Autoload.php | 2 +- app/Controllers/BaseController.php | 4 +- app/Resources/js/modules/markdown-preview.ts | 2 + composer.json | 12 +- composer.lock | 319 +++---- modules/Auth/Config/Auth.php | 18 +- modules/Auth/Config/AuthToken.php | 64 ++ modules/Auth/Config/Services.php | 3 +- package.json | 30 +- pnpm-lock.yaml | 906 ++++++++----------- 10 files changed, 638 insertions(+), 722 deletions(-) diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index 614a9632..47a8548f 100644 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -117,5 +117,5 @@ class Autoload extends AutoloadConfig * @var string[] * @phpstan-var list */ - public $helpers = []; + public $helpers = ['auth', 'setting']; } diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php index 6c87b000..0bd09d89 100644 --- a/app/Controllers/BaseController.php +++ b/app/Controllers/BaseController.php @@ -59,13 +59,11 @@ abstract class BaseController extends Controller ResponseInterface $response, LoggerInterface $logger ): void { - $this->helpers = [...$this->helpers, 'auth', 'svg', 'components', 'misc', 'seo', 'premium_podcasts']; + $this->helpers = [...$this->helpers, 'svg', 'components', 'misc', 'seo', 'premium_podcasts']; // Do Not Edit This Line parent::initController($request, $response, $logger); Theme::setTheme('app'); - - $this->helpers = [...$this->helpers, 'setting']; } } diff --git a/app/Resources/js/modules/markdown-preview.ts b/app/Resources/js/modules/markdown-preview.ts index d9612415..e2a37612 100644 --- a/app/Resources/js/modules/markdown-preview.ts +++ b/app/Resources/js/modules/markdown-preview.ts @@ -47,6 +47,8 @@ export class MarkdownPreview extends LitElement { return link.replace("=8.1" }, "require-dev": { - "symfony/filesystem": "^6.0" + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -5804,7 +5807,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.5" + "source": "https://github.com/symfony/finder/tree/v6.4.0" }, "funding": [ { @@ -5820,20 +5823,20 @@ "type": "tidelift" } ], - "time": "2023-09-26T12:56:25+00:00" + "time": "2023-10-31T17:30:12+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.3.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd" + "reference": "22301f0e7fdeaacc14318928612dee79be99860e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd", - "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", + "reference": "22301f0e7fdeaacc14318928612dee79be99860e", "shasum": "" }, "require": { @@ -5863,7 +5866,7 @@ "homepage": "https://symfony.com", "keywords": ["config", "configuration", "options"], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.3.0" + "source": "https://github.com/symfony/options-resolver/tree/v6.4.0" }, "funding": [ { @@ -5879,7 +5882,7 @@ "type": "tidelift" } ], - "time": "2023-05-12T14:21:09+00:00" + "time": "2023-08-08T10:16:24+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -6106,16 +6109,16 @@ }, { "name": "symfony/process", - "version": "v6.3.4", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", + "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa", + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa", "shasum": "" }, "require": { @@ -6143,7 +6146,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.4" + "source": "https://github.com/symfony/process/tree/v6.4.0" }, "funding": [ { @@ -6159,7 +6162,7 @@ "type": "tidelift" } ], - "time": "2023-08-07T10:39:22+00:00" + "time": "2023-11-17T21:06:49+00:00" }, { "name": "symfony/service-contracts", @@ -6241,7 +6244,7 @@ }, { "name": "symfony/stopwatch", - "version": "v6.3.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -6279,7 +6282,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.3.0" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.0" }, "funding": [ { @@ -6299,16 +6302,16 @@ }, { "name": "symfony/string", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "13880a87790c76ef994c91e87efb96134522577a" + "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a", - "reference": "13880a87790c76ef994c91e87efb96134522577a", + "url": "https://api.github.com/repos/symfony/string/zipball/b45fcf399ea9c3af543a92edf7172ba21174d809", + "reference": "b45fcf399ea9c3af543a92edf7172ba21174d809", "shasum": "" }, "require": { @@ -6322,11 +6325,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/intl": "^6.2", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6352,7 +6355,7 @@ "homepage": "https://symfony.com", "keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.8" + "source": "https://github.com/symfony/string/tree/v6.4.0" }, "funding": [ { @@ -6368,42 +6371,42 @@ "type": "tidelift" } ], - "time": "2023-11-09T08:28:21+00:00" + "time": "2023-11-28T20:41:49+00:00" }, { "name": "symplify/coding-standard", - "version": "12.0.3", + "version": "12.0.4", "source": { "type": "git", "url": "https://github.com/symplify/coding-standard.git", - "reference": "bf8f561330e769796903fdcd19adde5c158d3a4e" + "reference": "ff41218eb2e3cc4aacbb5d85b3e59f4a17f1842c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/coding-standard/zipball/bf8f561330e769796903fdcd19adde5c158d3a4e", - "reference": "bf8f561330e769796903fdcd19adde5c158d3a4e", + "url": "https://api.github.com/repos/symplify/coding-standard/zipball/ff41218eb2e3cc4aacbb5d85b3e59f4a17f1842c", + "reference": "ff41218eb2e3cc4aacbb5d85b3e59f4a17f1842c", "shasum": "" }, "require": { - "friendsofphp/php-cs-fixer": "^3.18", + "friendsofphp/php-cs-fixer": "^3.40", "nette/utils": "^3.2", "php": ">=8.1", "symplify/rule-doc-generator-contracts": "^11.1" }, "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/extension-installer": "^1.3", "phpstan/phpstan": "^1.10.26", "phpunit/phpunit": "^10.2", "rector/rector": "^0.17.7", "squizlabs/php_codesniffer": "^3.7.2", "symplify/easy-ci": "^11.3", - "symplify/easy-coding-standard": "^12.0.1", + "symplify/easy-coding-standard": "^12.0.8", "symplify/phpstan-extensions": "^11.2", "symplify/rule-doc-generator": "^12.0", - "tomasvotruba/class-leak": "^0.1", + "tomasvotruba/class-leak": "^0.2", "tomasvotruba/type-coverage": "^0.2", - "tomasvotruba/unused-public": "^0.2" + "tomasvotruba/unused-public": "^0.3", + "tracy/tracy": "^2.10" }, "type": "library", "autoload": { @@ -6416,7 +6419,7 @@ "description": "Set of Symplify rules for PHP_CodeSniffer and PHP CS Fixer.", "support": { "issues": "https://github.com/symplify/coding-standard/issues", - "source": "https://github.com/symplify/coding-standard/tree/12.0.3" + "source": "https://github.com/symplify/coding-standard/tree/12.0.4" }, "funding": [ { @@ -6428,20 +6431,20 @@ "type": "github" } ], - "time": "2023-08-12T15:52:36+00:00" + "time": "2023-11-29T09:22:08+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "12.0.8", + "version": "12.0.9", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "99d87d188acc712dd6655ee946569f823cfeff69" + "reference": "24b7b28c25d698e64496c4d19c798ccd01617c7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/99d87d188acc712dd6655ee946569f823cfeff69", - "reference": "99d87d188acc712dd6655ee946569f823cfeff69", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/24b7b28c25d698e64496c4d19c798ccd01617c7d", + "reference": "24b7b28c25d698e64496c4d19c798ccd01617c7d", "shasum": "" }, "require": { @@ -6463,7 +6466,7 @@ "keywords": ["Code style", "automation", "fixer", "static analysis"], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.0.8" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.0.9" }, "funding": [ { @@ -6475,7 +6478,7 @@ "type": "github" } ], - "time": "2023-09-08T10:17:14+00:00" + "time": "2023-11-29T09:35:09+00:00" }, { "name": "symplify/rule-doc-generator-contracts", @@ -6537,16 +6540,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -6571,7 +6574,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -6579,7 +6582,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" } ], "aliases": [], diff --git a/modules/Auth/Config/Auth.php b/modules/Auth/Config/Auth.php index d765960a..44250914 100644 --- a/modules/Auth/Config/Auth.php +++ b/modules/Auth/Config/Auth.php @@ -44,9 +44,12 @@ class Auth extends ShieldAuth * @var array */ public array $redirects = [ - 'register' => '/', - 'login' => '/', - 'logout' => 'login', + 'register' => '/', + 'login' => '/', + 'logout' => 'login', + 'force_reset' => '/', + 'permission_denied' => '/', + 'group_denied' => '/', ]; /** @@ -124,9 +127,12 @@ class Auth extends ShieldAuth ->gateway; $this->redirects = [ - 'register' => $adminGateway, - 'login' => $adminGateway, - 'logout' => $adminGateway, + 'register' => $adminGateway, + 'login' => $adminGateway, + 'logout' => $adminGateway, + 'force_reset' => $adminGateway, + 'permission_denied' => $adminGateway, + 'group_denied' => $adminGateway, ]; // FIXME: enable2FA config can only be updated in the .env diff --git a/modules/Auth/Config/AuthToken.php b/modules/Auth/Config/AuthToken.php index b19fe618..c82f653f 100644 --- a/modules/Auth/Config/AuthToken.php +++ b/modules/Auth/Config/AuthToken.php @@ -54,4 +54,68 @@ class AuthToken extends ShieldAuthToken * HMAC SHA256 byte size */ public int $hmacSecretKeyByteSize = 32; + + /** + * -------------------------------------------------------------------- + * HMAC encryption Keys + * -------------------------------------------------------------------- + * This sets the key to be used when encrypting a user's HMAC Secret Key. + * + * 'keys' is an array of keys which will facilitate key rotation. Valid + * keyTitles must include only [a-zA-Z0-9_] and should be kept to a + * max of 8 characters. + * + * Each keyTitle is an associative array containing the required 'key' + * value, and the optional 'driver' and 'digest' values. If the + * 'driver' and 'digest' values are not specified, the default 'driver' + * and 'digest' values will be used. + * + * Old keys will are used to decrypt existing Secret Keys. It is encouraged + * to run 'php spark shield:hmac reencrypt' to update existing Secret + * Key encryptions. + * + * @see https://codeigniter.com/user_guide/libraries/encryption.html + * + * @var array|string + * + * NOTE: The value becomes temporarily a string when setting value as JSON + * from environment variable. + * + * [key_name => ['key' => key_value]] + * or [key_name => ['key' => key_value, 'driver' => driver, 'digest' => digest]] + */ + public $hmacEncryptionKeys = [ + 'k1' => [ + 'key' => '', + ], + ]; + + /** + * -------------------------------------------------------------------- + * HMAC Current Encryption Key Selector + * -------------------------------------------------------------------- + * This specifies which of the encryption keys should be used. + */ + public string $hmacEncryptionCurrentKey = 'k1'; + + /** + * -------------------------------------------------------------------- + * HMAC Encryption Key Driver + * -------------------------------------------------------------------- + * This specifies which of the encryption drivers should be used. + * + * Available drivers: + * - OpenSSL + * - Sodium + */ + public string $hmacEncryptionDefaultDriver = 'OpenSSL'; + + /** + * -------------------------------------------------------------------- + * HMAC Encryption Key Driver + * -------------------------------------------------------------------- + * THis specifies the type of encryption to be used. + * e.g. 'SHA512' or 'SHA256'. + */ + public string $hmacEncryptionDefaultDigest = 'SHA512'; } diff --git a/modules/Auth/Config/Services.php b/modules/Auth/Config/Services.php index 5be76591..0771681e 100644 --- a/modules/Auth/Config/Services.php +++ b/modules/Auth/Config/Services.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace Modules\Auth\Config; -use CodeIgniter\Shield\Authentication\Authentication; use Config\Services as BaseService; use Modules\Auth\Auth; use Modules\Auth\Config\Auth as AuthConfig; @@ -23,6 +22,6 @@ class Services extends BaseService $config = config(AuthConfig::class); - return new Auth(new Authentication($config)); + return new Auth($config); } } diff --git a/package.json b/package.json index 5830fc94..8356d77a 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,11 @@ "dependencies": { "@amcharts/amcharts4": "^4.10.38", "@amcharts/amcharts4-geodata": "^4.1.27", - "@codemirror/commands": "^6.3.0", + "@codemirror/commands": "^6.3.2", "@codemirror/lang-xml": "^6.0.2", - "@codemirror/language": "^6.9.2", - "@codemirror/state": "^6.3.1", - "@codemirror/view": "^6.22.0", + "@codemirror/language": "^6.9.3", + "@codemirror/state": "^6.3.2", + "@codemirror/view": "^6.22.1", "@floating-ui/dom": "^1.5.3", "@github/clipboard-copy-element": "^1.3.0", "@github/hotkey": "^2.3.0", @@ -48,29 +48,29 @@ "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", "lit": "^3.1.0", - "marked": "^10.0.0", - "wavesurfer.js": "^7.4.5", + "marked": "^11.0.0", + "wavesurfer.js": "^7.4.12", "xml-formatter": "^3.6.0" }, "devDependencies": { - "@commitlint/cli": "^18.4.2", + "@commitlint/cli": "^18.4.3", "@commitlint/config-conventional": "^18.4.2", "@csstools/css-tokenizer": "^2.2.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", - "@semantic-release/gitlab": "^12.1.0", + "@semantic-release/gitlab": "^12.1.1", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.10", "@types/leaflet": "^1.9.8", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^6.11.0", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", "all-contributors-cli": "^6.26.1", "commitizen": "^4.3.0", "cross-env": "^7.0.3", "cssnano": "^6.0.1", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.53.0", + "eslint": "^8.54.0", "eslint-config-prettier": "^8.10.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.3", @@ -86,11 +86,11 @@ "semantic-release": "^22.0.8", "stylelint": "^15.11.0", "stylelint-config-standard": "^34.0.0", - "svgo": "^3.0.3", + "svgo": "^3.0.4", "tailwindcss": "^3.3.5", - "typescript": "^5.2.2", - "vite": "^5.0.0", - "vite-plugin-pwa": "^0.16.7", + "typescript": "^5.3.2", + "vite": "^5.0.4", + "vite-plugin-pwa": "^0.17.2", "workbox-build": "^7.0.0", "workbox-core": "^7.0.0", "workbox-routing": "^7.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0f916d3..b54c4902 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,20 +12,20 @@ dependencies: specifier: ^4.1.27 version: 4.1.27 "@codemirror/commands": - specifier: ^6.3.0 - version: 6.3.0 + specifier: ^6.3.2 + version: 6.3.2 "@codemirror/lang-xml": specifier: ^6.0.2 - version: 6.0.2(@codemirror/view@6.22.0) + version: 6.0.2(@codemirror/view@6.22.1) "@codemirror/language": - specifier: ^6.9.2 - version: 6.9.2 + specifier: ^6.9.3 + version: 6.9.3 "@codemirror/state": - specifier: ^6.3.1 - version: 6.3.1 + specifier: ^6.3.2 + version: 6.3.2 "@codemirror/view": - specifier: ^6.22.0 - version: 6.22.0 + specifier: ^6.22.1 + version: 6.22.1 "@floating-ui/dom": specifier: ^1.5.3 version: 1.5.3 @@ -66,19 +66,19 @@ dependencies: specifier: ^3.1.0 version: 3.1.0 marked: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^11.0.0 + version: 11.0.0 wavesurfer.js: - specifier: ^7.4.5 - version: 7.4.5 + specifier: ^7.4.12 + version: 7.4.12 xml-formatter: specifier: ^3.6.0 version: 3.6.0 devDependencies: "@commitlint/cli": - specifier: ^18.4.2 - version: 18.4.2(typescript@5.2.2) + specifier: ^18.4.3 + version: 18.4.3(typescript@5.3.2) "@commitlint/config-conventional": specifier: ^18.4.2 version: 18.4.2 @@ -95,8 +95,8 @@ devDependencies: specifier: ^10.0.1 version: 10.0.1(semantic-release@22.0.8) "@semantic-release/gitlab": - specifier: ^12.1.0 - version: 12.1.0(semantic-release@22.0.8) + specifier: ^12.1.1 + version: 12.1.1(semantic-release@22.0.8) "@tailwindcss/forms": specifier: ^0.5.7 version: 0.5.7(tailwindcss@3.3.5) @@ -107,17 +107,17 @@ devDependencies: specifier: ^1.9.8 version: 1.9.8 "@typescript-eslint/eslint-plugin": - specifier: ^6.11.0 - version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) + specifier: ^6.13.1 + version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2) "@typescript-eslint/parser": - specifier: ^6.11.0 - version: 6.11.0(eslint@8.53.0)(typescript@5.2.2) + specifier: ^6.13.1 + version: 6.13.1(eslint@8.54.0)(typescript@5.3.2) all-contributors-cli: specifier: ^6.26.1 version: 6.26.1 commitizen: specifier: ^4.3.0 - version: 4.3.0 + version: 4.3.0(typescript@5.3.2) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -126,16 +126,16 @@ devDependencies: version: 6.0.1(postcss@8.4.31) cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0 + version: 3.3.0(typescript@5.3.2) eslint: - specifier: ^8.53.0 - version: 8.53.0 + specifier: ^8.54.0 + version: 8.54.0 eslint-config-prettier: specifier: ^8.10.0 - version: 8.10.0(eslint@8.53.0) + version: 8.10.0(eslint@8.54.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.54.0)(prettier@2.8.8) husky: specifier: ^8.0.3 version: 8.0.3 @@ -165,7 +165,7 @@ devDependencies: version: 2.8.8 prettier-plugin-organize-imports: specifier: ^3.2.4 - version: 3.2.4(prettier@2.8.8)(typescript@5.2.2) + version: 3.2.4(prettier@2.8.8)(typescript@5.3.2) semantic-release: specifier: ^22.0.8 version: 22.0.8 @@ -176,20 +176,20 @@ devDependencies: specifier: ^34.0.0 version: 34.0.0(stylelint@15.11.0) svgo: - specifier: ^3.0.3 - version: 3.0.3 + specifier: ^3.0.4 + version: 3.0.4 tailwindcss: specifier: ^3.3.5 - version: 3.3.5(ts-node@10.9.1) + version: 3.3.5 typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ^5.3.2 + version: 5.3.2 vite: - specifier: ^5.0.0 - version: 5.0.0(@types/node@20.5.1) + specifier: ^5.0.4 + version: 5.0.4(@types/node@18.18.9) vite-plugin-pwa: - specifier: ^0.16.7 - version: 0.16.7(vite@5.0.0)(workbox-build@7.0.0)(workbox-window@7.0.0) + specifier: ^0.17.2 + version: 0.17.2(vite@5.0.4)(workbox-build@7.0.0)(workbox-window@7.0.0) workbox-build: specifier: ^7.0.0 version: 7.0.0 @@ -1777,7 +1777,7 @@ packages: to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.0.4): + /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.0.4): resolution: { integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==, @@ -1788,13 +1788,13 @@ packages: "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 dependencies: - "@codemirror/language": 6.9.2 - "@codemirror/state": 6.3.1 - "@codemirror/view": 6.22.0 + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.2 + "@codemirror/view": 6.22.1 "@lezer/common": 1.0.4 dev: false - /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.1.1): + /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1): resolution: { integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==, @@ -1805,47 +1805,47 @@ packages: "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 dependencies: - "@codemirror/language": 6.9.2 - "@codemirror/state": 6.3.1 - "@codemirror/view": 6.22.0 + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.2 + "@codemirror/view": 6.22.1 "@lezer/common": 1.1.1 dev: false - /@codemirror/commands@6.3.0: + /@codemirror/commands@6.3.2: resolution: { - integrity: sha512-tFfcxRIlOWiQDFhjBSWJ10MxcvbCIsRr6V64SgrcaY0MwNk32cUOcCuNlWo8VjV4qRQCgNgUAnIeo0svkk4R5Q==, + integrity: sha512-tjoi4MCWDNxgIpoLZ7+tezdS9OEB6pkiDKhfKx9ReJ/XBcs2G2RXIu+/FxXBlWsPTsz6C9q/r4gjzrsxpcnqCQ==, } dependencies: - "@codemirror/language": 6.9.2 - "@codemirror/state": 6.3.1 - "@codemirror/view": 6.22.0 + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.2 + "@codemirror/view": 6.22.1 "@lezer/common": 1.1.1 dev: false - /@codemirror/lang-xml@6.0.2(@codemirror/view@6.22.0): + /@codemirror/lang-xml@6.0.2(@codemirror/view@6.22.1): resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.0.4) - "@codemirror/language": 6.9.2 - "@codemirror/state": 6.3.1 + "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.0.4) + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.2 "@lezer/common": 1.0.4 "@lezer/xml": 1.0.2 transitivePeerDependencies: - "@codemirror/view" dev: false - /@codemirror/language@6.9.2: + /@codemirror/language@6.9.3: resolution: { - integrity: sha512-QGTQXSpAKDIzaSE96zNK1UfIUhPgkT1CLjh1N5qVzZuxgsEOhz5RqaN8QCIdyOQklGLx3MgHd9YrE3X3+Pl1ow==, + integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==, } dependencies: - "@codemirror/state": 6.3.1 - "@codemirror/view": 6.22.0 + "@codemirror/state": 6.3.2 + "@codemirror/view": 6.22.1 "@lezer/common": 1.1.1 "@lezer/highlight": 1.1.6 "@lezer/lr": 1.3.10 @@ -1858,8 +1858,8 @@ packages: integrity: sha512-6VZ44Ysh/Zn07xrGkdtNfmHCbGSHZzFBdzWi0pbd7chAQ/iUcpLGX99NYRZTa7Ugqg4kEHCqiHhcZnH0gLIgSg==, } dependencies: - "@codemirror/state": 6.3.1 - "@codemirror/view": 6.22.0 + "@codemirror/state": 6.3.2 + "@codemirror/view": 6.22.1 crelt: 1.0.6 dev: false @@ -1869,25 +1869,25 @@ packages: integrity: sha512-4jupk4JwkeVbrN2pStY74q6OJEYqwosB4koA66nyLeVedadtX9MHI38j2vbYmnfDGurDApP3OZO46MrWalcjiQ==, } dependencies: - "@codemirror/state": 6.3.1 - "@codemirror/view": 6.22.0 + "@codemirror/state": 6.3.2 + "@codemirror/view": 6.22.1 crelt: 1.0.6 dev: false - /@codemirror/state@6.3.1: + /@codemirror/state@6.3.2: resolution: { - integrity: sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==, + integrity: sha512-5jEikOfU0r9y+OTlZn5AEQB15mibu3deLBUp+GnLzVUNezEEuPt/JdSeniQNi+0YviblAvOPO2JQAlgJ3SYYaA==, } dev: false - /@codemirror/view@6.22.0: + /@codemirror/view@6.22.1: resolution: { - integrity: sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==, + integrity: sha512-38BRn1nPqZqiHbmWfI8zri23IbRVbmSpSmh1E/Ysvc+lIGGdBC17K8zlK7ZU6fhfy9x4De9Zyj5JQqScPq5DkA==, } dependencies: - "@codemirror/state": 6.3.1 + "@codemirror/state": 6.3.2 style-mod: 4.1.0 w3c-keyname: 2.2.8 dev: false @@ -1902,19 +1902,19 @@ packages: dev: true optional: true - /@commitlint/cli@18.4.2(typescript@5.2.2): + /@commitlint/cli@18.4.3(typescript@5.3.2): resolution: { - integrity: sha512-dDfb2+wzeQe6ogdHNHOy0J0nraok+La0BoxamNMhBOng9/5GoESPDmKUJ1Lt1oivh5MfIgZh0Vm6f0rxkB8CoA==, + integrity: sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==, } engines: { node: ">=v18" } hasBin: true dependencies: - "@commitlint/format": 18.4.0 - "@commitlint/lint": 18.4.2 - "@commitlint/load": 18.4.2(typescript@5.2.2) - "@commitlint/read": 18.4.0 - "@commitlint/types": 18.4.0 + "@commitlint/format": 18.4.3 + "@commitlint/lint": 18.4.3 + "@commitlint/load": 18.4.3(typescript@5.3.2) + "@commitlint/read": 18.4.3 + "@commitlint/types": 18.4.3 execa: 5.1.1 lodash.isfunction: 3.0.9 resolve-from: 5.0.0 @@ -1934,38 +1934,38 @@ packages: conventional-changelog-conventionalcommits: 7.0.2 dev: true - /@commitlint/config-validator@17.8.1: - resolution: - { - integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==, - } - engines: { node: ">=v14" } - requiresBuild: true - dependencies: - "@commitlint/types": 17.8.1 - ajv: 8.12.0 - dev: true - optional: true - /@commitlint/config-validator@18.4.0: resolution: { integrity: sha512-1y6qHMU3o4cYQSK+Y9EnmH6H1GRiwQGjnLIUOIKlekrmfc8MrMk1ByNmb8od4vK3qHJAaL/77/5n+1uyyIF5dA==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/types": 18.4.0 ajv: 8.12.0 dev: true + optional: true - /@commitlint/ensure@18.4.0: + /@commitlint/config-validator@18.4.3: resolution: { - integrity: sha512-N5cJo/n61ULSwz3W5Iz/IZJ0I9H/PaHc+OMcF2XcRVbLa6B3YwzEW66XGCRKVULlsBNSrIH6tk5un9ayXAXIdw==, + integrity: sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==, } engines: { node: ">=v18" } dependencies: - "@commitlint/types": 18.4.0 + "@commitlint/types": 18.4.3 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure@18.4.3: + resolution: + { + integrity: sha512-MI4fwD9TWDVn4plF5+7JUyLLbkOdzIRBmVeNlk4dcGlkrVA+/l5GLcpN66q9LkFsFv6G2X31y89ApA3hqnqIFg==, + } + engines: { node: ">=v18" } + dependencies: + "@commitlint/types": 18.4.3 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -1973,93 +1973,66 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule@17.8.1: - resolution: - { - integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==, - } - engines: { node: ">=v14" } - requiresBuild: true - dev: true - optional: true - /@commitlint/execute-rule@18.4.0: resolution: { integrity: sha512-g013SWki6ZWhURBLOSXTaVQGWHdA0QlPJGiW4a+YpThezmJOemvc4LiKVpn13AjSKQ40QnmBqpBrxujOaSo+3A==, } engines: { node: ">=v18" } - dev: true - - /@commitlint/format@18.4.0: - resolution: - { - integrity: sha512-MiAe4D5/ahty38CzULdQbpRa3ReKZtx0kyigOWcntq+N5uqez+Ac4/MO7H+3j1kC4G7nfJVfBu6TqcXeyNvhCQ==, - } - engines: { node: ">=v18" } - dependencies: - "@commitlint/types": 18.4.0 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored@18.4.2: - resolution: - { - integrity: sha512-uujjyJlrXsMsQrv0r8HDGigAwJELPAMtA1Vxi2WUB54HbyAWa0Ue6ujMRZNKov2YeA96r6o72gLDnugb6yu8IA==, - } - engines: { node: ">=v18" } - dependencies: - "@commitlint/types": 18.4.0 - semver: 7.5.4 - dev: true - - /@commitlint/lint@18.4.2: - resolution: - { - integrity: sha512-ljGOIH7w9SnjvZFoKjf30iWFxDnezfRtOc50+rNLdDP0TpLspaYYLPhDO/TeVdmii1/AJiDgBIuBboQlaIy7Bw==, - } - engines: { node: ">=v18" } - dependencies: - "@commitlint/is-ignored": 18.4.2 - "@commitlint/parse": 18.4.0 - "@commitlint/rules": 18.4.0 - "@commitlint/types": 18.4.0 - dev: true - - /@commitlint/load@17.8.1: - resolution: - { - integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==, - } - engines: { node: ">=v14" } requiresBuild: true - dependencies: - "@commitlint/config-validator": 17.8.1 - "@commitlint/execute-rule": 17.8.1 - "@commitlint/resolve-extends": 17.8.1 - "@commitlint/types": 17.8.1 - "@types/node": 20.5.1 - chalk: 4.1.2 - cosmiconfig: 8.2.0 - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.2.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - "@swc/core" - - "@swc/wasm" dev: true optional: true - /@commitlint/load@18.4.2(typescript@5.2.2): + /@commitlint/execute-rule@18.4.3: + resolution: + { + integrity: sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==, + } + engines: { node: ">=v18" } + dev: true + + /@commitlint/format@18.4.3: + resolution: + { + integrity: sha512-8b+ItXYHxAhRAXFfYki5PpbuMMOmXYuzLxib65z2XTqki59YDQJGpJ/wB1kEE5MQDgSTQWtKUrA8n9zS/1uIDQ==, + } + engines: { node: ">=v18" } + dependencies: + "@commitlint/types": 18.4.3 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@18.4.3: + resolution: + { + integrity: sha512-ZseOY9UfuAI32h9w342Km4AIaTieeFskm2ZKdrG7r31+c6zGBzuny9KQhwI9puc0J3GkUquEgKJblCl7pMnjwg==, + } + engines: { node: ">=v18" } + dependencies: + "@commitlint/types": 18.4.3 + semver: 7.5.4 + dev: true + + /@commitlint/lint@18.4.3: + resolution: + { + integrity: sha512-18u3MRgEXNbnYkMOWoncvq6QB8/90m9TbERKgdPqVvS+zQ/MsuRhdvHYCIXGXZxUb0YI4DV2PC4bPneBV/fYuA==, + } + engines: { node: ">=v18" } + dependencies: + "@commitlint/is-ignored": 18.4.3 + "@commitlint/parse": 18.4.3 + "@commitlint/rules": 18.4.3 + "@commitlint/types": 18.4.3 + dev: true + + /@commitlint/load@18.4.2(typescript@5.3.2): resolution: { integrity: sha512-CKmzXdF9XwZJoVijAqpUlV9qzZOkyiYni4KuSCtTZVAAVudi9H84cJ4FqZxSwEP9G21vmoJiNrW8G042AsduVg==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/config-validator": 18.4.0 "@commitlint/execute-rule": 18.4.0 @@ -2067,8 +2040,32 @@ packages: "@commitlint/types": 18.4.0 "@types/node": 18.18.9 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.2.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.2.2) + cosmiconfig: 8.3.6(typescript@5.3.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - typescript + dev: true + optional: true + + /@commitlint/load@18.4.3(typescript@5.3.2): + resolution: + { + integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==, + } + engines: { node: ">=v18" } + dependencies: + "@commitlint/config-validator": 18.4.3 + "@commitlint/execute-rule": 18.4.3 + "@commitlint/resolve-extends": 18.4.3 + "@commitlint/types": 18.4.3 + "@types/node": 18.18.9 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.3.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -2077,63 +2074,47 @@ packages: - typescript dev: true - /@commitlint/message@18.4.0: + /@commitlint/message@18.4.3: resolution: { - integrity: sha512-3kg6NQO6pJ+VdBTWi51KInT8ngkxPJaW+iI7URtUALjKcO9K4XY3gf80ZPmS1hDessrjb7qCr1lau8eWMINAQw==, + integrity: sha512-ddJ7AztWUIoEMAXoewx45lKEYEOeOlBVWjk8hDMUGpprkuvWULpaXczqdjwVtjrKT3JhhN+gMs8pm5G3vB2how==, } engines: { node: ">=v18" } dev: true - /@commitlint/parse@18.4.0: + /@commitlint/parse@18.4.3: resolution: { - integrity: sha512-SxTCSUZH8CJNYWOlFg18YUQ2RLz8ubXKbpHUIiSNwCbiQx7UDCydp1JnhoB4sOYOxgV8d3nuDwYluRU5KnEY4A==, + integrity: sha512-eoH7CXM9L+/Me96KVcfJ27EIIbA5P9sqw3DqjJhRYuhaULIsPHFs5S5GBDCqT0vKZQDx0DgxhMpW6AQbnKrFtA==, } engines: { node: ">=v18" } dependencies: - "@commitlint/types": 18.4.0 - conventional-changelog-angular: 6.0.0 + "@commitlint/types": 18.4.3 + conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 dev: true - /@commitlint/read@18.4.0: + /@commitlint/read@18.4.3: resolution: { - integrity: sha512-IpnABCbDeOw5npZ09SZZGLfd3T7cFtsxUYm6wT3aGmIB2fXKE3fMeuj3jxXjMibiGIyA3Z5voCMuOcKWpkNySA==, + integrity: sha512-H4HGxaYA6OBCimZAtghL+B+SWu8ep4X7BwgmedmqWZRHxRLcX2q0bWBtUm5FsMbluxbOfrJwOs/Z0ah4roP/GQ==, } engines: { node: ">=v18" } dependencies: - "@commitlint/top-level": 18.4.0 - "@commitlint/types": 18.4.0 + "@commitlint/top-level": 18.4.3 + "@commitlint/types": 18.4.3 fs-extra: 11.1.1 git-raw-commits: 2.0.11 minimist: 1.2.8 dev: true - /@commitlint/resolve-extends@17.8.1: - resolution: - { - integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==, - } - engines: { node: ">=v14" } - requiresBuild: true - dependencies: - "@commitlint/config-validator": 17.8.1 - "@commitlint/types": 17.8.1 - import-fresh: 3.3.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - optional: true - /@commitlint/resolve-extends@18.4.0: resolution: { integrity: sha512-qhgU6ach+S6sJMD9NjCYiEycOObGhxzWQLQzqlScJCv9zkPs15Bg0ffLXTQ3z7ipXv46XEKYMnSJzjLRw2Tlkg==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/config-validator": 18.4.0 "@commitlint/types": 18.4.0 @@ -2142,70 +2123,75 @@ packages: resolve-from: 5.0.0 resolve-global: 1.0.0 dev: true + optional: true - /@commitlint/rules@18.4.0: + /@commitlint/resolve-extends@18.4.3: resolution: { - integrity: sha512-T3ChRxQZ6g0iNCpVLc6KeQId0/86TnyQA8PFkng+dWElO2DAA5km/yirgKZV1Xlc+gF7Rf6d+a0ottxdKpOY+w==, + integrity: sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==, } engines: { node: ">=v18" } dependencies: - "@commitlint/ensure": 18.4.0 - "@commitlint/message": 18.4.0 - "@commitlint/to-lines": 18.4.0 - "@commitlint/types": 18.4.0 + "@commitlint/config-validator": 18.4.3 + "@commitlint/types": 18.4.3 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@18.4.3: + resolution: + { + integrity: sha512-8KIeukDf45BiY+Lul1T0imSNXF0sMrlLG6JpLLKolkmYVQ6PxxoNOriwyZ3UTFFpaVbPy0rcITaV7U9JCAfDTA==, + } + engines: { node: ">=v18" } + dependencies: + "@commitlint/ensure": 18.4.3 + "@commitlint/message": 18.4.3 + "@commitlint/to-lines": 18.4.3 + "@commitlint/types": 18.4.3 execa: 5.1.1 dev: true - /@commitlint/to-lines@18.4.0: + /@commitlint/to-lines@18.4.3: resolution: { - integrity: sha512-bZXuCtfBPjNgtEnG3gwJrveIgfKK2UdhIhFvKpMTrQl/gAwoto/3mzmE7qGAHwmuP4eZ2U8X7iwMnqIlWmv2Tw==, + integrity: sha512-fy1TAleik4Zfru1RJ8ZU6cOSvgSVhUellxd3WZV1D5RwHZETt1sZdcA4mQN2y3VcIZsUNKkW0Mq8CM9/L9harQ==, } engines: { node: ">=v18" } dev: true - /@commitlint/top-level@18.4.0: + /@commitlint/top-level@18.4.3: resolution: { - integrity: sha512-TfulcA8UHF7MZ6tm4Ci3aqZgMBZa1OoCg4prccWHvwG/hsHujZ7+0FKbeKqDbcSli/YWm4NJwEjl4uh5itIJeA==, + integrity: sha512-E6fJPBLPFL5R8+XUNSYkj4HekIOuGMyJo3mIx2PkYc3clel+pcWQ7TConqXxNWW4x1ugigiIY2RGot55qUq1hw==, } engines: { node: ">=v18" } dependencies: find-up: 5.0.0 dev: true - /@commitlint/types@17.8.1: - resolution: - { - integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==, - } - engines: { node: ">=v14" } - requiresBuild: true - dependencies: - chalk: 4.1.2 - dev: true - optional: true - /@commitlint/types@18.4.0: resolution: { integrity: sha512-MKeaFxt0I9fhqUb2E+YIzX/gZtmkuodJET/XKiZIMvXUff8Ee4Ih86eLg+yAm2jf1pwGBmU02uNOp0y094w2Uw==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: chalk: 4.1.2 dev: true + optional: true - /@cspotcode/source-map-support@0.8.1: + /@commitlint/types@18.4.3: resolution: { - integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + integrity: sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==, } - engines: { node: ">=12" } - requiresBuild: true + engines: { node: ">=v18" } dependencies: - "@jridgewell/trace-mapping": 0.3.9 + chalk: 4.1.2 dev: true /@csstools/cascade-layer-name-parser@1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): @@ -2989,7 +2975,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -2998,7 +2984,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.53.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 dev: true @@ -3030,10 +3016,10 @@ packages: - supports-color dev: true - /@eslint/js@8.53.0: + /@eslint/js@8.54.0: resolution: { - integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==, + integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true @@ -3224,17 +3210,6 @@ packages: "@jridgewell/sourcemap-codec": 1.4.15 dev: true - /@jridgewell/trace-mapping@0.3.9: - resolution: - { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, - } - requiresBuild: true - dependencies: - "@jridgewell/resolve-uri": 3.1.1 - "@jridgewell/sourcemap-codec": 1.4.15 - dev: true - /@lezer/common@1.0.4: resolution: { @@ -3255,7 +3230,7 @@ packages: integrity: sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==, } dependencies: - "@lezer/common": 1.0.4 + "@lezer/common": 1.1.1 dev: false /@lezer/lr@1.3.10: @@ -3808,10 +3783,10 @@ packages: - supports-color dev: true - /@semantic-release/gitlab@12.1.0(semantic-release@22.0.8): + /@semantic-release/gitlab@12.1.1(semantic-release@22.0.8): resolution: { - integrity: sha512-HU6dDOwVOcKdAqQ6rA5slnz4BjfbqcaVBD8SkBfEUb3qio3L89elu7FsxDKSED1fFDiA0req2PLyNG+qx9NMQw==, + integrity: sha512-vM8mqMmegRJB4+9MJCYeCt5Gn4C2rpF0bNOzKOHq1IaI4FleIV5sss0fn55jVCuVVztTnoPQylnti5Tkdg3uaw==, } engines: { node: ">=18" } peerDependencies: @@ -3824,7 +3799,7 @@ packages: escape-string-regexp: 5.0.0 form-data: 4.0.0 fs-extra: 11.1.1 - globby: 11.1.0 + globby: 14.0.0 got: 13.0.0 hpagent: 1.2.0 lodash-es: 4.17.21 @@ -3900,6 +3875,14 @@ packages: engines: { node: ">=14.16" } dev: true + /@sindresorhus/merge-streams@1.0.0: + resolution: + { + integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==, + } + engines: { node: ">=18" } + dev: true + /@stencil/core@2.5.2: resolution: { @@ -3940,7 +3923,7 @@ packages: tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1" dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.3.5(ts-node@10.9.1) + tailwindcss: 3.3.5 dev: true /@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.31): @@ -3967,7 +3950,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.5(ts-node@10.9.1) + tailwindcss: 3.3.5 dev: true /@trysound/sax@0.2.0: @@ -3978,38 +3961,6 @@ packages: engines: { node: ">=10.13.0" } dev: true - /@tsconfig/node10@1.0.9: - resolution: - { - integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==, - } - requiresBuild: true - dev: true - - /@tsconfig/node12@1.0.11: - resolution: - { - integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, - } - requiresBuild: true - dev: true - - /@tsconfig/node14@1.0.3: - resolution: - { - integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, - } - requiresBuild: true - dev: true - - /@tsconfig/node16@1.0.4: - resolution: - { - integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, - } - requiresBuild: true - dev: true - /@types/estree@0.0.39: resolution: { @@ -4070,14 +4021,6 @@ packages: undici-types: 5.26.5 dev: true - /@types/node@20.5.1: - resolution: - { - integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==, - } - requiresBuild: true - dev: true - /@types/node@20.5.6: resolution: { @@ -4085,13 +4028,6 @@ packages: } dev: true - /@types/normalize-package-data@2.4.1: - resolution: - { - integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==, - } - dev: true - /@types/normalize-package-data@2.4.4: resolution: { @@ -4121,10 +4057,10 @@ packages: integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==, } - /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2): resolution: { - integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==, + integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4136,27 +4072,27 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.8.0 - "@typescript-eslint/parser": 6.11.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/scope-manager": 6.11.0 - "@typescript-eslint/type-utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.11.0 + "@typescript-eslint/parser": 6.13.1(eslint@8.54.0)(typescript@5.3.2) + "@typescript-eslint/scope-manager": 6.13.1 + "@typescript-eslint/type-utils": 6.13.1(eslint@8.54.0)(typescript@5.3.2) + "@typescript-eslint/utils": 6.13.1(eslint@8.54.0)(typescript@5.3.2) + "@typescript-eslint/visitor-keys": 6.13.1 debug: 4.3.4 - eslint: 8.53.0 + eslint: 8.54.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.2(typescript@5.3.2) + typescript: 5.3.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.13.1(eslint@8.54.0)(typescript@5.3.2): resolution: { - integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==, + integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4166,32 +4102,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.11.0 - "@typescript-eslint/types": 6.11.0 - "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.11.0 + "@typescript-eslint/scope-manager": 6.13.1 + "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/typescript-estree": 6.13.1(typescript@5.3.2) + "@typescript-eslint/visitor-keys": 6.13.1 debug: 4.3.4 - eslint: 8.53.0 - typescript: 5.2.2 + eslint: 8.54.0 + typescript: 5.3.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.11.0: + /@typescript-eslint/scope-manager@6.13.1: resolution: { - integrity: sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==, + integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.11.0 - "@typescript-eslint/visitor-keys": 6.11.0 + "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/visitor-keys": 6.13.1 dev: true - /@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.13.1(eslint@8.54.0)(typescript@5.3.2): resolution: { - integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==, + integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4201,28 +4137,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) - "@typescript-eslint/utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) + "@typescript-eslint/typescript-estree": 6.13.1(typescript@5.3.2) + "@typescript-eslint/utils": 6.13.1(eslint@8.54.0)(typescript@5.3.2) debug: 4.3.4 - eslint: 8.53.0 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 + eslint: 8.54.0 + ts-api-utils: 1.0.2(typescript@5.3.2) + typescript: 5.3.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.11.0: + /@typescript-eslint/types@6.13.1: resolution: { - integrity: sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==, + integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: true - /@typescript-eslint/typescript-estree@6.11.0(typescript@5.2.2): + /@typescript-eslint/typescript-estree@6.13.1(typescript@5.3.2): resolution: { - integrity: sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==, + integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4231,48 +4167,48 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.11.0 - "@typescript-eslint/visitor-keys": 6.11.0 + "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/visitor-keys": 6.13.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.2(typescript@5.3.2) + typescript: 5.3.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.13.1(eslint@8.54.0)(typescript@5.3.2): resolution: { - integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==, + integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.53.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) "@types/json-schema": 7.0.12 "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 6.11.0 - "@typescript-eslint/types": 6.11.0 - "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) - eslint: 8.53.0 + "@typescript-eslint/scope-manager": 6.13.1 + "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/typescript-estree": 6.13.1(typescript@5.3.2) + eslint: 8.54.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.11.0: + /@typescript-eslint/visitor-keys@6.13.1: resolution: { - integrity: sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==, + integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/types": 6.13.1 eslint-visitor-keys: 3.4.3 dev: true @@ -4337,15 +4273,6 @@ packages: engines: { node: ">=0.4.0" } dev: false - /acorn-walk@8.2.0: - resolution: - { - integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, - } - engines: { node: ">=0.4.0" } - requiresBuild: true - dev: true - /acorn@7.4.1: resolution: { @@ -4566,14 +4493,6 @@ packages: picomatch: 2.3.1 dev: true - /arg@4.1.3: - resolution: - { - integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, - } - requiresBuild: true - dev: true - /arg@5.0.2: resolution: { @@ -5310,13 +5229,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.1.1) - "@codemirror/commands": 6.3.0 - "@codemirror/language": 6.9.2 + "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1) + "@codemirror/commands": 6.3.2 + "@codemirror/language": 6.9.3 "@codemirror/lint": 6.4.0 "@codemirror/search": 6.5.1 - "@codemirror/state": 6.3.1 - "@codemirror/view": 6.22.0 + "@codemirror/state": 6.3.2 + "@codemirror/view": 6.22.1 transitivePeerDependencies: - "@lezer/common" dev: false @@ -5408,7 +5327,7 @@ packages: } engines: { node: ">= 10" } - /commitizen@4.3.0: + /commitizen@4.3.0(typescript@5.3.2): resolution: { integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==, @@ -5417,7 +5336,7 @@ packages: hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0 + cz-conventional-changelog: 3.3.0(typescript@5.3.2) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -5431,8 +5350,7 @@ packages: strip-bom: 4.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: - - "@swc/core" - - "@swc/wasm" + - typescript dev: true /common-tags@1.8.2: @@ -5483,16 +5401,6 @@ packages: proto-list: 1.2.4 dev: true - /conventional-changelog-angular@6.0.0: - resolution: - { - integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==, - } - engines: { node: ">=14" } - dependencies: - compare-func: 2.0.0 - dev: true - /conventional-changelog-angular@7.0.0: resolution: { @@ -5587,27 +5495,7 @@ packages: integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, } - /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.2.2): - resolution: - { - integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==, - } - engines: { node: ">=v14.21.3" } - requiresBuild: true - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=4" - dependencies: - "@types/node": 20.5.1 - cosmiconfig: 8.2.0 - ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2) - typescript: 5.2.2 - dev: true - optional: true - - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.2.2): + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.2): resolution: { integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==, @@ -5619,9 +5507,9 @@ packages: typescript: ">=4" dependencies: "@types/node": 18.18.9 - cosmiconfig: 8.3.6(typescript@5.2.2) + cosmiconfig: 8.3.6(typescript@5.3.2) jiti: 1.19.3 - typescript: 5.2.2 + typescript: 5.3.2 dev: true /cosmiconfig@8.2.0: @@ -5637,7 +5525,7 @@ packages: path-type: 4.0.0 dev: true - /cosmiconfig@8.3.6(typescript@5.2.2): + /cosmiconfig@8.3.6(typescript@5.3.2): resolution: { integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==, @@ -5653,15 +5541,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.2.2 - dev: true - - /create-require@1.1.1: - resolution: - { - integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, - } - requiresBuild: true + typescript: 5.3.2 dev: true /crelt@1.0.6: @@ -5914,7 +5794,7 @@ packages: css-tree: 2.2.1 dev: true - /cz-conventional-changelog@3.3.0: + /cz-conventional-changelog@3.3.0(typescript@5.3.2): resolution: { integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, @@ -5922,16 +5802,15 @@ packages: engines: { node: ">= 10" } dependencies: chalk: 2.4.2 - commitizen: 4.3.0 + commitizen: 4.3.0(typescript@5.3.2) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - "@commitlint/load": 17.8.1 + "@commitlint/load": 18.4.2(typescript@5.3.2) transitivePeerDependencies: - - "@swc/core" - - "@swc/wasm" + - typescript dev: true /d3-array@3.2.4: @@ -6245,15 +6124,6 @@ packages: } dev: true - /diff@4.0.2: - resolution: - { - integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, - } - engines: { node: ">=0.3.1" } - requiresBuild: true - dev: true - /dir-glob@3.0.1: resolution: { @@ -6650,7 +6520,7 @@ packages: source-map: 0.1.43 dev: false - /eslint-config-prettier@8.10.0(eslint@8.53.0): + /eslint-config-prettier@8.10.0(eslint@8.54.0): resolution: { integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==, @@ -6659,10 +6529,10 @@ packages: peerDependencies: eslint: ">=7.0.0" dependencies: - eslint: 8.53.0 + eslint: 8.54.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@2.8.8): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.54.0)(prettier@2.8.8): resolution: { integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, @@ -6676,8 +6546,8 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.53.0 - eslint-config-prettier: 8.10.0(eslint@8.53.0) + eslint: 8.54.0 + eslint-config-prettier: 8.10.0(eslint@8.54.0) prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true @@ -6701,18 +6571,18 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /eslint@8.53.0: + /eslint@8.54.0: resolution: { - integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==, + integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.53.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) "@eslint-community/regexpp": 4.8.0 "@eslint/eslintrc": 2.1.3 - "@eslint/js": 8.53.0 + "@eslint/js": 8.54.0 "@humanwhocodes/config-array": 0.11.13 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -6965,6 +6835,20 @@ packages: micromatch: 4.0.5 dev: true + /fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: { @@ -7032,7 +6916,7 @@ packages: } engines: { node: ^10.12.0 || >=12.0.0 } dependencies: - flat-cache: 3.1.0 + flat-cache: 3.2.0 dev: true /file-entry-cache@7.0.1: @@ -7144,18 +7028,6 @@ packages: resolve-dir: 1.0.1 dev: true - /flat-cache@3.1.0: - resolution: - { - integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==, - } - engines: { node: ">=12.0.0" } - dependencies: - flatted: 3.2.7 - keyv: 4.5.3 - rimraf: 3.0.2 - dev: true - /flat-cache@3.2.0: resolution: { @@ -7175,13 +7047,6 @@ packages: } dev: false - /flatted@3.2.7: - resolution: - { - integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, - } - dev: true - /flatted@3.2.9: resolution: { @@ -7586,6 +7451,21 @@ packages: slash: 4.0.0 dev: true + /globby@14.0.0: + resolution: + { + integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==, + } + engines: { node: ">=18" } + dependencies: + "@sindresorhus/merge-streams": 1.0.0 + fast-glob: 3.3.2 + ignore: 5.2.4 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + dev: true + /globjoin@0.1.4: resolution: { @@ -9066,14 +8946,6 @@ packages: sourcemap-codec: 1.4.8 dev: true - /make-error@1.3.6: - resolution: - { - integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, - } - requiresBuild: true - dev: true - /map-obj@1.0.1: resolution: { @@ -9108,10 +8980,10 @@ packages: supports-hyperlinks: 3.0.0 dev: true - /marked@10.0.0: + /marked@11.0.0: resolution: { - integrity: sha512-YiGcYcWj50YrwBgNzFoYhQ1hT6GmQbFG8SksnYJX1z4BXTHSOrz1GB5/Jm2yQvMg4nN1FHP4M6r03R10KrVUiA==, + integrity: sha512-2GsW34uXaFEGTQ/+3rCnNC6vUYTAgFuDLGl70v/aWinA5mIJtTrrFAmfbLOfVvgPyxXuDVL9He/7reCK+6j3Sw==, } engines: { node: ">= 18" } hasBin: true @@ -10039,6 +9911,14 @@ packages: engines: { node: ">=8" } dev: true + /path-type@5.0.0: + resolution: + { + integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==, + } + engines: { node: ">=12" } + dev: true + /pdfmake@0.2.7: resolution: { @@ -10489,7 +10369,7 @@ packages: postcss: 8.4.31 dev: true - /postcss-load-config@4.0.1(postcss@8.4.31)(ts-node@10.9.1): + /postcss-load-config@4.0.1(postcss@8.4.31): resolution: { integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==, @@ -10506,7 +10386,6 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.31 - ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2) yaml: 2.3.1 dev: true @@ -11030,7 +10909,7 @@ packages: dependencies: postcss: 8.4.31 postcss-value-parser: 4.2.0 - svgo: 3.0.3 + svgo: 3.0.4 dev: true /postcss-unique-selectors@6.0.0(postcss@8.4.31): @@ -11090,7 +10969,7 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-organize-imports@3.2.4(prettier@2.8.8)(typescript@5.2.2): + /prettier-plugin-organize-imports@3.2.4(prettier@2.8.8)(typescript@5.3.2): resolution: { integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==, @@ -11107,7 +10986,7 @@ packages: optional: true dependencies: prettier: 2.8.8 - typescript: 5.2.2 + typescript: 5.3.2 dev: true /prettier@2.8.8: @@ -11295,7 +11174,7 @@ packages: } engines: { node: ">=12" } dependencies: - "@types/normalize-package-data": 2.4.1 + "@types/normalize-package-data": 2.4.4 normalize-package-data: 3.0.3 parse-json: 5.2.0 type-fest: 1.4.0 @@ -11967,6 +11846,14 @@ packages: engines: { node: ">=12" } dev: true + /slash@5.1.0: + resolution: + { + integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==, + } + engines: { node: ">=14.16" } + dev: true + /slice-ansi@4.0.0: resolution: { @@ -12548,10 +12435,10 @@ packages: } dev: true - /svgo@3.0.3: + /svgo@3.0.4: resolution: { - integrity: sha512-X4UZvLhOglD5Xrp834HzGHf8RKUW0Ahigg/08yRO1no9t2NxffOkMiQ0WmaMIbaGlVTlSst2zWANsdhz5ybXgA==, + integrity: sha512-T+Xul3JwuJ6VGXKo/p2ndqx1ibxNKnLTvRc1ZTWKCfyKS/GgNjRZcYsK84fxTsy/izr91g/Rwx6fGnVgaFSI5g==, } engines: { node: ">=14.0.0" } hasBin: true @@ -12560,6 +12447,7 @@ packages: commander: 7.2.0 css-select: 5.1.0 css-tree: 2.3.1 + css-what: 6.1.0 csso: 5.0.5 picocolors: 1.0.0 dev: true @@ -12578,7 +12466,7 @@ packages: strip-ansi: 6.0.1 dev: true - /tailwindcss@3.3.5(ts-node@10.9.1): + /tailwindcss@3.3.5: resolution: { integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==, @@ -12603,7 +12491,7 @@ packages: postcss: 8.4.31 postcss-import: 15.1.0(postcss@8.4.31) postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.1(postcss@8.4.31)(ts-node@10.9.1) + postcss-load-config: 4.0.1(postcss@8.4.31) postcss-nested: 6.0.1(postcss@8.4.31) postcss-selector-parser: 6.0.13 resolve: 1.22.4 @@ -12814,7 +12702,7 @@ packages: engines: { node: ">=12" } dev: true - /ts-api-utils@1.0.2(typescript@5.2.2): + /ts-api-utils@1.0.2(typescript@5.3.2): resolution: { integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==, @@ -12823,7 +12711,7 @@ packages: peerDependencies: typescript: ">=4.2.0" dependencies: - typescript: 5.2.2 + typescript: 5.3.2 dev: true /ts-interface-checker@0.1.13: @@ -12833,41 +12721,6 @@ packages: } dev: true - /ts-node@10.9.1(@types/node@20.5.1)(typescript@5.2.2): - resolution: - { - integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, - } - hasBin: true - requiresBuild: true - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - dependencies: - "@cspotcode/source-map-support": 0.8.1 - "@tsconfig/node10": 1.0.9 - "@tsconfig/node12": 1.0.11 - "@tsconfig/node14": 1.0.3 - "@tsconfig/node16": 1.0.4 - "@types/node": 20.5.1 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.2.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - /tslib@1.14.1: resolution: { @@ -13052,10 +12905,10 @@ packages: } dev: false - /typescript@5.2.2: + /typescript@5.3.2: resolution: { - integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, + integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==, } engines: { node: ">=14.17" } hasBin: true @@ -13154,6 +13007,14 @@ packages: tiny-inflate: 1.0.3 dev: false + /unicorn-magic@0.1.0: + resolution: + { + integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, + } + engines: { node: ">=18" } + dev: true + /unique-string@2.0.0: resolution: { @@ -13255,14 +13116,6 @@ packages: integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, } - /v8-compile-cache-lib@3.0.1: - resolution: - { - integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, - } - requiresBuild: true - dev: true - /validate-npm-package-license@3.0.4: resolution: { @@ -13273,31 +13126,31 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-plugin-pwa@0.16.7(vite@5.0.0)(workbox-build@7.0.0)(workbox-window@7.0.0): + /vite-plugin-pwa@0.17.2(vite@5.0.4)(workbox-build@7.0.0)(workbox-window@7.0.0): resolution: { - integrity: sha512-4WMA5unuKlHs+koNoykeuCfTcqEGbiTRr8sVYUQMhc6tWxZpSRnv9Ojk4LKmqVhoPGHfBVCdGaMo8t9Qidkc1Q==, + integrity: sha512-aVH9sxcTDumiWYiNcLrFqu+FdL79I2cT5EhlVe5V6nGcC64yQNGT1jamMytwi+OdfXl4VYic0LtoJ6JHMkM3ZQ==, } engines: { node: ">=16.0.0" } peerDependencies: - vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 workbox-build: ^7.0.0 workbox-window: ^7.0.0 dependencies: debug: 4.3.4 - fast-glob: 3.3.1 + fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.0.0(@types/node@20.5.1) + vite: 5.0.4(@types/node@18.18.9) workbox-build: 7.0.0 workbox-window: 7.0.0 transitivePeerDependencies: - supports-color dev: true - /vite@5.0.0(@types/node@20.5.1): + /vite@5.0.4(@types/node@18.18.9): resolution: { - integrity: sha512-ESJVM59mdyGpsiNAeHQOR/0fqNoOyWPYesFto8FFZugfmhdHx8Fzd8sF3Q/xkVhZsyOxHfdM7ieiVAorI9RjFw==, + integrity: sha512-RzAr8LSvM8lmhB4tQ5OPcBhpjOZRZjuxv9zO5UcxeoY2bd3kP3Ticd40Qma9/BqZ8JS96Ll/jeBX9u+LJZrhVg==, } engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true @@ -13325,7 +13178,7 @@ packages: terser: optional: true dependencies: - "@types/node": 20.5.1 + "@types/node": 18.18.9 esbuild: 0.19.5 postcss: 8.4.31 rollup: 4.4.1 @@ -13340,10 +13193,10 @@ packages: } dev: false - /wavesurfer.js@7.4.5: + /wavesurfer.js@7.4.12: resolution: { - integrity: sha512-Vwvui02yNlpe8NYCEcPH6KMlLm+0SELyAUsTbqLOdECLamS8iJI3LU8dyAhL7q1XhYHVhmK1i3jD4QtnnpajPQ==, + integrity: sha512-KzH4LkcOp8LECs9cOVIPBl6vsSoICKuZz+v5kh/zvxilpaVszU+QKC+4s2KEAqcCxBCecg3cNSg4RqAx278F8g==, } dev: false @@ -13850,15 +13703,6 @@ packages: yargs-parser: 21.1.1 dev: true - /yn@3.1.1: - resolution: - { - integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, - } - engines: { node: ">=6" } - requiresBuild: true - dev: true - /yocto-queue@0.1.0: resolution: { From 34a2ebfd65c9345a38ca4430efb66a5ce84fd2a7 Mon Sep 17 00:00:00 2001 From: crowdin Date: Wed, 29 Nov 2023 17:27:10 +0000 Subject: [PATCH 249/477] chore(i18n): new Crowdin updates --- app/Language/ar/Episode.php | 12 + app/Language/ar/Podcast.php | 1 + app/Language/br/Episode.php | 12 + app/Language/br/Podcast.php | 1 + app/Language/ca/Episode.php | 12 + app/Language/ca/Podcast.php | 1 + app/Language/da/Episode.php | 12 + app/Language/da/Podcast.php | 1 + app/Language/de/Episode.php | 20 +- app/Language/de/Podcast.php | 11 +- app/Language/el/Episode.php | 12 + app/Language/el/Podcast.php | 1 + app/Language/es/Episode.php | 12 + app/Language/es/Podcast.php | 1 + app/Language/fa/Episode.php | 12 + app/Language/fa/Podcast.php | 1 + app/Language/fr/Episode.php | 12 + app/Language/fr/Podcast.php | 1 + app/Language/fr2/Episode.php | 12 + app/Language/fr2/Podcast.php | 1 + app/Language/fr_CA/Episode.php | 12 + app/Language/fr_CA/Podcast.php | 1 + app/Language/gd/Episode.php | 12 + app/Language/gd/Podcast.php | 1 + app/Language/gl/Episode.php | 12 + app/Language/gl/Podcast.php | 1 + app/Language/id/Episode.php | 12 + app/Language/id/Podcast.php | 1 + app/Language/it/Episode.php | 12 + app/Language/it/Podcast.php | 1 + app/Language/ja/Episode.php | 12 + app/Language/ja/Podcast.php | 1 + app/Language/kk/Comment.php | 34 ++ app/Language/kk/Common.php | 30 ++ app/Language/kk/Episode.php | 45 +++ app/Language/kk/Fediverse.php | 37 +++ app/Language/kk/Home.php | 20 ++ app/Language/kk/Page.php | 17 + app/Language/kk/Podcast.php | 55 +++ app/Language/kk/Post.php | 40 +++ app/Language/ko/Episode.php | 12 + app/Language/ko/Podcast.php | 1 + app/Language/nl/Episode.php | 12 + app/Language/nl/Podcast.php | 1 + app/Language/nn-NO/Podcast.php | 1 + app/Language/oc/Episode.php | 12 + app/Language/oc/Podcast.php | 1 + app/Language/pl/Episode.php | 12 + app/Language/pl/Podcast.php | 3 +- app/Language/pt-BR/Episode.php | 12 + app/Language/pt-BR/Podcast.php | 1 + app/Language/pt/Episode.php | 12 + app/Language/pt/Podcast.php | 1 + app/Language/ro/Episode.php | 12 + app/Language/ro/Podcast.php | 1 + app/Language/ru/Episode.php | 12 + app/Language/ru/Podcast.php | 1 + app/Language/sk/Episode.php | 12 + app/Language/sk/Podcast.php | 3 +- app/Language/sr_Latn/Episode.php | 12 + app/Language/sr_Latn/Fediverse.php | 2 +- app/Language/sr_Latn/Podcast.php | 3 +- app/Language/sv/Episode.php | 12 + app/Language/sv/Podcast.php | 1 + app/Language/uk/Comment.php | 8 +- app/Language/uk/Episode.php | 12 + app/Language/uk/Home.php | 12 +- app/Language/uk/Page.php | 6 +- app/Language/uk/Podcast.php | 1 + app/Language/zh-Hans/Episode.php | 12 + app/Language/zh-Hans/Podcast.php | 1 + docs/src/ar/getting-started/install.md | 23 +- docs/src/br/getting-started/install.md | 23 +- docs/src/ca/getting-started/install.md | 23 +- docs/src/da/getting-started/install.md | 23 +- docs/src/de/getting-started/docker.md | 4 +- docs/src/de/getting-started/install.md | 162 +++++---- docs/src/de/index.md | 35 +- docs/src/el/getting-started/install.md | 23 +- docs/src/es/getting-started/install.md | 23 +- docs/src/fa/getting-started/install.md | 23 +- docs/src/fr/getting-started/docker.md | 36 +- docs/src/fr/getting-started/install.md | 23 +- docs/src/fr2/getting-started/install.md | 23 +- docs/src/fr_CA/getting-started/install.md | 23 +- docs/src/gd/getting-started/install.md | 23 +- docs/src/gl/getting-started/install.md | 23 +- docs/src/id/getting-started/install.md | 23 +- docs/src/it/getting-started/install.md | 23 +- docs/src/ja/getting-started/install.md | 23 +- docs/src/kk/getting-started/auth.md | 87 +++++ docs/src/kk/getting-started/docker.md | 158 +++++++++ docs/src/kk/getting-started/install.md | 238 +++++++++++++ docs/src/kk/getting-started/security.md | 26 ++ docs/src/kk/getting-started/update.md | 109 ++++++ docs/src/kk/index.md | 299 +++++++++++++++++ docs/src/ko/getting-started/install.md | 23 +- docs/src/nl/getting-started/install.md | 23 +- docs/src/nn-NO/getting-started/auth.md | 110 +++--- docs/src/nn-NO/getting-started/docker.md | 84 ++--- docs/src/nn-NO/getting-started/install.md | 23 +- docs/src/nn-NO/index.md | 102 +++--- docs/src/oc/getting-started/install.md | 23 +- docs/src/pl/getting-started/install.md | 23 +- docs/src/pt-BR/getting-started/install.md | 23 +- docs/src/pt/getting-started/install.md | 23 +- docs/src/ro/getting-started/install.md | 23 +- docs/src/ru/getting-started/install.md | 23 +- docs/src/sk/getting-started/install.md | 23 +- docs/src/sr_Latn/getting-started/auth.md | 110 +++--- docs/src/sr_Latn/getting-started/install.md | 72 ++-- docs/src/sv/getting-started/install.md | 23 +- docs/src/uk/getting-started/install.md | 23 +- docs/src/zh-Hans/getting-started/install.md | 23 +- modules/Admin/Language/ar/Breadcrumb.php | 2 + modules/Admin/Language/ar/Common.php | 1 + modules/Admin/Language/ar/Episode.php | 13 +- modules/Admin/Language/ar/Platforms.php | 15 +- modules/Admin/Language/ar/Podcast.php | 4 +- .../Admin/Language/ar/PodcastNavigation.php | 11 +- modules/Admin/Language/br/Breadcrumb.php | 2 + modules/Admin/Language/br/Common.php | 1 + modules/Admin/Language/br/Episode.php | 25 +- modules/Admin/Language/br/Platforms.php | 15 +- modules/Admin/Language/br/Podcast.php | 4 +- .../Admin/Language/br/PodcastNavigation.php | 11 +- modules/Admin/Language/ca/Breadcrumb.php | 2 + modules/Admin/Language/ca/Common.php | 1 + modules/Admin/Language/ca/Episode.php | 25 +- modules/Admin/Language/ca/Platforms.php | 15 +- modules/Admin/Language/ca/Podcast.php | 4 +- .../Admin/Language/ca/PodcastNavigation.php | 11 +- modules/Admin/Language/da/Breadcrumb.php | 2 + modules/Admin/Language/da/Common.php | 1 + modules/Admin/Language/da/Episode.php | 13 +- modules/Admin/Language/da/Platforms.php | 15 +- modules/Admin/Language/da/Podcast.php | 4 +- .../Admin/Language/da/PodcastNavigation.php | 11 +- modules/Admin/Language/de/Breadcrumb.php | 4 +- modules/Admin/Language/de/Common.php | 1 + modules/Admin/Language/de/Episode.php | 13 +- modules/Admin/Language/de/Navigation.php | 4 +- modules/Admin/Language/de/Platforms.php | 15 +- modules/Admin/Language/de/Podcast.php | 6 +- .../Admin/Language/de/PodcastNavigation.php | 13 +- modules/Admin/Language/el/Breadcrumb.php | 2 + modules/Admin/Language/el/Common.php | 1 + modules/Admin/Language/el/Episode.php | 23 +- modules/Admin/Language/el/Platforms.php | 15 +- modules/Admin/Language/el/Podcast.php | 4 +- .../Admin/Language/el/PodcastNavigation.php | 11 +- modules/Admin/Language/es/Breadcrumb.php | 2 + modules/Admin/Language/es/Common.php | 1 + modules/Admin/Language/es/Episode.php | 25 +- modules/Admin/Language/es/Platforms.php | 15 +- modules/Admin/Language/es/Podcast.php | 4 +- .../Admin/Language/es/PodcastNavigation.php | 11 +- modules/Admin/Language/fa/Breadcrumb.php | 2 + modules/Admin/Language/fa/Common.php | 1 + modules/Admin/Language/fa/Episode.php | 13 +- modules/Admin/Language/fa/Platforms.php | 15 +- modules/Admin/Language/fa/Podcast.php | 6 +- .../Admin/Language/fa/PodcastNavigation.php | 11 +- modules/Admin/Language/fr/Breadcrumb.php | 2 + modules/Admin/Language/fr/Common.php | 1 + modules/Admin/Language/fr/Episode.php | 23 +- modules/Admin/Language/fr/Platforms.php | 15 +- modules/Admin/Language/fr/Podcast.php | 4 +- .../Admin/Language/fr/PodcastNavigation.php | 11 +- modules/Admin/Language/fr2/Breadcrumb.php | 2 + modules/Admin/Language/fr2/Common.php | 1 + modules/Admin/Language/fr2/Episode.php | 25 +- modules/Admin/Language/fr2/Platforms.php | 15 +- modules/Admin/Language/fr2/Podcast.php | 4 +- .../Admin/Language/fr2/PodcastNavigation.php | 11 +- modules/Admin/Language/fr_CA/Breadcrumb.php | 2 + modules/Admin/Language/fr_CA/Common.php | 1 + modules/Admin/Language/fr_CA/Episode.php | 13 +- modules/Admin/Language/fr_CA/Platforms.php | 15 +- modules/Admin/Language/fr_CA/Podcast.php | 4 +- .../Language/fr_CA/PodcastNavigation.php | 11 +- modules/Admin/Language/gd/Breadcrumb.php | 2 + modules/Admin/Language/gd/Common.php | 1 + modules/Admin/Language/gd/Episode.php | 13 +- modules/Admin/Language/gd/Platforms.php | 15 +- modules/Admin/Language/gd/Podcast.php | 4 +- .../Admin/Language/gd/PodcastNavigation.php | 11 +- modules/Admin/Language/gl/Breadcrumb.php | 2 + modules/Admin/Language/gl/Common.php | 1 + modules/Admin/Language/gl/Episode.php | 25 +- modules/Admin/Language/gl/Platforms.php | 15 +- modules/Admin/Language/gl/Podcast.php | 4 +- .../Admin/Language/gl/PodcastNavigation.php | 11 +- modules/Admin/Language/id/Breadcrumb.php | 2 + modules/Admin/Language/id/Common.php | 1 + modules/Admin/Language/id/Episode.php | 13 +- modules/Admin/Language/id/Platforms.php | 15 +- modules/Admin/Language/id/Podcast.php | 4 +- .../Admin/Language/id/PodcastNavigation.php | 11 +- modules/Admin/Language/it/Breadcrumb.php | 2 + modules/Admin/Language/it/Common.php | 1 + modules/Admin/Language/it/Episode.php | 13 +- modules/Admin/Language/it/Platforms.php | 15 +- modules/Admin/Language/it/Podcast.php | 4 +- .../Admin/Language/it/PodcastNavigation.php | 11 +- modules/Admin/Language/ja/Breadcrumb.php | 2 + modules/Admin/Language/ja/Common.php | 1 + modules/Admin/Language/ja/Episode.php | 13 +- modules/Admin/Language/ja/Platforms.php | 15 +- modules/Admin/Language/ja/Podcast.php | 4 +- .../Admin/Language/ja/PodcastNavigation.php | 11 +- modules/Admin/Language/kk/AboutCastopod.php | 22 ++ modules/Admin/Language/kk/Breadcrumb.php | 59 ++++ modules/Admin/Language/kk/Charts.php | 41 +++ modules/Admin/Language/kk/Common.php | 52 +++ modules/Admin/Language/kk/Countries.php | 264 +++++++++++++++ modules/Admin/Language/kk/Dashboard.php | 28 ++ modules/Admin/Language/kk/Episode.php | 225 +++++++++++++ .../Admin/Language/kk/EpisodeNavigation.php | 23 ++ modules/Admin/Language/kk/Fediverse.php | 32 ++ modules/Admin/Language/kk/Home.php | 14 + modules/Admin/Language/kk/Install.php | 61 ++++ modules/Admin/Language/kk/Navigation.php | 43 +++ modules/Admin/Language/kk/Notifications.php | 19 ++ modules/Admin/Language/kk/Page.php | 30 ++ modules/Admin/Language/kk/Pager.php | 21 ++ modules/Admin/Language/kk/Person.php | 65 ++++ modules/Admin/Language/kk/Platforms.php | 43 +++ modules/Admin/Language/kk/Podcast.php | 314 ++++++++++++++++++ .../Admin/Language/kk/PodcastNavigation.php | 42 +++ modules/Admin/Language/kk/Settings.php | 58 ++++ modules/Admin/Language/kk/Soundbite.php | 31 ++ modules/Admin/Language/kk/Validation.php | 16 + modules/Admin/Language/kk/VideoClip.php | 72 ++++ modules/Admin/Language/ko/Breadcrumb.php | 2 + modules/Admin/Language/ko/Common.php | 1 + modules/Admin/Language/ko/Episode.php | 13 +- modules/Admin/Language/ko/Platforms.php | 15 +- modules/Admin/Language/ko/Podcast.php | 4 +- .../Admin/Language/ko/PodcastNavigation.php | 11 +- modules/Admin/Language/nl/Breadcrumb.php | 2 + modules/Admin/Language/nl/Common.php | 1 + modules/Admin/Language/nl/Episode.php | 13 +- modules/Admin/Language/nl/Platforms.php | 15 +- modules/Admin/Language/nl/Podcast.php | 4 +- .../Admin/Language/nl/PodcastNavigation.php | 11 +- modules/Admin/Language/nn-NO/Breadcrumb.php | 2 + modules/Admin/Language/nn-NO/Common.php | 1 + modules/Admin/Language/nn-NO/Platforms.php | 15 +- modules/Admin/Language/nn-NO/Podcast.php | 6 +- .../Language/nn-NO/PodcastNavigation.php | 11 +- modules/Admin/Language/oc/Breadcrumb.php | 2 + modules/Admin/Language/oc/Common.php | 1 + modules/Admin/Language/oc/Episode.php | 13 +- modules/Admin/Language/oc/Platforms.php | 15 +- modules/Admin/Language/oc/Podcast.php | 4 +- .../Admin/Language/oc/PodcastNavigation.php | 11 +- modules/Admin/Language/pl/Breadcrumb.php | 2 + modules/Admin/Language/pl/Common.php | 1 + modules/Admin/Language/pl/Episode.php | 21 +- modules/Admin/Language/pl/Platforms.php | 15 +- modules/Admin/Language/pl/Podcast.php | 4 +- .../Admin/Language/pl/PodcastNavigation.php | 11 +- modules/Admin/Language/pt-BR/Breadcrumb.php | 2 + modules/Admin/Language/pt-BR/Common.php | 1 + modules/Admin/Language/pt-BR/Episode.php | 25 +- modules/Admin/Language/pt-BR/Platforms.php | 15 +- modules/Admin/Language/pt-BR/Podcast.php | 6 +- .../Language/pt-BR/PodcastNavigation.php | 11 +- modules/Admin/Language/pt/Breadcrumb.php | 2 + modules/Admin/Language/pt/Common.php | 1 + modules/Admin/Language/pt/Episode.php | 13 +- modules/Admin/Language/pt/Platforms.php | 15 +- modules/Admin/Language/pt/Podcast.php | 4 +- .../Admin/Language/pt/PodcastNavigation.php | 11 +- modules/Admin/Language/ro/Breadcrumb.php | 2 + modules/Admin/Language/ro/Common.php | 1 + modules/Admin/Language/ro/Episode.php | 13 +- modules/Admin/Language/ro/Platforms.php | 15 +- modules/Admin/Language/ro/Podcast.php | 4 +- .../Admin/Language/ro/PodcastNavigation.php | 11 +- modules/Admin/Language/ru/Breadcrumb.php | 2 + modules/Admin/Language/ru/Common.php | 1 + modules/Admin/Language/ru/Episode.php | 13 +- modules/Admin/Language/ru/Platforms.php | 15 +- modules/Admin/Language/ru/Podcast.php | 4 +- .../Admin/Language/ru/PodcastNavigation.php | 11 +- modules/Admin/Language/sk/Breadcrumb.php | 4 +- modules/Admin/Language/sk/Common.php | 1 + modules/Admin/Language/sk/Countries.php | 2 +- modules/Admin/Language/sk/Episode.php | 25 +- .../Admin/Language/sk/EpisodeNavigation.php | 4 +- modules/Admin/Language/sk/Navigation.php | 2 +- modules/Admin/Language/sk/Pager.php | 2 +- modules/Admin/Language/sk/Person.php | 2 +- modules/Admin/Language/sk/Platforms.php | 15 +- modules/Admin/Language/sk/Podcast.php | 4 +- .../Admin/Language/sk/PodcastNavigation.php | 11 +- .../Admin/Language/sr_Latn/AboutCastopod.php | 16 +- modules/Admin/Language/sr_Latn/Breadcrumb.php | 4 +- modules/Admin/Language/sr_Latn/Common.php | 1 + modules/Admin/Language/sr_Latn/Countries.php | 70 ++-- modules/Admin/Language/sr_Latn/Dashboard.php | 20 +- modules/Admin/Language/sr_Latn/Episode.php | 21 +- modules/Admin/Language/sr_Latn/Fediverse.php | 24 +- modules/Admin/Language/sr_Latn/Home.php | 4 +- modules/Admin/Language/sr_Latn/Install.php | 62 ++-- modules/Admin/Language/sr_Latn/Navigation.php | 4 +- .../Admin/Language/sr_Latn/Notifications.php | 14 +- modules/Admin/Language/sr_Latn/Pager.php | 4 +- modules/Admin/Language/sr_Latn/Platforms.php | 15 +- modules/Admin/Language/sr_Latn/Podcast.php | 122 +++---- .../Language/sr_Latn/PodcastNavigation.php | 55 +-- modules/Admin/Language/sr_Latn/Settings.php | 68 ++-- modules/Admin/Language/sr_Latn/Soundbite.php | 26 +- modules/Admin/Language/sr_Latn/Validation.php | 4 +- modules/Admin/Language/sr_Latn/VideoClip.php | 84 ++--- modules/Admin/Language/sv/Breadcrumb.php | 2 + modules/Admin/Language/sv/Common.php | 1 + modules/Admin/Language/sv/Episode.php | 21 +- modules/Admin/Language/sv/Platforms.php | 15 +- modules/Admin/Language/sv/Podcast.php | 4 +- .../Admin/Language/sv/PodcastNavigation.php | 11 +- modules/Admin/Language/uk/Breadcrumb.php | 2 + modules/Admin/Language/uk/Common.php | 1 + modules/Admin/Language/uk/Episode.php | 13 +- modules/Admin/Language/uk/Platforms.php | 15 +- modules/Admin/Language/uk/Podcast.php | 4 +- .../Admin/Language/uk/PodcastNavigation.php | 11 +- modules/Admin/Language/zh-Hans/Breadcrumb.php | 2 + modules/Admin/Language/zh-Hans/Common.php | 1 + modules/Admin/Language/zh-Hans/Episode.php | 25 +- modules/Admin/Language/zh-Hans/Platforms.php | 15 +- modules/Admin/Language/zh-Hans/Podcast.php | 6 +- .../Language/zh-Hans/PodcastNavigation.php | 11 +- modules/Auth/Language/ar/Auth.php | 1 - modules/Auth/Language/br/Auth.php | 1 - modules/Auth/Language/ca/Auth.php | 1 - modules/Auth/Language/da/Auth.php | 1 - modules/Auth/Language/de/Auth.php | 1 - modules/Auth/Language/el/Auth.php | 1 - modules/Auth/Language/es/Auth.php | 1 - modules/Auth/Language/fa/Auth.php | 1 - modules/Auth/Language/fr/Auth.php | 1 - modules/Auth/Language/fr2/Auth.php | 1 - modules/Auth/Language/fr_CA/Auth.php | 1 - modules/Auth/Language/gd/Auth.php | 1 - modules/Auth/Language/gl/Auth.php | 1 - modules/Auth/Language/id/Auth.php | 1 - modules/Auth/Language/it/Auth.php | 1 - modules/Auth/Language/ja/Auth.php | 1 - modules/Auth/Language/kk/Auth.php | 93 ++++++ modules/Auth/Language/kk/Contributor.php | 47 +++ modules/Auth/Language/kk/MyAccount.php | 18 + modules/Auth/Language/kk/User.php | 60 ++++ modules/Auth/Language/ko/Auth.php | 1 - modules/Auth/Language/nl/Auth.php | 1 - modules/Auth/Language/nn-NO/Auth.php | 101 +++--- modules/Auth/Language/nn-NO/Contributor.php | 12 +- modules/Auth/Language/nn-NO/User.php | 16 +- modules/Auth/Language/oc/Auth.php | 1 - modules/Auth/Language/pl/Auth.php | 1 - modules/Auth/Language/pt-BR/Auth.php | 1 - modules/Auth/Language/pt/Auth.php | 1 - modules/Auth/Language/ro/Auth.php | 1 - modules/Auth/Language/ru/Auth.php | 1 - modules/Auth/Language/sk/Auth.php | 1 - modules/Auth/Language/sr_Latn/Auth.php | 101 +++--- modules/Auth/Language/sr_Latn/Contributor.php | 48 +-- modules/Auth/Language/sr_Latn/MyAccount.php | 8 +- modules/Auth/Language/sr_Latn/User.php | 66 ++-- modules/Auth/Language/sv/Auth.php | 1 - modules/Auth/Language/uk/Auth.php | 1 - modules/Auth/Language/zh-Hans/Auth.php | 1 - modules/Install/Language/kk/Install.php | 62 ++++ modules/Install/Language/sr_Latn/Install.php | 64 ++-- .../Language/ar/PodcastImport.php | 6 + .../Language/br/PodcastImport.php | 6 + .../Language/ca/PodcastImport.php | 6 + .../Language/da/PodcastImport.php | 6 + .../Language/de/PodcastImport.php | 6 + .../Language/el/PodcastImport.php | 6 + .../Language/es/PodcastImport.php | 6 + .../Language/fa/PodcastImport.php | 6 + .../Language/fr/PodcastImport.php | 6 + .../Language/fr2/PodcastImport.php | 6 + .../Language/fr_CA/PodcastImport.php | 6 + .../Language/gd/PodcastImport.php | 6 + .../Language/gl/PodcastImport.php | 6 + .../Language/id/PodcastImport.php | 6 + .../Language/it/PodcastImport.php | 6 + .../Language/ja/PodcastImport.php | 6 + .../Language/kk/PodcastImport.php | 66 ++++ .../Language/ko/PodcastImport.php | 6 + .../Language/nl/PodcastImport.php | 6 + .../Language/nn-NO/PodcastImport.php | 76 +++-- .../Language/oc/PodcastImport.php | 6 + .../Language/pl/PodcastImport.php | 6 + .../Language/pt-BR/PodcastImport.php | 6 + .../Language/pt/PodcastImport.php | 6 + .../Language/ro/PodcastImport.php | 6 + .../Language/ru/PodcastImport.php | 6 + .../Language/sk/PodcastImport.php | 6 + .../Language/sr_Latn/PodcastImport.php | 76 +++-- .../Language/sv/PodcastImport.php | 6 + .../Language/uk/PodcastImport.php | 6 + .../Language/zh-Hans/PodcastImport.php | 6 + .../Language/de/Subscription.php | 2 +- .../Language/es/Subscription.php | 2 +- .../Language/fr/Subscription.php | 2 +- .../Language/gd/Subscription.php | 2 +- .../Language/kk/PremiumPodcasts.php | 34 ++ .../Language/kk/Subscription.php | 100 ++++++ .../Language/nl/Subscription.php | 2 +- .../Language/nn-NO/PremiumPodcasts.php | 36 +- .../Language/nn-NO/Subscription.php | 124 +++---- .../Language/pl/Subscription.php | 2 +- .../Language/ro/Subscription.php | 2 +- .../Language/sr_Latn/PremiumPodcasts.php | 20 +- .../Language/sr_Latn/Subscription.php | 142 ++++---- .../Language/sv/Subscription.php | 2 +- .../Language/zh-Hans/Subscription.php | 2 +- 422 files changed, 6740 insertions(+), 1506 deletions(-) create mode 100644 app/Language/kk/Comment.php create mode 100644 app/Language/kk/Common.php create mode 100644 app/Language/kk/Episode.php create mode 100644 app/Language/kk/Fediverse.php create mode 100644 app/Language/kk/Home.php create mode 100644 app/Language/kk/Page.php create mode 100644 app/Language/kk/Podcast.php create mode 100644 app/Language/kk/Post.php create mode 100644 docs/src/kk/getting-started/auth.md create mode 100644 docs/src/kk/getting-started/docker.md create mode 100644 docs/src/kk/getting-started/install.md create mode 100644 docs/src/kk/getting-started/security.md create mode 100644 docs/src/kk/getting-started/update.md create mode 100644 docs/src/kk/index.md create mode 100644 modules/Admin/Language/kk/AboutCastopod.php create mode 100644 modules/Admin/Language/kk/Breadcrumb.php create mode 100644 modules/Admin/Language/kk/Charts.php create mode 100644 modules/Admin/Language/kk/Common.php create mode 100644 modules/Admin/Language/kk/Countries.php create mode 100644 modules/Admin/Language/kk/Dashboard.php create mode 100644 modules/Admin/Language/kk/Episode.php create mode 100644 modules/Admin/Language/kk/EpisodeNavigation.php create mode 100644 modules/Admin/Language/kk/Fediverse.php create mode 100644 modules/Admin/Language/kk/Home.php create mode 100644 modules/Admin/Language/kk/Install.php create mode 100644 modules/Admin/Language/kk/Navigation.php create mode 100644 modules/Admin/Language/kk/Notifications.php create mode 100644 modules/Admin/Language/kk/Page.php create mode 100644 modules/Admin/Language/kk/Pager.php create mode 100644 modules/Admin/Language/kk/Person.php create mode 100644 modules/Admin/Language/kk/Platforms.php create mode 100644 modules/Admin/Language/kk/Podcast.php create mode 100644 modules/Admin/Language/kk/PodcastNavigation.php create mode 100644 modules/Admin/Language/kk/Settings.php create mode 100644 modules/Admin/Language/kk/Soundbite.php create mode 100644 modules/Admin/Language/kk/Validation.php create mode 100644 modules/Admin/Language/kk/VideoClip.php create mode 100644 modules/Auth/Language/kk/Auth.php create mode 100644 modules/Auth/Language/kk/Contributor.php create mode 100644 modules/Auth/Language/kk/MyAccount.php create mode 100644 modules/Auth/Language/kk/User.php create mode 100644 modules/Install/Language/kk/Install.php create mode 100644 modules/PodcastImport/Language/kk/PodcastImport.php create mode 100644 modules/PremiumPodcasts/Language/kk/PremiumPodcasts.php create mode 100644 modules/PremiumPodcasts/Language/kk/Subscription.php diff --git a/app/Language/ar/Episode.php b/app/Language/ar/Episode.php index 2363eb39..26ac5405 100644 --- a/app/Language/ar/Episode.php +++ b/app/Language/ar/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'كافة حلقات البودكاست', 'back_to_podcast' => 'العودة إلى البودكاست', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/ar/Podcast.php b/app/Language/ar/Podcast.php index fccaa0c0..22308c43 100644 --- a/app/Language/ar/Podcast.php +++ b/app/Language/ar/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'أشخاص', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/br/Episode.php b/app/Language/br/Episode.php index a8ff6012..0d2b685b 100644 --- a/app/Language/br/Episode.php +++ b/app/Language/br/Episode.php @@ -39,4 +39,16 @@ return [ }', 'all_podcast_episodes' => 'Holl rannoù ar podkast', 'back_to_podcast' => 'Mont d\'ar podkast en-dro', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/br/Podcast.php b/app/Language/br/Podcast.php index a073756f..b826b4d0 100644 --- a/app/Language/br/Podcast.php +++ b/app/Language/br/Podcast.php @@ -131,4 +131,5 @@ return [ 82 {# zen} }', 'persons_list' => 'Emellerien·ezed', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/ca/Episode.php b/app/Language/ca/Episode.php index 001ea5ac..53b95d89 100644 --- a/app/Language/ca/Episode.php +++ b/app/Language/ca/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Tots els episodis del podcast', 'back_to_podcast' => 'Tornar al podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/ca/Podcast.php b/app/Language/ca/Podcast.php index ab6cbdce..e1d664e4 100644 --- a/app/Language/ca/Podcast.php +++ b/app/Language/ca/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persones} }', 'persons_list' => 'Persones', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/da/Episode.php b/app/Language/da/Episode.php index efd43ec6..beae489c 100644 --- a/app/Language/da/Episode.php +++ b/app/Language/da/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Alle podcastepisoder', 'back_to_podcast' => 'Tilbage til podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/da/Podcast.php b/app/Language/da/Podcast.php index c453554e..d34d7bfc 100644 --- a/app/Language/da/Podcast.php +++ b/app/Language/da/Podcast.php @@ -51,4 +51,5 @@ return [ other {# personer} }', 'persons_list' => 'Personer', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/de/Episode.php b/app/Language/de/Episode.php index 793c86d1..2e2c5e6b 100644 --- a/app/Language/de/Episode.php +++ b/app/Language/de/Episode.php @@ -12,22 +12,34 @@ return [ 'season' => 'Staffel {seasonNumber}', 'season_abbr' => 'S{seasonNumber}', 'number' => 'Folge {episodeNumber}', - 'number_abbr' => 'F {episodeNumber}', - 'season_episode' => 'Staffel {seasonNumber} Folge {episodeNumber}', + 'number_abbr' => 'E {episodeNumber}', + 'season_episode' => 'Staffel {seasonNumber} Episode {episodeNumber}', 'season_episode_abbr' => 'S{seasonNumber}F{episodeNumber}', 'persons' => '{personsCount, plural, one {# Mitwirkender} other {# Mitwirkende} }', 'persons_list' => 'Mitwirkende', - 'back_to_episodes' => 'Zurück zu den Folgen von {podcast}', + 'back_to_episodes' => 'Zurück zu Episoden von {podcast}', 'comments' => 'Kommentare', 'activity' => 'Aktivitäten', - 'description' => 'Beschreibung der Folge', + 'description' => 'Beschreibung der Episode', 'number_of_comments' => '{numberOfComments, plural, one {# Kommentar} other {# Kommentare} }', 'all_podcast_episodes' => 'Alle Podcast-Folgen', 'back_to_podcast' => 'Zurück zum Podcast', + 'preview' => [ + 'title' => 'Vorschau', + 'not_published' => 'Nicht veröffentlicht', + 'text' => '{publication_status, select, + published {Diese Episode ist noch nicht veröffentlicht.} + scheduled {Diese Episode ist für die Veröffentlichung geplant am {publication_date}.} + with_podcast {Diese Episode wird zur gleichen Zeit wie der Podcast veröffentlicht.} + other {Diese Episode ist noch nicht veröffentlicht.} + }', + 'publish' => 'Veröffentlichen', + 'publish_edit' => 'Veröffentlichung bearbeiten', + ], ]; diff --git a/app/Language/de/Podcast.php b/app/Language/de/Podcast.php index 18e414b5..10f71485 100644 --- a/app/Language/de/Podcast.php +++ b/app/Language/de/Podcast.php @@ -11,12 +11,12 @@ declare(strict_types=1); return [ 'feed' => 'RSS-Feed', 'season' => 'Staffel {seasonNumber}', - 'list_of_episodes_year' => '({episodeCount}) Folgen in {year}', + 'list_of_episodes_year' => '({episodeCount}) Episoden in {year}', 'list_of_episodes_season' => - 'Staffel {seasonNumber} Folgen ({episodeCount})', - 'no_episode' => 'Keine Folge gefunden', + 'Staffel {seasonNumber} Episode ({episodeCount})', + 'no_episode' => 'Keine Episode gefunden!', 'follow' => 'Folgen', - 'followTitle' => 'Folge {actorDisplayName} im Fediversum', + 'followTitle' => 'Folge {actorDisplayName} im Fediversum!', 'followers' => '{numberOfFollowers, plural, one {# Follower} other {# Follower} @@ -28,7 +28,7 @@ return [ 'links' => 'Links', 'activity' => 'Aktivitäten', 'episodes' => 'Episoden', - 'episodes_title' => 'Folgen von {podcastTitle}', + 'episodes_title' => 'Episoden von {podcastTitle}', 'about' => 'Über', 'stats' => [ 'title' => 'Statistiken', @@ -51,4 +51,5 @@ return [ other {# Personen} }', 'persons_list' => 'Mitwirkende', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/el/Episode.php b/app/Language/el/Episode.php index d7f8ee90..846b98f1 100644 --- a/app/Language/el/Episode.php +++ b/app/Language/el/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Όλα τα επεισόδια του podcast', 'back_to_podcast' => 'Μετάβαση πίσω στο podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/el/Podcast.php b/app/Language/el/Podcast.php index 7baf119f..249dbd98 100644 --- a/app/Language/el/Podcast.php +++ b/app/Language/el/Podcast.php @@ -51,4 +51,5 @@ return [ other {# άτομα} }', 'persons_list' => 'Άτομα', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/es/Episode.php b/app/Language/es/Episode.php index ad8bb076..c4cec2e6 100644 --- a/app/Language/es/Episode.php +++ b/app/Language/es/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Todos los episodios del podcast', 'back_to_podcast' => 'Regresar al podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Sin publicar', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/es/Podcast.php b/app/Language/es/Podcast.php index f89d6809..7f788524 100644 --- a/app/Language/es/Podcast.php +++ b/app/Language/es/Podcast.php @@ -51,4 +51,5 @@ return [ other {# personas} }', 'persons_list' => 'Personas', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/fa/Episode.php b/app/Language/fa/Episode.php index 981ea9c7..4a7596e2 100644 --- a/app/Language/fa/Episode.php +++ b/app/Language/fa/Episode.php @@ -28,4 +28,16 @@ return [ }', 'all_podcast_episodes' => 'تمامی قسمت‌های پادکست', 'back_to_podcast' => 'بازگشت به پادکست', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/fa/Podcast.php b/app/Language/fa/Podcast.php index 44c1fb78..9a6a2f83 100644 --- a/app/Language/fa/Podcast.php +++ b/app/Language/fa/Podcast.php @@ -46,4 +46,5 @@ return [ other {# نفر} }', 'persons_list' => 'نفر', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/fr/Episode.php b/app/Language/fr/Episode.php index 86fa3453..7d87dee9 100644 --- a/app/Language/fr/Episode.php +++ b/app/Language/fr/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Tous les épisodes du podcast', 'back_to_podcast' => 'Revenir au podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/fr/Podcast.php b/app/Language/fr/Podcast.php index f212d564..29fbc118 100644 --- a/app/Language/fr/Podcast.php +++ b/app/Language/fr/Podcast.php @@ -51,4 +51,5 @@ return [ other {# intervenant·e·s} }', 'persons_list' => 'Intervenant·e·s', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/fr2/Episode.php b/app/Language/fr2/Episode.php index 96d6a3ca..4d778a21 100644 --- a/app/Language/fr2/Episode.php +++ b/app/Language/fr2/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Tous les épisodes du podcast', 'back_to_podcast' => 'Revenir au podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/fr2/Podcast.php b/app/Language/fr2/Podcast.php index 8a79be58..ac47801c 100644 --- a/app/Language/fr2/Podcast.php +++ b/app/Language/fr2/Podcast.php @@ -51,4 +51,5 @@ return [ other {# intervenants} }', 'persons_list' => 'Intervenants', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/fr_CA/Episode.php b/app/Language/fr_CA/Episode.php index ebe39336..44be8e38 100644 --- a/app/Language/fr_CA/Episode.php +++ b/app/Language/fr_CA/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/fr_CA/Podcast.php b/app/Language/fr_CA/Podcast.php index dbccf51b..2798fcdd 100644 --- a/app/Language/fr_CA/Podcast.php +++ b/app/Language/fr_CA/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'Persons', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/gd/Episode.php b/app/Language/gd/Episode.php index 0d4c3770..3442ad5c 100644 --- a/app/Language/gd/Episode.php +++ b/app/Language/gd/Episode.php @@ -34,4 +34,16 @@ return [ }', 'all_podcast_episodes' => 'A h-uile eapasod a’ phod-chraolaidh', 'back_to_podcast' => 'Air ais dhan phod-chraoladh', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/gd/Podcast.php b/app/Language/gd/Podcast.php index 2a93dcbe..7f0369bf 100644 --- a/app/Language/gd/Podcast.php +++ b/app/Language/gd/Podcast.php @@ -61,4 +61,5 @@ return [ other {# duine} }', 'persons_list' => 'Daoine', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/gl/Episode.php b/app/Language/gl/Episode.php index 9d228bd9..1c2b8a66 100644 --- a/app/Language/gl/Episode.php +++ b/app/Language/gl/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Tódolos episodios do podcast', 'back_to_podcast' => 'Volver ao podcast', + 'preview' => [ + 'title' => 'Vista previa', + 'not_published' => 'Sen publicar', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publicar', + 'publish_edit' => 'Editar publicación', + ], ]; diff --git a/app/Language/gl/Podcast.php b/app/Language/gl/Podcast.php index 2a98a9bf..84e71982 100644 --- a/app/Language/gl/Podcast.php +++ b/app/Language/gl/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persoas} }', 'persons_list' => 'Persoas', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/id/Episode.php b/app/Language/id/Episode.php index c64b5eb8..cfc02d19 100644 --- a/app/Language/id/Episode.php +++ b/app/Language/id/Episode.php @@ -28,4 +28,16 @@ return [ }', 'all_podcast_episodes' => 'Semua episode siniar', 'back_to_podcast' => 'Kembali ke siniar', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/id/Podcast.php b/app/Language/id/Podcast.php index 83d0b160..2e983ba8 100644 --- a/app/Language/id/Podcast.php +++ b/app/Language/id/Podcast.php @@ -46,4 +46,5 @@ return [ other {# orang} }', 'persons_list' => 'Orang', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/it/Episode.php b/app/Language/it/Episode.php index c9e96445..d06d4b18 100644 --- a/app/Language/it/Episode.php +++ b/app/Language/it/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Tutti gli episodi del podcast', 'back_to_podcast' => 'Torna a podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/it/Podcast.php b/app/Language/it/Podcast.php index 1ee5d5cf..933eb3d2 100644 --- a/app/Language/it/Podcast.php +++ b/app/Language/it/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'Persone', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/ja/Episode.php b/app/Language/ja/Episode.php index ebe39336..44be8e38 100644 --- a/app/Language/ja/Episode.php +++ b/app/Language/ja/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/ja/Podcast.php b/app/Language/ja/Podcast.php index dbccf51b..2798fcdd 100644 --- a/app/Language/ja/Podcast.php +++ b/app/Language/ja/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'Persons', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/kk/Comment.php b/app/Language/kk/Comment.php new file mode 100644 index 00000000..1dd8f5ea --- /dev/null +++ b/app/Language/kk/Comment.php @@ -0,0 +1,34 @@ + "{actorDisplayName}'s comment for {episodeTitle}", + 'back_to_comments' => 'Back to comments', + 'form' => [ + 'episode_message_placeholder' => 'Write a comment…', + 'reply_to_placeholder' => 'Reply to @{actorUsername}', + 'submit' => 'Send', + 'submit_reply' => 'Reply', + ], + 'likes' => '{numberOfLikes, plural, + one {# like} + other {# likes} + }', + 'replies' => '{numberOfReplies, plural, + one {# reply} + other {# replies} + }', + 'like' => 'Like', + 'reply' => 'Reply', + 'view_replies' => 'View replies ({numberOfReplies})', + 'block_actor' => 'Block user @{actorUsername}', + 'block_domain' => 'Block domain @{actorDomain}', + 'delete' => 'Delete comment', +]; diff --git a/app/Language/kk/Common.php b/app/Language/kk/Common.php new file mode 100644 index 00000000..1258afcc --- /dev/null +++ b/app/Language/kk/Common.php @@ -0,0 +1,30 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'close' => 'Close', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'go_back' => 'Go back', + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'read_more' => 'Read more', + 'read_less' => 'Read less', + 'see_more' => 'See more', + 'see_less' => 'See less', + 'legal_notice' => 'Legal notice', +]; diff --git a/app/Language/kk/Episode.php b/app/Language/kk/Episode.php new file mode 100644 index 00000000..44be8e38 --- /dev/null +++ b/app/Language/kk/Episode.php @@ -0,0 +1,45 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', + 'persons' => '{personsCount, plural, + one {# person} + other {# persons} + }', + 'persons_list' => 'Persons', + 'back_to_episodes' => 'Back to episodes of {podcast}', + 'comments' => 'Comments', + 'activity' => 'Activity', + 'description' => 'Episode description', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], +]; diff --git a/app/Language/kk/Fediverse.php b/app/Language/kk/Fediverse.php new file mode 100644 index 00000000..32f54c07 --- /dev/null +++ b/app/Language/kk/Fediverse.php @@ -0,0 +1,37 @@ + 'Your handle', + 'your_handle_hint' => 'Enter the @username@domain you want to act from.', + 'follow' => [ + 'label' => 'Follow', + 'title' => 'Follow {actorDisplayName}', + 'subtitle' => 'You are going to follow:', + 'accountNotFound' => 'The account could not be found.', + 'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…', + 'submit' => 'Proceed to follow', + ], + 'favourite' => [ + 'title' => "Favourite {actorDisplayName}'s post", + 'subtitle' => 'You are going to favourite:', + 'submit' => 'Proceed to favourite', + ], + 'reblog' => [ + 'title' => "Share {actorDisplayName}'s post", + 'subtitle' => 'You are going to share:', + 'submit' => 'Proceed to share', + ], + 'reply' => [ + 'title' => "Reply to {actorDisplayName}'s post", + 'subtitle' => 'You are going to reply to:', + 'submit' => 'Proceed to reply', + ], +]; diff --git a/app/Language/kk/Home.php b/app/Language/kk/Home.php new file mode 100644 index 00000000..1518239b --- /dev/null +++ b/app/Language/kk/Home.php @@ -0,0 +1,20 @@ + 'All podcasts', + 'sort_by' => 'Sort by', + 'sort_options' => [ + 'activity' => 'Recent activity', + 'created_desc' => 'Newest first', + 'created_asc' => 'Oldest first', + ], + 'no_podcast' => 'No podcast found', +]; diff --git a/app/Language/kk/Page.php b/app/Language/kk/Page.php new file mode 100644 index 00000000..7cd60669 --- /dev/null +++ b/app/Language/kk/Page.php @@ -0,0 +1,17 @@ + 'Back to home', + 'map' => [ + 'title' => 'Map', + 'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.', + ], +]; diff --git a/app/Language/kk/Podcast.php b/app/Language/kk/Podcast.php new file mode 100644 index 00000000..2798fcdd --- /dev/null +++ b/app/Language/kk/Podcast.php @@ -0,0 +1,55 @@ + 'RSS Podcast feed', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followTitle' => 'Follow {actorDisplayName} on the fediverse!', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'links' => 'Links', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'episodes_title' => 'Episodes of {podcastTitle}', + 'about' => 'About', + 'stats' => [ + 'title' => 'Stats', + 'number_of_seasons' => '{0, plural, + one {# season} + other {# seasons} + }', + 'number_of_episodes' => '{0, plural, + one {# episode} + other {# episodes} + }', + 'first_published_at' => 'First episode published on {0, date, medium}', + ], + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', + 'persons' => '{personsCount, plural, + one {# person} + other {# persons} + }', + 'persons_list' => 'Persons', + 'castopod_website' => 'Castopod (website)', +]; diff --git a/app/Language/kk/Post.php b/app/Language/kk/Post.php new file mode 100644 index 00000000..58d1cf80 --- /dev/null +++ b/app/Language/kk/Post.php @@ -0,0 +1,40 @@ + "{actorDisplayName}'s post", + 'back_to_actor_posts' => 'Back to {actor} posts', + 'actor_shared' => '{actor} shared', + 'reply_to' => 'Reply to @{actorUsername}', + 'form' => [ + 'message_placeholder' => 'Write a message…', + 'episode_message_placeholder' => 'Write a message for the episode…', + 'episode_url_placeholder' => 'Episode URL', + 'reply_to_placeholder' => 'Reply to @{actorUsername}', + 'submit' => 'Send', + 'submit_reply' => 'Reply', + ], + 'favourites' => '{numberOfFavourites, plural, + one {# favourite} + other {# favourites} + }', + 'reblogs' => '{numberOfReblogs, plural, + one {# share} + other {# shares} + }', + 'replies' => '{numberOfReplies, plural, + one {# reply} + other {# replies} + }', + 'expand' => 'Expand post', + 'block_actor' => 'Block user @{actorUsername}', + 'block_domain' => 'Block domain @{actorDomain}', + 'delete' => 'Delete post', +]; diff --git a/app/Language/ko/Episode.php b/app/Language/ko/Episode.php index ebe39336..44be8e38 100644 --- a/app/Language/ko/Episode.php +++ b/app/Language/ko/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/ko/Podcast.php b/app/Language/ko/Podcast.php index dbccf51b..2798fcdd 100644 --- a/app/Language/ko/Podcast.php +++ b/app/Language/ko/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'Persons', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/nl/Episode.php b/app/Language/nl/Episode.php index e1989a29..4ddc503c 100644 --- a/app/Language/nl/Episode.php +++ b/app/Language/nl/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Alle podcast afleveringen', 'back_to_podcast' => 'Terug naar podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/nl/Podcast.php b/app/Language/nl/Podcast.php index a5d5f61f..67d23c9a 100644 --- a/app/Language/nl/Podcast.php +++ b/app/Language/nl/Podcast.php @@ -51,4 +51,5 @@ return [ other {# personen} }', 'persons_list' => 'Personen', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/nn-NO/Podcast.php b/app/Language/nn-NO/Podcast.php index a3161457..2f5b24a1 100644 --- a/app/Language/nn-NO/Podcast.php +++ b/app/Language/nn-NO/Podcast.php @@ -51,4 +51,5 @@ return [ other {# personar} }', 'persons_list' => 'Personar', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/oc/Episode.php b/app/Language/oc/Episode.php index ebe39336..44be8e38 100644 --- a/app/Language/oc/Episode.php +++ b/app/Language/oc/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/oc/Podcast.php b/app/Language/oc/Podcast.php index dbccf51b..2798fcdd 100644 --- a/app/Language/oc/Podcast.php +++ b/app/Language/oc/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'Persons', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/pl/Episode.php b/app/Language/pl/Episode.php index 3f519cce..33e8539c 100644 --- a/app/Language/pl/Episode.php +++ b/app/Language/pl/Episode.php @@ -32,4 +32,16 @@ return [ }', 'all_podcast_episodes' => 'Wszystkie odcinki podcastu', 'back_to_podcast' => 'Wróć do podkastu', + 'preview' => [ + 'title' => 'Podgląd', + 'not_published' => 'Nieopublikowany', + 'text' => '{publication_status, select, + published {Ten odcinek nie jest jeszcze opublikowany.} + scheduled {Ten odcinek jest zaplanowany do publikacji {publication_date}.} + with_podcast {Ten odcinek zostanie opublikowany w tym samym czasie co podcast.} + other {Ten odcinek nie jest jeszcze opublikowany.} + }', + 'publish' => 'Opublikuj', + 'publish_edit' => 'Edytuj publikację', + ], ]; diff --git a/app/Language/pl/Podcast.php b/app/Language/pl/Podcast.php index e36b92de..dfaed970 100644 --- a/app/Language/pl/Podcast.php +++ b/app/Language/pl/Podcast.php @@ -28,7 +28,7 @@ return [ other {# osób} }', 'links' => 'Links', - 'activity' => 'Aktywność', + 'activity' => 'Wpisy', 'episodes' => 'Odcinki', 'episodes_title' => 'Odcinki {podcastTitle}', 'about' => 'Informacje', @@ -56,4 +56,5 @@ return [ other {# osób} }', 'persons_list' => 'Osoby', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/pt-BR/Episode.php b/app/Language/pt-BR/Episode.php index 3dc334f2..a7fd80b3 100644 --- a/app/Language/pt-BR/Episode.php +++ b/app/Language/pt-BR/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Todos os episódios de podcast', 'back_to_podcast' => 'Voltar para o podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/pt-BR/Podcast.php b/app/Language/pt-BR/Podcast.php index 4f9c6954..a27e6c46 100644 --- a/app/Language/pt-BR/Podcast.php +++ b/app/Language/pt-BR/Podcast.php @@ -51,4 +51,5 @@ return [ other {# pessoas} }', 'persons_list' => 'Pessoas', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/pt/Episode.php b/app/Language/pt/Episode.php index ebe39336..44be8e38 100644 --- a/app/Language/pt/Episode.php +++ b/app/Language/pt/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/pt/Podcast.php b/app/Language/pt/Podcast.php index dbccf51b..2798fcdd 100644 --- a/app/Language/pt/Podcast.php +++ b/app/Language/pt/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'Persons', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/ro/Episode.php b/app/Language/ro/Episode.php index b59401f3..6dc7595b 100644 --- a/app/Language/ro/Episode.php +++ b/app/Language/ro/Episode.php @@ -32,4 +32,16 @@ return [ }', 'all_podcast_episodes' => 'Toate episoadele podcastului', 'back_to_podcast' => 'Înapoi la podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/ro/Podcast.php b/app/Language/ro/Podcast.php index c21e4404..5752d1eb 100644 --- a/app/Language/ro/Podcast.php +++ b/app/Language/ro/Podcast.php @@ -56,4 +56,5 @@ return [ other {# persoane} }', 'persons_list' => 'Persoane', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/ru/Episode.php b/app/Language/ru/Episode.php index e97ac452..3811bf49 100644 --- a/app/Language/ru/Episode.php +++ b/app/Language/ru/Episode.php @@ -34,4 +34,16 @@ return [ }', 'all_podcast_episodes' => 'Все выпуски подкаста', 'back_to_podcast' => 'Вернуться к подкасту', + 'preview' => [ + 'title' => 'Предпросмотр', + 'not_published' => 'Не опубликовано', + 'text' => '{publication_status, select, + published {Этот эпизод еще не опубликован.} + scheduled {Этот эпизод запланирован на {publication_date}.} + with_podcast {Этот эпизод будет опубликован одновременно с подкастом.} + other {Этот эпизод еще не опубликован.} + }', + 'publish' => 'Опубликовать', + 'publish_edit' => 'Редактировать публикацию', + ], ]; diff --git a/app/Language/ru/Podcast.php b/app/Language/ru/Podcast.php index 65a2701d..d48e9309 100644 --- a/app/Language/ru/Podcast.php +++ b/app/Language/ru/Podcast.php @@ -53,4 +53,5 @@ return [ other {# человек} }', 'persons_list' => 'Лица', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/sk/Episode.php b/app/Language/sk/Episode.php index d8fe8759..3f441fd7 100644 --- a/app/Language/sk/Episode.php +++ b/app/Language/sk/Episode.php @@ -34,4 +34,16 @@ return [ }', 'all_podcast_episodes' => 'Všetky epizódy podcastu', 'back_to_podcast' => 'Späť na podcast', + 'preview' => [ + 'title' => 'Náhľad', + 'not_published' => 'Nezverejnená', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Zverejniť', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/sk/Podcast.php b/app/Language/sk/Podcast.php index 7cd79c57..121cecc6 100644 --- a/app/Language/sk/Podcast.php +++ b/app/Language/sk/Podcast.php @@ -29,7 +29,7 @@ return [ many {# príspevkov} other {# príspevkov} }', - 'links' => 'Links', + 'links' => 'Odkazy', 'activity' => 'Aktivita', 'episodes' => 'Časti', 'episodes_title' => 'Časti {podcastTitle}', @@ -61,4 +61,5 @@ return [ other {# osobností} }', 'persons_list' => 'Osobnosti', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/sr_Latn/Episode.php b/app/Language/sr_Latn/Episode.php index cd15419b..a688adb1 100644 --- a/app/Language/sr_Latn/Episode.php +++ b/app/Language/sr_Latn/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Sve epizode podkasta', 'back_to_podcast' => 'Nazad na podkast', + 'preview' => [ + 'title' => 'Pregled', + 'not_published' => 'Neobjavljeno', + 'text' => '{publication_status, select, + published {Ova epizoda još uvek nije objavljena.} + scheduled {Ova epizoda je zakazana za {publication_date}.} + with_podcast {Ova epizoda će biti objavljena kad i podkast.} + other {Ova epizoda još uvek nije objavljena.} + }', + 'publish' => 'Objavi', + 'publish_edit' => 'Uredi objavu', + ], ]; diff --git a/app/Language/sr_Latn/Fediverse.php b/app/Language/sr_Latn/Fediverse.php index 93c5e1ad..cfa3c4cc 100644 --- a/app/Language/sr_Latn/Fediverse.php +++ b/app/Language/sr_Latn/Fediverse.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'your_handle' => 'Your handle', + 'your_handle' => 'Tvoj nadimak', 'your_handle_hint' => 'Unesite @username@domain koji želite da koristite.', 'follow' => [ 'label' => 'Prati', diff --git a/app/Language/sr_Latn/Podcast.php b/app/Language/sr_Latn/Podcast.php index 2dc4000c..21638abc 100644 --- a/app/Language/sr_Latn/Podcast.php +++ b/app/Language/sr_Latn/Podcast.php @@ -25,7 +25,7 @@ return [ few {# objave} other {# objava} }', - 'links' => 'Links', + 'links' => 'Linkovi', 'activity' => 'Aktivnost', 'episodes' => 'Epizode', 'episodes_title' => 'Epizode {podcastTitle}', @@ -51,4 +51,5 @@ return [ other {# osobe} }', 'persons_list' => 'Ličnosti', + 'castopod_website' => 'Castopod (veb stranica)', ]; diff --git a/app/Language/sv/Episode.php b/app/Language/sv/Episode.php index 3571750c..61c205bd 100644 --- a/app/Language/sv/Episode.php +++ b/app/Language/sv/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => 'Alla podcast avsnitt', 'back_to_podcast' => 'Gå tillbaka till podcasten', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/sv/Podcast.php b/app/Language/sv/Podcast.php index 7cfc658a..fd2d786b 100644 --- a/app/Language/sv/Podcast.php +++ b/app/Language/sv/Podcast.php @@ -51,4 +51,5 @@ return [ other {# personer} }', 'persons_list' => 'Personer', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/uk/Comment.php b/app/Language/uk/Comment.php index c5c8b4eb..f3abd93e 100644 --- a/app/Language/uk/Comment.php +++ b/app/Language/uk/Comment.php @@ -18,10 +18,10 @@ return [ 'submit_reply' => 'Відповісти', ], 'likes' => '{numberOfLikes, plural, - one {# лайк} - few {# подобається} - many {# подобається} - other {# подобається} + one {# вподобайка} + few {# вподобань} + many {# вподобань} + other {# вподобань} }', 'replies' => '{numberOfReplies, plural, one {# коментар} diff --git a/app/Language/uk/Episode.php b/app/Language/uk/Episode.php index 33c715d4..dd5b0b35 100644 --- a/app/Language/uk/Episode.php +++ b/app/Language/uk/Episode.php @@ -34,4 +34,16 @@ return [ }', 'all_podcast_episodes' => 'Всі серії подкастів', 'back_to_podcast' => 'Повернутися до подкасту', + 'preview' => [ + 'title' => 'Переглянути', + 'not_published' => 'Не опубліковано', + 'text' => '{publication_status, select, + published {Цей епізод ще не опублікований.} + scheduled {Цей епізод запланований на публікацію {publication_date}.} + with_podcast {Цей епізод буде опублікований одночасно з подкастом.} + other {Цей епізод ще не опублікований.} + }', + 'publish' => 'Опублікувати', + 'publish_edit' => 'Редагувати публікацію', + ], ]; diff --git a/app/Language/uk/Home.php b/app/Language/uk/Home.php index 1518239b..7d05f1c6 100644 --- a/app/Language/uk/Home.php +++ b/app/Language/uk/Home.php @@ -9,12 +9,12 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'sort_by' => 'Sort by', + 'all_podcasts' => 'Усі подкасти', + 'sort_by' => 'Сортувати за', 'sort_options' => [ - 'activity' => 'Recent activity', - 'created_desc' => 'Newest first', - 'created_asc' => 'Oldest first', + 'activity' => 'Попередня активність', + 'created_desc' => 'Спочатку нові', + 'created_asc' => 'Спочатку старі', ], - 'no_podcast' => 'No podcast found', + 'no_podcast' => 'Подкастів не знайдено', ]; diff --git a/app/Language/uk/Page.php b/app/Language/uk/Page.php index 7cd60669..7f14b287 100644 --- a/app/Language/uk/Page.php +++ b/app/Language/uk/Page.php @@ -9,9 +9,9 @@ declare(strict_types=1); */ return [ - 'back_to_home' => 'Back to home', + 'back_to_home' => 'Повернутися на головну', 'map' => [ - 'title' => 'Map', - 'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.', + 'title' => 'Мапа', + 'description' => 'Відкрийте для себе епізоди подкастів на {siteName}, які розміщуються на карті! Подорожуйте по карті та прослуховуйте епізоди, що розповідають про конкретні місця.', ], ]; diff --git a/app/Language/uk/Podcast.php b/app/Language/uk/Podcast.php index dbccf51b..2798fcdd 100644 --- a/app/Language/uk/Podcast.php +++ b/app/Language/uk/Podcast.php @@ -51,4 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'Persons', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/zh-Hans/Episode.php b/app/Language/zh-Hans/Episode.php index 778837dd..9b084e77 100644 --- a/app/Language/zh-Hans/Episode.php +++ b/app/Language/zh-Hans/Episode.php @@ -30,4 +30,16 @@ return [ }', 'all_podcast_episodes' => '所有播客剧集', 'back_to_podcast' => '返回播客', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], ]; diff --git a/app/Language/zh-Hans/Podcast.php b/app/Language/zh-Hans/Podcast.php index 1731418d..a16e73b2 100644 --- a/app/Language/zh-Hans/Podcast.php +++ b/app/Language/zh-Hans/Podcast.php @@ -51,4 +51,5 @@ return [ other {# 人} }', 'persons_list' => '人', + 'castopod_website' => 'Castopod (website)', ]; diff --git a/docs/src/ar/getting-started/install.md b/docs/src/ar/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/ar/getting-started/install.md +++ b/docs/src/ar/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/br/getting-started/install.md b/docs/src/br/getting-started/install.md index 3826a9a7..6e12eb88 100644 --- a/docs/src/br/getting-started/install.md +++ b/docs/src/br/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/ca/getting-started/install.md b/docs/src/ca/getting-started/install.md index 217ebd85..c6dc8994 100644 --- a/docs/src/ca/getting-started/install.md +++ b/docs/src/ca/getting-started/install.md @@ -20,15 +20,15 @@ Si preferiu utilitzar Docker, podeu ometre això i anar directament a la ## Requisits -- PHP v8.1 only +- PHP v8.1 or higher - MySQL versió 5.7 o superior o MariaDB versió 10.2 o superior - Support d'HTTPS - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -126,6 +126,23 @@ manually based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/da/getting-started/install.md b/docs/src/da/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/da/getting-started/install.md +++ b/docs/src/da/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/de/getting-started/docker.md b/docs/src/de/getting-started/docker.md index 3f119d4e..814d0177 100644 --- a/docs/src/de/getting-started/docker.md +++ b/docs/src/de/getting-started/docker.md @@ -1,5 +1,5 @@ --- -title: Official Docker images +title: Offizielle Docker Images sidebarDepth: 3 --- @@ -112,7 +112,7 @@ kann als Cache-Handler hinzugefügt werden. ## Umgebungsvariablen -- **castopod/castopod** and **castopod/app** +- **castopod/castopod** und **castopod/app** | Variablennamen | Typ (`Standard`) | Standardwert | | ------------------------------------- | ----------------------- | ----------------- | diff --git a/docs/src/de/getting-started/install.md b/docs/src/de/getting-started/install.md index 576b1eb9..3625a9aa 100644 --- a/docs/src/de/getting-started/install.md +++ b/docs/src/de/getting-started/install.md @@ -20,15 +20,16 @@ direkt zur [Docker-Dokumentation](./docker.md) für Castopod gehen. ## Voraussetzungen -- PHP v8.1 only +- PHP v8.1 oder höher - MySQL Version 5.7 oder höher oder MariaDB Version 10.2 oder höher - HTTPS-Unterstützung - Eine [ntp-synchronisierte Uhr](https://wiki.debian.org/NTP) um die eingehenden Anfragen zu überprüfen -### PHP v8.1 only +### PHP v8.1 oder höher -PHP version 8.1 is required, with the following extensions installed: +PHP Version 8.1 oder höher ist erforderlich, mit folgenden Erweiterungen +installiert: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -85,54 +86,72 @@ nicht installiert: %s: ### Voraussetzungen -0. Get a Web Server with [requirements](#requirements) installed -1. Create a MySQL database for Castopod with a user having access and - modification privileges (for more info, see - [MySQL compatible database](#mysql-compatible-database)). -2. Activate HTTPS on your domain with an _SSL certificate_. -3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto - the web server if you haven’t already. - - ⚠️ Set the web server document root to the `public/` sub-folder within the - `castopod` folder. -4. Add **cron tasks** on your web server for various background processes - (replace the paths accordingly): +0. Treib einen Webserver mit den [Voraussetzungen](#requirements) auf +1. Erstellen Sie eine MySQL-Datenbank für Castopod mit einem Benutzer mit + Zugriffsrechten und Modifikationsberechtigungen (für weitere Infos, Siehe + [MySQL kompatible Datenbank](#mysql-compatible-database)). +2. Aktivieren Sie HTTPS auf Ihrer Domain mit einem _SSL Zertifikat_. +3. Lade und entpacke das letzte [Castopod Packet](https://castopod.org/) auf den + Webserver, wenn nicht schon geschehen. + - ⚠️ Setzte das Webserver Document root auf das `public/` Unterverzeichnis + innerhalb des `castopod` Ordners. +4. Füge **cron tasks** auf deinem Webserver hinzu für verschiedene + Hintergrundprozesse (ersetze die Pfade entsprechend): ```bash * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 ``` - **Note** - If you do not add this cron task, the following Castopod features - will not work: + **Hinweis** - Wenn Sie diese Cron-Aufgabe nicht hinzufügen, funktionieren die + folgenden Castopod-Funktionen nicht: - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + - Einen Podcast aus einem vorhandenen RSS-Feed importieren + - Sende soziale Aktivitäten an deine Follower im Fediversum + - Übertragungen von Episoden zu open hubs mit + [WebSub-](https://en.wikipedia.org/wiki/WebSub) + - Generieren von Videoclips - + [benötigt FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) -### (recommended) Install Wizard +### (empfohlen) Installations-Assistent -1. Run the Castopod install script by going to the install wizard page - (`https://your_domain_name.com/cp-install`) in your favorite web browser. -2. Follow the instructions on your screen. -3. Start podcasting! +1. Führen Sie das Castopod Installationsskript aus, indem Sie auf die + Installations-Seite (`https://your_domain_name.com/cp-install`) in Ihrem + bevorzugten Webbrowser gehen. +2. Folge der Anleitung auf dem Bildschirm. +3. Podcasting starten! ::: info Note -The install script writes a `.env` file in the package root. If you cannot go -through the install wizard, you can create and edit the `.env` file manually -based on the `.env.example` file. +Das Installationsskript schreibt eine `.env` Datei im Paket-Root. Wenn Sie nicht +durch den Installations-Assistenten kommen, können Sie die `.env` Datei manuell +erstellen und bearbeiten basierend auf der `.env.example` Datei. ::: -### Email/SMTP setup +### Using CLI -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: -You may add your email configuration in your instance's `.env` like so: + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP Setup + +E-Mail-Konfiguration ist erforderlich, damit einige Funktionen ordnungsgemäß +funktionieren (zB. das Abrufen Ihres vergessenen Passworts, das Senden von +Anweisungen an Premium-Abonnenten, …) + +Sie können Ihre E-Mail-Konfiguration in `.env` Ihrer Instanz einfügen: ```ini # […] @@ -145,23 +164,23 @@ email.SMTPUser="your_smtp_user" email.SMTPPass="your_smtp_password" ``` -#### Email config options +#### E-Mail-Konfigurationsoptionen -| Variable name | Type | Default | -| ---------------- | -------------------- | ------------ | -| **`fromEmail`** | string | `undefined` | -| **`fromName`** | string | `"Castopod"` | -| **`SMTPHost`** | string | `undefined` | -| **`SMTPUser`** | string | `undefined` | -| **`SMTPPass`** | string | `undefined` | -| **`SMTPPort`** | number | `25` | -| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +| Variablennamen | Typ | Voreinstellung | +| ---------------- | -------------------- | -------------- | +| **`fromEmail`** | string | `undefined` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `undefined` | +| **`SMTPUser`** | string | `undefined` | +| **`SMTPPass`** | string | `undefined` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | ### Media storage -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: +Standardmäßig werden Dateien im Ordner `public/media` über das Dateisystem +gespeichert. Wenn Sie den Ordner `media` an einen anderen Ort verlegen müssen, +können Sie es in Ihrer `.env` Datei angeben wie unten gezeigt: ```ini # […] @@ -170,13 +189,14 @@ media.root="media" media.storage="/mnt/storage" ``` -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. +In diesem Beispiel werden die Dateien im Ordner /mnt/storage/media gespeichert. +Stellen Sie sicher, dass Sie auch Ihre Webserver-Konfiguration aktualisieren, um +diese Änderung wiederzugeben. ### S3 -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: +Wenn Sie Ihre Mediendateien lieber auf einem S3-kompatiblen Speicher speichern +möchten, können Sie dies in Ihrer `.env` spezifizieren: ```ini # […] @@ -188,34 +208,34 @@ media.s3.secret="your_s3_secret" media.s3.region="your_s3_region" ``` -#### S3 config options +#### S3 Konfigurationsoptionen -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | +| Variablennamen | Typ | Voreinstellung | +| ----------------------- | ------- | -------------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | -## Community packages +## Community-Pakete -If you don't want to bother with installing Castopod manually, you may use one -of the packages created and maintained by the open-source community. +Wenn Sie Castopod nicht manuell installieren wollen, können Sie eines der von +der Open-Source-Community erstellten und betreuten Pakete verwenden. -### Install with YunoHost +### Installieren mit YunoHost -[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux -made up of free and open-source software packages. It manages the hardships of -self-hosting for you. +[YunoHost](https://yunohost.org/) ist eine auf Debian GNU/Linux basierende +Distribution, die aus freien und Open-Source-Software-Paketen besteht. Es +kümmert sich um den Aufwand von self-hosting für dich.
    - Install Castopod with YunoHost + Installiere Castopod mit YunoHost + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/kk/getting-started/docker.md b/docs/src/kk/getting-started/docker.md new file mode 100644 index 00000000..75158bd6 --- /dev/null +++ b/docs/src/kk/getting-started/docker.md @@ -0,0 +1,158 @@ +--- +title: Official Docker images +sidebarDepth: 3 +--- + +# Official Docker images + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle + with all of Castopod dependencies +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an + Nginx configuration for Castopod + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +1. Install [docker](https://docs.docker.com/get-docker/) and + [docker-compose](https://docs.docker.com/compose/install/) +2. Create a `docker-compose.yml` file with the following: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for TLS (SSL/HTTPS) + + TLS is mandatory for ActivityPub to work. This job can easily be handled by + a reverse proxy, for example with [Caddy](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +4. Run `docker-compose up -d`, wait for it to initialize and head on to + `https://castopod.example.com/cp-install` to finish setting up Castopod! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + | **`CP_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/kk/getting-started/install.md b/docs/src/kk/getting-started/install.md new file mode 100644 index 00000000..cdea18ec --- /dev/null +++ b/docs/src/kk/getting-started/install.md @@ -0,0 +1,238 @@ +--- +title: Installation +sidebarDepth: 3 +--- + +# How to install Castopod? + +Castopod was thought-out to be easy to install. Whether using dedicated or +shared hosting, you can install it on most PHP-MySQL compatible web servers. + +::: tip Note + +We've released official Docker images for Castopod! + +If you prefer using Docker, you may skip this and go straight to the +[docker documentation](./docker.md) for Castopod. + +::: + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +PHP version 8.1 or higher is required, with the following extensions installed: + +- [intl](https://php.net/manual/en/intl.requirements.php) +- [libcurl](https://php.net/manual/en/curl.requirements.php) +- [mbstring](https://php.net/manual/en/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, + **PNG** and **WEBP** libraries. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +::: warning Warning + +Castopod only works with supported MySQL 5.7 or higher compatible databases. It +will break with the previous MySQL v5.6 for example as its end of life was on +February 5, 2021. + +::: + +You will need the server hostname, database name, username and password to +complete the installation process. If you do not have these, please contact your +server administrator. + +#### Privileges + +User must have at least these privileges on the database for Castopod to work: +`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, +`REFERENCES`, `CREATE VIEW`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you +want to generate Video Clips. The following extensions must be installed: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +0. Get a Web Server with [requirements](#requirements) installed +1. Create a MySQL database for Castopod with a user having access and + modification privileges (for more info, see + [MySQL compatible database](#mysql-compatible-database)). +2. Activate HTTPS on your domain with an _SSL certificate_. +3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto + the web server if you haven’t already. + - ⚠️ Set the web server document root to the `public/` sub-folder within the + `castopod` folder. +4. Add **cron tasks** on your web server for various background processes + (replace the paths accordingly): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +1. Run the Castopod install script by going to the install wizard page + (`https://your_domain_name.com/cp-install`) in your favorite web browser. +2. Follow the instructions on your screen. +3. Start podcasting! + +::: info Note + +The install script writes a `.env` file in the package root. If you cannot go +through the install wizard, you can create and edit the `.env` file manually +based on the `.env.example` file. + +::: + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +You may add your email configuration in your instance's `.env` like so: + +```ini +# […] + +email.fromEmail="your_email_address" +email.SMTPHost="your_smtp_host" +email.SMTPUser="your_smtp_user" +email.SMTPPass="your_smtp_password" +``` + +#### Email config options + +| Variable name | Type | Default | +| ---------------- | -------------------- | ------------ | +| **`fromEmail`** | string | `undefined` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `undefined` | +| **`SMTPUser`** | string | `undefined` | +| **`SMTPPass`** | string | `undefined` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. + +### Install with YunoHost + +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you. + + diff --git a/docs/src/kk/getting-started/security.md b/docs/src/kk/getting-started/security.md new file mode 100644 index 00000000..e205698d --- /dev/null +++ b/docs/src/kk/getting-started/security.md @@ -0,0 +1,26 @@ +--- +title: Security +--- + +# Security concerns + +Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP +framework that encourages +[good security practices](https://codeigniter.com/user_guide/concepts/security.html). + +To maximize your instance's safety and prevent any malicious attack, we +recommend you update all your Castopod files permissions after installation or +updates (to avoid any prior permission error): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/kk/getting-started/update.md b/docs/src/kk/getting-started/update.md new file mode 100644 index 00000000..98e019fb --- /dev/null +++ b/docs/src/kk/getting-started/update.md @@ -0,0 +1,109 @@ +--- +title: Update +sidebarDepth: 3 +--- + +# How to update Castopod? + +After installing Castopod, you may want to update your instance to the latest +version in order to enjoy the latest features ✨, bug fixes 🐛 and performance +improvements ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version + + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives + + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). + + ::: + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```bash + php spark castopod:database-update + ``` + +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `public/media`. + +2. Go through each release update instructions sequentially (from oldest to + newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +We advise you do, so you don't lose everything if anything goes wrong! + +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/kk/index.md b/docs/src/kk/index.md new file mode 100644 index 00000000..42ec8ed0 --- /dev/null +++ b/docs/src/kk/index.md @@ -0,0 +1,299 @@ +--- +sidebarDepth: 2 +--- + +# Welcome 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + +
    + Install +
    + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivation + +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. + +It is in fact one of the only media to have stayed this way for a long time. + +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. + +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. + +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. + +## Comparison with other solutions + +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. + +### Castopod vs Wordpress + +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. + +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. + +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. + +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. + +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwhale + +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. + +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod can be self-hosted and is the only solution that allows you to keep + full control over what you produce. Also, as it is open-source, you can even + customize it as you wish. + +- Castopod is the only solution that currently integrates both a decentralized + social network with ActivityPub as well as many of the podcasting 2.0 + features, hoping to bridge the gap between the two. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. + +### Contributing guide + +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔
    Bastien Luneteau
    Bastien Luneteau

    💻 🐛
    Cécile Ricordeau
    Cécile Ricordeau

    🎨
    Patryk Miś
    Patryk Miś

    🌍
    Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔
    Sebastian Janik
    Sebastian Janik

    💻
    Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻
    denis d
    denis d

    🐛 🤔
    Douglas Kastle
    Douglas Kastle

    🐛 🤔
    cExplorer
    cExplorer

    🐛 🌍
    ImaCrea
    ImaCrea

    🐛 🤔
    Jonas S
    Jonas S

    💻
    LEFEBVRE Yann
    LEFEBVRE Yann

    🐛
    Sebastian Späth
    Sebastian Späth

    🐛 🤔
    rocky III
    rocky III

    🐛
    Hermann Josef Eckl
    Hermann Josef Eckl

    🐛
    Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔
    João Leandro
    João Leandro

    🌍 🤔
    Angelos Chouvardas
    Angelos Chouvardas

    🌍
    Eivind
    Eivind

    🌍
    Ewen
    Ewen

    🌍 🤔
    forght
    forght

    🌍
    glottis0q
    glottis0q

    🌍
    ButterflyOfFire
    ButterflyOfFire

    🌍
    Lucian I. Last
    Lucian I. Last

    🌍
    LuuzViir
    LuuzViir

    🌍
    CTHTC
    CTHTC

    🌍
    Russian Retro
    Russian Retro

    🌍
    Marek L'ach
    Marek L'ach

    🌍
    GunChleoc
    GunChleoc

    🌍
    GabiSnow
    GabiSnow

    🌍
    bendaha
    bendaha

    🌍
    Samuel Roland
    Samuel Roland

    🌍
    Dimitri Regnier
    Dimitri Regnier

    🤔
    irithys
    irithys

    🌍
    Sergi
    Sergi

    🌍
    ghose (XoseM)
    ghose (XoseM)

    🌍
    Andreas Olsson
    Andreas Olsson

    🌍
    leonfrom
    leonfrom

    🌍
    agentcobra
    agentcobra

    🌍
    Alessandro
    Alessandro

    🌍
    liimee
    liimee

    🌍
    Ahmed Sabouni
    Ahmed Sabouni

    🌍
    KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻
    + + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
    + Ad Aures Logo + NLnet Logo +
    + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/ko/getting-started/install.md b/docs/src/ko/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/ko/getting-started/install.md +++ b/docs/src/ko/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/nl/getting-started/install.md +++ b/docs/src/nl/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/nn-NO/getting-started/auth.md b/docs/src/nn-NO/getting-started/auth.md index ff5d59c0..7cd0073d 100644 --- a/docs/src/nn-NO/getting-started/auth.md +++ b/docs/src/nn-NO/getting-started/auth.md @@ -1,87 +1,87 @@ --- -title: Authentication & Authorization +title: Godkjenning & Autorisasjon sidebarDepth: 3 --- -# Authentication & Authorization +# Godkjenning & Autorisasjon -Castopod handles authentication and authorization using `codeigniter/shield` -coupled with custom rules. Roles and permissions are defined at two levels: +Castopod tek seg av godkjenning og autorisasjon med `codeigniter/shield` saman +med nokre eigne reglar. Roller og løyve er definerte på to nivå: -1. [instance wide](#1-instance-wide-roles-and-permissions) -2. [per podcast](#2-per-podcast-roles-and-permissions) +1. [for heile nettstaden](#1-instance-wide-roles-and-permissions) +2. [for kvar podkast](#2-per-podcast-roles-and-permissions) -## 1. Instance wide roles and permissions +## 1. Roller og løyve for heile nettstaden -### Instance roles +### Roller på nettstaden -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| rolle | skildring | løyve | +| ----------- | -------------------------------- | ------------------------------------------------------------------------------------------ | +| Superstyrar | Har full kontroll over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Leiar | Styrer innhaldet på Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podkastar | Vanlege Castopod-brukarar. | admin.tilgang | -### Instance permissions +### Løyve på nettstaden -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| løyve | skildring | +| ----------------------- | ---------------------------------------------------------------------- | +| admin.access | Kan bruka styringspanelet for Castopod. | +| admin.settings | Kan få tilgang til innstillingane for Castopod. | +| users.manage | Kan handtera Castopod-brukarar. | +| persons.manage | Kan handtera folk. | +| pages.manage | Kan handtera sider. | +| podcasts.view | Kan sjå alle podkastane. | +| podcasts.create | Kan laga nye podkastar. | +| podcasts.import | Kan importera podkastar. | +| fediverse.manage-blocks | Kan blokkera folk og domene på allheimen frå å samhandla med Castopod. | -## 2. Per podcast roles and permissions +## 2. Roller og løyve pr. podkast -### Per podcast roles +### Roller pr. podkast -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| rolle | skildring | løyve | +| ------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrator | Har full kontroll over podkasten #{id}. | \* | +| Redaktør | Styrer innhald og publisering for podkasten #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Skapar | Styrer innhald for podkasten #{id}, men kan ikkje publisera dei. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gjest | Vanleg bidragsytar til podkasten #{id}. | view, episodes.view | -### Per podcast permissions +### Løyve pr. podkast -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| løyve | description | +| ---------------------------- | ------------------------------------------------------------------ | +| view | Kan sjå styringspanelet og analysedata for podkasten #{id}. | +| edit | Kan redigera podkasten #{id}. | +| delete | Kan sletta podkasten #{id}. | +| manage-import | Kan synkronisera den importerte podkasten #{id}. | +| manage-persons | Kan handtera abonnement for podkasten #{id}. | +| manage-subscriptions | Kan handtera abonnement for podkasten #{id}. | +| manage-contributors | Kan handtera bidragsytarar for podkasten #{id}. | +| manage-platforms | Kan oppretta og fjerna plattformlenkjer for podkasten #{id}. | +| manage-publications | Kan publisera podkasten #{id}. | +| manage-notifications | Kan lesa og merka varsel som lesne for podkasten #{id}. | +| interact-as | Kan merka podkasten #{id} som favoritt, dela og svara på innlegg. | +| episodes.view | Kan sjå styringspanelet og analysedata for podkasten #{id}. | +| episodes.create | Kan laga epoisodar for podkasten #{id}. | +| episodes.edit | Kan redigera podkasten #{id}. | +| episodes.delete | Kan sletta podkasten #{id}. | +| episodes.manage-persons | Kan handtera abonnement for podkasten #{id}. | +| episodes.manage-clips | Kan handtera film- og lydklypp av podkasten #{id}. | +| episodes.manage-publications | Kan publisera podkasten #{id}. | +| episodes.manage-comments | Kan skriva og sletta kommentarar til episodane av podkasten #{id}. | diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/nn-NO/getting-started/docker.md index 102aab79..f23732e0 100644 --- a/docs/src/nn-NO/getting-started/docker.md +++ b/docs/src/nn-NO/getting-started/docker.md @@ -112,48 +112,48 @@ Redis-database for å handtera mellomlagring. - **castopod/castopod** og **castopod/app** - | Variabelnamn | Type (`standard`) | Standardval | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | streng | `udefinert` | - | **`CP_MEDIA_BASEURL`** | ?streng | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?streng | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | - | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | - | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | - | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | - | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | - | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | - | **`CP_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | - | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | - | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | - | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` eller `"ssl"`] | `"tls"` | - | **`CP_ENABLE_2FA`** | ?boolsk | `udefinert` | - | **`CP_MEDIA_FILE_MANAGER`** | ?streng | `udefinert` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?streng | `udefinert` | - | **`CP_MEDIA_S3_KEY`** | ?streng | `udefinert` | - | **`CP_MEDIA_S3_SECRET`** | ?streng | `udefinert` | - | **`CP_MEDIA_S3_REGION`** | ?streng | `udefinert` | - | **`CP_MEDIA_S3_BUCKET`** | ?streng | `udefinert` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?tal | `udefinert` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolsk | `udefinert` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?streng | `udefinert` | - | **`CP_DISABLE_HTTPS`** | ?[`0` eller `1`] | `udefinert` | - | **`CP_MAX_BODY_SIZE`** | ?tal (med suffiks) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?tal (med suffiks) | `512M` | - | **`CP_TIMEOUT`** | ?tal | `900` | + | Variabelnamn | Type (`standard`) | Standardval | + | ------------------------------------- | -------------------------- | ---------------- | + | **`CP_BASEURL`** | streng | `udefinert` | + | **`CP_MEDIA_BASEURL`** | ?streng | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?streng | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?streng | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | streng | `udefinert` | + | **`CP_DATABASE_HOSTNAME`** | ?streng | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?streng | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?streng | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?streng | `MYSQL_PASSORD` | + | **`CP_DATABASE_PREFIX`** | ?streng | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` eller `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?streng | `"localhost"` | + | **`CP_REDIS_PASSORD`** | ?streng | `tom` | + | **`CP_REDIS_PORT`** | ?tal | `6379` | + | **`CP_REDIS_DATABASE`** | ?tal | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?streng | `udefinert` | + | **`CP_EMAIL_FROM`** | ?streng | `udefinert` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?streng | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?streng | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?tal | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` eller `"ssl"`] | `"tls"` | + | **`CP_ENABLE_2FA`** | ?boolsk | `udefinert` | + | **`CP_MEDIA_FILE_MANAGER`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_KEY`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_SECRET`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_REGION`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_BUCKET`** | ?streng | `udefinert` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?tal | `udefinert` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolsk | `udefinert` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?streng | `udefinert` | + | **`CP_DISABLE_HTTPS`** | ?[`0` eller `1`] | `udefinert` | + | **`CP_MAX_BODY_SIZE`** | ?tal (med suffiks) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?tal (med suffiks) | `512M` | + | **`CP_TIMEOUT`** | ?tal | `900` | - **castopod/web-server** - | Variabelnamn | Type | Standardval | - | ---------------------- | --------------------- | ----------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | + | Variabelnamn | Type | Standardval | + | ---------------------- | ------------------ | ----------- | + | **`CP_APP_HOSTNAME`** | ?streng | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?tal (med suffiks) | `512M` | + | **`CP_TIMEOUT`** | ?tal | `900` | diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md index ef0e79a5..0d3e99ca 100644 --- a/docs/src/nn-NO/getting-started/install.md +++ b/docs/src/nn-NO/getting-started/install.md @@ -20,15 +20,15 @@ Viss du helst vil bruka Docker, kan du hoppa over dette og gå rett til ## Krav -- Berre PHP v8.1 +- PHP v8.1 eller nyare - MySQL versjon 5.7 eller nyare, eller MariaDB versjon 10.2 eller nyare - Støtte for HTTPS - Ei [ntp-synkronisert klokke](https://wiki.debian.org/NTP) for å stadfesta innkomande førespurnader frå allheimen -### Berre PHP v8.1 +### PHP v8.1 eller nyare -PHP versjon 8.1 med desse utvidingane krevst: +Du treng PHP versjon 8.1 eller nyare, og mde desse tillegga: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -124,6 +124,23 @@ manuelt basert på `.env.example`-fila. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Epost/SMTP-oppsett Epostoppsett er naudsynt for at nokre av funksjonane skal verka skikkeleg (td. diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md index 9b5fbbdb..51053794 100644 --- a/docs/src/nn-NO/index.md +++ b/docs/src/nn-NO/index.md @@ -182,67 +182,67 @@ Mange takk til dei flotte folka på Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝 Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢 Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔 - Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔 - Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔 - Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔 - Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔 + Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔 + Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔 + Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 - Bastien Luneteau
    Bastien Luneteau

    💻 🐛 - Cécile Ricordeau
    Cécile Ricordeau

    🎨 - Patryk Miś
    Patryk Miś

    🌍 - Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 - Sebastian Janik
    Sebastian Janik

    💻 - Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + Bastien Luneteau
    Bastien Luneteau

    💻 🐛 + Cécile Ricordeau
    Cécile Ricordeau

    🎨 + Patryk Miś
    Patryk Miś

    🌍 + Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 + Sebastian Janik
    Sebastian Janik

    💻 + Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 + denis d
    denis d

    🐛 🤔 - Douglas Kastle
    Douglas Kastle

    🐛 🤔 - cExplorer
    cExplorer

    🐛 🌍 - ImaCrea
    ImaCrea

    🐛 🤔 - Jonas S
    Jonas S

    💻 - LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 - Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + Douglas Kastle
    Douglas Kastle

    🐛 🤔 + cExplorer
    cExplorer

    🐛 🌍 + ImaCrea
    ImaCrea

    🐛 🤔 + Jonas S
    Jonas S

    💻 + LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 + Sebastian Späth
    Sebastian Späth

    🐛 🤔 + rocky III
    rocky III

    🐛 - Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 - Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 - João Leandro
    João Leandro

    🌍 🤔 - Angelos Chouvardas
    Angelos Chouvardas

    🌍 - Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 - forght
    forght

    🌍 + Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 + Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 + João Leandro
    João Leandro

    🌍 🤔 + Angelos Chouvardas
    Angelos Chouvardas

    🌍 + Eivind
    Eivind

    🌍 + Ewen
    Ewen

    🌍 🤔 + forght
    forght

    🌍 - glottis0q
    glottis0q

    🌍 - ButterflyOfFire
    ButterflyOfFire

    🌍 - Lucian I. Last
    Lucian I. Last

    🌍 - LuuzViir
    LuuzViir

    🌍 - CTHTC
    CTHTC

    🌍 - Russian Retro
    Russian Retro

    🌍 - Marek L'ach
    Marek L'ach

    🌍 + glottis0q
    glottis0q

    🌍 + ButterflyOfFire
    ButterflyOfFire

    🌍 + Lucian I. Last
    Lucian I. Last

    🌍 + LuuzViir
    LuuzViir

    🌍 + CTHTC
    CTHTC

    🌍 + Russian Retro
    Russian Retro

    🌍 + Marek L'ach
    Marek L'ach

    🌍 - GunChleoc
    GunChleoc

    🌍 - GabiSnow
    GabiSnow

    🌍 - bendaha
    bendaha

    🌍 - Samuel Roland
    Samuel Roland

    🌍 - Dimitri Regnier
    Dimitri Regnier

    🤔 - irithys
    irithys

    🌍 - Sergi
    Sergi

    🌍 + GunChleoc
    GunChleoc

    🌍 + GabiSnow
    GabiSnow

    🌍 + bendaha
    bendaha

    🌍 + Samuel Roland
    Samuel Roland

    🌍 + Dimitri Regnier
    Dimitri Regnier

    🤔 + irithys
    irithys

    🌍 + Sergi
    Sergi

    🌍 - ghose (XoseM)
    ghose (XoseM)

    🌍 - Andreas Olsson
    Andreas Olsson

    🌍 - leonfrom
    leonfrom

    🌍 - agentcobra
    agentcobra

    🌍 - Alessandro
    Alessandro

    🌍 - liimee
    liimee

    🌍 - Ahmed Sabouni
    Ahmed Sabouni

    🌍 + ghose (XoseM)
    ghose (XoseM)

    🌍 + Andreas Olsson
    Andreas Olsson

    🌍 + leonfrom
    leonfrom

    🌍 + agentcobra
    agentcobra

    🌍 + Alessandro
    Alessandro

    🌍 + liimee
    liimee

    🌍 + Ahmed Sabouni
    Ahmed Sabouni

    🌍 - KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 @@ -252,11 +252,11 @@ Mange takk til dei flotte folka på -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! +Dette prosjektet fylgjer +[all-contributors](https://github.com/all-contributors/all-contributors)-spesifikasjonen. +Me er glade for alle slags bidrag! -## Contact +## Kontakt Du kan spørja om hjelp eller kva som helst andre spørsmål på: diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/oc/getting-started/install.md +++ b/docs/src/oc/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/pl/getting-started/install.md +++ b/docs/src/pl/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/pt-BR/getting-started/install.md index c736872c..0cf1e1c0 100644 --- a/docs/src/pt-BR/getting-started/install.md +++ b/docs/src/pt-BR/getting-started/install.md @@ -20,15 +20,15 @@ Se você prefere usar o Docker, você pode pular isso e ir direto para a ## Requisitos -- Somente PHP v8.1 +- PHP v8.1 or higher - MySQL versão 5.7 ou superior ou MariaDB versão 10.2 ou superior - Suporte a HTTPS - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### Somento PHP v8.1 +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -126,6 +126,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/pt/getting-started/install.md b/docs/src/pt/getting-started/install.md index 3ce3cf7a..f47362af 100644 --- a/docs/src/pt/getting-started/install.md +++ b/docs/src/pt/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/ro/getting-started/install.md b/docs/src/ro/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/ro/getting-started/install.md +++ b/docs/src/ro/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/ru/getting-started/install.md b/docs/src/ru/getting-started/install.md index 3ce3cf7a..f47362af 100644 --- a/docs/src/ru/getting-started/install.md +++ b/docs/src/ru/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/sk/getting-started/install.md +++ b/docs/src/sk/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/sr_Latn/getting-started/auth.md b/docs/src/sr_Latn/getting-started/auth.md index ff5d59c0..663557e1 100644 --- a/docs/src/sr_Latn/getting-started/auth.md +++ b/docs/src/sr_Latn/getting-started/auth.md @@ -1,87 +1,87 @@ --- -title: Authentication & Authorization +title: Verifikacija i Odobravanje sidebarDepth: 3 --- -# Authentication & Authorization +# Verifikacija i Odobravanje -Castopod handles authentication and authorization using `codeigniter/shield` -coupled with custom rules. Roles and permissions are defined at two levels: +Castopod upravlja verifikacijom i odobravanjem koristeći `codeigniter/shield` u +paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: -1. [instance wide](#1-instance-wide-roles-and-permissions) -2. [per podcast](#2-per-podcast-roles-and-permissions) +1. [po nalogu](#1-instance-wide-roles-and-permissions) +2. [po podkastu](#2-per-podcast-roles-and-permissions) -## 1. Instance wide roles and permissions +## 1. Uloge i dozvole po nalogu -### Instance roles +### Uloge po nalogu -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| uloga | opis | dozvola | +| ------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administrator | Ima kompletnu kontrolu nad Castopod nalogom. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Menadžer | Upravlja sadržajem na Castopod-u. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podkaster | Opšti korisnici Castopod-a. | admin.access | -### Instance permissions +### Dozvole po nalogu -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| dozvola | opis | +| ----------------------- | --------------------------------------------------------------- | +| admin.access | Može pristupiti administratorskom delu Castopod-a. | +| admin.settings | Može pristupiti podešavanjima Castopod-a. | +| users.manage | Može upravljati korisnicima Castopod-a. | +| persons.manage | Može upravljati osobama. | +| pages.manage | Može upravljati stranicama. | +| podcasts.view | Može videti sve podkaste. | +| podcasts.create | Može napraviti nove podkaste. | +| podcasts.import | Može uvesti nove podkaste. | +| fediverse.manage-blocks | Može blokirati interakciju Castopoda i fediverse naloga/domena. | -## 2. Per podcast roles and permissions +## 2. Uloge i dozvole po podkastu -### Per podcast roles +### Uloge po podkastu -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| uloga | opis | dozvola | +| ------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrator | Ima kompletnu kontrolu nad podkastom #{id}. | \* | +| Urednik | Upravlja sadržajem i objavama podkasta #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Upravlja sadržajem podkasta #{id} ali ne može da ga objavi. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gost | Saradnik na podkastu #{id}. | view, episodes.view | -### Per podcast permissions +### Dozvole po podkastu -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| dozvola | opis | +| ---------------------------- | -------------------------------------------------------------------------------------- | +| view | Može videti upravljačku tablu i analitiku podkasta #{id}. | +| edit | Može uređivati podkast #{id}. | +| delete | Može obrisati podkast #{id}. | +| manage-import | Može upravljati uvozom podkasta #{id}. | +| manage-persons | Može upravljati osobama na podkastu #{id}. | +| manage-subscriptions | Može upravljati pretplatama na podkast #{id}. | +| manage-contributors | Može upravljati saradnicima na podkastu #{id}. | +| manage-platforms | Može ubaciti/izbaciti veze ka platformama podkasta #{id}. | +| manage-publications | Može objaviti podkast #{id}. | +| manage-notifications | Može videti obaveštenja i označiti ih kao pročitana za podkast #{id}. | +| interact-as | Može da komunicira kao podkast #{id} i deli, odgovara na i stavlja u omiljene postove. | +| episodes.view | Može videti upravljačku tablu i analitiku podkasta #{id}. | +| episodes.create | Može napraviti epizodu podkasta #{id}. | +| episodes.edit | Može uređivati epizodu podkasta #{id}. | +| episodes.delete | Može obrisati epizodu podkasta #{id}. | +| episodes.manage-persons | Može upravljati pretplatama na podkast #{id}. | +| episodes.manage-clips | Može upravljati video klipovima i zvučnim isečcima podkasta #{id}. | +| episodes.manage-publications | Može objaviti podkast #{id}. | +| episodes.manage-comments | Može dodati/obrisati komentar na epizodi podkasta #{id}. | diff --git a/docs/src/sr_Latn/getting-started/install.md b/docs/src/sr_Latn/getting-started/install.md index af405daf..a95643c2 100644 --- a/docs/src/sr_Latn/getting-started/install.md +++ b/docs/src/sr_Latn/getting-started/install.md @@ -1,56 +1,57 @@ --- -title: Installation +title: Instalacija sidebarDepth: 3 --- -# How to install Castopod? +# Kako Instalirati Castopod? -Castopod was thought-out to be easy to install. Whether using dedicated or -shared hosting, you can install it on most PHP-MySQL compatible web servers. +Zamišljeno je da Castopod bude jednostavan za instalaciju. Bilo da se koristi +namenski ili deljeni hosting, možete ga instalirati na većinu PHP-MySQL +kompatibilnih veb servera. -::: tip Note +::: savet Napomena -We've released official Docker images for Castopod! +Objavili smo zvanične Docker slike za Castopod! -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. +Ako više volite da koristite Docker, možete ovo preskočiti i preći direktno na +[docker dokumentaciju](./docker.md) za Castopod. ::: -## Requirements +## Uslovi -- PHP v8.1 only -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests +- PHP v8.1 ili novija verzija +- MySQL verzija 5.7 ili novija ili MariaDB verzija 10.2 ili novija +- HTTPS podrška +- [ntp-sinhronizovani sat](https://viki.debian.org/NTP) za potvrdu dolaznih + zahteva federacije -### PHP v8.1 only +### PHP v8.1 ili kasnija verzija -PHP version 8.1 is required, with the following extensions installed: +Potrebna je PHP verzija 8.1 ili novija, sa instaliranim sledećim ekstenzijama: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) - [mbstring](https://php.net/manual/en/mbstring.installation.php) -- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, - **PNG** and **WEBP** libraries. +- [gd](https://www.php.net/manual/en/image.installation.php) sa **JPEG**, + **PNG** i **WEBP** bibliotekama. - [exif](https://www.php.net/manual/en/exif.installation.php) -Additionally, make sure that the following extensions are enabled in your PHP: +Pored toga, uverite se da su sledeće ekstenzije omogućene u vašem PHP-u: -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) +- json (podrazumevano omogućeno - ne isključujte ga) +- xml (podrazumevano omogućeno - ne isključujte ga) - [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) -### MySQL compatible database +### MySQL kompatibilne baze podataka -> We recommend using [MariaDB](https://mariadb.org). +> Preporučujemo korišćenje [MariaDB](https://mariadb.org). -::: warning Warning +::: upozorenje Upozorenje -Castopod only works with supported MySQL 5.7 or higher compatible databases. It -will break with the previous MySQL v5.6 for example as its end of life was on -February 5, 2021. +Castopod radi samo sa podržanim MySQL 5.7 ili novijim kompatibilnim bazama +podataka. Kvari se na MySQL v5.6 na primer, jer je njen životni vek istekao 5. +februara 2021. ::: @@ -123,6 +124,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/sv/getting-started/install.md b/docs/src/sv/getting-started/install.md index 27aa903a..bef89df5 100644 --- a/docs/src/sv/getting-started/install.md +++ b/docs/src/sv/getting-started/install.md @@ -20,15 +20,15 @@ Om du föredrar att använda Docker, kan du hoppa över detta och gå direkt til ## Krav -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 eller högre eller MariaDB version 10.2 eller högre - Stöd för HTTPS - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -124,6 +124,23 @@ installationsguiden kan du skapa och redigera `. nv` filen manuellt baserat på ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup E-postkonfiguration krävs för att vissa funktioner ska fungera korrekt (t.ex. diff --git a/docs/src/uk/getting-started/install.md b/docs/src/uk/getting-started/install.md index af405daf..cdea18ec 100644 --- a/docs/src/uk/getting-started/install.md +++ b/docs/src/uk/getting-started/install.md @@ -19,15 +19,15 @@ If you prefer using Docker, you may skip this and go straight to the ## Requirements -- PHP v8.1 only +- PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher - HTTPS support - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 only +### PHP v8.1 or higher -PHP version 8.1 is required, with the following extensions installed: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -123,6 +123,23 @@ based on the `.env.example` file. ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### Email/SMTP setup Email configuration is required for some features to work properly (eg. diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/zh-Hans/getting-started/install.md index aa9938eb..1d5e4ca0 100644 --- a/docs/src/zh-Hans/getting-started/install.md +++ b/docs/src/zh-Hans/getting-started/install.md @@ -19,14 +19,14 @@ Castopod 的安装非常简单。 你能在大多数兼容的 PHP-MySQL 的服 ## 要求 -- 仅 PHP v8.1 +- PHP v8.1 or higher - MySQL 5.7 或更高版本与 MariaDB 10.2 或更高版本 - HTTPS 支持 - 用于验证的 [NTP 同步时钟](https://wiki.debian.org/NTP) 传入请求 -### 仅 PHP v8.1 +### PHP v8.1 or higher -需要 PHP 8.1,并安装以下扩展: +PHP version 8.1 or higher is required, with the following extensions installed: - [intl](https://php.net/manual/en/intl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php) @@ -113,6 +113,23 @@ Castopod 仅适用于受支持的 MySQL 5.7 或更高版本的兼容数据库。 ::: +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + ### 邮箱/SMTP 设置 某些功能需要电子邮件配置才能正常工作(例如: 找回密码,向高级订阅者发送说明, …) diff --git a/modules/Admin/Language/ar/Breadcrumb.php b/modules/Admin/Language/ar/Breadcrumb.php index f65f731a..887dd362 100644 --- a/modules/Admin/Language/ar/Breadcrumb.php +++ b/modules/Admin/Language/ar/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'حسابي', 'change-password' => 'تغيير الكلمة السرية', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'منصات', 'social' => 'شبكات التواصل الاجتماعي', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'صفحات ويب', diff --git a/modules/Admin/Language/ar/Common.php b/modules/Admin/Language/ar/Common.php index 9dff13c6..fc39a83b 100644 --- a/modules/Admin/Language/ar/Common.php +++ b/modules/Admin/Language/ar/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'إرسال ملف', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'تشغيل', diff --git a/modules/Admin/Language/ar/Episode.php b/modules/Admin/Language/ar/Episode.php index cac3ebd3..0e5de94c 100644 --- a/modules/Admin/Language/ar/Episode.php +++ b/modules/Admin/Language/ar/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'كافة حلقات البودكاست', 'back_to_podcast' => 'العودة إلى البودكاست', 'edit' => 'تعديل', + 'preview' => 'Preview', 'publish' => 'نشر', 'publish_edit' => 'تعديل المنشور', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/ar/Platforms.php b/modules/Admin/Language/ar/Platforms.php index 5b17c098..7c01243d 100644 --- a/modules/Admin/Language/ar/Platforms.php +++ b/modules/Admin/Language/ar/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'المنصات', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/ar/Podcast.php b/modules/Admin/Language/ar/Podcast.php index 1404cc1a..230edb81 100644 --- a/modules/Admin/Language/ar/Podcast.php +++ b/modules/Admin/Language/ar/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'الانتقال إلى الصفحة', 'latest_episodes' => 'أحدث الحلقات', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/ar/PodcastNavigation.php b/modules/Admin/Language/ar/PodcastNavigation.php index dc39cf23..b82f78d9 100644 --- a/modules/Admin/Language/ar/PodcastNavigation.php +++ b/modules/Admin/Language/ar/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'انتقل إلى صفحة البودكاست', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'الرئيسية', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'الحلقات', 'episode-list' => 'جميع الحلقات', 'episode-create' => 'حلقة جديدة', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'المساهمون', 'contributor-list' => 'كل المساهمين', 'contributor-add' => 'إضافة مساهم', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php index 2807e934..f22aaef1 100644 --- a/modules/Admin/Language/br/Breadcrumb.php +++ b/modules/Admin/Language/br/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'ma c\'hont', 'change-password' => 'kemmañ ar ger-tremen', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'savennoù', 'social' => 'rouedadoù sokial', 'funding' => 'arc\'hantaouiñ', + 'monetization-other' => 'other monetization', 'analytics' => 'muzulioù heklev', 'locations' => 'lec\'hioù', 'webpages' => 'pajennoù web', diff --git a/modules/Admin/Language/br/Common.php b/modules/Admin/Language/br/Common.php index 1cb6c3b2..6c2792b7 100644 --- a/modules/Admin/Language/br/Common.php +++ b/modules/Admin/Language/br/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Uskargit ur restr', 'remote_url' => 'URL a-bell', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Lenn', diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php index cea956c5..ce731f01 100644 --- a/modules/Admin/Language/br/Episode.php +++ b/modules/Admin/Language/br/Episode.php @@ -23,6 +23,7 @@ return [ 'all_podcast_episodes' => 'Holl rannoù ar podkast', 'back_to_podcast' => 'Mont d\'ar podkast en-dro', 'edit' => 'Kemmañ', + 'preview' => 'Preview', 'publish' => 'Embann', 'publish_edit' => 'Kemmañ an embannadur', 'publish_date_edit' => 'Edit publication date', @@ -82,13 +83,13 @@ return [ audio {aodio} other {media} } ar rann.', - 'deleteFileError' => 'C\'hwitadenn war dilemel restr {type, select, - transcript {an treuzskrivadur} - chapters {ar chabistroù} - image {ar golo} - audio {an aodio} - other {ar media} - } ({file_path}). Gallout a rit lemel kuit ar restr-mañ diouzh ar gantenn dre zorn.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Bez ez eus eus ur rann gant ar berradur-mañ (slug) dija.', ], 'form' => [ @@ -213,4 +214,14 @@ return [ 'light' => 'Sklaer', 'light-transparent' => 'Sklaer treuzwelus', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/br/Platforms.php b/modules/Admin/Language/br/Platforms.php index 71d04168..ccec98c5 100644 --- a/modules/Admin/Language/br/Platforms.php +++ b/modules/Admin/Language/br/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Savennoù', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Mont da lec\'hienn {platformName}', + 'register' => 'Register', 'submit_url' => 'Kasit ho podkast war {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Diskouez e pajenn ar podkast?', 'on_embed' => 'Diskouez el lenner enkorfet?', 'remove' => 'Dilemel {platformName}', diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php index cf39ee7a..6933da22 100644 --- a/modules/Admin/Language/br/Podcast.php +++ b/modules/Admin/Language/br/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Dilemel ar podkast', 'see_episodes' => 'Gwelet ar rannoù', 'see_contributors' => 'Gwelet ar berzhidi, ar perzhiadezed', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Gwelet ar bajenn', 'latest_episodes' => 'Rannoù diwezhañ', 'see_all_episodes' => 'Gwelet an holl rannoù', @@ -60,6 +61,8 @@ return [ 'form' => [ 'identity_section_title' => 'Titouroù diwar-benn ar podkast', 'identity_section_subtitle' => 'Ar maeziennoù a laka ac\'hanoc\'h da vezañ remerket.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Golo ar podkast', 'cover_size_hint' => 'Ar golo a rankfe bezañ ur c\'harrez ha 1400px e vent da nebeutañ.', 'banner' => 'Giton ar podkast', @@ -135,7 +138,6 @@ return [ 'partner_id_hint' => 'Hoc’h ID deoc\'h-c\'hwi e ti ar c\'heveler', 'partner_link_url_hint' => 'Chomlec\'h generek an ereoù gant ar c\'heveler', 'partner_image_url_hint' => 'Chomlec\'h generek ar skeudennoù gant ar c\'heveler', - 'status_section_title' => 'Statud', 'block' => 'Ar podkast a rankfe bezañ kuzhet diouzh ar rolladoù publik', 'block_hint' => 'Diskouez pe kuzhat ar podkast: trec\'haoliñ an afell-mañ a viro ar podkast a-bezh ouzh bezañ diskouezet war Apple Podcasts, Google Podcasts pe savennoù all hag a implij ar renabloù-se. (N\'eus gwarant ebet)', diff --git a/modules/Admin/Language/br/PodcastNavigation.php b/modules/Admin/Language/br/PodcastNavigation.php index 9590aea0..e21fe4cc 100644 --- a/modules/Admin/Language/br/PodcastNavigation.php +++ b/modules/Admin/Language/br/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Mont da pajenn ar podkast', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Taolenn-stur ar podkast', 'podcast-view' => 'Degemer', 'podcast-edit' => 'Kemmañ ar podkast', 'podcast-persons-manage' => 'Merañ an emellerien·ezed', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Rannoù', 'episode-list' => 'An holl rannoù', 'episode-create' => 'Rann nevez', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Lennerioù', 'podcast-analytics-listening-time' => 'Padelezh ar selaou', 'podcast-analytics-time-periods' => 'Mareoù ar selaou', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Perzhidi, perzhiadezed', 'contributor-list' => 'An holl berzhidi ha perzhiadezed', 'contributor-add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez', - 'platforms' => 'Savennoù diavaez', - 'platforms-podcasting' => 'Podkast', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Rouedadoù sokial', - 'platforms-funding' => 'Arc\'hantaouiñ', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/ca/Breadcrumb.php b/modules/Admin/Language/ca/Breadcrumb.php index 4ccba18f..75141943 100644 --- a/modules/Admin/Language/ca/Breadcrumb.php +++ b/modules/Admin/Language/ca/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'el meu compte', 'change-password' => 'canviar la contrasenya', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'plataformes', 'social' => 'xarxes socials', 'funding' => 'financiació', + 'monetization-other' => 'other monetization', 'analytics' => 'estadístiques', 'locations' => 'ubicacions', 'webpages' => 'pàgines web', diff --git a/modules/Admin/Language/ca/Common.php b/modules/Admin/Language/ca/Common.php index c178db60..8ce267d5 100644 --- a/modules/Admin/Language/ca/Common.php +++ b/modules/Admin/Language/ca/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Pujar un fitxer', 'remote_url' => 'URL remota', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Reproduir', diff --git a/modules/Admin/Language/ca/Episode.php b/modules/Admin/Language/ca/Episode.php index c80dc1d5..bd279837 100644 --- a/modules/Admin/Language/ca/Episode.php +++ b/modules/Admin/Language/ca/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Tots els episodis del podcast', 'back_to_podcast' => 'Tornar al podcast', 'edit' => 'Editar', + 'preview' => 'Preview', 'publish' => 'Publicar', 'publish_edit' => 'Editar la publicació', 'publish_date_edit' => 'Edita la data de publicació', @@ -80,13 +81,13 @@ return [ audio {l\'àudio} other {el material} } de l\'episodi.', - 'deleteFileError' => 'No s\'ha pogut esborrar el fitxer {file_path} {type, select, - transcript {de la transcripció} - chapters {dels episodis} - image {de la portada} - audio {de l\'àudio} - other {del material} - }. Podeu esborrar-los manualment del disc.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Ja existeix un episodi amb aquest àlies.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Clar', 'light-transparent' => 'Clar i transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/ca/Platforms.php b/modules/Admin/Language/ca/Platforms.php index cb1abfff..cfa50efb 100644 --- a/modules/Admin/Language/ca/Platforms.php +++ b/modules/Admin/Language/ca/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Plataformes', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Visitar el lloc web de {platformName}', + 'register' => 'Register', 'submit_url' => 'Enviar el vostre podcast a {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Mostrar a la pàgina d\'inici del podcast?', 'on_embed' => 'Mostrar al reproductor incrustable?', 'remove' => 'Suprimir {platformName}', diff --git a/modules/Admin/Language/ca/Podcast.php b/modules/Admin/Language/ca/Podcast.php index c31998b2..a12efb3c 100644 --- a/modules/Admin/Language/ca/Podcast.php +++ b/modules/Admin/Language/ca/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Suprimir el podcast', 'see_episodes' => 'Veure els episodis', 'see_contributors' => 'Veure els col·laboradors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Anar a la pàgina ', 'latest_episodes' => 'Darrers episodis', 'see_all_episodes' => 'Veure tots els episodis', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Identitat del podcast', 'identity_section_subtitle' => 'Aquests camps permeten fer-se notar.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Portada del podcast', 'cover_size_hint' => 'La portada ha de ser quadrada i com a mínim de 1400 px d\'amplada i alçada.', 'banner' => 'Bàner del podcast', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'El vostre propi ID de soci', 'partner_link_url_hint' => 'L\'adreça genèrica de l\'enllaç del soci', 'partner_image_url_hint' => 'L\'adreça genèrica de la imatge del soci', - 'status_section_title' => 'Estat', 'block' => 'El podcast s\'ha d\'amagar als catàlegs públics', 'block_hint' => 'L\'estat de visibilitat del podcast: activar aquesta opció evita que el podcast aparegui a Apple Podcasts, Google Podcasts i qualsevol aplicació de tercers que extreu programes d\'aquests directoris. (No garantit)', diff --git a/modules/Admin/Language/ca/PodcastNavigation.php b/modules/Admin/Language/ca/PodcastNavigation.php index a30d12c7..5ce86ed8 100644 --- a/modules/Admin/Language/ca/PodcastNavigation.php +++ b/modules/Admin/Language/ca/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Anar a la pàgina del podcast', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Panell de control del podcast', 'podcast-view' => 'Inici', 'podcast-edit' => 'Editar el podcast', 'podcast-persons-manage' => 'Administrar persones', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodis', 'episode-list' => 'Tots els episodis', 'episode-create' => 'Nou episodi', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Reproductors', 'podcast-analytics-listening-time' => 'Temps d\'escolta', 'podcast-analytics-time-periods' => 'Períodes de temps', - 'premium' => 'Prèmium', + 'monetization' => 'Monetization', 'subscription-list' => 'Totes les subscripcions', 'subscription-create' => 'Afegiu una subscripció', 'contributors' => 'Col·laboradors', 'contributor-list' => 'Tots els col·laboradors', 'contributor-add' => 'Afegir un col·laborador', - 'platforms' => 'Plataformes de tercers', - 'platforms-podcasting' => 'Podcasts', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Xarxes socials', - 'platforms-funding' => 'Financiació', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/da/Breadcrumb.php b/modules/Admin/Language/da/Breadcrumb.php index fcf3d567..0adb76ba 100644 --- a/modules/Admin/Language/da/Breadcrumb.php +++ b/modules/Admin/Language/da/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'min konto', 'change-password' => 'skift adgangskode', 'imports' => 'importer', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforme', 'social' => 'sociale netværk', 'funding' => 'finansiering', + 'monetization-other' => 'other monetization', 'analytics' => 'analyse', 'locations' => 'lokationer', 'webpages' => 'websider', diff --git a/modules/Admin/Language/da/Common.php b/modules/Admin/Language/da/Common.php index e788799f..b53eff26 100644 --- a/modules/Admin/Language/da/Common.php +++ b/modules/Admin/Language/da/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/da/Episode.php b/modules/Admin/Language/da/Episode.php index a099a944..8a39dd6d 100644 --- a/modules/Admin/Language/da/Episode.php +++ b/modules/Admin/Language/da/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/da/Platforms.php b/modules/Admin/Language/da/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/da/Platforms.php +++ b/modules/Admin/Language/da/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/da/Podcast.php b/modules/Admin/Language/da/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/da/Podcast.php +++ b/modules/Admin/Language/da/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/da/PodcastNavigation.php b/modules/Admin/Language/da/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/da/PodcastNavigation.php +++ b/modules/Admin/Language/da/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php index aa060fda..c271fd31 100644 --- a/modules/Admin/Language/de/Breadcrumb.php +++ b/modules/Admin/Language/de/Breadcrumb.php @@ -38,10 +38,12 @@ return [ 'users' => 'Benutzer', 'my-account' => 'Mein Konto', 'change-password' => 'Passwort ändern', - 'imports' => 'imports', + 'imports' => 'Importe', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'Plattformen', 'social' => 'soziale Netzwerke', 'funding' => 'Finanzierung', + 'monetization-other' => 'other monetization', 'analytics' => 'Statistiken', 'locations' => 'Orte', 'webpages' => 'Webseiten', diff --git a/modules/Admin/Language/de/Common.php b/modules/Admin/Language/de/Common.php index 0cc58599..c4ff79bf 100644 --- a/modules/Admin/Language/de/Common.php +++ b/modules/Admin/Language/de/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Eine Datei hochladen', 'remote_url' => 'Externe URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Abspielen', diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php index ce77a865..8b7c6709 100644 --- a/modules/Admin/Language/de/Episode.php +++ b/modules/Admin/Language/de/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Alle Podcast-Episoden', 'back_to_podcast' => 'Zurück zum Podcast', 'edit' => 'Bearbeiten', + 'preview' => 'Vorschau', 'publish' => 'Veröffentllichen', 'publish_edit' => 'Veröffentlichung bearbeiten', 'publish_date_edit' => 'Veröffentlichungsdatum bearbeiten', @@ -86,7 +87,7 @@ return [ image {Cover} audio {Audio} other {Medien} - }-Datei {file_path}. Sie können es manuell von der Festplatte entfernen.', + }-Datei {file_key}. Sie können es manuell von der Festplatte entfernen.', 'sameSlugError' => 'Eine Folge mit dem ausgewählten Slug existiert bereits.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Hell', 'light-transparent' => 'Hell (transparent)', ], + 'publication_status_banner' => [ + 'draft_mode' => 'Entwurfsmodus', + 'text' => '{publication_status, select, + published {Diese Episode ist noch nicht veröffentlicht.} + scheduled {Diese Episode ist für die Veröffentlichung geplant am {publication_date}.} + with_podcast {Diese Episode wird zur gleichen Zeit wie der Podcast veröffentlicht.} + other {Diese Episode ist noch nicht veröffentlicht.} + }', + 'preview' => 'Vorschau', + ], ]; diff --git a/modules/Admin/Language/de/Navigation.php b/modules/Admin/Language/de/Navigation.php index 943c27f2..d8c3010b 100644 --- a/modules/Admin/Language/de/Navigation.php +++ b/modules/Admin/Language/de/Navigation.php @@ -17,8 +17,8 @@ return [ 'podcasts' => 'Podcasts', 'podcast-list' => 'Alle Podcasts', 'podcast-create' => 'Neuer Podcast', - 'all-podcast-imports' => 'All Podcast imports', - 'podcast-imports-add' => 'Import a podcast', + 'all-podcast-imports' => 'Alle Podcast-Importe', + 'podcast-imports-add' => 'Podcast importieren', 'persons' => 'Mitwirkende', 'person-list' => 'Alle Mitwirkenden', 'person-create' => 'Neuer Mitwirkender', diff --git a/modules/Admin/Language/de/Platforms.php b/modules/Admin/Language/de/Platforms.php index 5e55a2a3..48b5c747 100644 --- a/modules/Admin/Language/de/Platforms.php +++ b/modules/Admin/Language/de/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Plattformen', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Gehe zu {platformName} Webseite', + 'register' => 'Register', 'submit_url' => 'Sende deinen Podcast an {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Auf Podcast-Homepage anzeigen?', 'on_embed' => 'Auf einbettbarem Player anzeigen?', 'remove' => 'Entferne {platformName}', diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php index 7fc92d32..dc66c033 100644 --- a/modules/Admin/Language/de/Podcast.php +++ b/modules/Admin/Language/de/Podcast.php @@ -13,7 +13,7 @@ return [ 'no_podcast' => 'Kein Podcast gefunden!', 'create' => 'Podcast erstellen', 'import' => 'Podcast importieren', - 'all_imports' => 'Podcast imports', + 'all_imports' => 'Podcast-Importe', 'new_episode' => 'Neue Folge', 'view' => 'Podcast ansehen', 'edit' => 'Podcast bearbeiten', @@ -22,6 +22,7 @@ return [ 'delete' => 'Podcast löschen', 'see_episodes' => 'Episoden ansehen', 'see_contributors' => 'Mitwirkende anzeigen', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Gehe zur Seite', 'latest_episodes' => 'Neueste Folgen', 'see_all_episodes' => 'Alle Folgen anzeigen', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast-Identität', 'identity_section_subtitle' => 'Diese Felder erlauben es dir, Aufmerksamkeit zu bekommen.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast-Cover', 'cover_size_hint' => 'Das Cover muss quadratisch und mindestens 1400px breit und hoch sein.', 'banner' => 'Podcast-Banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Ihre eigene Partner-ID', 'partner_link_url_hint' => 'Die generische Partnerlink-Adresse', 'partner_image_url_hint' => 'Die generische Partnerbild-Adresse', - 'status_section_title' => 'Status', 'block' => 'Podcast soll vor öffentlichen Katalogen versteckt werden', 'block_hint' => 'Der Podcast zeigt oder versteckt den Status: Beim Einschalten dieser Option wird verhindert, dass der Podcast in Apple Podcasts, Google Podcasts und alle Apps von Drittanbietern, die Inhalte aus diesen Verzeichnissen ziehen, erscheint. (Ohne Garantie!)', diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php index 0ddccc4a..480d3419 100644 --- a/modules/Admin/Language/de/PodcastNavigation.php +++ b/modules/Admin/Language/de/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Zur Podcast-Seite gehen', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast-Dashboard', 'podcast-view' => 'Startseite', 'podcast-edit' => 'Podcast bearbeiten', 'podcast-persons-manage' => 'Mitwirkende verwalten', - 'podcast-imports' => 'Podcast imports', + 'podcast-imports' => 'Podcast-Importe', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Folgen', 'episode-list' => 'Alle Episoden', 'episode-create' => 'Neue Episoden', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Podcast-Player', 'podcast-analytics-listening-time' => 'Hörzeit', 'podcast-analytics-time-periods' => 'Zeiträume', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Alle Abonnements', 'subscription-create' => 'Abonnement hinzufügen', 'contributors' => 'Mitwirkende', 'contributor-list' => 'Alle Unterstützer', 'contributor-add' => 'Mitwirkenden hinzufügen', - 'platforms' => 'Externe Plattformen', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Soziale Netzwerke', - 'platforms-funding' => 'Finanzierung', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/el/Breadcrumb.php b/modules/Admin/Language/el/Breadcrumb.php index e642116c..d08f66f7 100644 --- a/modules/Admin/Language/el/Breadcrumb.php +++ b/modules/Admin/Language/el/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'ο λογαριασμός μου', 'change-password' => 'αλλαγή κωδικού πρόσβασης', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'πλατφόρμες', 'social' => 'κοινωνικά δίκτυα', 'funding' => 'χρηματοδότηση', + 'monetization-other' => 'other monetization', 'analytics' => 'αναλυτικά στοιχεία', 'locations' => 'τοποθεσίες', 'webpages' => 'ιστοσελίδες', diff --git a/modules/Admin/Language/el/Common.php b/modules/Admin/Language/el/Common.php index 4652e2a3..7bf5bbec 100644 --- a/modules/Admin/Language/el/Common.php +++ b/modules/Admin/Language/el/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Μεταφορτώστε ένα αρχείο', 'remote_url' => 'Απομακρυσμένη διεύθυνση URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Αναπαραγωγή', diff --git a/modules/Admin/Language/el/Episode.php b/modules/Admin/Language/el/Episode.php index 2eeec1c3..35df7992 100644 --- a/modules/Admin/Language/el/Episode.php +++ b/modules/Admin/Language/el/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Όλα τα επεισόδια του podcast', 'back_to_podcast' => 'Μετάβαση πίσω στο podcast', 'edit' => 'Επεξεργασία', + 'preview' => 'Preview', 'publish' => 'Δημοσίευση', 'publish_edit' => 'Επεξεργασία δημοσίευσης', 'publish_date_edit' => 'Επεξεργασία ημερομηνίας δημοσίευσης', @@ -80,13 +81,13 @@ return [ audio {ήχος} other {πολυμέσα} }.', - 'deleteFileError' => 'Αποτυχία διαγραφής {type, select, + 'deleteFileError' => 'Failed to delete {type, select, transcript {transcript} - chapters {κεφάλαια} - image {καλύψτε} - audio {ήχος} - other {πολυμέσα} - } αρχείο {file_path}. Μπορείτε να το αφαιρέσετε χειροκίνητα από το δίσκο σας.', + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Ένα επεισόδιο με το επιλεγμένο slug υπάρχει ήδη.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Ανοιχτόχρωμο', 'light-transparent' => 'Ανοιχτό διαφανές', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/el/Platforms.php b/modules/Admin/Language/el/Platforms.php index 4b5f2fb5..2c5a10ec 100644 --- a/modules/Admin/Language/el/Platforms.php +++ b/modules/Admin/Language/el/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Πλατφόρμες', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Μεταβείτε στην ιστοσελίδα {platformName}', + 'register' => 'Register', 'submit_url' => 'Υποβάλετε το podcast σας στην πλατφόρμα {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Εμφάνιση στην αρχική σελίδα του podcast;', 'on_embed' => 'Εμφάνιση σε ενσωματωμένο player;', 'remove' => 'Κατάργηση {platformName}', diff --git a/modules/Admin/Language/el/Podcast.php b/modules/Admin/Language/el/Podcast.php index a04effe4..65fcc8c8 100644 --- a/modules/Admin/Language/el/Podcast.php +++ b/modules/Admin/Language/el/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Διαγραφή podcast', 'see_episodes' => 'Δείτε επεισόδια', 'see_contributors' => 'Βλέπε συντελεστές', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Μετάβαση στη σελίδα', 'latest_episodes' => 'Τελευταία επεισόδια', 'see_all_episodes' => 'Δείτε όλα τα επεισόδια', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Αναγνωριστικό Podcast', 'identity_section_subtitle' => 'Αυτά τα πεδία σας επιτρέπουν να ξεχωρίσει το podcast σας.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Εξώφυλο podcast', 'cover_size_hint' => 'Το εξώφυλλο πρέπει να είναι τουλάχιστον 1400px πλάτος και ύψος.', 'banner' => 'Banner podcast', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/el/PodcastNavigation.php b/modules/Admin/Language/el/PodcastNavigation.php index 3e97a3a3..830fdfaa 100644 --- a/modules/Admin/Language/el/PodcastNavigation.php +++ b/modules/Admin/Language/el/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Μετάβαση στη σελίδα podcast', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Πίνακας ελέγχου Podcast', 'podcast-view' => 'Αρχική σελίδα', 'podcast-edit' => 'Επεξεργασία podcast', 'podcast-persons-manage' => 'Διαχείριση ατόμων', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Επεισόδια', 'episode-list' => 'Όλα τα επεισόδια', 'episode-create' => 'Νέο Επεισόδιο', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Αναπαραγωγές', 'podcast-analytics-listening-time' => 'Χρόνος ακρόασης', 'podcast-analytics-time-periods' => 'Χρονικές περίοδοι', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Όλες οι συνδρομές', 'subscription-create' => 'Προσθέστε συνδρομή', 'contributors' => 'Συντελεστές', 'contributor-list' => 'Όλοι οι συντελεστές', 'contributor-add' => 'Προσθήκη συντελεστή', - 'platforms' => 'Εξωτερικές πλατφόρμες', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Κοινωνικά δίκτυα', - 'platforms-funding' => 'Χρηματοδότηση', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/es/Breadcrumb.php b/modules/Admin/Language/es/Breadcrumb.php index cace2713..41de91c1 100644 --- a/modules/Admin/Language/es/Breadcrumb.php +++ b/modules/Admin/Language/es/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'mi cuenta', 'change-password' => 'cambiar contraseña', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'plataformas', 'social' => 'redes sociales', 'funding' => 'financiación | fondos', + 'monetization-other' => 'other monetization', 'analytics' => 'estadísticas', 'locations' => 'ubicaciones', 'webpages' => 'páginas web', diff --git a/modules/Admin/Language/es/Common.php b/modules/Admin/Language/es/Common.php index b64ee73d..ff3987cc 100644 --- a/modules/Admin/Language/es/Common.php +++ b/modules/Admin/Language/es/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Subir un archivo', 'remote_url' => 'URL remoto', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Reproducir', diff --git a/modules/Admin/Language/es/Episode.php b/modules/Admin/Language/es/Episode.php index 6dcde24f..8f4c8644 100644 --- a/modules/Admin/Language/es/Episode.php +++ b/modules/Admin/Language/es/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Todos los episodios del podcast', 'back_to_podcast' => 'Regresar al podcast', 'edit' => 'Editar', + 'preview' => 'Preview', 'publish' => 'Publicar', 'publish_edit' => 'Editar publicación', 'publish_date_edit' => 'Editar fecha de publicación', @@ -80,13 +81,13 @@ return [ audio {audio} other {media} }.', - 'deleteFileError' => 'Hubo un problema al tratar de eliminar el archivo {file_path} {type, select, - transcript {de la transcripción} - chapters {de los episodios} - image {de la portada} - audio {del audio} - other {} - }. Puedes eliminarlo manualmente de tu disco.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Ya existe un episodio con el slug elegido.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Claro', 'light-transparent' => 'Transparente claro', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/es/Platforms.php b/modules/Admin/Language/es/Platforms.php index 48effd90..f045e36c 100644 --- a/modules/Admin/Language/es/Platforms.php +++ b/modules/Admin/Language/es/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Plataformas', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Ir al sitio web de {platformName}', + 'register' => 'Register', 'submit_url' => 'Envía tu podcast en {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => '¿Mostrar en la página de inicio del podcast?', 'on_embed' => '¿Mostrar en el reproductor incrustable?', 'remove' => 'Eliminar {platformName}', diff --git a/modules/Admin/Language/es/Podcast.php b/modules/Admin/Language/es/Podcast.php index 2fc372f4..8e9fe838 100644 --- a/modules/Admin/Language/es/Podcast.php +++ b/modules/Admin/Language/es/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Eliminar podcast', 'see_episodes' => 'Ver episodios', 'see_contributors' => 'Ver colaboradores', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Ir a la página', 'latest_episodes' => 'Últimos Episodios', 'see_all_episodes' => 'Mostrar todos los episodios', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Identidad de Podcast', 'identity_section_subtitle' => 'Estos campos le permiten recibir un aviso.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Portada de Podcast', 'cover_size_hint' => 'La portada debe ser cuadrada y con al menos 1400 px de ancho y alto.', 'banner' => 'Cartel del Podcast', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Su propio ID de socio', 'partner_link_url_hint' => 'La dirección genérica de enlace de socio', 'partner_image_url_hint' => 'La dirección de imagen genérica del socio', - 'status_section_title' => 'Estado', 'block' => 'El podcast debe ocultarse a los catálogos públicos', 'block_hint' => 'El estado de visibilidad del podcast: al activar esto se impide que este podcast al completo aparezca en Apple Podcasts, Google Podcasts y cualquier aplicación de terceros que extraiga episodios de estos directorios. (no está garantizado al 100%)', diff --git a/modules/Admin/Language/es/PodcastNavigation.php b/modules/Admin/Language/es/PodcastNavigation.php index 8f9ee8d1..0a299f97 100644 --- a/modules/Admin/Language/es/PodcastNavigation.php +++ b/modules/Admin/Language/es/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Ir a la página del podcast', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Panel de Podcast', 'podcast-view' => 'Inicio', 'podcast-edit' => 'Editar podcast', 'podcast-persons-manage' => 'Administrar personas', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodios', 'episode-list' => 'Todos los episodios', 'episode-create' => 'Nuevo episodio', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Reproductores', 'podcast-analytics-listening-time' => 'Tiempo de escucha', 'podcast-analytics-time-periods' => 'Periodos de tiempo', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Todas las suscripciones', 'subscription-create' => 'Añadir suscripción', 'contributors' => 'Colaboradores', 'contributor-list' => 'Todos los colaboradores', 'contributor-add' => 'Añadir colaborador', - 'platforms' => 'Plataformas externas', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Redes sociales', - 'platforms-funding' => 'Financiamiento', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/fa/Breadcrumb.php b/modules/Admin/Language/fa/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/fa/Breadcrumb.php +++ b/modules/Admin/Language/fa/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/fa/Common.php b/modules/Admin/Language/fa/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/fa/Common.php +++ b/modules/Admin/Language/fa/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/fa/Episode.php b/modules/Admin/Language/fa/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/fa/Episode.php +++ b/modules/Admin/Language/fa/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/fa/Platforms.php b/modules/Admin/Language/fa/Platforms.php index 6bdfb6ed..7dc10de7 100644 --- a/modules/Admin/Language/fa/Platforms.php +++ b/modules/Admin/Language/fa/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'بن‌سازه‌ها', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'رفتن به پایگاه وب {platformName}', + 'register' => 'Register', 'submit_url' => 'ثبت پادکستتان روی {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'نمایش در صفحهٔ خانگی پادکست؟', 'on_embed' => 'نمایش در پخش‌کنندهٔ تعبیه شده؟', 'remove' => 'برداشتن {platformName}', diff --git a/modules/Admin/Language/fa/Podcast.php b/modules/Admin/Language/fa/Podcast.php index 10271de5..5296151c 100644 --- a/modules/Admin/Language/fa/Podcast.php +++ b/modules/Admin/Language/fa/Podcast.php @@ -22,12 +22,11 @@ return [ 'delete' => 'حذف پادکست', 'see_episodes' => 'دیدن قسمت‌ّا', 'see_contributors' => 'دیدن مشارکت‌کنندگان', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'رفتن به صفحه', 'latest_episodes' => 'جدیدترین قسمت‌ها', 'see_all_episodes' => 'دیدن تمامی قسمت‌ها', 'draft' => 'پیش‌نویس', - 'sync_feed' => 'خوراک هم‌گام شده', - 'sync_feed_hint' => 'Import this podcast\'s latest episodes', 'messages' => [ 'createSuccess' => 'Podcast successfully created!', 'editSuccess' => 'Podcast has been successfully updated!', @@ -59,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'هویت پادکست', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'جلد پادکست', 'cover_size_hint' => 'جلد باید مربّعی بوده و کمینه ۱۴۰۰ پیکسل پنها و بلندا داشته باشد.', 'banner' => 'بیرق پادکست', @@ -134,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/fa/PodcastNavigation.php b/modules/Admin/Language/fa/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/fa/PodcastNavigation.php +++ b/modules/Admin/Language/fa/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/fr/Breadcrumb.php b/modules/Admin/Language/fr/Breadcrumb.php index a25e678e..5c855914 100644 --- a/modules/Admin/Language/fr/Breadcrumb.php +++ b/modules/Admin/Language/fr/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'mon compte', 'change-password' => 'changer le mot de passe', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'plateformes', 'social' => 'réseaux sociaux', 'funding' => 'financement', + 'monetization-other' => 'other monetization', 'analytics' => 'mesures d’audience', 'locations' => 'localisations', 'webpages' => 'pages web', diff --git a/modules/Admin/Language/fr/Common.php b/modules/Admin/Language/fr/Common.php index 0a12d861..3b7dcad9 100644 --- a/modules/Admin/Language/fr/Common.php +++ b/modules/Admin/Language/fr/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Téléversez un fichier', 'remote_url' => 'URL distante', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Lire', diff --git a/modules/Admin/Language/fr/Episode.php b/modules/Admin/Language/fr/Episode.php index 4ef980f1..39d94863 100644 --- a/modules/Admin/Language/fr/Episode.php +++ b/modules/Admin/Language/fr/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Tous les épisodes du podcast', 'back_to_podcast' => 'Revenir au podcast', 'edit' => 'Modifier', + 'preview' => 'Preview', 'publish' => 'Publier', 'publish_edit' => 'Modifier la publication', 'publish_date_edit' => 'Définir la date de publication', @@ -80,13 +81,13 @@ return [ audio {audio} other {média} }.', - 'deleteFileError' => 'Impossible de supprimer {type, select, - transcript {transcription} - chapters {chapitres} - image {couverture} + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} audio {audio} - other {média} - } fichier {file_path}. Vous pouvez le supprimer manuellement de votre disque.', + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Il existe déjà un épisode avec le slug choisi.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Clair', 'light-transparent' => 'Clair transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/fr/Platforms.php b/modules/Admin/Language/fr/Platforms.php index e6605532..b72147cc 100644 --- a/modules/Admin/Language/fr/Platforms.php +++ b/modules/Admin/Language/fr/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Plateformes', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Aller au site {platformName}', + 'register' => 'Register', 'submit_url' => 'Soumettez votre podcast sur {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Afficher sur la page d’accueil du podcast ?', 'on_embed' => 'Afficher sur le lecteur intégré ?', 'remove' => 'Supprimer {platformName}', diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php index 2a3c5e4c..4d9979a9 100644 --- a/modules/Admin/Language/fr/Podcast.php +++ b/modules/Admin/Language/fr/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Supprimer le podcast', 'see_episodes' => 'Voir les épisodes', 'see_contributors' => 'Voir les contributeurs', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Aller à la page', 'latest_episodes' => 'Derniers épisodes', 'see_all_episodes' => 'Voir tous les épisodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Informations sur le Podcast', 'identity_section_subtitle' => 'Ces champs vous permettent de vous faire remarquer.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Couverture du podcast', 'cover_size_hint' => 'La couverture du podcast doit être carrée, avec au minimum 1400px de largeur et de hauteur.', 'banner' => 'Bannière du podcast', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Votre identifiant personnel partenaire', 'partner_link_url_hint' => 'L’adresse générique des liens partenaire', 'partner_image_url_hint' => 'L’adresse générique des images partenaire', - 'status_section_title' => 'Statut', 'block' => 'L\'épisode doit être masqué dans les catalogues publics', 'block_hint' => 'Le statut d\'affichage ou de masquage du podcast : activer cette option empêche l\'intégralité du podcast d\'apparaître dans les podcasts Apple, Google Podcasts et toutes les applications tierces qui extraient des émissions de ces répertoires. (Pas garantie)', diff --git a/modules/Admin/Language/fr/PodcastNavigation.php b/modules/Admin/Language/fr/PodcastNavigation.php index 8043fc9d..f18cb92c 100644 --- a/modules/Admin/Language/fr/PodcastNavigation.php +++ b/modules/Admin/Language/fr/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Aller à la page du podcast', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Tableau de bord du podcast', 'podcast-view' => 'Accueil', 'podcast-edit' => 'Modifier le podcast', 'podcast-persons-manage' => 'Gestion des intervenants', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Épisodes', 'episode-list' => 'Tous les épisodes', 'episode-create' => 'Créer un épisode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Lecteurs', 'podcast-analytics-listening-time' => 'Durée d’écoute', 'podcast-analytics-time-periods' => 'Périodes', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Tous les abonnements', 'subscription-create' => 'Ajouter un abonnement', 'contributors' => 'Contributeurs', 'contributor-list' => 'Tous les contributeurs', 'contributor-add' => 'Ajouter un contributeur', - 'platforms' => 'Plate-formes externes', - 'platforms-podcasting' => 'Podcasts', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Réseaux sociaux', - 'platforms-funding' => 'Financement', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/fr2/Breadcrumb.php b/modules/Admin/Language/fr2/Breadcrumb.php index 5588f808..13b077df 100644 --- a/modules/Admin/Language/fr2/Breadcrumb.php +++ b/modules/Admin/Language/fr2/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'mon compte', 'change-password' => 'changer le mot de passe', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'plateformes', 'social' => 'réseaux sociaux', 'funding' => 'financement', + 'monetization-other' => 'other monetization', 'analytics' => 'mesure d’audience', 'locations' => 'localisation', 'webpages' => 'pages web', diff --git a/modules/Admin/Language/fr2/Common.php b/modules/Admin/Language/fr2/Common.php index 1d92e048..73daacf7 100644 --- a/modules/Admin/Language/fr2/Common.php +++ b/modules/Admin/Language/fr2/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Téléverser un fichier', 'remote_url' => 'URL distante', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Lire', diff --git a/modules/Admin/Language/fr2/Episode.php b/modules/Admin/Language/fr2/Episode.php index 81a102fe..52ab28fd 100644 --- a/modules/Admin/Language/fr2/Episode.php +++ b/modules/Admin/Language/fr2/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Tous les épisodes du podcast', 'back_to_podcast' => 'Revenir au podcast', 'edit' => 'Modifier', + 'preview' => 'Preview', 'publish' => 'Publier', 'publish_edit' => 'Modifier la publication', 'publish_date_edit' => 'Modifier la date de publication', @@ -80,13 +81,13 @@ return [ audio {l\'audio} other {le média} } de l\'épisode.', - 'deleteFileError' => 'Impossible de supprimer {type, select, - transcript {la transcription} - chapters {les chapitres} - image {la couverture} - audio {l\'audio} - other {le média} - } du fichier {file_path}. Vous pouvez le supprimer manuellement de votre disque.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Il existe déjà un épisode avec le slug choisi.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Clair', 'light-transparent' => 'Clair transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/fr2/Platforms.php b/modules/Admin/Language/fr2/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/fr2/Platforms.php +++ b/modules/Admin/Language/fr2/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/fr2/Podcast.php b/modules/Admin/Language/fr2/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/fr2/Podcast.php +++ b/modules/Admin/Language/fr2/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/fr2/PodcastNavigation.php b/modules/Admin/Language/fr2/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/fr2/PodcastNavigation.php +++ b/modules/Admin/Language/fr2/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/fr_CA/Breadcrumb.php b/modules/Admin/Language/fr_CA/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/fr_CA/Breadcrumb.php +++ b/modules/Admin/Language/fr_CA/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/fr_CA/Common.php b/modules/Admin/Language/fr_CA/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/fr_CA/Common.php +++ b/modules/Admin/Language/fr_CA/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/fr_CA/Episode.php b/modules/Admin/Language/fr_CA/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/fr_CA/Episode.php +++ b/modules/Admin/Language/fr_CA/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/fr_CA/Platforms.php b/modules/Admin/Language/fr_CA/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/fr_CA/Platforms.php +++ b/modules/Admin/Language/fr_CA/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/fr_CA/Podcast.php b/modules/Admin/Language/fr_CA/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/fr_CA/Podcast.php +++ b/modules/Admin/Language/fr_CA/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/fr_CA/PodcastNavigation.php b/modules/Admin/Language/fr_CA/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/fr_CA/PodcastNavigation.php +++ b/modules/Admin/Language/fr_CA/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/gd/Breadcrumb.php b/modules/Admin/Language/gd/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/gd/Breadcrumb.php +++ b/modules/Admin/Language/gd/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/gd/Common.php b/modules/Admin/Language/gd/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/gd/Common.php +++ b/modules/Admin/Language/gd/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/gd/Episode.php b/modules/Admin/Language/gd/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/gd/Episode.php +++ b/modules/Admin/Language/gd/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/gd/Platforms.php b/modules/Admin/Language/gd/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/gd/Platforms.php +++ b/modules/Admin/Language/gd/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/gd/Podcast.php b/modules/Admin/Language/gd/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/gd/Podcast.php +++ b/modules/Admin/Language/gd/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/gd/PodcastNavigation.php b/modules/Admin/Language/gd/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/gd/PodcastNavigation.php +++ b/modules/Admin/Language/gd/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php index 15c54937..c6236fe0 100644 --- a/modules/Admin/Language/gl/Breadcrumb.php +++ b/modules/Admin/Language/gl/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'a miña conta', 'change-password' => 'cambiar contrasinal', 'imports' => 'importacións', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'plataformas', 'social' => 'redes sociais', 'funding' => 'financiamento', + 'monetization-other' => 'other monetization', 'analytics' => 'análise', 'locations' => 'localizacións', 'webpages' => 'páxinas web', diff --git a/modules/Admin/Language/gl/Common.php b/modules/Admin/Language/gl/Common.php index 66a6f8d2..bdccefcf 100644 --- a/modules/Admin/Language/gl/Common.php +++ b/modules/Admin/Language/gl/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Subir un ficheiro', 'remote_url' => 'URL remoto', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Reproducir', diff --git a/modules/Admin/Language/gl/Episode.php b/modules/Admin/Language/gl/Episode.php index 428610bc..a38dd8ba 100644 --- a/modules/Admin/Language/gl/Episode.php +++ b/modules/Admin/Language/gl/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Tódolos episodios do podcast', 'back_to_podcast' => 'Volver ao podcast', 'edit' => 'Editar', + 'preview' => 'Vista previa', 'publish' => 'Publicar', 'publish_edit' => 'Editar publicación', 'publish_date_edit' => 'Editar data de publicación', @@ -55,7 +56,7 @@ return [ }', 'episode' => 'Episodio', 'visibility' => 'Visibilidade', - 'downloads' => 'Downloads', + 'downloads' => 'Descargas', 'comments' => 'Comentarios', 'actions' => 'Accións', ], @@ -81,12 +82,12 @@ return [ other {do multimedia} } do episodio.', 'deleteFileError' => 'Fallou a eliminación do ficheiro {type, select, - transcript {da transcrición} - chapters {dos capítulos} - image {da imaxe} - audio {do audio} - other {do multimedia} - } {file_path}. Deberías eliminala manualmente do disco.', + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } {file_key}. Deberías eliminalo a man do disco.', 'sameSlugError' => 'Xa existe un episodio co id de url elexido.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Claro', 'light-transparent' => 'Claro transparente', ], + 'publication_status_banner' => [ + 'draft_mode' => 'modo borrador', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Vista previa', + ], ]; diff --git a/modules/Admin/Language/gl/Platforms.php b/modules/Admin/Language/gl/Platforms.php index aa2eb173..d9c98818 100644 --- a/modules/Admin/Language/gl/Platforms.php +++ b/modules/Admin/Language/gl/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Plataformas', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Ir á web de {platformName}', + 'register' => 'Register', 'submit_url' => 'Envía o teu podcast en {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Mostrar na páxina de inicio do podcast?', 'on_embed' => 'Mostrar no navegador incrustable?', 'remove' => 'Eliminar {platformName}', diff --git a/modules/Admin/Language/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php index 6abc8e1d..b16aade1 100644 --- a/modules/Admin/Language/gl/Podcast.php +++ b/modules/Admin/Language/gl/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Eliminar podcast', 'see_episodes' => 'Ver episodios', 'see_contributors' => 'Ver colaboradoras', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Ir á páxina', 'latest_episodes' => 'Últimos episodios', 'see_all_episodes' => 'Ver tódolos episodios', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Identidade do podcast', 'identity_section_subtitle' => 'Estes campos permítenche recibir notificacións.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Portada do podcast', 'cover_size_hint' => 'A portada ten que ser cadrada e como mínimo de 1400px de alto e ancho.', 'banner' => 'Cabeceira do podcast', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/gl/PodcastNavigation.php b/modules/Admin/Language/gl/PodcastNavigation.php index 4be04cdf..cb191d10 100644 --- a/modules/Admin/Language/gl/PodcastNavigation.php +++ b/modules/Admin/Language/gl/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Ir á páxina do podcast', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Taboleiro do podcast', 'podcast-view' => 'Inicio', 'podcast-edit' => 'Editar podcast', 'podcast-persons-manage' => 'Xestionar persoas', 'podcast-imports' => 'Importacións de podcasts', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodios', 'episode-list' => 'Todos os episodios', 'episode-create' => 'Novo episodio', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Reprodutores', 'podcast-analytics-listening-time' => 'Tempo de escoita', 'podcast-analytics-time-periods' => 'Período de tempo', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Todas as subscricións', 'subscription-create' => 'Engadir unha subscrición', 'contributors' => 'Contribúen', 'contributor-list' => 'Todas as contribucións', 'contributor-add' => 'Engadir colaboración', - 'platforms' => 'Plataformas externas', - 'platforms-podcasting' => 'Podcasts', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Redes sociais', - 'platforms-funding' => 'Financiamento', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/id/Breadcrumb.php b/modules/Admin/Language/id/Breadcrumb.php index 38927596..290483af 100644 --- a/modules/Admin/Language/id/Breadcrumb.php +++ b/modules/Admin/Language/id/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'akun saya', 'change-password' => 'ubah kata sandi', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analitik', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/id/Common.php b/modules/Admin/Language/id/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/id/Common.php +++ b/modules/Admin/Language/id/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/id/Episode.php b/modules/Admin/Language/id/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/id/Episode.php +++ b/modules/Admin/Language/id/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/id/Platforms.php b/modules/Admin/Language/id/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/id/Platforms.php +++ b/modules/Admin/Language/id/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/id/Podcast.php b/modules/Admin/Language/id/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/id/Podcast.php +++ b/modules/Admin/Language/id/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/id/PodcastNavigation.php b/modules/Admin/Language/id/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/id/PodcastNavigation.php +++ b/modules/Admin/Language/id/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/it/Breadcrumb.php b/modules/Admin/Language/it/Breadcrumb.php index 21988dad..fa31a5fe 100644 --- a/modules/Admin/Language/it/Breadcrumb.php +++ b/modules/Admin/Language/it/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'il mio profilo', 'change-password' => 'cambia la password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'piattaforme', 'social' => 'social networks', 'funding' => 'finanziamento', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'posizioni', 'webpages' => 'pagine web', diff --git a/modules/Admin/Language/it/Common.php b/modules/Admin/Language/it/Common.php index bff79dff..82ad7a8c 100644 --- a/modules/Admin/Language/it/Common.php +++ b/modules/Admin/Language/it/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Carica un file', 'remote_url' => 'URL remoto', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Riproduci', diff --git a/modules/Admin/Language/it/Episode.php b/modules/Admin/Language/it/Episode.php index 56151df7..28a890d0 100644 --- a/modules/Admin/Language/it/Episode.php +++ b/modules/Admin/Language/it/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Tutti gli episodi del podcast', 'back_to_podcast' => 'Torna a podcast', 'edit' => 'Modifica', + 'preview' => 'Preview', 'publish' => 'Pubblica', 'publish_edit' => 'Modifica pubblicazione', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/it/Platforms.php b/modules/Admin/Language/it/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/it/Platforms.php +++ b/modules/Admin/Language/it/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/it/Podcast.php b/modules/Admin/Language/it/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/it/Podcast.php +++ b/modules/Admin/Language/it/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/it/PodcastNavigation.php b/modules/Admin/Language/it/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/it/PodcastNavigation.php +++ b/modules/Admin/Language/it/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/ja/Breadcrumb.php b/modules/Admin/Language/ja/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/ja/Breadcrumb.php +++ b/modules/Admin/Language/ja/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/ja/Common.php b/modules/Admin/Language/ja/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/ja/Common.php +++ b/modules/Admin/Language/ja/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/ja/Episode.php b/modules/Admin/Language/ja/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/ja/Episode.php +++ b/modules/Admin/Language/ja/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/ja/Platforms.php b/modules/Admin/Language/ja/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/ja/Platforms.php +++ b/modules/Admin/Language/ja/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/ja/Podcast.php b/modules/Admin/Language/ja/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/ja/Podcast.php +++ b/modules/Admin/Language/ja/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/ja/PodcastNavigation.php b/modules/Admin/Language/ja/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/ja/PodcastNavigation.php +++ b/modules/Admin/Language/ja/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/kk/AboutCastopod.php b/modules/Admin/Language/kk/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/kk/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/kk/Breadcrumb.php b/modules/Admin/Language/kk/Breadcrumb.php new file mode 100644 index 00000000..6a678d4e --- /dev/null +++ b/modules/Admin/Language/kk/Breadcrumb.php @@ -0,0 +1,59 @@ + 'breadcrumb', + config(Admin::class) + ->gateway => 'Home', + 'podcasts' => 'podcasts', + 'episodes' => 'episodes', + 'subscriptions' => 'subscriptions', + 'contributors' => 'contributors', + 'pages' => 'pages', + 'settings' => 'settings', + 'theme' => 'theme', + 'about' => 'about', + 'add' => 'add', + 'new' => 'new', + 'edit' => 'edit', + 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'publish-date-edit' => 'edit publication date', + 'unpublish' => 'unpublish', + 'delete' => 'delete', + 'remove' => 'remove', + 'fediverse' => 'fediverse', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', + 'users' => 'users', + 'my-account' => 'my account', + 'change-password' => 'change password', + 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', + 'platforms' => 'platforms', + 'social' => 'social networks', + 'funding' => 'funding', + 'monetization-other' => 'other monetization', + 'analytics' => 'analytics', + 'locations' => 'locations', + 'webpages' => 'web pages', + 'unique-listeners' => 'unique listeners', + 'players' => 'players', + 'listening-time' => 'listening time', + 'time-periods' => 'time periods', + 'soundbites' => 'soundbites', + 'video-clips' => 'video clips', + 'embed' => 'embeddable player', + 'notifications' => 'notifications', + 'suspend' => 'suspend', +]; diff --git a/modules/Admin/Language/kk/Charts.php b/modules/Admin/Language/kk/Charts.php new file mode 100644 index 00000000..6ede2510 --- /dev/null +++ b/modules/Admin/Language/kk/Charts.php @@ -0,0 +1,41 @@ + 'Episode downloads by service (for the past week)', + 'by_player_weekly' => 'Episode downloads by player (for the past week)', + 'by_player_yearly' => 'Episode downloads by player (for the past year)', + 'by_device_weekly' => 'Episode downloads by device (for the past week)', + 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', + 'podcast_by_region' => 'Episode downloads by region (for the past week)', + 'unique_daily_listeners' => 'Daily unique listeners', + 'unique_monthly_listeners' => 'Monthly unique listeners', + 'by_browser' => 'Web pages usage by browser (for the past week)', + 'podcast_by_day' => 'Episode daily downloads', + 'podcast_by_month' => 'Episode monthly downloads', + 'episode_by_day' => 'Episode daily downloads (first 60 days)', + 'episode_by_month' => 'Episode monthly downloads', + 'episodes_by_day' => + '5 latest episodes downloads (during their first 60 days)', + 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_yearly' => 'Episode downloads by country (for the past year)', + 'by_domain_weekly' => 'Web pages visits by source (for the past week)', + 'by_domain_yearly' => 'Web pages visits by source (for the past year)', + 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + 'podcast_bots' => 'Bots (crawlers)', + 'daily_listening_time' => 'Daily cumulative listening time', + 'monthly_listening_time' => 'Monthly cumulative listening time', + 'by_weekday' => 'By week day (for the past 60 days)', + 'by_hour' => 'By time of day (for the past 60 days)', + 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', + 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', +]; diff --git a/modules/Admin/Language/kk/Common.php b/modules/Admin/Language/kk/Common.php new file mode 100644 index 00000000..74addcf2 --- /dev/null +++ b/modules/Admin/Language/kk/Common.php @@ -0,0 +1,52 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'more' => 'More', + 'no_data' => 'No data found!', + 'close' => 'Close', + 'edit' => 'Edit', + 'copy' => 'Copy', + 'copied' => 'Copied!', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', + 'forms' => [ + 'editor' => [ + 'write' => 'Write', + 'preview' => 'Preview', + 'help' => 'Powered by markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Press to select', + 'loadingText' => 'Loading…', + 'noResultsText' => 'No results found', + 'noChoicesText' => 'No choices to choose from', + 'maxItemText' => 'Cannot add more items', + ], + 'upload_file' => 'Upload a file', + 'remote_url' => 'Remote URL', + 'save' => 'Save', + ], + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'size_limit' => 'Size limit: {0}.', + 'choose_interact' => 'Choose how to interact', + 'view' => 'View', +]; diff --git a/modules/Admin/Language/kk/Countries.php b/modules/Admin/Language/kk/Countries.php new file mode 100644 index 00000000..4cd5d9c8 --- /dev/null +++ b/modules/Admin/Language/kk/Countries.php @@ -0,0 +1,264 @@ + 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia, Plurinational State of', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, the Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => "Côte d'Ivoire", + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cape Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia, Federated States of', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran, Islamic Republic of', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao People's Democratic Republic", + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'N/A' => 'Not Applicable (local IP…)', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Swaziland', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See (Vatican City State)', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/kk/Dashboard.php b/modules/Admin/Language/kk/Dashboard.php new file mode 100644 index 00000000..881073fd --- /dev/null +++ b/modules/Admin/Language/kk/Dashboard.php @@ -0,0 +1,28 @@ + 'Admin dashboard', + 'welcome_message' => 'Welcome to the admin area!', + 'podcasts' => [ + 'title' => 'Podcasts', + 'not_found' => 'No published podcast', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'episodes' => [ + 'title' => 'Episodes', + 'not_found' => 'No published episode', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'storage' => [ + 'title' => 'Storage', + 'subtitle' => '{totalUploaded} out of {totalStorage}', + ], +]; diff --git a/modules/Admin/Language/kk/Episode.php b/modules/Admin/Language/kk/Episode.php new file mode 100644 index 00000000..1a5e57a4 --- /dev/null +++ b/modules/Admin/Language/kk/Episode.php @@ -0,0 +1,225 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'edit' => 'Edit', + 'preview' => 'Preview', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'publish_date_edit' => 'Edit publication date', + 'unpublish' => 'Unpublish', + 'publish_error' => 'Episode is already published.', + 'publish_edit_error' => 'Episode is already published.', + 'publish_cancel_error' => 'Episode is already published.', + 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', + 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', + 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'unpublish_error' => 'Episode is not published.', + 'delete' => 'Delete', + 'go_to_page' => 'Go to page', + 'create' => 'Add an episode', + 'publication_status' => [ + 'published' => 'Published', + 'with_podcast' => 'Published', + 'scheduled' => 'Scheduled', + 'not_published' => 'Not published', + ], + 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Search for an episode', + 'clear' => 'Clear search', + 'submit' => 'Search', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# episode} + other {# episodes} + }', + 'episode' => 'Episode', + 'visibility' => 'Visibility', + 'downloads' => 'Downloads', + 'comments' => 'Comments', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'Episode has been successfully created!', + 'editSuccess' => 'Episode has been successfully updated!', + 'publishSuccess' => '{publication_status, select, + published {Episode successfully published!} + scheduled {Episode publication successfully scheduled!} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not published.} + }', + 'publishCancelSuccess' => 'Episode publication successfully cancelled!', + 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', + 'scheduleDateError' => 'Schedule date must be set!', + 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'deleteSuccess' => 'Episode successfully deleted!', + 'deleteError' => 'Failed to delete episode {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', + 'sameSlugError' => 'An episode with the chosen slug already exists.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapters', + 'chapters_hint' => 'File must be in JSON Chapters format.', + 'chapters_download' => 'Download chapters', + 'chapters_file' => 'Chapters file', + 'chapters_remote_url' => 'Remote url for chapters file', + 'chapters_file_delete' => 'Delete chapters file', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the episode', + 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', + 'block' => 'Episode should be hidden from public catalogues', + 'block_hint' => + 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'submit_create' => 'Create episode', + 'submit_edit' => 'Save episode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Back to episode dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + 'with_podcast' => 'Publish alongside podcast', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', + 'message_warning_submit' => 'Publish anyways', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'New publication date', + 'new_publication_date_hint' => 'Must be set to a past date.', + 'submit' => 'Edit publication date', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + 'understand' => 'I understand, I want to delete the episode', + 'submit' => 'Delete', + ], + 'embed' => [ + 'title' => 'Embeddable player', + 'label' => + 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', + 'clipboard_iframe' => 'Copy embeddable player to clipboard', + 'clipboard_url' => 'Copy address to clipboard', + 'dark' => 'Dark', + 'dark-transparent' => 'Dark transparent', + 'light' => 'Light', + 'light-transparent' => 'Light transparent', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], +]; diff --git a/modules/Admin/Language/kk/EpisodeNavigation.php b/modules/Admin/Language/kk/EpisodeNavigation.php new file mode 100644 index 00000000..1406e301 --- /dev/null +++ b/modules/Admin/Language/kk/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'View episode page', + 'dashboard' => 'Episode dashboard', + 'episode-view' => 'Home', + 'episode-edit' => 'Edit episode', + 'episode-persons-manage' => 'Manage persons', + 'embed-add' => 'Embeddable player', + 'clips' => 'Clips', + 'video-clips-list' => 'Video clips', + 'video-clips-create' => 'New video clip', + 'soundbites-list' => 'Soundbites', + 'soundbites-create' => 'New soundbite', +]; diff --git a/modules/Admin/Language/kk/Fediverse.php b/modules/Admin/Language/kk/Fediverse.php new file mode 100644 index 00000000..0e4ca66d --- /dev/null +++ b/modules/Admin/Language/kk/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'The account could not be found!', + 'blockActorSuccess' => '{actor} has been blocked!', + 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockDomainSuccess' => '{domain} has been blocked!', + 'unblockDomainSuccess' => '{domain} has been unblocked!', + ], + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/modules/Admin/Language/kk/Home.php b/modules/Admin/Language/kk/Home.php new file mode 100644 index 00000000..3ff4c04d --- /dev/null +++ b/modules/Admin/Language/kk/Home.php @@ -0,0 +1,14 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found', +]; diff --git a/modules/Admin/Language/kk/Install.php b/modules/Admin/Language/kk/Install.php new file mode 100644 index 00000000..36e373a2 --- /dev/null +++ b/modules/Admin/Language/kk/Install.php @@ -0,0 +1,61 @@ + 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Admin/Language/kk/Navigation.php b/modules/Admin/Language/kk/Navigation.php new file mode 100644 index 00000000..5d1b4583 --- /dev/null +++ b/modules/Admin/Language/kk/Navigation.php @@ -0,0 +1,43 @@ + 'Toggle sidebar', + 'go_to_website' => 'Go to website', + 'go_to_admin' => 'Go to admin', + 'dashboard' => 'Dashboard', + 'admin' => 'Home', + 'podcasts' => 'Podcasts', + 'podcast-list' => 'All podcasts', + 'podcast-create' => 'New podcast', + 'all-podcast-imports' => 'All Podcast imports', + 'podcast-imports-add' => 'Import a podcast', + 'persons' => 'Persons', + 'person-list' => 'All persons', + 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', + 'users' => 'Users', + 'user-list' => 'All users', + 'user-create' => 'New user', + 'pages' => 'Pages', + 'page-list' => 'All pages', + 'page-create' => 'New Page', + 'settings' => 'Settings', + 'settings-general' => 'General', + 'settings-theme' => 'Theme', + 'admin-about' => 'About', + 'account' => [ + 'my-account' => 'My account', + 'change-password' => 'Change password', + 'logout' => 'Logout', + ], +]; diff --git a/modules/Admin/Language/kk/Notifications.php b/modules/Admin/Language/kk/Notifications.php new file mode 100644 index 00000000..2b139d51 --- /dev/null +++ b/modules/Admin/Language/kk/Notifications.php @@ -0,0 +1,19 @@ + 'Notifications', + 'reply' => '{actor_username} replied to your post', + 'favourite' => '{actor_username} favourited your post', + 'reblog' => '{actor_username} shared your post', + 'follow' => '{actor_username} started following you', + 'no_notifications' => 'No notifications', + 'mark_all_as_read' => 'Mark all as read', +]; diff --git a/modules/Admin/Language/kk/Page.php b/modules/Admin/Language/kk/Page.php new file mode 100644 index 00000000..b6f49de5 --- /dev/null +++ b/modules/Admin/Language/kk/Page.php @@ -0,0 +1,30 @@ + 'Back to home', + 'page' => 'Page', + 'all_pages' => 'All pages', + 'create' => 'New page', + 'go_to_page' => 'Go to page', + 'edit' => 'Edit page', + 'delete' => 'Delete page', + 'form' => [ + 'title' => 'Title', + 'permalink' => 'Permalink', + 'content' => 'Content', + 'submit_create' => 'Create page', + 'submit_edit' => 'Save', + ], + 'messages' => [ + 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'editSuccess' => 'The page was successfully updated!', + ], +]; diff --git a/modules/Admin/Language/kk/Pager.php b/modules/Admin/Language/kk/Pager.php new file mode 100644 index 00000000..e25ee638 --- /dev/null +++ b/modules/Admin/Language/kk/Pager.php @@ -0,0 +1,21 @@ + 'Page navigation', + 'first' => 'First', + 'previous' => 'Previous', + 'next' => 'Next', + 'last' => 'Last', + 'older' => 'Older', + 'newer' => 'Newer', + 'invalidTemplate' => '{0} is not a valid Pager template.', + 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', +]; diff --git a/modules/Admin/Language/kk/Person.php b/modules/Admin/Language/kk/Person.php new file mode 100644 index 00000000..a652be9f --- /dev/null +++ b/modules/Admin/Language/kk/Person.php @@ -0,0 +1,65 @@ + 'Persons', + 'all_persons' => 'All persons', + 'no_person' => 'Nobody found!', + 'create' => 'Create a person', + 'view' => 'View person', + 'edit' => 'Edit person', + 'delete' => 'Delete person', + 'messages' => [ + 'createSuccess' => 'Person has been successfully created!', + 'editSuccess' => 'Person has been successfully updated!', + 'deleteSuccess' => 'Person has been removed!', + ], + 'form' => [ + 'avatar' => 'Avatar', + 'avatar_size_hint' => + 'Avatar must be squared and at least 400px wide and tall.', + 'full_name' => 'Full name', + 'full_name_hint' => 'This is the full name or alias of the person.', + 'unique_name' => 'Unique name', + 'unique_name_hint' => 'Used for URLs', + 'information_url' => 'Information URL', + 'information_url_hint' => + 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', + 'submit_create' => 'Create person', + 'submit_edit' => 'Save person', + ], + 'podcast_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this podcast', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'episode_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this episode', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'credits' => 'Credits', +]; diff --git a/modules/Admin/Language/kk/Platforms.php b/modules/Admin/Language/kk/Platforms.php new file mode 100644 index 00000000..e161181c --- /dev/null +++ b/modules/Admin/Language/kk/Platforms.php @@ -0,0 +1,43 @@ + [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', + 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', + 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', + 'visible' => 'Display in podcast homepage?', + 'on_embed' => 'Display on embeddable player?', + 'remove' => 'Remove {platformName}', + 'submit' => 'Save', + 'messages' => [ + 'updateSuccess' => 'Platform links have been successfully updated!', + 'removeLinkSuccess' => 'The platform link has been removed.', + 'removeLinkError' => + 'The platform link could not be removed. Try again.', + ], + 'description' => [ + 'podcasting' => 'The podcast ID on this platform', + 'social' => 'The podcast account ID on this platform', + 'funding' => 'Call to action message', + ], +]; diff --git a/modules/Admin/Language/kk/Podcast.php b/modules/Admin/Language/kk/Podcast.php new file mode 100644 index 00000000..d9359e9b --- /dev/null +++ b/modules/Admin/Language/kk/Podcast.php @@ -0,0 +1,314 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found!', + 'create' => 'Create podcast', + 'import' => 'Import podcast', + 'all_imports' => 'Podcast imports', + 'new_episode' => 'New Episode', + 'view' => 'View podcast', + 'edit' => 'Edit podcast', + 'publish' => 'Publish podcast', + 'publish_edit' => 'Edit publication', + 'delete' => 'Delete podcast', + 'see_episodes' => 'See episodes', + 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', + 'go_to_page' => 'Go to page', + 'latest_episodes' => 'Latest episodes', + 'see_all_episodes' => 'See all episodes', + 'draft' => 'Draft', + 'messages' => [ + 'createSuccess' => 'Podcast successfully created!', + 'editSuccess' => 'Podcast has been successfully updated!', + 'importSuccess' => 'Podcast has been successfully imported!', + 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, + cover {cover} + banner {banner} + other {media} + }.', + 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, + one {# episode was} + other {# episodes were} + } added to the podcast!', + 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'publishError' => 'This podcast is either already published or scheduled for publication.', + 'publishEditError' => 'This podcast is not scheduled for publication.', + 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', + 'scheduleDateError' => 'Schedule date must be set!', + ], + 'form' => [ + 'identity_section_title' => 'Podcast identity', + 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + + 'cover' => 'Podcast cover', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'banner' => 'Podcast banner', + 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_delete' => 'Delete podcast banner', + 'title' => 'Title', + 'handle' => 'Handle', + 'handle_hint' => + 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'type' => [ + 'label' => 'Type', + 'episodic' => 'Episodic', + 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', + 'serial' => 'Serial', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + ], + 'description' => 'Description', + 'classification_section_title' => 'Classification', + 'classification_section_subtitle' => + 'These fields will impact your audience and competition.', + 'language' => 'Language', + 'category' => 'Category', + 'category_placeholder' => 'Select a category…', + 'other_categories' => 'Other categories', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does it contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'author_section_title' => 'Author', + 'author_section_subtitle' => 'Who is managing the podcast?', + 'owner_name' => 'Owner name', + 'owner_name_hint' => + 'For administrative use only. Visible in the public RSS feed.', + 'owner_email' => 'Owner email', + 'owner_email_hint' => + 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'publisher' => 'Publisher', + 'publisher_hint' => + 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'copyright' => 'Copyright', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this podcast about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real place or fictional', + 'monetization_section_title' => 'Monetization', + 'monetization_section_subtitle' => + 'Earn money thanks to your audience.', + 'premium' => 'Premium', + 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_enable' => 'Enable OP3 analytics service', + 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'payment_pointer_hint' => + 'This is your where you will receive money thanks to Web Monetization', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the podcast', + 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'new_feed_url' => 'New feed URL', + 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', + 'old_feed_url' => 'Old feed URL', + 'partnership' => 'Partnership', + 'partner_id' => 'ID', + 'partner_link_url' => 'Link URL', + 'partner_image_url' => 'Image URL', + 'partner_id_hint' => 'Your own partner ID', + 'partner_link_url_hint' => 'The generic partner link address', + 'partner_image_url_hint' => 'The generic partner image address', + 'block' => 'Podcast should be hidden from public catalogues', + 'block_hint' => + 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'complete' => 'Podcast will not be having new episodes', + 'lock' => 'Prevent podcast from being copied', + 'lock_hint' => + 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', + 'submit_create' => 'Create podcast', + 'submit_edit' => 'Save podcast', + ], + 'category_options' => [ + 'uncategorized' => 'uncategorized', + 'arts' => 'Arts', + 'business' => 'Business', + 'comedy' => 'Comedy', + 'education' => 'Education', + 'fiction' => 'Fiction', + 'government' => 'Government', + 'health_and_fitness' => 'Health & Fitness', + 'history' => 'History', + 'kids_and_family' => 'Kids & Family', + 'leisure' => 'Leisure', + 'music' => 'Music', + 'news' => 'News', + 'religion_and_spirituality' => 'Religion & Spirituality', + 'science' => 'Science', + 'society_and_culture' => 'Society & Culture', + 'sports' => 'Sports', + 'technology' => 'Technology', + 'true_crime' => 'True Crime', + 'tv_and_film' => 'TV & Film', + 'books' => 'Books', + 'design' => 'Design', + 'fashion_and_beauty' => 'Fashion & Beauty', + 'food' => 'Food', + 'performing_arts' => 'Performing Arts', + 'visual_arts' => 'Visual Arts', + 'careers' => 'Careers', + 'entrepreneurship' => 'Entrepreneurship', + 'investing' => 'Investing', + 'management' => 'Management', + 'marketing' => 'Marketing', + 'non_profit' => 'Non-Profit', + 'comedy_interviews' => 'Comedy Interviews', + 'improv' => 'Improv', + 'stand_up' => 'Stand-Up', + 'courses' => 'Courses', + 'how_to' => 'How To', + 'language_learning' => 'Language Learning', + 'self_improvement' => 'Self-Improvement', + 'comedy_fiction' => 'Comedy Fiction', + 'drama' => 'Drama', + 'science_fiction' => 'Science Fiction', + 'alternative_health' => 'Alternative Health', + 'fitness' => 'Fitness', + 'medicine' => 'Medicine', + 'mental_health' => 'Mental Health', + 'nutrition' => 'Nutrition', + 'sexuality' => 'Sexuality', + 'education_for_kids' => 'Education for Kids', + 'parenting' => 'Parenting', + 'pets_and_animals' => 'Pets & Animals', + 'stories_for_kids' => 'Stories for Kids', + 'animation_and_manga' => 'Animation & Manga', + 'automotive' => 'Automotive', + 'aviation' => 'Aviation', + 'crafts' => 'Crafts', + 'games' => 'Games', + 'hobbies' => 'Hobbies', + 'home_and_garden' => 'Home & Garden', + 'video_games' => 'Video Games', + 'music_commentary' => 'Music Commentary', + 'music_history' => 'Music History', + 'music_interviews' => 'Music Interviews', + 'business_news' => 'Business News', + 'daily_news' => 'Daily News', + 'entertainment_news' => 'Entertainment News', + 'news_commentary' => 'News Commentary', + 'politics' => 'Politics', + 'sports_news' => 'Sports News', + 'tech_news' => 'Tech News', + 'buddhism' => 'Buddhism', + 'christianity' => 'Christianity', + 'hinduism' => 'Hinduism', + 'islam' => 'Islam', + 'judaism' => 'Judaism', + 'religion' => 'Religion', + 'spirituality' => 'Spirituality', + 'astronomy' => 'Astronomy', + 'chemistry' => 'Chemistry', + 'earth_sciences' => 'Earth Sciences', + 'life_sciences' => 'Life Sciences', + 'mathematics' => 'Mathematics', + 'natural_sciences' => 'Natural Sciences', + 'nature' => 'Nature', + 'physics' => 'Physics', + 'social_sciences' => 'Social Sciences', + 'documentary' => 'Documentary', + 'personal_journals' => 'Personal Journals', + 'philosophy' => 'Philosophy', + 'places_and_travel' => 'Places & Travel', + 'relationships' => 'Relationships', + 'baseball' => 'Baseball', + 'basketball' => 'Basketball', + 'cricket' => 'Cricket', + 'fantasy_sports' => 'Fantasy Sports', + 'football' => 'Football', + 'golf' => 'Golf', + 'hockey' => 'Hockey', + 'rugby' => 'Rugby', + 'running' => 'Running', + 'soccer' => 'Soccer', + 'swimming' => 'Swimming', + 'tennis' => 'Tennis', + 'volleyball' => 'Volleyball', + 'wilderness' => 'Wilderness', + 'wrestling' => 'Wrestling', + 'after_shows' => 'After Shows', + 'film_history' => 'Film History', + 'film_interviews' => 'Film Interviews', + 'film_reviews' => 'Film Reviews', + 'tv_reviews' => 'TV Reviews', + ], + 'publish_form' => [ + 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'submit' => 'Publish', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', + 'message_warning_submit' => 'Publish anyway', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'not_published' => 'This podcast is not yet published.', + 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", + 'understand' => 'I understand, I want the podcast to be permanently deleted', + 'submit' => 'Delete', + ], + 'by' => 'By {publisher}', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', +]; diff --git a/modules/Admin/Language/kk/PodcastNavigation.php b/modules/Admin/Language/kk/PodcastNavigation.php new file mode 100644 index 00000000..bb777707 --- /dev/null +++ b/modules/Admin/Language/kk/PodcastNavigation.php @@ -0,0 +1,42 @@ + 'Go to podcast page', + 'rss_feed' => 'RSS feed', + 'dashboard' => 'Podcast dashboard', + 'podcast-view' => 'Home', + 'podcast-edit' => 'Edit podcast', + 'podcast-persons-manage' => 'Manage persons', + 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', + 'episodes' => 'Episodes', + 'episode-list' => 'All episodes', + 'episode-create' => 'New episode', + 'analytics' => 'Analytics', + 'podcast-analytics' => 'Audience overview', + 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-players' => 'Players', + 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-time-periods' => 'Time periods', + 'monetization' => 'Monetization', + 'subscription-list' => 'All subscriptions', + 'subscription-create' => 'Add subscription', + 'contributors' => 'Contributors', + 'contributor-list' => 'All contributors', + 'contributor-add' => 'Add contributor', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', + 'platforms-social' => 'Social networks', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', +]; diff --git a/modules/Admin/Language/kk/Settings.php b/modules/Admin/Language/kk/Settings.php new file mode 100644 index 00000000..4a70dcba --- /dev/null +++ b/modules/Admin/Language/kk/Settings.php @@ -0,0 +1,58 @@ + 'General settings', + 'instance' => [ + 'title' => 'Instance', + 'site_icon' => 'Site icon', + 'site_icon_delete' => 'Delete site icon', + 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_name' => 'Site name', + 'site_description' => 'Site description', + 'submit' => 'Save', + 'editSuccess' => 'Instance has been updated successfully!', + 'deleteIconSuccess' => 'Site icon has been remove successfully!', + ], + 'images' => [ + 'title' => 'Images', + 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'regenerate' => 'Regenerate images', + 'regenerationSuccess' => 'All images have been regenerated successfully!', + ], + 'housekeeping' => [ + 'title' => 'Housekeeping', + 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', + 'reset_counts' => 'Reset counts', + 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', + 'rewrite_media' => 'Rewrite media metadata', + 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', + 'rename_episodes_files' => 'Rename episode audio files', + 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'clear_cache' => 'Clear all cache', + 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'run' => 'Run housekeeping', + 'runSuccess' => 'Housekeeping has been run successfully!', + ], + 'theme' => [ + 'title' => 'Theme', + 'accent_section_title' => 'Accent color', + 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', + 'pine' => 'Pine', + 'crimson' => 'Crimson', + 'amber' => 'Amber', + 'lake' => 'Lake', + 'jacaranda' => 'Jacaranda', + 'onyx' => 'Onyx', + 'submit' => 'Save', + 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + ], +]; diff --git a/modules/Admin/Language/kk/Soundbite.php b/modules/Admin/Language/kk/Soundbite.php new file mode 100644 index 00000000..a3f828fe --- /dev/null +++ b/modules/Admin/Language/kk/Soundbite.php @@ -0,0 +1,31 @@ + [ + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', + ], + 'messages' => [ + 'createSuccess' => 'Soundbite has been successfully created!', + 'deleteSuccess' => 'Soundbite has been successfully removed!', + ], + 'form' => [ + 'title' => 'New soundbite', + 'soundbite_title' => 'Soundbite title', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'submit' => 'Create soundbite', + ], + 'play' => 'Play soundbite', + 'stop' => 'Stop soundbite', + 'create' => 'New soundbite', + 'delete' => 'Delete soundbite', +]; diff --git a/modules/Admin/Language/kk/Validation.php b/modules/Admin/Language/kk/Validation.php new file mode 100644 index 00000000..3bc78cfe --- /dev/null +++ b/modules/Admin/Language/kk/Validation.php @@ -0,0 +1,16 @@ + + '{field} is either not an image, or it is not wide or tall enough.', + 'is_image_ratio' => + '{field} is either not an image or not of the right ratio.', +]; diff --git a/modules/Admin/Language/kk/VideoClip.php b/modules/Admin/Language/kk/VideoClip.php new file mode 100644 index 00000000..638de697 --- /dev/null +++ b/modules/Admin/Language/kk/VideoClip.php @@ -0,0 +1,72 @@ + [ + 'title' => 'Video clips', + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Clip is waiting to be processed.', + 'pending' => 'pending', + 'pending_hint' => 'Clip will be generated shortly.', + 'running' => 'running', + 'running_hint' => 'Clip is being generated.', + 'failed' => 'failed', + 'failed_hint' => 'Clip could not be generated: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Clip was generated successfully!', + ], + 'clip' => 'Clip', + 'duration' => 'Job duration', + ], + 'title' => 'Video clip: {videoClipLabel}', + 'download_clip' => 'Download clip', + 'create' => 'New video clip', + 'go_to_page' => 'Go to clip page', + 'retry' => 'Retry clip generation', + 'delete' => 'Delete clip', + 'logs' => 'Job logs', + 'messages' => [ + 'alreadyExistingError' => 'The video clip you are trying to create already exists!', + 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', + 'deleteSuccess' => 'Video clip has been successfully removed!', + ], + 'format' => [ + 'landscape' => 'Landscape', + 'portrait' => 'Portrait', + 'squared' => 'Squared', + ], + 'form' => [ + 'title' => 'New video clip', + 'params_section_title' => 'Video clip parameters', + 'clip_title' => 'Clip title', + 'format' => [ + 'label' => 'Choose a format', + 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', + 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', + 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + ], + 'theme' => 'Select a theme', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'trim_start' => 'Trim start', + 'trim_end' => 'Trim end', + 'submit' => 'Create video clip', + ], + 'requirements' => [ + 'title' => 'Missing requirements', + 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'ffmpeg' => 'FFmpeg', + 'gd' => 'Graphics Draw (GD)', + 'freetype' => 'Freetype library for GD', + 'transcript' => 'Transcript file (.srt)', + ], +]; diff --git a/modules/Admin/Language/ko/Breadcrumb.php b/modules/Admin/Language/ko/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/ko/Breadcrumb.php +++ b/modules/Admin/Language/ko/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/ko/Common.php b/modules/Admin/Language/ko/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/ko/Common.php +++ b/modules/Admin/Language/ko/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/ko/Episode.php b/modules/Admin/Language/ko/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/ko/Episode.php +++ b/modules/Admin/Language/ko/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/ko/Platforms.php b/modules/Admin/Language/ko/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/ko/Platforms.php +++ b/modules/Admin/Language/ko/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/ko/Podcast.php b/modules/Admin/Language/ko/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/ko/Podcast.php +++ b/modules/Admin/Language/ko/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/ko/PodcastNavigation.php b/modules/Admin/Language/ko/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/ko/PodcastNavigation.php +++ b/modules/Admin/Language/ko/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php index 4f2591f8..d131f786 100644 --- a/modules/Admin/Language/nl/Breadcrumb.php +++ b/modules/Admin/Language/nl/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'mijn account', 'change-password' => 'wachtwoord wijzigen', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platformen', 'social' => 'sociale netwerken', 'funding' => 'financiering', + 'monetization-other' => 'other monetization', 'analytics' => 'statistieken', 'locations' => 'locaties', 'webpages' => 'webpagina\'s', diff --git a/modules/Admin/Language/nl/Common.php b/modules/Admin/Language/nl/Common.php index a6194f73..4f1fd4f3 100644 --- a/modules/Admin/Language/nl/Common.php +++ b/modules/Admin/Language/nl/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Bestand uploaden', 'remote_url' => 'Externe URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Afspelen', diff --git a/modules/Admin/Language/nl/Episode.php b/modules/Admin/Language/nl/Episode.php index 9902c773..88eac050 100644 --- a/modules/Admin/Language/nl/Episode.php +++ b/modules/Admin/Language/nl/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Alle podcast afleveringen', 'back_to_podcast' => 'Terug naar podcast', 'edit' => 'Bewerken', + 'preview' => 'Preview', 'publish' => 'Publiceren', 'publish_edit' => 'Publicatie bewerken', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/nl/Platforms.php b/modules/Admin/Language/nl/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/nl/Platforms.php +++ b/modules/Admin/Language/nl/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/nl/Podcast.php b/modules/Admin/Language/nl/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/nl/Podcast.php +++ b/modules/Admin/Language/nl/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/nl/PodcastNavigation.php b/modules/Admin/Language/nl/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/nl/PodcastNavigation.php +++ b/modules/Admin/Language/nl/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php index 17dfc79c..c2b222af 100644 --- a/modules/Admin/Language/nn-NO/Breadcrumb.php +++ b/modules/Admin/Language/nn-NO/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'kontoen min', 'change-password' => 'endre passord', 'imports' => 'importar', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'plattformer', 'social' => 'sosiale nettverk', 'funding' => 'finansiering', + 'monetization-other' => 'other monetization', 'analytics' => 'analysar', 'locations' => 'stader', 'webpages' => 'nettsider', diff --git a/modules/Admin/Language/nn-NO/Common.php b/modules/Admin/Language/nn-NO/Common.php index 46688469..b37e1394 100644 --- a/modules/Admin/Language/nn-NO/Common.php +++ b/modules/Admin/Language/nn-NO/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Last opp ei fil', 'remote_url' => 'Ekstern URL-adresse', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Spel', diff --git a/modules/Admin/Language/nn-NO/Platforms.php b/modules/Admin/Language/nn-NO/Platforms.php index 3cf5f254..f1fd7c9a 100644 --- a/modules/Admin/Language/nn-NO/Platforms.php +++ b/modules/Admin/Language/nn-NO/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Plattformer', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Gå til {platformName}-nettstaden', + 'register' => 'Register', 'submit_url' => 'Send podkasten din til {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Vis på heimesida til podkasten?', 'on_embed' => 'Vis i den innbyggbare spelaren?', 'remove' => 'Fjern {platformName}', diff --git a/modules/Admin/Language/nn-NO/Podcast.php b/modules/Admin/Language/nn-NO/Podcast.php index e4765352..e54b193a 100644 --- a/modules/Admin/Language/nn-NO/Podcast.php +++ b/modules/Admin/Language/nn-NO/Podcast.php @@ -22,12 +22,11 @@ return [ 'delete' => 'Slett podkasten', 'see_episodes' => 'Sjå episodane', 'see_contributors' => 'Sjå bidragsytarane', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Gå til side', 'latest_episodes' => 'Dei nyaste episodane', 'see_all_episodes' => 'Sjå alle episodane', 'draft' => 'Kladd', - 'sync_feed' => 'Synkroniser straumen', - 'sync_feed_hint' => 'Importer dei nyaste episodane til denne podkasten', 'messages' => [ 'createSuccess' => 'Podkasten er oppretta!', 'editSuccess' => 'Podkasten er oppdatert!', @@ -59,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podkastidentitet', 'identity_section_subtitle' => 'Desse felta gjer at du blir lagt merke til.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podkastomslag', 'cover_size_hint' => 'Omslaget må vera kvadratisk, og minst 1400pkt breitt og høgt.', 'banner' => 'Podkastbanner', @@ -134,7 +135,6 @@ return [ 'partner_id_hint' => 'Din eigen partnar-ID', 'partner_link_url_hint' => 'Lenkeadressa til den generelle partnaren', 'partner_image_url_hint' => 'Biletadressa til den generelle partnaren', - 'status_section_title' => 'Status', 'block' => 'Podkasten skal gøymast frå offentlege katalogar', 'block_hint' => 'Vis- eller gøym- status for podkasten: Dersom du skrur på dette, hindrar det heile podkasten frå å syna i Apple podcasts, Google podcasts og andre tredjeparts-appar som hentar podkastar frå desse (men ingen garanti)', diff --git a/modules/Admin/Language/nn-NO/PodcastNavigation.php b/modules/Admin/Language/nn-NO/PodcastNavigation.php index cbbfedaa..3b0bd11a 100644 --- a/modules/Admin/Language/nn-NO/PodcastNavigation.php +++ b/modules/Admin/Language/nn-NO/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Gå til podkastsida', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podkast-styringspanel', 'podcast-view' => 'Heim', 'podcast-edit' => 'Rediger podkasten', 'podcast-persons-manage' => 'Handter personar', 'podcast-imports' => 'Podkast-importar', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodar', 'episode-list' => 'Alle episodane', 'episode-create' => 'Ny episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Spelarar', 'podcast-analytics-listening-time' => 'Lyttetid', 'podcast-analytics-time-periods' => 'Tidsperiodar', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Alle abonnement', 'subscription-create' => 'Legg til abonnement', 'contributors' => 'Bidragsytarar', 'contributor-list' => 'Alle bidragsytarane', 'contributor-add' => 'Legg til bidragsytar', - 'platforms' => 'Eksterne plattformer', - 'platforms-podcasting' => 'Podkasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Sosiale nettverk', - 'platforms-funding' => 'Finansiering', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/oc/Breadcrumb.php b/modules/Admin/Language/oc/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/oc/Breadcrumb.php +++ b/modules/Admin/Language/oc/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/oc/Common.php b/modules/Admin/Language/oc/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/oc/Common.php +++ b/modules/Admin/Language/oc/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/oc/Episode.php b/modules/Admin/Language/oc/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/oc/Episode.php +++ b/modules/Admin/Language/oc/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/oc/Platforms.php b/modules/Admin/Language/oc/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/oc/Platforms.php +++ b/modules/Admin/Language/oc/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/oc/Podcast.php b/modules/Admin/Language/oc/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/oc/Podcast.php +++ b/modules/Admin/Language/oc/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/oc/PodcastNavigation.php b/modules/Admin/Language/oc/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/oc/PodcastNavigation.php +++ b/modules/Admin/Language/oc/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/pl/Breadcrumb.php b/modules/Admin/Language/pl/Breadcrumb.php index d3e718f0..37e81c6f 100644 --- a/modules/Admin/Language/pl/Breadcrumb.php +++ b/modules/Admin/Language/pl/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'moje konto', 'change-password' => 'zmień hasło', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platformy', 'social' => 'sieci społecznościowe', 'funding' => 'finansowanie', + 'monetization-other' => 'other monetization', 'analytics' => 'analityka', 'locations' => 'lokalizacje', 'webpages' => 'strony internetowe', diff --git a/modules/Admin/Language/pl/Common.php b/modules/Admin/Language/pl/Common.php index 8fcbc322..25c59bb1 100644 --- a/modules/Admin/Language/pl/Common.php +++ b/modules/Admin/Language/pl/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Prześlij plik', 'remote_url' => 'Zdalny URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Odtwarzaj', diff --git a/modules/Admin/Language/pl/Episode.php b/modules/Admin/Language/pl/Episode.php index e58524c0..de847425 100644 --- a/modules/Admin/Language/pl/Episode.php +++ b/modules/Admin/Language/pl/Episode.php @@ -23,6 +23,7 @@ return [ 'all_podcast_episodes' => 'Wszystkie odcinki podcastu', 'back_to_podcast' => 'Wróć do podkastu', 'edit' => 'Edytuj', + 'preview' => 'Preview', 'publish' => 'Publikuj', 'publish_edit' => 'Edytuj publikację', 'publish_date_edit' => 'Edytuj datę publikacji', @@ -82,13 +83,13 @@ return [ audio {audio} other {mediów} } odcinka.', - 'deleteFileError' => 'Nie udało się usunąć {type, select, - transcript {transkryptu} - chapters {rozdziały} - image {okładka} + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} audio {audio} other {media} - } plik {file_path}. Możesz ręcznie usunąć go ze swojego dysku.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Odcinek z wybranym slugiem już istnieje.', ], 'form' => [ @@ -213,4 +214,14 @@ return [ 'light' => 'Jasny', 'light-transparent' => 'Jasny przezroczysty', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/pl/Platforms.php b/modules/Admin/Language/pl/Platforms.php index 82bb83e6..1d8393a8 100644 --- a/modules/Admin/Language/pl/Platforms.php +++ b/modules/Admin/Language/pl/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platformy', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Idź do strony {platformName}', + 'register' => 'Register', 'submit_url' => 'Prześlij swój podcast na {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Wyświetlać na stronie głównej podcastu?', 'on_embed' => 'Wyświetlać w osadzalnym odtwarzaczu?', 'remove' => 'Usuń {platformName}', diff --git a/modules/Admin/Language/pl/Podcast.php b/modules/Admin/Language/pl/Podcast.php index 0a617a2f..7c9b48dd 100644 --- a/modules/Admin/Language/pl/Podcast.php +++ b/modules/Admin/Language/pl/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Usuń podcast', 'see_episodes' => 'Zobacz odcinki', 'see_contributors' => 'Zobacz kontrybutorów', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Idź do strony', 'latest_episodes' => 'Najnowsze odcinki', 'see_all_episodes' => 'Zobacz wszystkie odcinki', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Tożsamość podcastu', 'identity_section_subtitle' => 'Te pola pozwalają Ci zostać zauważonym.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Okładka podcastu', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Baner podcastu', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Twój własny ID partnera', 'partner_link_url_hint' => 'Ogólny adres linku partnera', 'partner_image_url_hint' => 'Ogólny adres obrazu partnera', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/pl/PodcastNavigation.php b/modules/Admin/Language/pl/PodcastNavigation.php index 6226fc2a..621e411e 100644 --- a/modules/Admin/Language/pl/PodcastNavigation.php +++ b/modules/Admin/Language/pl/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Idź do strony podcastu', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Pulpit podcastu', 'podcast-view' => 'Początek', 'podcast-edit' => 'Edytuj podcast', 'podcast-persons-manage' => 'Zarządzaj osobami', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Odcinki', 'episode-list' => 'Wszystkie odcinki', 'episode-create' => 'Nowy odcinek', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Odtwarzacze', 'podcast-analytics-listening-time' => 'Czas odsłuchu', 'podcast-analytics-time-periods' => 'Okresy czasu', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Wszystkie subskrypcje', 'subscription-create' => 'Dodaj subskrypcję', 'contributors' => 'Kontrybutorzy', 'contributor-list' => 'Wszyscy kontrybutorzy', 'contributor-add' => 'Dodaj kontrybutora', - 'platforms' => 'Zewnętrzne platformy', - 'platforms-podcasting' => 'Platformy podcastingowe', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Sieci społecznościowe', - 'platforms-funding' => 'Finansowanie', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-BR/Breadcrumb.php index 63d17e97..29c73be3 100644 --- a/modules/Admin/Language/pt-BR/Breadcrumb.php +++ b/modules/Admin/Language/pt-BR/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'minha conta', 'change-password' => 'alterar senha', 'imports' => 'importações', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'plataformas', 'social' => 'redes sociais', 'funding' => 'financiamento', + 'monetization-other' => 'other monetization', 'analytics' => 'estatísticas', 'locations' => 'localizações', 'webpages' => 'páginas da web', diff --git a/modules/Admin/Language/pt-BR/Common.php b/modules/Admin/Language/pt-BR/Common.php index c323eef3..f82a5109 100644 --- a/modules/Admin/Language/pt-BR/Common.php +++ b/modules/Admin/Language/pt-BR/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Enviar um arquivo', 'remote_url' => 'URL remota', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Reproduzir', diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-BR/Episode.php index 8a7e19d7..deb669aa 100644 --- a/modules/Admin/Language/pt-BR/Episode.php +++ b/modules/Admin/Language/pt-BR/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Todos os episódios de podcast', 'back_to_podcast' => 'Voltar para o podcast', 'edit' => 'Editar', + 'preview' => 'Preview', 'publish' => 'Publicar', 'publish_edit' => 'Editar publicação', 'publish_date_edit' => 'Editar data de publicação', @@ -80,13 +81,13 @@ return [ audio {áudio} other {mídia} }.', - 'deleteFileError' => 'Falha ao excluir o arquivo de {type, select, - transcript {transcrição} - chapters {capítulos} - image {capa} - audio {áudio} - other {mídia} - } {file_path}. Você pode removê-lo manualmente do seu disco.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Um episódio com o slug escolhido já existe.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Claro', 'light-transparent' => 'Claro translúcido', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/pt-BR/Platforms.php b/modules/Admin/Language/pt-BR/Platforms.php index c49bc8a2..14f14b49 100644 --- a/modules/Admin/Language/pt-BR/Platforms.php +++ b/modules/Admin/Language/pt-BR/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Plataformas', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Ir para o site {platformName}', + 'register' => 'Register', 'submit_url' => 'Enviar seu podcast para {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Mostrar na página inicial do podcast?', 'on_embed' => 'Mostrar no player incorporável?', 'remove' => 'Remover {platformName}', diff --git a/modules/Admin/Language/pt-BR/Podcast.php b/modules/Admin/Language/pt-BR/Podcast.php index 8678bbe8..c6716eb4 100644 --- a/modules/Admin/Language/pt-BR/Podcast.php +++ b/modules/Admin/Language/pt-BR/Podcast.php @@ -22,12 +22,11 @@ return [ 'delete' => 'Excluir podcast', 'see_episodes' => 'Ver episódios', 'see_contributors' => 'Ver contribuidores', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Ir para a página', 'latest_episodes' => 'Últimos episódios', 'see_all_episodes' => 'Ver todos os episódios', 'draft' => 'Rascunho', - 'sync_feed' => 'Sincronizar o feed', - 'sync_feed_hint' => 'Importar os últimos episódios deste podcast', 'messages' => [ 'createSuccess' => 'Podcast criado com sucesso!', 'editSuccess' => 'Podcast foi atualizado com sucesso!', @@ -59,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Identidade do podcast', 'identity_section_subtitle' => 'Esses campos permitem que você seja notado.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Capa do podcast', 'cover_size_hint' => 'A capa deve ser quadrada e ter pelo menos 1400px de largura e altura.', 'banner' => 'Banner do podcast', @@ -134,7 +135,6 @@ return [ 'partner_id_hint' => 'Seu próprio ID de parceiro', 'partner_link_url_hint' => 'O endereço genérico de link do parceiro', 'partner_image_url_hint' => 'O endereço genérico da imagem de parceiro', - 'status_section_title' => 'Status', 'block' => 'O podcast deve ser ocultado dos catálogos públicos', 'block_hint' => 'O status do podcast: ativar isso impede que o podcast inteiro apareça em Apple Podcasts, Google Podcasts e qualquer aplicativo de terceiros que extraia programas desses diretórios. (Não garantido)', diff --git a/modules/Admin/Language/pt-BR/PodcastNavigation.php b/modules/Admin/Language/pt-BR/PodcastNavigation.php index 94d7a7a4..753b6691 100644 --- a/modules/Admin/Language/pt-BR/PodcastNavigation.php +++ b/modules/Admin/Language/pt-BR/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Ir para página do podcast', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Painel do podcast', 'podcast-view' => 'Início', 'podcast-edit' => 'Editar podcast', 'podcast-persons-manage' => 'Gerenciar pessoas', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episódios', 'episode-list' => 'Todos os episódios', 'episode-create' => 'Novo episódio', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Tempo de escuta', 'podcast-analytics-time-periods' => 'Períodos de tempo', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Todas as assinaturas', 'subscription-create' => 'Adicionar assinatura', 'contributors' => 'Contribuidores', 'contributor-list' => 'Todos os contribuidores', 'contributor-add' => 'Adicionar contribuidor', - 'platforms' => 'Plataformas externas', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Redes sociais', - 'platforms-funding' => 'Financiamento', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/pt/Breadcrumb.php b/modules/Admin/Language/pt/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/pt/Breadcrumb.php +++ b/modules/Admin/Language/pt/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/pt/Common.php b/modules/Admin/Language/pt/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/pt/Common.php +++ b/modules/Admin/Language/pt/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/pt/Episode.php b/modules/Admin/Language/pt/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/pt/Episode.php +++ b/modules/Admin/Language/pt/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/pt/Platforms.php b/modules/Admin/Language/pt/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/pt/Platforms.php +++ b/modules/Admin/Language/pt/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/pt/Podcast.php b/modules/Admin/Language/pt/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/pt/Podcast.php +++ b/modules/Admin/Language/pt/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/pt/PodcastNavigation.php b/modules/Admin/Language/pt/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/pt/PodcastNavigation.php +++ b/modules/Admin/Language/pt/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/ro/Breadcrumb.php b/modules/Admin/Language/ro/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/ro/Breadcrumb.php +++ b/modules/Admin/Language/ro/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/ro/Common.php b/modules/Admin/Language/ro/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/ro/Common.php +++ b/modules/Admin/Language/ro/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/ro/Episode.php b/modules/Admin/Language/ro/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/ro/Episode.php +++ b/modules/Admin/Language/ro/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/ro/Platforms.php b/modules/Admin/Language/ro/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/ro/Platforms.php +++ b/modules/Admin/Language/ro/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/ro/Podcast.php b/modules/Admin/Language/ro/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/ro/Podcast.php +++ b/modules/Admin/Language/ro/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/ro/PodcastNavigation.php b/modules/Admin/Language/ro/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/ro/PodcastNavigation.php +++ b/modules/Admin/Language/ro/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/ru/Breadcrumb.php b/modules/Admin/Language/ru/Breadcrumb.php index 642f273d..097ddc1c 100644 --- a/modules/Admin/Language/ru/Breadcrumb.php +++ b/modules/Admin/Language/ru/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'мой аккаунт', 'change-password' => 'сменить пароль', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'платформы', 'social' => 'социальные сети', 'funding' => 'финансирование', + 'monetization-other' => 'other monetization', 'analytics' => 'аналитика', 'locations' => 'расположение', 'webpages' => 'веб-страницы', diff --git a/modules/Admin/Language/ru/Common.php b/modules/Admin/Language/ru/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/ru/Common.php +++ b/modules/Admin/Language/ru/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/ru/Episode.php b/modules/Admin/Language/ru/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/ru/Episode.php +++ b/modules/Admin/Language/ru/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/ru/Platforms.php b/modules/Admin/Language/ru/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/ru/Platforms.php +++ b/modules/Admin/Language/ru/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/ru/Podcast.php b/modules/Admin/Language/ru/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/ru/Podcast.php +++ b/modules/Admin/Language/ru/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/ru/PodcastNavigation.php b/modules/Admin/Language/ru/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/ru/PodcastNavigation.php +++ b/modules/Admin/Language/ru/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/sk/Breadcrumb.php b/modules/Admin/Language/sk/Breadcrumb.php index a3d97f7f..b47dd878 100644 --- a/modules/Admin/Language/sk/Breadcrumb.php +++ b/modules/Admin/Language/sk/Breadcrumb.php @@ -38,10 +38,12 @@ return [ 'users' => 'používatelia', 'my-account' => 'môj účet', 'change-password' => 'zmeniť heslo', - 'imports' => 'imports', + 'imports' => 'nahratia', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platformy', 'social' => 'sociálne siete', 'funding' => 'financovanie', + 'monetization-other' => 'other monetization', 'analytics' => 'analytika', 'locations' => 'miesta', 'webpages' => 'web stránky', diff --git a/modules/Admin/Language/sk/Common.php b/modules/Admin/Language/sk/Common.php index 9572c953..a8fc2465 100644 --- a/modules/Admin/Language/sk/Common.php +++ b/modules/Admin/Language/sk/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Nahrať súbor', 'remote_url' => 'Vzdialená adresa URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Prehrať', diff --git a/modules/Admin/Language/sk/Countries.php b/modules/Admin/Language/sk/Countries.php index 305fa5d2..8d5fa7cd 100644 --- a/modules/Admin/Language/sk/Countries.php +++ b/modules/Admin/Language/sk/Countries.php @@ -261,7 +261,7 @@ Laoská ľudovodemokratická Republika", 'TZ' => 'Tanzánia', 'UA' => 'Ukraina', 'UG' => 'Uganda', - 'UM' => 'United States Minor Outlying Islands', + 'UM' => 'Menšie Odľahlé Ostrovy Spojených Štátov', 'US' => 'Spojené Štáty', 'UY' => 'Uruguaj', 'UZ' => 'Uzbekistán', diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php index 5619ea85..bc0e6ac8 100644 --- a/modules/Admin/Language/sk/Episode.php +++ b/modules/Admin/Language/sk/Episode.php @@ -24,6 +24,7 @@ return [ 'all_podcast_episodes' => 'Všetky epizódy podcastu', 'back_to_podcast' => 'Späť na podcast', 'edit' => 'Upraviť', + 'preview' => 'Náhľad', 'publish' => 'Zverejniť', 'publish_edit' => 'Upraviť zverejnenie', 'publish_date_edit' => 'Upraviť dátum zverejnenia', @@ -84,13 +85,13 @@ return [ audio {zvuk} other {médiá} }.', - 'deleteFileError' => 'Nepodarilo sa vymazať {type, select, - transcript {prepis} - chapters {kapitoly} - image {obrázok} - audio {zvuk} - other {médiá} - } súbor {file_path}. Môžete ho z disku odstrániť ručne.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Epizóda s takýmto trvalým odkazom už existuje.', ], 'form' => [ @@ -215,4 +216,14 @@ return [ 'light' => 'Svetlý', 'light-transparent' => 'Svetlý priehľadný', ], + 'publication_status_banner' => [ + 'draft_mode' => 'konceptový režim', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Náhľad', + ], ]; diff --git a/modules/Admin/Language/sk/EpisodeNavigation.php b/modules/Admin/Language/sk/EpisodeNavigation.php index ccf727da..9d213d89 100644 --- a/modules/Admin/Language/sk/EpisodeNavigation.php +++ b/modules/Admin/Language/sk/EpisodeNavigation.php @@ -16,8 +16,8 @@ return [ 'episode-persons-manage' => 'Spravovať osobnosti', 'embed-add' => 'Vnorený prehrávač', 'clips' => 'Klipy', - 'video-clips-list' => 'Video clips', - 'video-clips-create' => 'New video clip', + 'video-clips-list' => 'Video klipy', + 'video-clips-create' => 'Nový video klip', 'soundbites-list' => 'Soundbites', 'soundbites-create' => 'Nová zvučka', ]; diff --git a/modules/Admin/Language/sk/Navigation.php b/modules/Admin/Language/sk/Navigation.php index 4039ab46..2f1976a1 100644 --- a/modules/Admin/Language/sk/Navigation.php +++ b/modules/Admin/Language/sk/Navigation.php @@ -18,7 +18,7 @@ return [ 'podcast-list' => 'Všetky podcasty', 'podcast-create' => 'Nový podcast', 'all-podcast-imports' => 'All Podcast imports', - 'podcast-imports-add' => 'Import a podcast', + 'podcast-imports-add' => 'Importovať podcast', 'persons' => 'Osobnosti', 'person-list' => 'Všetky osobnosti', 'person-create' => 'Nová osobnosť', diff --git a/modules/Admin/Language/sk/Pager.php b/modules/Admin/Language/sk/Pager.php index 41adf3d7..43b98de4 100644 --- a/modules/Admin/Language/sk/Pager.php +++ b/modules/Admin/Language/sk/Pager.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'pageNavigation' => 'Page navigation', + 'pageNavigation' => 'Navigácia stránky', 'first' => 'Prvá', 'previous' => 'Predošlá', 'next' => 'Ďalšia', diff --git a/modules/Admin/Language/sk/Person.php b/modules/Admin/Language/sk/Person.php index 38e1f073..7e98b939 100644 --- a/modules/Admin/Language/sk/Person.php +++ b/modules/Admin/Language/sk/Person.php @@ -29,7 +29,7 @@ return [ 'full_name_hint' => 'This is the full name or alias of the person.', 'unique_name' => 'Unikátne meno', 'unique_name_hint' => 'Použité pre URL odkazy', - 'information_url' => 'Information URL', + 'information_url' => 'Informačná URL adresa', 'information_url_hint' => 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', 'submit_create' => 'Vytvoriť osobnosť', diff --git a/modules/Admin/Language/sk/Platforms.php b/modules/Admin/Language/sk/Platforms.php index bd52fd09..d8654a77 100644 --- a/modules/Admin/Language/sk/Platforms.php +++ b/modules/Admin/Language/sk/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platformy', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Prejsť na stránku {platformName}', + 'register' => 'Register', 'submit_url' => 'Uverejniť podcast na platforme {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Zobraziť na úvodnej stránke podcastu?', 'on_embed' => 'Zobraziť na vnorenom prehrávači?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php index 1db0f269..8e6d5d07 100644 --- a/modules/Admin/Language/sk/Podcast.php +++ b/modules/Admin/Language/sk/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Vymazať podcast', 'see_episodes' => 'Ukázať časti', 'see_contributors' => 'Pozrieť prispievateľov', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Prejsť na stránku', 'latest_episodes' => 'Posledné časti', 'see_all_episodes' => 'Pozrieť všetky časti', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Obal podcastu', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Stav', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/sk/PodcastNavigation.php b/modules/Admin/Language/sk/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/sk/PodcastNavigation.php +++ b/modules/Admin/Language/sk/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/sr_Latn/AboutCastopod.php b/modules/Admin/Language/sr_Latn/AboutCastopod.php index 3fb62aff..66ccc2e3 100644 --- a/modules/Admin/Language/sr_Latn/AboutCastopod.php +++ b/modules/Admin/Language/sr_Latn/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'O Castopod-u', + 'host_name' => 'Naziv hosta', + 'version' => 'Verzija Castopod-a', + 'php_version' => 'PHP verzija', + 'os' => 'Operativni Sistem', + 'languages' => 'Jezici', + 'update_database' => 'Ažuriraj baze podataka', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'Baza podataka je ažurirana!', ], ]; diff --git a/modules/Admin/Language/sr_Latn/Breadcrumb.php b/modules/Admin/Language/sr_Latn/Breadcrumb.php index 4f685d60..48e20d41 100644 --- a/modules/Admin/Language/sr_Latn/Breadcrumb.php +++ b/modules/Admin/Language/sr_Latn/Breadcrumb.php @@ -38,10 +38,12 @@ return [ 'users' => 'korisnici', 'my-account' => 'moj nalog', 'change-password' => 'promenite lozinku', - 'imports' => 'imports', + 'imports' => 'uvozi', + 'sync-feeds' => 'sinhronizuj snabdevače', 'platforms' => 'platforme', 'social' => 'društvene mreže', 'funding' => 'finansiranje', + 'monetization-other' => 'druga monetizacija', 'analytics' => 'analitika', 'locations' => 'lokacije', 'webpages' => 'veb strane', diff --git a/modules/Admin/Language/sr_Latn/Common.php b/modules/Admin/Language/sr_Latn/Common.php index 0b2b3cdb..8fc6f706 100644 --- a/modules/Admin/Language/sr_Latn/Common.php +++ b/modules/Admin/Language/sr_Latn/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Otpremite datoteku', 'remote_url' => 'Daljinski URL', + 'save' => 'Sačuvaj', ], 'play_episode_button' => [ 'play' => 'Pusti', diff --git a/modules/Admin/Language/sr_Latn/Countries.php b/modules/Admin/Language/sr_Latn/Countries.php index eb139a8c..64b97465 100644 --- a/modules/Admin/Language/sr_Latn/Countries.php +++ b/modules/Admin/Language/sr_Latn/Countries.php @@ -217,48 +217,48 @@ return [ 'SL' => 'Sijera Leone', 'SM' => 'San Marino', 'SN' => 'Senegal', - 'SO' => 'Somalia', - 'SR' => 'Suriname', - 'SS' => 'South Sudan', - 'ST' => 'Sao Tome and Principe', - 'SV' => 'El Salvador', - 'SX' => 'Sint Maarten (Dutch part)', - 'SY' => 'Syrian Arab Republic', - 'SZ' => 'Swaziland', - 'TC' => 'Turks and Caicos Islands', - 'TD' => 'Chad', - 'TF' => 'French Southern Territories', + 'SO' => 'Somalija', + 'SR' => 'Surinam', + 'SS' => 'Južni Sudan', + 'ST' => 'Sao Tomе i Prinsipе', + 'SV' => 'Salvador', + 'SX' => 'Sveti Martin (Holandski deo)', + 'SY' => 'Sirijska Arapska Republika', + 'SZ' => 'Svazilеnd', + 'TC' => 'Tеrks i Kеjkos', + 'TD' => 'Čad', + 'TF' => 'Francuske Južne Teritorije', 'TG' => 'Togo', - 'TH' => 'Thailand', - 'TJ' => 'Tajikistan', + 'TH' => 'Таjland', + 'TJ' => 'Tadžikistan', 'TK' => 'Tokelau', - 'TL' => 'Timor-Leste', + 'TL' => 'Istočni Timor', 'TM' => 'Turkmenistan', - 'TN' => 'Tunisia', + 'TN' => 'Tunis', 'TO' => 'Tonga', - 'TR' => 'Turkey', - 'TT' => 'Trinidad and Tobago', + 'TR' => 'Turska', + 'TT' => 'Trinidad i Tobago', 'TV' => 'Tuvalu', - 'TW' => 'Taiwan, Province of China', - 'TZ' => 'Tanzania, United Republic of', - 'UA' => 'Ukraine', + 'TW' => 'Tajvan, Kineska provincija', + 'TZ' => 'Ujedinjena Republika Tanzanija', + 'UA' => 'Ukrajina', 'UG' => 'Uganda', - 'UM' => 'United States Minor Outlying Islands', - 'US' => 'United States', - 'UY' => 'Uruguay', + 'UM' => 'Mala spoljna ostrva Sjedinjenih Američkih Država', + 'US' => 'Sjеdinjеnе Državе', + 'UY' => 'Urugvaj', 'UZ' => 'Uzbekistan', - 'VA' => 'Holy See (Vatican City State)', - 'VC' => 'Saint Vincent and the Grenadines', - 'VE' => 'Venezuela, Bolivarian Republic of', - 'VG' => 'Virgin Islands, British', - 'VI' => 'Virgin Islands, U.S.', - 'VN' => 'Viet Nam', + 'VA' => 'Sveta stolica (Grad-država Vatikan)', + 'VC' => 'Sveti Vinsent i Grenadini', + 'VE' => 'Venecuela', + 'VG' => 'Devičanska ostrva', + 'VI' => 'Devičanska Ostrva, S.A.D.', + 'VN' => 'Vijetnam', 'VU' => 'Vanuatu', - 'WF' => 'Wallis and Futuna', + 'WF' => 'Valis i Futuna', 'WS' => 'Samoa', - 'YE' => 'Yemen', - 'YT' => 'Mayotte', - 'ZA' => 'South Africa', - 'ZM' => 'Zambia', - 'ZW' => 'Zimbabwe', + 'YE' => 'Jemen', + 'YT' => 'Majote', + 'ZA' => 'Južna Afrika', + 'ZM' => 'Zambija', + 'ZW' => 'Zimbabve', ]; diff --git a/modules/Admin/Language/sr_Latn/Dashboard.php b/modules/Admin/Language/sr_Latn/Dashboard.php index 881073fd..8761ee1b 100644 --- a/modules/Admin/Language/sr_Latn/Dashboard.php +++ b/modules/Admin/Language/sr_Latn/Dashboard.php @@ -9,20 +9,20 @@ declare(strict_types=1); */ return [ - 'home' => 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', + 'home' => 'Kontrolna tabla za administratora', + 'welcome_message' => 'Dobrodošli u deo za administratore!', 'podcasts' => [ - 'title' => 'Podcasts', - 'not_found' => 'No published podcast', - 'last_published' => 'Last published on {lastPublicationDate}', + 'title' => 'Podkasti', + 'not_found' => 'Nemate objavljen podkast', + 'last_published' => 'Poslednja objava {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episodes', - 'not_found' => 'No published episode', - 'last_published' => 'Last published on {lastPublicationDate}', + 'title' => 'Epizode', + 'not_found' => 'Nemate objavljene epizode', + 'last_published' => 'Poslednja objava {lastPublicationDate}', ], 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', + 'title' => 'Prostor', + 'subtitle' => '{totalUploaded} od {totalStorage}', ], ]; diff --git a/modules/Admin/Language/sr_Latn/Episode.php b/modules/Admin/Language/sr_Latn/Episode.php index d06b5d04..123288cc 100644 --- a/modules/Admin/Language/sr_Latn/Episode.php +++ b/modules/Admin/Language/sr_Latn/Episode.php @@ -9,9 +9,9 @@ declare(strict_types=1); */ return [ - 'season' => 'Season {seasonNumber}', + 'season' => 'Sezona {seasonNumber}', 'season_abbr' => 'S{seasonNumber}', - 'number' => 'Episode {episodeNumber}', + 'number' => 'Epizoda {episodeNumber}', 'number_abbr' => 'Ep. {episodeNumber}', 'season_episode' => 'Sezona {seasonNumber} epizoda {episodeNumber}', 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Sve epizode podkasta', 'back_to_podcast' => 'Nazad na podkast', 'edit' => 'Izmeni', + 'preview' => 'Pregled', 'publish' => 'Objavi', 'publish_edit' => 'Uredi objavu', 'publish_date_edit' => 'Uredi datum objave', @@ -55,7 +56,7 @@ return [ }', 'episode' => 'Epizoda', 'visibility' => 'Vidljivost', - 'downloads' => 'Downloads', + 'downloads' => 'Preuzimanja', 'comments' => 'Komentari', 'actions' => 'Akcije', ], @@ -86,7 +87,7 @@ return [ image {omota} audio {zvuka} other {medija} - } datoteke {file_path}. Možete je ukloniti ručno sa diska.', + } datoteke {file_key}. Možete je ukloniti ručno sa vašeg diska.', 'sameSlugError' => 'Odabrano URL ime (slug) epizode već postoji.', ], 'form' => [ @@ -156,7 +157,7 @@ return [ 'custom_rss_hint' => 'Ovo će biti ubačeno u ❬item❭ tag.', 'block' => 'Epizoda treba biti sakriivena u javnim katalozima', 'block_hint' => - 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'Prikazan ili sakriven status epizode: ukoliko uključite ovu opciju onemogućavate prikazivanje vaše epizode na paltformama za slušanje podkasta kao što su Apple Podcasts, Google Podcasts i sličnim direktorijima. (Nije zagarantovano)', 'submit_create' => 'Kreiraj epizodu', 'submit_edit' => 'Sačuvaj epizodu', ], @@ -211,4 +212,14 @@ return [ 'light' => 'Svetla', 'light-transparent' => 'Svetla providna', ], + 'publication_status_banner' => [ + 'draft_mode' => 'režim nacrta', + 'text' => '{publication_status, select, + published {Ova epizoda još uvek nije objavljena.} + scheduled {Ova epizoda je zakazana za {publication_date}.} + with_podcast {Ova epizoda će biti objavljena kad i podkast.} + other {Ova epizoda još uvek nije objavljena.} + }', + 'preview' => 'Pregled', + ], ]; diff --git a/modules/Admin/Language/sr_Latn/Fediverse.php b/modules/Admin/Language/sr_Latn/Fediverse.php index 97b2088f..77d2bd18 100644 --- a/modules/Admin/Language/sr_Latn/Fediverse.php +++ b/modules/Admin/Language/sr_Latn/Fediverse.php @@ -12,21 +12,21 @@ return [ 'messages' => [ 'actorNotFound' => 'Nalog ne može biti pronađen!', 'blockActorSuccess' => '{actor} je blokiran!', - 'unblockActorSuccess' => 'Actor has been unblocked!', - 'blockDomainSuccess' => '{domain} has been blocked!', - 'unblockDomainSuccess' => '{domain} has been unblocked!', + 'unblockActorSuccess' => '{actor} je blokiran!', + 'blockDomainSuccess' => '{domain} je blokiran!', + 'unblockDomainSuccess' => '{domain} je odblokiran!', ], - 'blocked_actors' => 'Blocked accounts', - 'blocked_domains' => 'Blocked domains', + 'blocked_actors' => 'Blokirani nalozi', + 'blocked_domains' => 'Blokirani domeni', 'block_lists_form' => [ - 'handle' => 'Account handle', - 'handle_hint' => 'Input @username@domain account.', - 'domain' => 'Domain name', - 'submit' => 'Block!', + 'handle' => 'Kvačica naloga', + 'handle_hint' => 'Unesi @username@domain nalog.', + 'domain' => 'Naziv domena', + 'submit' => 'Blokiraj!', ], 'list' => [ - 'actor' => 'Account', - 'domain' => 'Domain name', - 'unblock' => 'Unblock', + 'actor' => 'Nalog', + 'domain' => 'Naziv domena', + 'unblock' => 'Odblokiraj', ], ]; diff --git a/modules/Admin/Language/sr_Latn/Home.php b/modules/Admin/Language/sr_Latn/Home.php index 3ff4c04d..b116bc70 100644 --- a/modules/Admin/Language/sr_Latn/Home.php +++ b/modules/Admin/Language/sr_Latn/Home.php @@ -9,6 +9,6 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found', + 'all_podcasts' => 'Svi podkasti', + 'no_podcast' => 'Nema pronađenih podkasta', ]; diff --git a/modules/Admin/Language/sr_Latn/Install.php b/modules/Admin/Language/sr_Latn/Install.php index 36e373a2..65edca65 100644 --- a/modules/Admin/Language/sr_Latn/Install.php +++ b/modules/Admin/Language/sr_Latn/Install.php @@ -9,53 +9,53 @@ declare(strict_types=1); */ return [ - 'manual_config' => 'Manual configuration', + 'manual_config' => 'Ručna konfiguracija', 'manual_config_subtitle' => - 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'Napravite `.env` datoteku sa vašim podešavanjima i osvežite stranicu da bi ste nastavili instalaciju.', 'form' => [ - 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', - 'media_base_url' => 'Media base URL', + 'instance_config' => 'Konfiguracija instance', + 'hostname' => 'Ime domaćina', + 'media_base_url' => 'URL medijske baze', 'media_base_url_hint' => - 'If you use a CDN and/or an external analytics service, you may set them here.', - 'admin_gateway' => 'Admin gateway', + 'Ako koristite CDN i/ili eksternu uslugu za analitiku, možete ih postaviti ovde.', + 'admin_gateway' => 'Administratorski izlaz', 'admin_gateway_hint' => - 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', - 'auth_gateway' => 'Auth gateway', + 'Ruta za pristup kontrolnoj tabli administratora (eg. https://example.com/cp-admin).Podrazumevano je podešena na cp-admin, preporučujemo da je promenite iz sigurnosnih razloga.', + 'auth_gateway' => 'Auth izlaz', 'auth_gateway_hint' => - 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', + 'Ruta za pristup stranicama za potvrdu identiteta (eg. https://example.com/cp-auth).Podrazumevano je podešena na cp-auth, preporučujemo da je promenite iz sigurnosnih razloga.', + 'database_config' => 'Konfiguracija baze podataka', 'database_config_hint' => - 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', + 'Castopod mora da se poveže za vašom MySQL (ili MariaDB) bazom. Ukoliko ne posedujete potrebne informacije, molimo vas kontaktirajte administratora vašeg servera.', + 'db_hostname' => 'Ime hosta baze podataka', + 'db_name' => 'Ime baze podataka', + 'db_username' => 'Korisničko ime baze podataka', + 'db_password' => 'Lozinka baze podataka', + 'db_prefix' => 'Prefiks baze', 'db_prefix_hint' => - "The prefix of the Castopod table names, leave as is if you don't know what it means.", - 'cache_config' => 'Cache configuration', + "Prefiks imena tabela Castopod-a, ne diraj ako ne znaš šta znači.", + 'cache_config' => 'Konfiguracija keša', 'cache_config_hint' => - 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', - 'cache_handler' => 'Cache handler', + 'Izaberite željeni obrađivač keša. Ostavite je kao podrazumevanu vrednost ako nemate pojma šta to znači.', + 'cache_handler' => 'Obrađivač keša', 'cacheHandlerOptions' => [ - 'file' => 'File', + 'file' => 'Datoteka', 'redis' => 'Redis', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', - 'create_superadmin' => 'Create your superadmin account', - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', + 'next' => 'Sledeće', + 'submit' => 'Završi instalaciju', + 'create_superadmin' => 'Kreiraj svoj nalog super administratora', + 'email' => 'E-pošta', + 'username' => 'Korisničko ime', + 'password' => 'Lozinka', ], 'messages' => [ 'createSuperAdminSuccess' => - 'Your superadmin account has been created successfully. Login to start podcasting!', + 'Vaš nalog superadmina je uspešno kreiran. Prijavite se da biste započeli podkasting!', 'databaseConnectError' => - 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'Castopod nije mogao da se poveže sa vašom bazom podataka. Uredite konfiguraciju baze podataka i pokušajte ponovo.', 'writeError' => - "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + "Nije moguće kreirati/upisati datoteku `.env`. Morate je kreirati ručno prateći šablon datoteke `.env.example` u Castopod-ovom paketu.", ], ]; diff --git a/modules/Admin/Language/sr_Latn/Navigation.php b/modules/Admin/Language/sr_Latn/Navigation.php index fe7e6c68..d532dc5b 100644 --- a/modules/Admin/Language/sr_Latn/Navigation.php +++ b/modules/Admin/Language/sr_Latn/Navigation.php @@ -17,8 +17,8 @@ return [ 'podcasts' => 'Podkasti', 'podcast-list' => 'Svi podkasti', 'podcast-create' => 'Novi podkast', - 'all-podcast-imports' => 'All Podcast imports', - 'podcast-imports-add' => 'Import a podcast', + 'all-podcast-imports' => 'Uvozi podkasta', + 'podcast-imports-add' => 'Uvezi podkast', 'persons' => 'Osobe', 'person-list' => 'Sve osobe', 'person-create' => 'Nova osoba', diff --git a/modules/Admin/Language/sr_Latn/Notifications.php b/modules/Admin/Language/sr_Latn/Notifications.php index 2b139d51..dc79e82a 100644 --- a/modules/Admin/Language/sr_Latn/Notifications.php +++ b/modules/Admin/Language/sr_Latn/Notifications.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'Notifications', - 'reply' => '{actor_username} replied to your post', - 'favourite' => '{actor_username} favourited your post', - 'reblog' => '{actor_username} shared your post', - 'follow' => '{actor_username} started following you', - 'no_notifications' => 'No notifications', - 'mark_all_as_read' => 'Mark all as read', + 'title' => 'Obaveštenja', + 'reply' => '{actor_username} odgovara na tvoju objavu', + 'favourite' => '{actor_username} dodaje tvoju objavu u omiljene', + 'reblog' => '{actor_username} deli tvoju objavu', + 'follow' => '{actor_username} vas sada prati', + 'no_notifications' => 'Nema obaveštenja', + 'mark_all_as_read' => 'Označi svе kao pročitano', ]; diff --git a/modules/Admin/Language/sr_Latn/Pager.php b/modules/Admin/Language/sr_Latn/Pager.php index 6aac1696..421dbe64 100644 --- a/modules/Admin/Language/sr_Latn/Pager.php +++ b/modules/Admin/Language/sr_Latn/Pager.php @@ -16,6 +16,6 @@ return [ 'last' => 'Poslednja', 'older' => 'Starije', 'newer' => 'Novije', - 'invalidTemplate' => '{0} is not a valid Pager template.', - 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', + 'invalidTemplate' => '{0} nije važeći šablon za stranice.', + 'invalidPaginationGroup' => '{0} nije važeći šablon za grupu paginacija.', ]; diff --git a/modules/Admin/Language/sr_Latn/Platforms.php b/modules/Admin/Language/sr_Latn/Platforms.php index a55c8dcd..0e895f03 100644 --- a/modules/Admin/Language/sr_Latn/Platforms.php +++ b/modules/Admin/Language/sr_Latn/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforme', + 'title' => [ + 'podcasting' => 'Podkasting platforme', + 'social' => 'Društvene mreže', + 'funding' => 'Podrška', + ], + 'website' => 'Veb stranica', 'home_url' => 'Idi na {platformName} stranicu', + 'register' => 'Rеgistrujte sе', 'submit_url' => 'Dodaj svoj podkast na {platformName}', + 'your_link' => 'Vaš link', + 'your_id' => [ + 'podcasting' => 'Tvoj ID', + 'social' => 'Tvoj ID', + 'funding' => 'Tvoj PNA', + ], + 'your_cta' => 'Tvoj poziv na akciju', 'visible' => 'Prikaži na naslovnoj strani podkasta?', 'on_embed' => 'Prikaži na embedovanom plejeru?', 'remove' => 'Ukloni {platformName}', diff --git a/modules/Admin/Language/sr_Latn/Podcast.php b/modules/Admin/Language/sr_Latn/Podcast.php index 1b08fcf5..33dbf24f 100644 --- a/modules/Admin/Language/sr_Latn/Podcast.php +++ b/modules/Admin/Language/sr_Latn/Podcast.php @@ -13,7 +13,7 @@ return [ 'no_podcast' => 'Nema pronađenih podkasta!', 'create' => 'Napravi podkast', 'import' => 'Uvezi podkast', - 'all_imports' => 'Podcast imports', + 'all_imports' => 'Uvozi podkasta', 'new_episode' => 'Nova epizoda', 'view' => 'Pogledaj epizodu', 'edit' => 'Uredi podkast', @@ -22,6 +22,7 @@ return [ 'delete' => 'Obriši podkast', 'see_episodes' => 'Pogledaj epizode', 'see_contributors' => 'Pogledaj saradnike', + 'monetization_other' => 'Druga monetizacija', 'go_to_page' => 'Idi na stranicu', 'latest_episodes' => 'Najnovije epizode', 'see_all_episodes' => 'Prikaži sve epizode', @@ -57,13 +58,15 @@ return [ 'form' => [ 'identity_section_title' => 'Identitet podkasta', 'identity_section_subtitle' => 'Ova polja vam pomažu da budete prepoznati.', + 'fediverse_section_title' => 'Fedivers identitet', + 'cover' => 'Omot podkasta', 'cover_size_hint' => 'Omot mora biti kvadratnog oblika i minimum 1400px širok i visok.', 'banner' => 'Baner podkasta', 'banner_size_hint' => 'Baner mora imati odnos 3:1 i biti najmanje 1500px širok.', 'banner_delete' => 'Obriši baner podkasta', 'title' => 'Naslov', - 'handle' => 'Handle', + 'handle' => 'Ručka', 'handle_hint' => 'Koristi se radi identifikacije podkasta. Velika slova, mala slova, brojevi i donja crta su prihvatljivi.', 'type' => [ @@ -73,66 +76,65 @@ return [ 'serial' => 'Serijski', 'serial_hint' => 'Ukoliko su epizode namenjene za konzumiranje specifičnim redom. Najstarija epizoda će biti predstavljena prva u redosledu.', ], - 'description' => 'Description', - 'classification_section_title' => 'Classification', + 'description' => 'Opis', + 'classification_section_title' => 'Klasifikacija', 'classification_section_subtitle' => - 'These fields will impact your audience and competition.', - 'language' => 'Language', - 'category' => 'Category', - 'category_placeholder' => 'Select a category…', - 'other_categories' => 'Other categories', + 'Ova polja će uticati na vašu publiku i konkurenciju.', + 'language' => 'Jezik', + 'category' => 'Kategorija', + 'category_placeholder' => 'Izaberite kategoriju…', + 'other_categories' => 'Ostale kategorije', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does it contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'label' => 'Upozorenje za roditelje', + 'hint' => 'Da li sadrži eksplicitan sadržaj?', + 'undefined' => 'nedefinisano', + 'clean' => 'Čisto', + 'explicit' => 'Eksplicitno', ], - 'author_section_title' => 'Author', - 'author_section_subtitle' => 'Who is managing the podcast?', - 'owner_name' => 'Owner name', + 'author_section_title' => 'Autor', + 'author_section_subtitle' => 'Ko upravlja podkastom?', + 'owner_name' => 'Ime vlasnika', 'owner_name_hint' => - 'For administrative use only. Visible in the public RSS feed.', - 'owner_email' => 'Owner email', + 'Za administrativnu upotrebu. Vidljivo u javnom RSS feed-u.', + 'owner_email' => 'Elektronska pošta vlasnika', 'owner_email_hint' => - 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', - 'publisher' => 'Publisher', + 'Koristiće se na većini platforma kako bi se utvrdilo vlasništvo nad podkastom. Vidljivo javno u RSS feed-u.', + 'publisher' => 'Izdavač', 'publisher_hint' => - 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', - 'copyright' => 'Copyright', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this podcast about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real place or fictional', - 'monetization_section_title' => 'Monetization', + 'Grupa odgovorna za stvaranje ove emisije. Često se misli na vlasničku kompaniju ili mrežu kojoj pripada podkast. Ovo polje se nekada naziva i \'Autor".', + 'copyright' => 'Autorsko pravo', + 'location_section_title' => 'Lokacija', + 'location_section_subtitle' => 'O kom mestu je ova epizoda?', + 'location_name' => 'Ime ili adresa lokacije', + 'location_name_hint' => 'Ovo može biti stvarno ili izmišljeno mesto', + 'monetization_section_title' => 'Monetizacija', 'monetization_section_subtitle' => - 'Earn money thanks to your audience.', - 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', - 'op3' => 'Open Podcast Prefix Project (OP3)', - 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', - 'op3_enable' => 'Enable OP3 analytics service', - 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', - 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'Zaradi novac zahvaljujući svojoj publici.', + 'premium' => 'Premijum', + 'premium_by_default' => 'Epizode ​​se podrazumevano moraju podesiti kao premijum', + 'premium_by_default_hint' => 'Epizode ​​podkasta će podrazumevano biti označene kao premijum. I dalje možete izabrati da neke epizode, trejlere ili bonuse postavite kao javne.', + 'op3' => 'Otvoreni Podkast Prefiks Projekat (OP3)', + 'op3_hint' => 'Vrednujte svoje analitičke podatke pomoću OP3, otvorenog koda i pouzdane analitičke usluge treće strane. Delite, potvrdite i uporedite svoje analitičke podatke sa otvorenim podkast ekosistemom.', + 'op3_enable' => 'Omogućite OP3 analitičku uslugu', + 'op3_enable_hint' => 'Iz bezbednosnih razloga, analitika premijum epizoda se neće deliti sa OP3.', + 'payment_pointer' => 'Pokazivač plaćanja za Veb monetizaciju', 'payment_pointer_hint' => - 'This is your where you will receive money thanks to Web Monetization', - 'advanced_section_title' => 'Advanced Parameters', + 'Ovde ćete primati novac zahvaljujući Veb monetizaciji', + 'advanced_section_title' => 'Napredni parametri', 'advanced_section_subtitle' => - 'If you need RSS tags that Castopod does not handle, set them here.', - 'custom_rss' => 'Custom RSS tags for the podcast', - 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', - 'new_feed_url' => 'New feed URL', - 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', - 'old_feed_url' => 'Old feed URL', - 'partnership' => 'Partnership', + 'Ukoliko su vam potrebni RSS tagovi koje Castopod ne obrađuje, postavite ih ovde.', + 'custom_rss' => 'Posebni RSS tagovi epizode', + 'custom_rss_hint' => 'Ovo će biti ubačeno u ❬channel❭ tag.', + 'new_feed_url' => 'Novi URL fid', + 'new_feed_url_hint' => 'Koristite ovo polje kada prelazite na drugi domen ili platformu za hostovanje podkasta. Podrazumevano, vrednost je podešena na trenutni RSS URL ako je podkast uvezen.', + 'old_feed_url' => 'Stari URL fid', + 'partnership' => 'Partnerstvo', 'partner_id' => 'ID', 'partner_link_url' => 'URL adresa veze', 'partner_image_url' => 'URL adresa slike', 'partner_id_hint' => 'Vaš partnerski ID', 'partner_link_url_hint' => 'Generička adresa veze partnera', 'partner_image_url_hint' => 'Generička adresa slike partnera', - 'status_section_title' => 'Status', 'block' => 'Podkast treba sakriti iz javnih kataloga', 'block_hint' => 'Prikazan ili sakriven status podkasta: ukoliko uključite ovu opciju onemogućavate prikazivanje vašeg podkasta na paltformama za slušanje podkasta kao što su Apple Podcasts, Google Podcasts i sličnim direktorijima. (Nije zagarantovano)', @@ -229,8 +231,8 @@ return [ 'natural_sciences' => 'Prirodne nauke', 'nature' => 'Priroda', 'physics' => 'Fizika', - 'social_sciences' => 'Social Sciences', - 'documentary' => 'Documentary', + 'social_sciences' => 'Društvene nauke', + 'documentary' => 'Dokumentarni', 'personal_journals' => 'Lični dnevnici', 'philosophy' => 'Filozofija', 'places_and_travel' => 'Mesta i Putovanje', @@ -294,19 +296,19 @@ return [ 'list_of_episodes_season' => 'Sezona {seasonNumber} epizoda ({episodeCount})', 'no_episode' => 'Nijedna epizode nije pronađena!', - 'follow' => 'Follow', + 'follow' => 'Prati', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# pratilac} + other {# pratilaca} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# objava} + other {# objave} }', - 'activity' => 'Activity', - 'episodes' => 'Episodes', - 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', + 'activity' => 'Aktivnost', + 'episodes' => 'Epizode', + 'sponsor' => 'Sponzor', + 'funding_links' => 'Linkovi za finansiranje {podcastTitle}', + 'find_on' => 'Pronađi {podcastTitle} na', + 'listen_on' => 'Slušaj na', ]; diff --git a/modules/Admin/Language/sr_Latn/PodcastNavigation.php b/modules/Admin/Language/sr_Latn/PodcastNavigation.php index 9ea142e2..d2357d86 100644 --- a/modules/Admin/Language/sr_Latn/PodcastNavigation.php +++ b/modules/Admin/Language/sr_Latn/PodcastNavigation.php @@ -9,31 +9,34 @@ declare(strict_types=1); */ return [ - 'go_to_page' => 'Go to podcast page', - 'dashboard' => 'Podcast dashboard', - 'podcast-view' => 'Home', - 'podcast-edit' => 'Edit podcast', - 'podcast-persons-manage' => 'Manage persons', - 'podcast-imports' => 'Podcast imports', - 'episodes' => 'Episodes', - 'episode-list' => 'All episodes', - 'episode-create' => 'New episode', - 'analytics' => 'Analytics', - 'podcast-analytics' => 'Audience overview', - 'podcast-analytics-webpages' => 'Web pages visits', - 'podcast-analytics-locations' => 'Locations', - 'podcast-analytics-unique-listeners' => 'Unique listeners', - 'podcast-analytics-players' => 'Players', - 'podcast-analytics-listening-time' => 'Listening time', - 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-create' => 'Add subscription', - 'contributors' => 'Contributors', - 'contributor-list' => 'All contributors', - 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podkasting', + 'go_to_page' => 'Idite na stranu podkasta', + 'rss_feed' => 'RSS feed', + 'dashboard' => 'Kontrolna strana podkasta', + 'podcast-view' => 'Početna stranica', + 'podcast-edit' => 'Uredi podkast', + 'podcast-persons-manage' => 'Upravljaj osobama', + 'podcast-imports' => 'Uvozi podkasta', + 'podcast-imports-sync' => 'Sinhronizuj snabdevače', + 'episodes' => 'Epizode', + 'episode-list' => 'Sve Epizode', + 'episode-create' => 'Nova epizoda', + 'analytics' => 'Analitika', + 'podcast-analytics' => 'Pregled publike', + 'podcast-analytics-webpages' => 'Poseta Veb stranici', + 'podcast-analytics-locations' => 'Lokacije', + 'podcast-analytics-unique-listeners' => 'Jedinstveni slušaoci', + 'podcast-analytics-players' => 'Plejeri', + 'podcast-analytics-listening-time' => 'Ukupno vreme slušanja', + 'podcast-analytics-time-periods' => 'Vremenski periodi', + 'monetization' => 'Monetizacija', + 'subscription-list' => 'Sve pretplate', + 'subscription-create' => 'Dodaj pretplatu', + 'contributors' => 'Saradnici', + 'contributor-list' => 'Svi saradnici', + 'contributor-add' => 'Dodaj saradnika', + 'broadcast' => 'Emitovanje', + 'platforms-podcasting' => 'Podkasting aplikacije', 'platforms-social' => 'Društvene mreže', - 'platforms-funding' => 'Finansiranje', + 'platforms-funding' => 'Podrška', + 'podcast-monetization-other' => 'Drugo', ]; diff --git a/modules/Admin/Language/sr_Latn/Settings.php b/modules/Admin/Language/sr_Latn/Settings.php index 650bd13d..82554b3c 100644 --- a/modules/Admin/Language/sr_Latn/Settings.php +++ b/modules/Admin/Language/sr_Latn/Settings.php @@ -14,45 +14,45 @@ return [ 'title' => 'Instance', 'site_icon' => 'Ikonica sajta', 'site_icon_delete' => 'Obriši ikonicu sajta', - 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', - 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', - 'site_name' => 'Site name', - 'site_description' => 'Site description', - 'submit' => 'Save', - 'editSuccess' => 'Instance has been updated successfully!', - 'deleteIconSuccess' => 'Site icon has been remove successfully!', + 'site_icon_hint' => 'Ikone sajtova su ono što vidite na karticama pregledača, traci sa obeleživačima i kada dodate veb lokaciju kao prečicu na mobilnim uređajima.', + 'site_icon_helper' => 'Ikona mora biti kvadratnog oblika i minimum 512px široka i visoka.', + 'site_name' => 'Naziv veb strane', + 'site_description' => 'Opis veb strane', + 'submit' => 'Sačuvaj', + 'editSuccess' => 'Instanca je uspešno ažurirana!', + 'deleteIconSuccess' => 'Ikona veb strane je uspešno uklonjena!', ], 'images' => [ - 'title' => 'Images', - 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', - 'regenerate' => 'Regenerate images', - 'regenerationSuccess' => 'All images have been regenerated successfully!', + 'title' => 'Slike', + 'subtitle' => 'Ovde možete regenerisati sve slike na osnovu originala koji su otpremljeni. Koristi se ako ustanovite da neke slike nedostaju. Ovaj zadatak može potrajati.', + 'regenerate' => 'Regeneriši slike', + 'regenerationSuccess' => 'Sve slike su uspešno regenerisane!', ], 'housekeeping' => [ - 'title' => 'Housekeeping', - 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', - 'reset_counts' => 'Reset counts', - 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', - 'rewrite_media' => 'Rewrite media metadata', - 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', - 'clear_cache' => 'Clear all cache', - 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', - 'run' => 'Run housekeeping', - 'runSuccess' => 'Housekeeping has been run successfully!', + 'title' => 'Održavanje', + 'subtitle' => 'Obavlja razne poslove u održavanju. Koristite ovu funkciju ako ikada naiđete na probleme sa medijskim datotekama ili integritetom podataka. Ovi zadaci mogu potrajati.', + 'reset_counts' => 'Resetujte brojače', + 'reset_counts_helper' => 'Ova opcija će ponovo izračunati i resetovati sve podatke (broj pratilaca, objava, komentara,…).', + 'rewrite_media' => 'Ponovo upiši medijske metapodatke', + 'rewrite_media_helper' => 'Ova opcija će izbrisati sve suvišne medijske datoteke i ponovo ih kreirati (slike, audio datoteke, transkripte, poglavlja,…)', + 'rename_episodes_files' => 'Preimenuj audio datoteku epizode', + 'rename_episodes_files_hint' => 'Ova opcija će preimenovati sve audio datoteke epizoda u nasumični niz znakova. Koristite ovo ako je neka od vaših privatnih epizoda procurila jer će je to efektivno sakriti.', + 'clear_cache' => 'Obriši sav keš', + 'clear_cache_helper' => 'Ova opcija će isprazniti redis keš ili datoteke za pisanje/keširanje.', + 'run' => 'Pokreni održavanje', + 'runSuccess' => 'Održavanje je uspešno obavljeno!', ], 'theme' => [ - 'title' => 'Theme', - 'accent_section_title' => 'Accent color', - 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', - 'pine' => 'Pine', - 'crimson' => 'Crimson', - 'amber' => 'Amber', - 'lake' => 'Lake', - 'jacaranda' => 'Jacaranda', - 'onyx' => 'Onyx', - 'submit' => 'Save', - 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + 'title' => 'Tema', + 'accent_section_title' => 'Naglašena boja', + 'accent_section_subtitle' => 'Izaberite boju da biste odredili izgled svih javnih stranica.', + 'pine' => 'Bor zelena', + 'crimson' => 'Tamnocrvena', + 'amber' => 'Ćilibar', + 'lake' => 'Jezero plava', + 'jacaranda' => 'Jakaranda ljubičasta', + 'onyx' => 'Oniks crna', + 'submit' => 'Sačuvaj', + 'setInstanceThemeSuccess' => 'Tema je uspešno ažurirana!', ], ]; diff --git a/modules/Admin/Language/sr_Latn/Soundbite.php b/modules/Admin/Language/sr_Latn/Soundbite.php index a3f828fe..306681f9 100644 --- a/modules/Admin/Language/sr_Latn/Soundbite.php +++ b/modules/Admin/Language/sr_Latn/Soundbite.php @@ -10,22 +10,22 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Soundbites', - 'soundbite' => 'Soundbite', + 'title' => 'Zvučni isečci', + 'soundbite' => 'Zvučni isečak', ], 'messages' => [ - 'createSuccess' => 'Soundbite has been successfully created!', - 'deleteSuccess' => 'Soundbite has been successfully removed!', + 'createSuccess' => 'Zvučni isečak je uspešno kreiran!', + 'deleteSuccess' => 'Zvučni isečak je uspešno uklonjen!', ], 'form' => [ - 'title' => 'New soundbite', - 'soundbite_title' => 'Soundbite title', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'submit' => 'Create soundbite', + 'title' => 'Novi zvučni isečak', + 'soundbite_title' => 'Naziv zvučnog isečka', + 'start_time' => 'Počni na', + 'duration' => 'Trajanje', + 'submit' => 'Napravi zvučni isečak', ], - 'play' => 'Play soundbite', - 'stop' => 'Stop soundbite', - 'create' => 'New soundbite', - 'delete' => 'Delete soundbite', + 'play' => 'Reprodukuj zvučni isečak', + 'stop' => 'Zaustavi zvučni isečak', + 'create' => 'Novi zvučni isečak', + 'delete' => 'Obriši zvučni isečak', ]; diff --git a/modules/Admin/Language/sr_Latn/Validation.php b/modules/Admin/Language/sr_Latn/Validation.php index 3bc78cfe..d66cbb4f 100644 --- a/modules/Admin/Language/sr_Latn/Validation.php +++ b/modules/Admin/Language/sr_Latn/Validation.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'min_dims' => - '{field} is either not an image, or it is not wide or tall enough.', + '{field} ili nije slika ili nije dovoljne dužine/visine.', 'is_image_ratio' => - '{field} is either not an image or not of the right ratio.', + '{field} ili nije slike ili nije u pravom odnosu veličina.', ]; diff --git a/modules/Admin/Language/sr_Latn/VideoClip.php b/modules/Admin/Language/sr_Latn/VideoClip.php index 638de697..aa0d795b 100644 --- a/modules/Admin/Language/sr_Latn/VideoClip.php +++ b/modules/Admin/Language/sr_Latn/VideoClip.php @@ -10,63 +10,63 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Video clips', + 'title' => 'Video isečci', 'status' => [ 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Clip is waiting to be processed.', - 'pending' => 'pending', - 'pending_hint' => 'Clip will be generated shortly.', - 'running' => 'running', - 'running_hint' => 'Clip is being generated.', - 'failed' => 'failed', - 'failed_hint' => 'Clip could not be generated: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Clip was generated successfully!', + 'queued' => 'čekanje', + 'queued_hint' => 'Video isečak čeka na obradu.', + 'pending' => 'na čekanju', + 'pending_hint' => 'Video isečak će uskoro biti napravljen.', + 'running' => 'u toku', + 'running_hint' => 'Video isečak se pravi.', + 'failed' => 'nije uspеlo', + 'failed_hint' => 'Pravljenje video isečka nije uspelo: greška u skripti.', + 'passed' => 'prošlo', + 'passed_hint' => 'Video isečak je uspešno napravljen!', ], - 'clip' => 'Clip', - 'duration' => 'Job duration', + 'clip' => 'Isečak', + 'duration' => 'Trajanje posla', ], - 'title' => 'Video clip: {videoClipLabel}', - 'download_clip' => 'Download clip', - 'create' => 'New video clip', - 'go_to_page' => 'Go to clip page', - 'retry' => 'Retry clip generation', - 'delete' => 'Delete clip', - 'logs' => 'Job logs', + 'title' => 'Video Isečak: {videoClipLabel}', + 'download_clip' => 'Preuzmi isečak', + 'create' => 'Novi video isečak', + 'go_to_page' => 'Idi na stranicu isečka', + 'retry' => 'Ponovo pokušaj da napraviš isečak', + 'delete' => 'Obriši isečak', + 'logs' => 'Katalog poslova', 'messages' => [ - 'alreadyExistingError' => 'The video clip you are trying to create already exists!', - 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', - 'deleteSuccess' => 'Video clip has been successfully removed!', + 'alreadyExistingError' => 'Video isečak koji pokušavate da napravite već postoji!', + 'addToQueueSuccess' => 'Video isečak je dodat u katalog poslova, čeka da bude napravljen!', + 'deleteSuccess' => 'Video isečak je uspešno uklonjen!', ], 'format' => [ - 'landscape' => 'Landscape', - 'portrait' => 'Portrait', - 'squared' => 'Squared', + 'landscape' => 'Položeno', + 'portrait' => 'Uspravno', + 'squared' => 'Kvadratno', ], 'form' => [ - 'title' => 'New video clip', - 'params_section_title' => 'Video clip parameters', - 'clip_title' => 'Clip title', + 'title' => 'Novi video isečak', + 'params_section_title' => 'Parametri video isečka', + 'clip_title' => 'Naziv isečka', 'format' => [ - 'label' => 'Choose a format', - 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', - 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', - 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + 'label' => 'Odaberite format', + 'landscape_hint' => 'U 16:9 formatu, položeni video klipovi su odlični za platforme kao što su PeerTube, YouTube i Vimeo.', + 'portrait_hint' => 'U 9:16 formatu, uspravni video isečci su odlični za TikTok, YouTube shorts i Instagram stories.', + 'squared_hint' => 'U 1:1 formatu, kvadratni video isečci su odlični za Mastodon, Facebook, Twitter i LinkedIn.', ], - 'theme' => 'Select a theme', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'trim_start' => 'Trim start', - 'trim_end' => 'Trim end', - 'submit' => 'Create video clip', + 'theme' => 'Odaberite temu', + 'start_time' => 'Počni na', + 'duration' => 'Trajanje', + 'trim_start' => 'Početak isečka', + 'trim_end' => 'Kraj isečka', + 'submit' => 'Napravi video isečak', ], 'requirements' => [ - 'title' => 'Missing requirements', - 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'title' => 'Nedostaje polje', + 'missing' => 'Niste popunili sva polja. Potrudite se da ubacite sve što je potrebno kako bi ste napravili video za ovu epizodu!', 'ffmpeg' => 'FFmpeg', 'gd' => 'Graphics Draw (GD)', 'freetype' => 'Freetype library for GD', - 'transcript' => 'Transcript file (.srt)', + 'transcript' => 'Datoteka transkripta (.srt)', ], ]; diff --git a/modules/Admin/Language/sv/Breadcrumb.php b/modules/Admin/Language/sv/Breadcrumb.php index a373f4cf..cf8a2e95 100644 --- a/modules/Admin/Language/sv/Breadcrumb.php +++ b/modules/Admin/Language/sv/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'mitt konto', 'change-password' => 'ändra lösenord', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'plattformar', 'social' => 'sociala nätverk', 'funding' => 'finansiering', + 'monetization-other' => 'other monetization', 'analytics' => 'analys', 'locations' => 'platser', 'webpages' => 'webbplatser', diff --git a/modules/Admin/Language/sv/Common.php b/modules/Admin/Language/sv/Common.php index ce69e0eb..6551b84d 100644 --- a/modules/Admin/Language/sv/Common.php +++ b/modules/Admin/Language/sv/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Ladda upp en fil', 'remote_url' => 'Fjärr URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Spela', diff --git a/modules/Admin/Language/sv/Episode.php b/modules/Admin/Language/sv/Episode.php index 542449f1..8df284a2 100644 --- a/modules/Admin/Language/sv/Episode.php +++ b/modules/Admin/Language/sv/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'Alla podcast avsnitt', 'back_to_podcast' => 'Gå tillbaka till podcasten', 'edit' => 'Redigera', + 'preview' => 'Preview', 'publish' => 'Publicera', 'publish_edit' => 'Redigera publikation', 'publish_date_edit' => 'Redigera publiceringsdatum', @@ -80,13 +81,13 @@ return [ audio {ljud} other {media} }.', - 'deleteFileError' => 'Det gick inte att ta bort {type, select, + 'deleteFileError' => 'Failed to delete {type, select, transcript {transcript} - chapters {kapitel} - image {omslag} - audio {ljud} + chapters {chapters} + image {cover} + audio {audio} other {media} - } fil {file_path}. Du kan manuellt ta bort den från disken.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'Ett avsnitt med den valda slug finns redan.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Ljust', 'light-transparent' => 'Ljus transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/sv/Platforms.php b/modules/Admin/Language/sv/Platforms.php index 1ab090f9..40eab4f8 100644 --- a/modules/Admin/Language/sv/Platforms.php +++ b/modules/Admin/Language/sv/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Plattformar', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Gå till {platformName} webbplats', + 'register' => 'Register', 'submit_url' => 'Skicka din podcast den {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Visa på podcastens hemsida?', 'on_embed' => 'Visa på inbäddbar spelare?', 'remove' => 'Ta bort {platformName}', diff --git a/modules/Admin/Language/sv/Podcast.php b/modules/Admin/Language/sv/Podcast.php index 32505fbc..9e1818df 100644 --- a/modules/Admin/Language/sv/Podcast.php +++ b/modules/Admin/Language/sv/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Ta bort podcast', 'see_episodes' => 'Se avsnitt', 'see_contributors' => 'Se bidragsgivare', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Gå till sida', 'latest_episodes' => 'Senaste avsnitt', 'see_all_episodes' => 'Se alla avsnitt', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identitet', 'identity_section_subtitle' => 'Dessa fält gör att du kan bli uppmärksammad.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast omslag', 'cover_size_hint' => 'Omslaget måste vara fyrkantigt och minst 1400px brett och högt.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Din egen partner ID', 'partner_link_url_hint' => 'Den generiska partnerns länkadress', 'partner_image_url_hint' => 'Den generiska partnerns bildadress', - 'status_section_title' => 'Status', 'block' => 'Podcast bör döljas från offentliga kataloger', 'block_hint' => 'Podcasten visar eller dölj status: att växla på detta hindrar hela podcasten från att visas i Apple Podcasts, Google Podcasts, och alla tredjepartsappar som drar program från dessa kataloger. (Inte garanterat)', diff --git a/modules/Admin/Language/sv/PodcastNavigation.php b/modules/Admin/Language/sv/PodcastNavigation.php index 848c577c..41b0c5b5 100644 --- a/modules/Admin/Language/sv/PodcastNavigation.php +++ b/modules/Admin/Language/sv/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Gå till podcast sida', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast instrumentpanel', 'podcast-view' => 'Hem', 'podcast-edit' => 'Redigera podcast', 'podcast-persons-manage' => 'Hantera personer', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Avsnitt', 'episode-list' => 'Alla avsnitt', 'episode-create' => 'Nytt avsnitt', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Spelare', 'podcast-analytics-listening-time' => 'Lyssningstid', 'podcast-analytics-time-periods' => 'Tidsperioder', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'Alla prenumerationer', 'subscription-create' => 'Lägg till en prenumeration', 'contributors' => 'Bidragsgivare', 'contributor-list' => 'Alla bidragsgivare', 'contributor-add' => 'Lägg till bidragsgivare', - 'platforms' => 'Externa plattformar', - 'platforms-podcasting' => 'Poddsändning', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Sociala nätverk', - 'platforms-funding' => 'Finansiering', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/uk/Breadcrumb.php b/modules/Admin/Language/uk/Breadcrumb.php index 593322e6..6a678d4e 100644 --- a/modules/Admin/Language/uk/Breadcrumb.php +++ b/modules/Admin/Language/uk/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => 'my account', 'change-password' => 'change password', 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', 'platforms' => 'platforms', 'social' => 'social networks', 'funding' => 'funding', + 'monetization-other' => 'other monetization', 'analytics' => 'analytics', 'locations' => 'locations', 'webpages' => 'web pages', diff --git a/modules/Admin/Language/uk/Common.php b/modules/Admin/Language/uk/Common.php index 596c8bcd..74addcf2 100644 --- a/modules/Admin/Language/uk/Common.php +++ b/modules/Admin/Language/uk/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => 'Upload a file', 'remote_url' => 'Remote URL', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => 'Play', diff --git a/modules/Admin/Language/uk/Episode.php b/modules/Admin/Language/uk/Episode.php index 98498bee..1a5e57a4 100644 --- a/modules/Admin/Language/uk/Episode.php +++ b/modules/Admin/Language/uk/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'preview' => 'Preview', 'publish' => 'Publish', 'publish_edit' => 'Edit publication', 'publish_date_edit' => 'Edit publication date', @@ -86,7 +87,7 @@ return [ image {cover} audio {audio} other {media} - } file {file_path}. You may manually remove it from your disk.', + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => 'An episode with the chosen slug already exists.', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => 'Light', 'light-transparent' => 'Light transparent', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/uk/Platforms.php b/modules/Admin/Language/uk/Platforms.php index ab17d599..e161181c 100644 --- a/modules/Admin/Language/uk/Platforms.php +++ b/modules/Admin/Language/uk/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => 'Platforms', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', 'remove' => 'Remove {platformName}', diff --git a/modules/Admin/Language/uk/Podcast.php b/modules/Admin/Language/uk/Podcast.php index ab84e4ff..d9359e9b 100644 --- a/modules/Admin/Language/uk/Podcast.php +++ b/modules/Admin/Language/uk/Podcast.php @@ -22,6 +22,7 @@ return [ 'delete' => 'Delete podcast', 'see_episodes' => 'See episodes', 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', 'go_to_page' => 'Go to page', 'latest_episodes' => 'Latest episodes', 'see_all_episodes' => 'See all episodes', @@ -57,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast identity', 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => 'Podcast cover', 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'banner' => 'Podcast banner', @@ -132,7 +135,6 @@ return [ 'partner_id_hint' => 'Your own partner ID', 'partner_link_url_hint' => 'The generic partner link address', 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', 'block' => 'Podcast should be hidden from public catalogues', 'block_hint' => 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', diff --git a/modules/Admin/Language/uk/PodcastNavigation.php b/modules/Admin/Language/uk/PodcastNavigation.php index efc00e5b..bb777707 100644 --- a/modules/Admin/Language/uk/PodcastNavigation.php +++ b/modules/Admin/Language/uk/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Go to podcast page', + 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Home', 'podcast-edit' => 'Edit podcast', 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', + 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', 'contributors' => 'Contributors', 'contributor-list' => 'All contributors', 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-Hans/Breadcrumb.php index e4c2d8a3..d0344a98 100644 --- a/modules/Admin/Language/zh-Hans/Breadcrumb.php +++ b/modules/Admin/Language/zh-Hans/Breadcrumb.php @@ -39,9 +39,11 @@ return [ 'my-account' => '我的帐户', 'change-password' => '修改密码', 'imports' => '导入', + 'sync-feeds' => 'synchronize feeds', 'platforms' => '平台', 'social' => '社交网络', 'funding' => '资金支持', + 'monetization-other' => 'other monetization', 'analytics' => '统计数据', 'locations' => '位置', 'webpages' => '网页', diff --git a/modules/Admin/Language/zh-Hans/Common.php b/modules/Admin/Language/zh-Hans/Common.php index 1ecaf542..5909a764 100644 --- a/modules/Admin/Language/zh-Hans/Common.php +++ b/modules/Admin/Language/zh-Hans/Common.php @@ -40,6 +40,7 @@ return [ ], 'upload_file' => '上传文件', 'remote_url' => '远程网址', + 'save' => 'Save', ], 'play_episode_button' => [ 'play' => '播放', diff --git a/modules/Admin/Language/zh-Hans/Episode.php b/modules/Admin/Language/zh-Hans/Episode.php index 84ac4e98..7ca92c0c 100644 --- a/modules/Admin/Language/zh-Hans/Episode.php +++ b/modules/Admin/Language/zh-Hans/Episode.php @@ -22,6 +22,7 @@ return [ 'all_podcast_episodes' => '所有播客剧集', 'back_to_podcast' => '返回播客', 'edit' => '编辑', + 'preview' => 'Preview', 'publish' => '发布', 'publish_edit' => '编辑发布', 'publish_date_edit' => '编辑发布日期', @@ -80,13 +81,13 @@ return [ audio {音频} other {媒体} }', - 'deleteFileError' => '无法删除 {type, select, - transcript {字幕} - chapters {章节} - image {封面} - audio {音频} - other {媒体} - } 文件 {file_path}。您可以手动将其从磁盘删除。', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', 'sameSlugError' => '选中的剧集已存在。', ], 'form' => [ @@ -211,4 +212,14 @@ return [ 'light' => '亮色', 'light-transparent' => '亮色透明', ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], ]; diff --git a/modules/Admin/Language/zh-Hans/Platforms.php b/modules/Admin/Language/zh-Hans/Platforms.php index 6a71b42a..2869a4b2 100644 --- a/modules/Admin/Language/zh-Hans/Platforms.php +++ b/modules/Admin/Language/zh-Hans/Platforms.php @@ -9,9 +9,22 @@ declare(strict_types=1); */ return [ - 'title' => '平台', + 'title' => [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', 'home_url' => '转至 {platformName} 网站', + 'register' => 'Register', 'submit_url' => '在 {platformName} 上提交你的播客', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', 'visible' => '在播客主页上显示?', 'on_embed' => '在嵌入式播放器上显示?', 'remove' => '移除 {platformName}', diff --git a/modules/Admin/Language/zh-Hans/Podcast.php b/modules/Admin/Language/zh-Hans/Podcast.php index d07c4fd6..b685e54a 100644 --- a/modules/Admin/Language/zh-Hans/Podcast.php +++ b/modules/Admin/Language/zh-Hans/Podcast.php @@ -22,12 +22,11 @@ return [ 'delete' => '删除播客', 'see_episodes' => '查看剧集', 'see_contributors' => '查看贡献者', + 'monetization_other' => 'Other monetization', 'go_to_page' => '转到页面', 'latest_episodes' => '最新剧集', 'see_all_episodes' => '查看所有剧集', 'draft' => '草稿', - 'sync_feed' => '同步摘要', - 'sync_feed_hint' => '导入此播客的最新剧集', 'messages' => [ 'createSuccess' => '播客创建成功!', 'editSuccess' => '播客已更新!', @@ -59,6 +58,8 @@ return [ 'form' => [ 'identity_section_title' => '播客标识', 'identity_section_subtitle' => '这些字段可能让你脱颖而出。', + 'fediverse_section_title' => 'Fediverse identity', + 'cover' => '播客封面', 'cover_size_hint' => '封面必须是方形,而且至少 1400 px 宽度和高度。', 'banner' => '播客横幅', @@ -134,7 +135,6 @@ return [ 'partner_id_hint' => '你自己的合作伙伴 ID', 'partner_link_url_hint' => '通用合作伙伴链接地址', 'partner_image_url_hint' => '通用合作伙伴图片地址', - 'status_section_title' => '状态', 'block' => '播客应该在公共目录中隐藏', 'block_hint' => '播客显示或隐藏状态:打开此选项可防止整个播客出现在 Apple 播客、Google 播客以及从此目录中提取剧集的任何第三方应用程序中。(不保证)', diff --git a/modules/Admin/Language/zh-Hans/PodcastNavigation.php b/modules/Admin/Language/zh-Hans/PodcastNavigation.php index cd1913a0..e2546046 100644 --- a/modules/Admin/Language/zh-Hans/PodcastNavigation.php +++ b/modules/Admin/Language/zh-Hans/PodcastNavigation.php @@ -10,11 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => '转到播客页面', + 'rss_feed' => 'RSS feed', 'dashboard' => '播客控制面板', 'podcast-view' => '主页', 'podcast-edit' => '编辑播客', 'podcast-persons-manage' => '管理人员', 'podcast-imports' => '播客导入', + 'podcast-imports-sync' => 'Sync feeds', 'episodes' => '剧集', 'episode-list' => '所有剧集', 'episode-create' => '新剧集', @@ -26,14 +28,15 @@ return [ 'podcast-analytics-players' => '播放', 'podcast-analytics-listening-time' => '收听时间', 'podcast-analytics-time-periods' => '时间段', - 'premium' => '高级版', + 'monetization' => 'Monetization', 'subscription-list' => '所有订阅', 'subscription-create' => '添加订阅', 'contributors' => '贡献者', 'contributor-list' => '所有贡献者', 'contributor-add' => '添加贡献者', - 'platforms' => '外部平台', - 'platforms-podcasting' => '播客', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => '社交网络', - 'platforms-funding' => '资金支持', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Auth/Language/ar/Auth.php b/modules/Auth/Language/ar/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/ar/Auth.php +++ b/modules/Auth/Language/ar/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/br/Auth.php b/modules/Auth/Language/br/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/br/Auth.php +++ b/modules/Auth/Language/br/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/ca/Auth.php b/modules/Auth/Language/ca/Auth.php index b939afe2..9e14a56c 100644 --- a/modules/Auth/Language/ca/Auth.php +++ b/modules/Auth/Language/ca/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'El teu codi de 6 dígits', - 'notEnoughPrivilege' => 'No teniu prou permisos per accedir a aquesta pàgina.', 'set_password' => 'Estableix la teva contrasenya', // Welcome email diff --git a/modules/Auth/Language/da/Auth.php b/modules/Auth/Language/da/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/da/Auth.php +++ b/modules/Auth/Language/da/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/de/Auth.php b/modules/Auth/Language/de/Auth.php index 1cef24ad..407c8a25 100644 --- a/modules/Auth/Language/de/Auth.php +++ b/modules/Auth/Language/de/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Ihr 6-stelliger Code', - 'notEnoughPrivilege' => 'Sie haben keine ausreichenden Berechtigungen, um auf diese Seite zuzugreifen.', 'set_password' => 'Legen Sie Ihr Passwort fest', // Welcome email diff --git a/modules/Auth/Language/el/Auth.php b/modules/Auth/Language/el/Auth.php index 9dc498fa..50417442 100644 --- a/modules/Auth/Language/el/Auth.php +++ b/modules/Auth/Language/el/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/es/Auth.php b/modules/Auth/Language/es/Auth.php index cc8ac368..4158f59e 100644 --- a/modules/Auth/Language/es/Auth.php +++ b/modules/Auth/Language/es/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Introduce un código de 6 dígitos', - 'notEnoughPrivilege' => 'No tiene permisos suficientes para acceder a esa página.', 'set_password' => 'Establece tu contraseña', // Welcome email diff --git a/modules/Auth/Language/fa/Auth.php b/modules/Auth/Language/fa/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/fa/Auth.php +++ b/modules/Auth/Language/fa/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/fr/Auth.php b/modules/Auth/Language/fr/Auth.php index 39a0aaef..abc4a96d 100644 --- a/modules/Auth/Language/fr/Auth.php +++ b/modules/Auth/Language/fr/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Votre code à 6 chiffres', - 'notEnoughPrivilege' => 'Vous n\'avez pas les autorisations pour accéder à cette page.', 'set_password' => 'Choisis ton mot de passe', // Welcome email diff --git a/modules/Auth/Language/fr2/Auth.php b/modules/Auth/Language/fr2/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/fr2/Auth.php +++ b/modules/Auth/Language/fr2/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/fr_CA/Auth.php b/modules/Auth/Language/fr_CA/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/fr_CA/Auth.php +++ b/modules/Auth/Language/fr_CA/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/gd/Auth.php b/modules/Auth/Language/gd/Auth.php index 5350be4d..bd2f24b2 100644 --- a/modules/Auth/Language/gd/Auth.php +++ b/modules/Auth/Language/gd/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'An còd 6-àireamhach agad', - 'notEnoughPrivilege' => 'Chan fhoghainn an cead agad gus an duilleag sin inntrigeadh.', 'set_password' => 'Suidhich am facal-faire agad', // Welcome email diff --git a/modules/Auth/Language/gl/Auth.php b/modules/Auth/Language/gl/Auth.php index 2f954d65..798fc535 100644 --- a/modules/Auth/Language/gl/Auth.php +++ b/modules/Auth/Language/gl/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Código de 6 díxitos', - 'notEnoughPrivilege' => 'Non tes permisos suficientes para acceder a esa páxina.', 'set_password' => 'Establece un contrasinal', // Welcome email diff --git a/modules/Auth/Language/id/Auth.php b/modules/Auth/Language/id/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/id/Auth.php +++ b/modules/Auth/Language/id/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/it/Auth.php b/modules/Auth/Language/it/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/it/Auth.php +++ b/modules/Auth/Language/it/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/ja/Auth.php b/modules/Auth/Language/ja/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/ja/Auth.php +++ b/modules/Auth/Language/ja/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/kk/Auth.php b/modules/Auth/Language/kk/Auth.php new file mode 100644 index 00000000..725b760b --- /dev/null +++ b/modules/Auth/Language/kk/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/kk/Contributor.php b/modules/Auth/Language/kk/Contributor.php new file mode 100644 index 00000000..c70badc0 --- /dev/null +++ b/modules/Auth/Language/kk/Contributor.php @@ -0,0 +1,47 @@ + 'Podcast contributors', + 'view' => "{username}'s contribution to {podcastTitle}", + 'add' => 'Add contributor', + 'add_contributor' => 'Add a contributor for {0}', + 'edit_role' => 'Update role for {0}', + 'edit' => 'Edit', + 'remove' => 'Remove', + 'list' => [ + 'username' => 'Username', + 'role' => 'Role', + ], + 'form' => [ + 'user' => 'User', + 'user_placeholder' => 'Select a user…', + 'role' => 'Role', + 'role_placeholder' => 'Select its role…', + 'submit_add' => 'Add contributor', + 'submit_edit' => 'Update role', + ], + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', + ], + 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", + 'removeOwnerError' => "You can't remove the podcast owner!", + 'removeSuccess' => + 'You have successfully removed {username} from {podcastTitle}', + 'alreadyAddedError' => + "The contributor you're trying to add has already been added!", + ], +]; diff --git a/modules/Auth/Language/kk/MyAccount.php b/modules/Auth/Language/kk/MyAccount.php new file mode 100644 index 00000000..6ebbb30e --- /dev/null +++ b/modules/Auth/Language/kk/MyAccount.php @@ -0,0 +1,18 @@ + 'My account info', + 'changePassword' => 'Change my password', + 'messages' => [ + 'wrongPasswordError' => "You've entered the wrong password, try again.", + 'passwordChangeSuccess' => 'Password has been successfully changed!', + ], +]; diff --git a/modules/Auth/Language/kk/User.php b/modules/Auth/Language/kk/User.php new file mode 100644 index 00000000..32ec560c --- /dev/null +++ b/modules/Auth/Language/kk/User.php @@ -0,0 +1,60 @@ + "Edit {username}'s role", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'role' => 'Role', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'role' => 'Role', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Auth/Language/ko/Auth.php b/modules/Auth/Language/ko/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/ko/Auth.php +++ b/modules/Auth/Language/ko/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/nl/Auth.php b/modules/Auth/Language/nl/Auth.php index 60a631a0..80faa4e8 100644 --- a/modules/Auth/Language/nl/Auth.php +++ b/modules/Auth/Language/nl/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Jouw 6-cijferige code', - 'notEnoughPrivilege' => 'U heeft niet voldoende rechten om deze pagina te openen.', 'set_password' => 'Stel je wachtwoord in', // Welcome email diff --git a/modules/Auth/Language/nn-NO/Auth.php b/modules/Auth/Language/nn-NO/Auth.php index a47932e3..d359ffcb 100644 --- a/modules/Auth/Language/nn-NO/Auth.php +++ b/modules/Auth/Language/nn-NO/Auth.php @@ -11,84 +11,83 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Nettstadeigar', + 'description' => 'Castopod-eigaren.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Superstyrar', + 'description' => 'Har full kontroll over Castopod.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Leiar', + 'description' => 'Styrer innhaldet på Castopod.', ], 'podcaster' => [ - 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'title' => 'Podkastar', + 'description' => 'Vanlege Castopod-brukarar.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => 'Kan bruka styringspanelet for Castopod.', + 'admin.settings' => 'Kan få tilgang til innstillingane for Castopod.', + 'users.manage' => 'Kan handtera Castopod-brukarar.', + 'persons.manage' => 'Kan handtera folk.', + 'pages.manage' => 'Kan handtera sider.', + 'podcasts.view' => 'Kan sjå alle podkastane.', + 'podcasts.create' => 'Kan laga nye podkastar.', + 'podcasts.import' => 'Kan importera podkastar.', + 'fediverse.manage-blocks' => 'Kan blokkera folk og domene på allheimen frå å samhandla med Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Podkasteigar', + 'description' => 'Podkasteigaren.', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => 'Administrator', + 'description' => 'Har full kontroll over podkasten #{id}.', ], 'editor' => [ - 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'title' => 'Redaktør', + 'description' => 'Styrer innhald og publisering for podkasten #{id}.', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => 'Skapar', + 'description' => 'Styrer innhald for podkasten #{id}, men kan ikkje publisera dei.', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => 'Gjest', + 'description' => 'Vanleg bidragsytar til podkasten #{id}.', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => 'Kan sjå styringspanelet og analysedata for podkasten #{id}.', + 'edit' => 'Kan redigera podkasten #{id}.', + 'delete' => 'Kan sletta podkasten #{id}.', + 'manage-import' => 'Kan synkronisera den importerte podkasten #{id}.', + 'manage-persons' => 'Kan handtera abonnement for podkasten #{id}.', + 'manage-subscriptions' => 'Kan handtera abonnement for podkasten #{id}.', + 'manage-contributors' => 'Kan handtera bidragsytarar for podkasten #{id}.', + 'manage-platforms' => 'Kan oppretta og fjerna plattformlenkjer for podkasten #{id}.', + 'manage-publications' => 'Kan publisera podkasten #{id}.', + 'manage-notifications' => 'Kan lesa og merka varsel som lesne for podkasten #{id}.', + 'interact-as' => 'Kan merka podkasten #{id} som favoritt, dela og svara på innlegg.', + 'episodes.view' => 'Kan sjå styringspanelet og analysedata for episodane av podkasten #{id}.', + 'episodes.create' => 'Kan laga epoisodar for podkasten #{id}.', + 'episodes.edit' => 'Kan redigera episodane av podkasten #{id}.', + 'episodes.delete' => 'Kan sletta episodar av podkasten #{id}.', + 'episodes.manage-persons' => 'Kan handtera bidragsytarar til episodar av podkasten #{id}.', + 'episodes.manage-clips' => 'Kan handtera film- og lydklypp av podkasten #{id}.', + 'episodes.manage-publications' => 'Kan publisera og avpublisera episodar og innlegg for podkasten #{id}.', + 'episodes.manage-comments' => 'Kan skriva og sletta kommentarar til episodane av podkasten #{id}.', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'Den sekssifra koden din', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', + 'set_password' => 'Lag eit passord', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'welcomeSubject' => 'Du er invitert til {siteName}', + 'emailWelcomeMailBody' => 'Me har laga ein konto til deg på {domain}. Klikk på lenka under for å laga eit passord. Lenka er gyldig i {numberOfHours} timar etter eposten vart send.', ]; diff --git a/modules/Auth/Language/nn-NO/Contributor.php b/modules/Auth/Language/nn-NO/Contributor.php index 1fc338ba..941af518 100644 --- a/modules/Auth/Language/nn-NO/Contributor.php +++ b/modules/Auth/Language/nn-NO/Contributor.php @@ -29,15 +29,15 @@ return [ 'submit_edit' => 'Oppdater rolla', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Fjern {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'Du er i ferd med å fjerna {contributor} som bidragsytar. Dei vil mista tilgangen til "{podcastTitle}".', + 'understand' => 'Eg forstår, og vil fjerna {contributor} frå "{podcastTitle}"', + 'submit' => 'Fjern', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", + 'editSuccess' => 'Rolle endra!', + 'editOwnerError' => "Du kan ikkje endra podkast-eigaren.", 'removeOwnerError' => "Du kan ikkje fjerna podkast-eigaren!", 'removeSuccess' => 'Du har fjerna {username} frå {podcastTitle}', diff --git a/modules/Auth/Language/nn-NO/User.php b/modules/Auth/Language/nn-NO/User.php index 2ac777e1..fedf303b 100644 --- a/modules/Auth/Language/nn-NO/User.php +++ b/modules/Auth/Language/nn-NO/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_role' => "Edit {username}'s role", + 'edit_role' => "Endre rollene til {username}", 'ban' => 'Steng ute', 'unban' => 'Slepp inn att', 'delete' => 'Slett', @@ -18,7 +18,7 @@ return [ 'all_users' => 'Alle brukarane', 'list' => [ 'user' => 'Brukar', - 'role' => 'Role', + 'role' => 'Rolle', 'banned' => 'Utestengd?', ], 'form' => [ @@ -26,7 +26,7 @@ return [ 'username' => 'Brukarnamn', 'password' => 'Passord', 'new_password' => 'Nytt passord', - 'role' => 'Role', + 'role' => 'Rolle', 'roles' => 'Roller', 'permissions' => 'Løyve', 'submit_create' => 'Lag brukar', @@ -34,11 +34,11 @@ return [ 'submit_password_change' => 'Endre!', ], 'delete_form' => [ - 'title' => 'Delete {user}', + 'title' => 'Slett {user}', 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', + "Du er i ferd med å sletta {user} for alltid. Dei vil ikkje få tilgang til styringspanelet lenger.", + 'understand' => 'Eg forstår, og vil sletta {user} for alltid', + 'submit' => 'Slett', ], 'messages' => [ 'createSuccess' => @@ -52,7 +52,7 @@ return [ 'banSuperAdminError' => '{username} er superstyrar, og du stengjer ikkje ute ein superstyrar…', 'deleteOwnerError' => - '{username} is the instance owner, one does not simply delete the owner…', + '{username} eig nettstaden. Du kan ikkje berre sletta eigaren…', 'deleteSuperAdminError' => '{username} er superstyrar, og du slettar ikkje ein superstyrar…', 'deleteSuccess' => '{username} er sletta.', diff --git a/modules/Auth/Language/oc/Auth.php b/modules/Auth/Language/oc/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/oc/Auth.php +++ b/modules/Auth/Language/oc/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/pl/Auth.php b/modules/Auth/Language/pl/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/pl/Auth.php +++ b/modules/Auth/Language/pl/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/pt-BR/Auth.php b/modules/Auth/Language/pt-BR/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/pt-BR/Auth.php +++ b/modules/Auth/Language/pt-BR/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/pt/Auth.php b/modules/Auth/Language/pt/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/pt/Auth.php +++ b/modules/Auth/Language/pt/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/ro/Auth.php b/modules/Auth/Language/ro/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/ro/Auth.php +++ b/modules/Auth/Language/ro/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/ru/Auth.php b/modules/Auth/Language/ru/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/ru/Auth.php +++ b/modules/Auth/Language/ru/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/sk/Auth.php b/modules/Auth/Language/sk/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/sk/Auth.php +++ b/modules/Auth/Language/sk/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/sr_Latn/Auth.php b/modules/Auth/Language/sr_Latn/Auth.php index a47932e3..325856d4 100644 --- a/modules/Auth/Language/sr_Latn/Auth.php +++ b/modules/Auth/Language/sr_Latn/Auth.php @@ -11,84 +11,83 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Vlasnik instance', + 'description' => 'Vlasnik Castopoda.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Super administrator', + 'description' => 'Ima kompletnu kontrolu nad Castopod-om.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Menadžer', + 'description' => 'Upravlja sadržajem na Castopod-u.', ], 'podcaster' => [ - 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'title' => 'Podkaster', + 'description' => 'Opšti korisnici Castopod-a.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => 'Može pristupiti administratorskom delu Castopod-a.', + 'admin.settings' => 'Može pristupiti podešavanjima Castopod-a.', + 'users.manage' => 'Može upravljati korisnicima Castopod-a.', + 'persons.manage' => 'Može upravljati osobama.', + 'pages.manage' => 'Može upravljati stranicama.', + 'podcasts.view' => 'Može videti sve podkaste.', + 'podcasts.create' => 'Može napraviti nove podkaste.', + 'podcasts.import' => 'Može uvesti nove podkaste.', + 'fediverse.manage-blocks' => 'Može blokirati interakciju Castopoda i fedivers naloga/domena.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Vlasnik podkasta', + 'description' => 'Vlasnik podkasta.', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => 'Administrator', + 'description' => 'Ima kompletnu kontrolu nad podkastom #{id}.', ], 'editor' => [ - 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'title' => 'Urednik', + 'description' => 'Upravlja sadržajem i objavama podkasta #{id}.', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => 'Autor', + 'description' => 'Upravlja sadržajem podkasta #{id} ali ne može da ga objavi.', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => 'Gost', + 'description' => 'Saradnik na podkastu #{id}.', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => 'Može videti upravljačku tablu i analitiku podkasta #{id}.', + 'edit' => 'Može uređivati podkast #{id}.', + 'delete' => 'Može obrisati podkast #{id}.', + 'manage-import' => 'Može sinhronizovati uvezen podkast #{id}.', + 'manage-persons' => 'Može upravljati pretplatama na podkast #{id}.', + 'manage-subscriptions' => 'Može upravljati pretplatama na podkast #{id}.', + 'manage-contributors' => 'Može upravljati saradnicima na podkastu #{id}.', + 'manage-platforms' => 'Može ubaciti/izbaciti veze ka platformama podkasta #{id}.', + 'manage-publications' => 'Može objaviti podkast #{id}.', + 'manage-notifications' => 'Može videti obaveštenja i označiti ih kao pročitana za podkast #{id}.', + 'interact-as' => 'Može da komunicira kao podkast #{id} i deli, odgovara na i stavlja u omiljene postove.', + 'episodes.view' => 'Može videti upravljačku tablu i analitiku epizoda podkasta #{id}.', + 'episodes.create' => 'Može napraviti epizode podkasta #{id}.', + 'episodes.edit' => 'Može uređivati epizode podkasta #{id}.', + 'episodes.delete' => 'Može obrisati epizode podkasta #{id}.', + 'episodes.manage-persons' => 'Može upravljati osobama na epizodama podkasta #{id}.', + 'episodes.manage-clips' => 'Može upravljati video klipovima i zvučnim isečcima podkasta #{id}.', + 'episodes.manage-publications' => 'Može da objavi/poništi objavljivanje epizoda i postova podkasta #{id}.', + 'episodes.manage-comments' => 'Može dodati/obrisati komentar na epizodi podkasta #{id}.', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'Vaša šestocifrena šifra', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', + 'set_password' => 'Podesi lozinku', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'welcomeSubject' => 'Pozvani ste na {siteName}', + 'emailWelcomeMailBody' => 'Za vas je napravljen nalog na {domain}, kliknite na link za prijavu ispod da biste postavili lozinku. Veza je važeća {numberOfHours} sati nakon slanja ove e-pošte.', ]; diff --git a/modules/Auth/Language/sr_Latn/Contributor.php b/modules/Auth/Language/sr_Latn/Contributor.php index c70badc0..39bcbdb9 100644 --- a/modules/Auth/Language/sr_Latn/Contributor.php +++ b/modules/Auth/Language/sr_Latn/Contributor.php @@ -9,39 +9,39 @@ declare(strict_types=1); */ return [ - 'podcast_contributors' => 'Podcast contributors', - 'view' => "{username}'s contribution to {podcastTitle}", - 'add' => 'Add contributor', - 'add_contributor' => 'Add a contributor for {0}', - 'edit_role' => 'Update role for {0}', - 'edit' => 'Edit', - 'remove' => 'Remove', + 'podcast_contributors' => 'Saradnici podkasta', + 'view' => "{username} doprinos {podcastTitle}", + 'add' => 'Dodaj saradnika', + 'add_contributor' => 'Dodaj saradnike za {0}', + 'edit_role' => 'Uredi ulogu za {0}', + 'edit' => 'Izmeni', + 'remove' => 'Ukloni', 'list' => [ - 'username' => 'Username', - 'role' => 'Role', + 'username' => 'Korisničko ime', + 'role' => 'Uloga', ], 'form' => [ - 'user' => 'User', - 'user_placeholder' => 'Select a user…', - 'role' => 'Role', - 'role_placeholder' => 'Select its role…', - 'submit_add' => 'Add contributor', - 'submit_edit' => 'Update role', + 'user' => 'Korisnik', + 'user_placeholder' => 'Izaberi korisnika…', + 'role' => 'Uloga', + 'role_placeholder' => 'Dodaj ulogu…', + 'submit_add' => 'Dodaj saradnika', + 'submit_edit' => 'Ažuriraj ulogu', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Ukloni {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'Obrisaćete {contributor} iz saradnika. Oni neće moći više da pristupe "{podcastTitle}".', + 'understand' => 'Razumem, želim da uklonim {contributor} iz "{podcastTitle}"', + 'submit' => 'Ukloni', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", - 'removeOwnerError' => "You can't remove the podcast owner!", + 'editSuccess' => 'Uloga uspešno promenjena!', + 'editOwnerError' => "Ne možete urediti vlasnika podkasta!", + 'removeOwnerError' => "Ne možete ukloniti vlasnika podkasta!", 'removeSuccess' => - 'You have successfully removed {username} from {podcastTitle}', + 'Uspešno ste uklonili {username} iz {podcastTitle}', 'alreadyAddedError' => - "The contributor you're trying to add has already been added!", + "Saradnik kojeg pokušavate dodati je već dodat!", ], ]; diff --git a/modules/Auth/Language/sr_Latn/MyAccount.php b/modules/Auth/Language/sr_Latn/MyAccount.php index 6ebbb30e..5fa13d74 100644 --- a/modules/Auth/Language/sr_Latn/MyAccount.php +++ b/modules/Auth/Language/sr_Latn/MyAccount.php @@ -9,10 +9,10 @@ declare(strict_types=1); */ return [ - 'info' => 'My account info', - 'changePassword' => 'Change my password', + 'info' => 'Infromacije o mom nalogu', + 'changePassword' => 'Promeni moju lozinku', 'messages' => [ - 'wrongPasswordError' => "You've entered the wrong password, try again.", - 'passwordChangeSuccess' => 'Password has been successfully changed!', + 'wrongPasswordError' => "Uneli ste pogrešnu lozinku, probajte ponovo.", + 'passwordChangeSuccess' => 'Lozinka je uspešno promenjena!', ], ]; diff --git a/modules/Auth/Language/sr_Latn/User.php b/modules/Auth/Language/sr_Latn/User.php index 32ec560c..5e128ed8 100644 --- a/modules/Auth/Language/sr_Latn/User.php +++ b/modules/Auth/Language/sr_Latn/User.php @@ -9,52 +9,52 @@ declare(strict_types=1); */ return [ - 'edit_role' => "Edit {username}'s role", - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', + 'edit_role' => "Uredi {username} uloge", + 'ban' => 'Zabrani', + 'unban' => 'Ukini zabranu', + 'delete' => 'Obriši', + 'create' => 'Novi korisnik', + 'view' => "Informacije o korisniku {username}", + 'all_users' => 'Svi korisnici', 'list' => [ - 'user' => 'User', - 'role' => 'Role', - 'banned' => 'Banned?', + 'user' => 'Korisnik', + 'role' => 'Uloga', + 'banned' => 'Zabranjen?', ], 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'role' => 'Role', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', + 'email' => 'E-pošta', + 'username' => 'Korisničko ime', + 'password' => 'Lozinka', + 'new_password' => 'Nova lozinka', + 'role' => 'Uloga', + 'roles' => 'Uloge', + 'permissions' => 'Dozvole', + 'submit_create' => 'Kreiraj korisnika', + 'submit_edit' => 'Sačuvaj', + 'submit_password_change' => 'Promeni!', ], 'delete_form' => [ - 'title' => 'Delete {user}', + 'title' => 'Ukloni korisnika {user}', 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', + "Spremate se da trajno uklonite korisnika {user}. Korisnik neće moći više da pristupi administratorskoj zoni.", + 'understand' => 'Shvatam, želim da trajno uklonim korisnika {user}', + 'submit' => 'Obriši', ], 'messages' => [ 'createSuccess' => - 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'Korisnik je uspešno kreiran! Poruka dobrodošlice je poslata E-poštom korisniku {username}. Ona sadrži vezu za prijavu a od njih će biti zatraženo resetovanje lozinke nakon prve autentifikacije.', 'roleEditSuccess' => - "{username}'s roles have been successfully updated.", - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', + "Uloge korisnika {username} su uspešno ažurirane.", + 'banSuccess' => 'Korisnik {username} je zabranjen.', + 'unbanSuccess' => 'Korisniku {username} je skinuta zabrana.', 'editOwnerError' => - '{username} is the instance owner, one does not simply touch the owner…', + 'Korisnik {username} je vlasnik instance, prosto ne možete dirati vlasnika…', 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', + 'Korisnik {username} je super administrator, prosto ne možete zabraniti super administratora…', 'deleteOwnerError' => - '{username} is the instance owner, one does not simply delete the owner…', + 'Korisnik {username} je vlasnik instance, prosto ne možete obrisati vlasnika…', 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', + 'Korisnik {username} je super administrator, prosto ne možete obrisati super administratora…', + 'deleteSuccess' => 'Korisnik {username} je obrisan.', ], ]; diff --git a/modules/Auth/Language/sv/Auth.php b/modules/Auth/Language/sv/Auth.php index 92c04320..59bbe7aa 100644 --- a/modules/Auth/Language/sv/Auth.php +++ b/modules/Auth/Language/sv/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Din 6-siffriga kod', - 'notEnoughPrivilege' => 'Du har inte tillräcklig behörighet att komma åt sidan.', 'set_password' => 'Välj ett lösenord', // Welcome email diff --git a/modules/Auth/Language/uk/Auth.php b/modules/Auth/Language/uk/Auth.php index a47932e3..725b760b 100644 --- a/modules/Auth/Language/uk/Auth.php +++ b/modules/Auth/Language/uk/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => 'Your 6-digit code', - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', 'set_password' => 'Set your password', // Welcome email diff --git a/modules/Auth/Language/zh-Hans/Auth.php b/modules/Auth/Language/zh-Hans/Auth.php index 9d5502a2..89f14530 100644 --- a/modules/Auth/Language/zh-Hans/Auth.php +++ b/modules/Auth/Language/zh-Hans/Auth.php @@ -85,7 +85,6 @@ return [ // missing keys 'code' => '你的6位验证码', - 'notEnoughPrivilege' => '你没有足够的权限访问该页面。', 'set_password' => '设置你的密码', // Welcome email diff --git a/modules/Install/Language/kk/Install.php b/modules/Install/Language/kk/Install.php new file mode 100644 index 00000000..45d26085 --- /dev/null +++ b/modules/Install/Language/kk/Install.php @@ -0,0 +1,62 @@ + 'Castopod installer', + 'manual_config' => 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your Super Admin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Install/Language/sr_Latn/Install.php b/modules/Install/Language/sr_Latn/Install.php index 45d26085..d12ba554 100644 --- a/modules/Install/Language/sr_Latn/Install.php +++ b/modules/Install/Language/sr_Latn/Install.php @@ -9,54 +9,54 @@ declare(strict_types=1); */ return [ - 'title' => 'Castopod installer', - 'manual_config' => 'Manual configuration', + 'title' => 'Instalator Castopoda', + 'manual_config' => 'Ručna konfiguracija', 'manual_config_subtitle' => - 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'Napravite `.env` datoteku sa vašim podešavanjima i osvežite stranicu da bi ste nastavili instalaciju.', 'form' => [ - 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', - 'media_base_url' => 'Media base URL', + 'instance_config' => 'Konfiguracija instance', + 'hostname' => 'Ime domaćina', + 'media_base_url' => 'URL medijske baze', 'media_base_url_hint' => - 'If you use a CDN and/or an external analytics service, you may set them here.', - 'admin_gateway' => 'Admin gateway', + 'Ako koristite CDN i/ili eksternu uslugu za analitiku, možete ih postaviti ovde.', + 'admin_gateway' => 'Administratorski izlaz', 'admin_gateway_hint' => - 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', - 'auth_gateway' => 'Auth gateway', + 'Ruta za pristup kontrolnoj tabli administratora (eg. https://example.com/cp-admin).Podrazumevano je podešena na cp-admin, preporučujemo da je promenite iz sigurnosnih razloga.', + 'auth_gateway' => 'Auth izlaz', 'auth_gateway_hint' => - 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', + 'Ruta za pristup stranicama za potvrdu identiteta (eg. https://example.com/cp-auth).Podrazumevano je podešena na cp-auth, preporučujemo da je promenite iz sigurnosnih razloga.', + 'database_config' => 'Konfiguracija baze podataka', 'database_config_hint' => - 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', + 'Castopod mora da se poveže za vašom MySQL (ili MariaDB) bazom. Ukoliko ne posedujete potrebne informacije, molimo vas kontaktirajte administratora vašeg servera.', + 'db_hostname' => 'Ime hosta baze podataka', + 'db_name' => 'Ime baze podataka', + 'db_username' => 'Korisničko ime baze podataka', + 'db_password' => 'Lozinka baze podataka', + 'db_prefix' => 'Prefiks baze', 'db_prefix_hint' => - "The prefix of the Castopod table names, leave as is if you don't know what it means.", - 'cache_config' => 'Cache configuration', + "Prefiks imena tabela Castopod-a, ne diraj ako ne znaš šta znači.", + 'cache_config' => 'Konfiguracija keša', 'cache_config_hint' => - 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', - 'cache_handler' => 'Cache handler', + 'Izaberite željeni obrađivač keša. Ostavite je kao podrazumevanu vrednost ako nemate pojma šta to znači.', + 'cache_handler' => 'Obrađivač keša', 'cacheHandlerOptions' => [ - 'file' => 'File', + 'file' => 'Datoteka', 'redis' => 'Redis', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', - 'create_superadmin' => 'Create your Super Admin account', - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', + 'next' => 'Sledeće', + 'submit' => 'Završi instalaciju', + 'create_superadmin' => 'Kreiraj svoj nalog super administratora', + 'email' => 'E-pošta', + 'username' => 'Korisničko ime', + 'password' => 'Lozinka', ], 'messages' => [ 'createSuperAdminSuccess' => - 'Your superadmin account has been created successfully. Login to start podcasting!', + 'Vaš nalog superadmina je uspešno kreiran. Prijavite se da biste započeli podkasting!', 'databaseConnectError' => - 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'Castopod nije mogao da se poveže sa vašom bazom podataka. Uredite konfiguraciju baze podataka i pokušajte ponovo.', 'writeError' => - "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + "Nije moguće kreirati/upisati datoteku `.env`. Morate je kreirati ručno prateći šablon datoteke `.env.example` u Castopod-ovom paketu.", ], ]; diff --git a/modules/PodcastImport/Language/ar/PodcastImport.php b/modules/PodcastImport/Language/ar/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/ar/PodcastImport.php +++ b/modules/PodcastImport/Language/ar/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/br/PodcastImport.php b/modules/PodcastImport/Language/br/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/br/PodcastImport.php +++ b/modules/PodcastImport/Language/br/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/ca/PodcastImport.php b/modules/PodcastImport/Language/ca/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/ca/PodcastImport.php +++ b/modules/PodcastImport/Language/ca/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/da/PodcastImport.php b/modules/PodcastImport/Language/da/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/da/PodcastImport.php +++ b/modules/PodcastImport/Language/da/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/de/PodcastImport.php b/modules/PodcastImport/Language/de/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/de/PodcastImport.php +++ b/modules/PodcastImport/Language/de/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/el/PodcastImport.php b/modules/PodcastImport/Language/el/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/el/PodcastImport.php +++ b/modules/PodcastImport/Language/el/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/es/PodcastImport.php b/modules/PodcastImport/Language/es/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/es/PodcastImport.php +++ b/modules/PodcastImport/Language/es/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/fa/PodcastImport.php b/modules/PodcastImport/Language/fa/PodcastImport.php index ac6779ab..cf5f4592 100644 --- a/modules/PodcastImport/Language/fa/PodcastImport.php +++ b/modules/PodcastImport/Language/fa/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'حذف', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'وظیفهٔ درون‌ریزی با موفّقیت لغو شد!', 'notRunning' => 'نمی‌توان وظیفهٔ درون‌ریزی را لغو کرد؛ چرا که در حال اجرا نیست.', diff --git a/modules/PodcastImport/Language/fr/PodcastImport.php b/modules/PodcastImport/Language/fr/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/fr/PodcastImport.php +++ b/modules/PodcastImport/Language/fr/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/fr2/PodcastImport.php b/modules/PodcastImport/Language/fr2/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/fr2/PodcastImport.php +++ b/modules/PodcastImport/Language/fr2/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/fr_CA/PodcastImport.php b/modules/PodcastImport/Language/fr_CA/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/fr_CA/PodcastImport.php +++ b/modules/PodcastImport/Language/fr_CA/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/gd/PodcastImport.php b/modules/PodcastImport/Language/gd/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/gd/PodcastImport.php +++ b/modules/PodcastImport/Language/gd/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/gl/PodcastImport.php b/modules/PodcastImport/Language/gl/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/gl/PodcastImport.php +++ b/modules/PodcastImport/Language/gl/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/id/PodcastImport.php b/modules/PodcastImport/Language/id/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/id/PodcastImport.php +++ b/modules/PodcastImport/Language/id/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/it/PodcastImport.php b/modules/PodcastImport/Language/it/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/it/PodcastImport.php +++ b/modules/PodcastImport/Language/it/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/ja/PodcastImport.php b/modules/PodcastImport/Language/ja/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/ja/PodcastImport.php +++ b/modules/PodcastImport/Language/ja/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/kk/PodcastImport.php b/modules/PodcastImport/Language/kk/PodcastImport.php new file mode 100644 index 00000000..8bf494d3 --- /dev/null +++ b/modules/PodcastImport/Language/kk/PodcastImport.php @@ -0,0 +1,66 @@ + [ + 'disclaimer' => 'Importing', + 'text' => '{podcastTitle} is currently being imported.', + 'cta' => 'See import status', + ], + 'old_podcast_section_title' => 'The podcast to import', + 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_legal_disclaimer' => + 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', + 'imported_feed_url' => 'Feed URL', + 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', + 'new_podcast_section_title' => 'The new podcast', + 'lock_import' => + 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', + 'submit' => 'Add import to queue', + 'queue' => [ + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Import task is awaiting to be processed.', + 'canceled' => 'canceled', + 'canceled_hint' => 'Import task was canceled.', + 'running' => 'running', + 'running_hint' => 'Import task is being processed.', + 'failed' => 'failed', + 'failed_hint' => 'Import task could not complete: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Import task was completed successfully!', + ], + 'feed' => 'Feed', + 'duration' => 'Import duration', + 'imported_episodes' => 'Imported episodes', + 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'actions' => [ + 'cancel' => 'Cancel', + 'retry' => 'Retry', + 'delete' => 'Delete', + ], + ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], + 'messages' => [ + 'canceled' => 'Import task has been successfully canceled!', + 'notRunning' => 'Cannot cancel Import Task as it is not running.', + 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', + 'retried' => 'Import task has been queued, it will be retried shortly!', + 'deleted' => 'Import task has been successfully deleted!', + 'importTaskQueued' => 'An new task has been queued, import will start shortly!', + 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + ], +]; diff --git a/modules/PodcastImport/Language/ko/PodcastImport.php b/modules/PodcastImport/Language/ko/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/ko/PodcastImport.php +++ b/modules/PodcastImport/Language/ko/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/nl/PodcastImport.php b/modules/PodcastImport/Language/nl/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/nl/PodcastImport.php +++ b/modules/PodcastImport/Language/nl/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/nn-NO/PodcastImport.php b/modules/PodcastImport/Language/nn-NO/PodcastImport.php index 3708fb06..f778e048 100644 --- a/modules/PodcastImport/Language/nn-NO/PodcastImport.php +++ b/modules/PodcastImport/Language/nn-NO/PodcastImport.php @@ -10,51 +10,57 @@ declare(strict_types=1); return [ 'banner' => [ - 'disclaimer' => 'Importing', - 'text' => '{podcastTitle} is currently being imported.', - 'cta' => 'See import status', + 'disclaimer' => 'Importerer', + 'text' => '{podcastTitle} blir importert.', + 'cta' => 'Sjå status på importen', ], - 'old_podcast_section_title' => 'The podcast to import', - 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_section_title' => 'Podkast å importera', + 'old_podcast_legal_disclaimer_title' => 'Juridisk ansvarsfråskriving', 'old_podcast_legal_disclaimer' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', + 'Syt for at du har rettane til podkasten før du importerer han. Å kopiera og kringkasta ein podkast utan løyve er ulovleg og straffbart.', + 'imported_feed_url' => 'URL til straumen', + 'imported_feed_url_hint' => 'Straumen må vera i xml- eller rss-format.', + 'new_podcast_section_title' => 'Den nye podkasten', 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', - 'submit' => 'Add import to queue', + 'Denne straumen er verna. Du kan ikkje importera han. Viss du er eigaren, må du låsa han opp på den originale plattforma.', + 'submit' => 'Legg importen i køen', 'queue' => [ 'status' => [ 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Import task is awaiting to be processed.', - 'canceled' => 'canceled', - 'canceled_hint' => 'Import task was canceled.', - 'running' => 'running', - 'running_hint' => 'Import task is being processed.', - 'failed' => 'failed', - 'failed_hint' => 'Import task could not complete: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Import task was completed successfully!', + 'queued' => 'i kø', + 'queued_hint' => 'Importjobben ventar på å bli utført.', + 'canceled' => 'avbrote', + 'canceled_hint' => 'Importjobben vart avbroten.', + 'running' => 'køyrer', + 'running_hint' => 'Utfører importoppgåva.', + 'failed' => 'mislukka', + 'failed_hint' => 'Greidde ikkje fullføra importen: skriptfeil.', + 'passed' => 'utført', + 'passed_hint' => 'Importen var vellukka.', ], - 'feed' => 'Feed', - 'duration' => 'Import duration', - 'imported_episodes' => 'Imported episodes', - 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'feed' => 'Straum', + 'duration' => 'Kor lenge importen vara', + 'imported_episodes' => 'Importerte episodar', + 'imported_episodes_hint' => '{newlyImportedCount} nyss importerte, {alreadyImportedCount} allereie importerte.', 'actions' => [ - 'cancel' => 'Cancel', - 'retry' => 'Retry', - 'delete' => 'Delete', + 'cancel' => 'Avbryt', + 'retry' => 'Prøv på nytt', + 'delete' => 'Slett', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ - 'canceled' => 'Import task has been successfully canceled!', - 'notRunning' => 'Cannot cancel Import Task as it is not running.', - 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', - 'retried' => 'Import task has been queued, it will be retried shortly!', - 'deleted' => 'Import task has been successfully deleted!', - 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + 'canceled' => 'Importen vart avbroten.', + 'notRunning' => 'Kan ikkje avbryta importen, fordi han ikkje køyrer.', + 'alreadyRunning' => 'Importen er i gang. Du kan avbryta han før du prøver på nytt.', + 'retried' => 'Importjobben er lagt i køen, og vil bli prøvd på nytt straks.', + 'deleted' => 'Importjobben er sletta.', + 'importTaskQueued' => 'Ein ny jobb er lagd i køen, og importen startar straks.', + 'syncTaskQueued' => 'Ein ny importjobb er lagd i køen, og synkroniseringa startar straks.', ], ]; diff --git a/modules/PodcastImport/Language/oc/PodcastImport.php b/modules/PodcastImport/Language/oc/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/oc/PodcastImport.php +++ b/modules/PodcastImport/Language/oc/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/pl/PodcastImport.php b/modules/PodcastImport/Language/pl/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/pl/PodcastImport.php +++ b/modules/PodcastImport/Language/pl/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/pt-BR/PodcastImport.php b/modules/PodcastImport/Language/pt-BR/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/pt-BR/PodcastImport.php +++ b/modules/PodcastImport/Language/pt-BR/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/pt/PodcastImport.php b/modules/PodcastImport/Language/pt/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/pt/PodcastImport.php +++ b/modules/PodcastImport/Language/pt/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/ro/PodcastImport.php b/modules/PodcastImport/Language/ro/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/ro/PodcastImport.php +++ b/modules/PodcastImport/Language/ro/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/ru/PodcastImport.php b/modules/PodcastImport/Language/ru/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/ru/PodcastImport.php +++ b/modules/PodcastImport/Language/ru/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/sk/PodcastImport.php b/modules/PodcastImport/Language/sk/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/sk/PodcastImport.php +++ b/modules/PodcastImport/Language/sk/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/sr_Latn/PodcastImport.php b/modules/PodcastImport/Language/sr_Latn/PodcastImport.php index 3708fb06..504175b7 100644 --- a/modules/PodcastImport/Language/sr_Latn/PodcastImport.php +++ b/modules/PodcastImport/Language/sr_Latn/PodcastImport.php @@ -10,51 +10,57 @@ declare(strict_types=1); return [ 'banner' => [ - 'disclaimer' => 'Importing', - 'text' => '{podcastTitle} is currently being imported.', - 'cta' => 'See import status', + 'disclaimer' => 'Uvoz', + 'text' => '{podcastTitle} se trenutno uvozi.', + 'cta' => 'Pogledaj status uvoza', ], - 'old_podcast_section_title' => 'The podcast to import', - 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_section_title' => 'Podkast koji se uvozi', + 'old_podcast_legal_disclaimer_title' => 'Pravno odricanje od odgovornosti', 'old_podcast_legal_disclaimer' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', + 'Uverite se da posedujete prava za ovaj podkast pre nego što ga uvezete. Kopiranje i emitovanje podkasta bez odgovarajućih prava je piraterija i podložno je krivičnom gonjenju.', + 'imported_feed_url' => 'URL snabdevača', + 'imported_feed_url_hint' => 'Snabdevač mora biti u xml ili rss formatu.', + 'new_podcast_section_title' => 'Novi podkast', 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', - 'submit' => 'Add import to queue', + 'Ovaj snabdevač je zaštićen. Ne možete ga uvesti. Ukoliko ste vlasnik, otključajte snabdevač na originalnoj platformi na kojoj ste ga napravili.', + 'submit' => 'Dodaj uvoz na čekanje', 'queue' => [ 'status' => [ 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Import task is awaiting to be processed.', - 'canceled' => 'canceled', - 'canceled_hint' => 'Import task was canceled.', - 'running' => 'running', - 'running_hint' => 'Import task is being processed.', - 'failed' => 'failed', - 'failed_hint' => 'Import task could not complete: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Import task was completed successfully!', + 'queued' => 'čekanje', + 'queued_hint' => 'Zadatak uvoza čeka na obradu.', + 'canceled' => 'otkazano', + 'canceled_hint' => 'Zadatak uvoza je otkazan.', + 'running' => 'u toku', + 'running_hint' => 'Zadatak uvoza se procesuira.', + 'failed' => 'nije uspеlo', + 'failed_hint' => 'Zadatak uvoza nije mogao da se završi: greška skripte.', + 'passed' => 'pauzirano', + 'passed_hint' => 'Zadatak uvoza uspešno obavljen!', ], - 'feed' => 'Feed', - 'duration' => 'Import duration', - 'imported_episodes' => 'Imported episodes', - 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'feed' => 'Snabdevač', + 'duration' => 'Trajanje uvoza', + 'imported_episodes' => 'Uvežene epizode', + 'imported_episodes_hint' => '{newlyImportedCount} novo uvežena, {alreadyImportedCount} već uveženih.', 'actions' => [ - 'cancel' => 'Cancel', - 'retry' => 'Retry', - 'delete' => 'Delete', + 'cancel' => 'Otkaži', + 'retry' => 'Pokušaj ponovo', + 'delete' => 'Obriši', ], ], + 'syncForm' => [ + 'title' => 'Sinhronizuj snabdevače', + 'feed_url' => 'URL snabdevača', + 'feed_url_hint' => 'URL veza snabdevača koju želite da sinhronizujete sa trenutnim podkastom.', + 'submit' => 'Dodaj u redosled', + ], 'messages' => [ - 'canceled' => 'Import task has been successfully canceled!', - 'notRunning' => 'Cannot cancel Import Task as it is not running.', - 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', - 'retried' => 'Import task has been queued, it will be retried shortly!', - 'deleted' => 'Import task has been successfully deleted!', - 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + 'canceled' => 'Zadatak uvoza uspešno otkazan!', + 'notRunning' => 'Nije moguće otkazati zadatak uvoza jer isti nije u toku.', + 'alreadyRunning' => 'Zadatak uvoza je u toku. Možete ga otkazati pre ponovnog pokušaja.', + 'retried' => 'Zadatak uvoza je na čekanju, biće pokušan ponovo uskoro!', + 'deleted' => 'Zadatak uvoza uspešno obrisan!', + 'importTaskQueued' => 'Novi zadatak je na čekanju, uvoz će krenuti uskoro!', + 'syncTaskQueued' => 'Novi zadatak uvoza je na čekanju, sinhronizacija će početi uskoro!', ], ]; diff --git a/modules/PodcastImport/Language/sv/PodcastImport.php b/modules/PodcastImport/Language/sv/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/sv/PodcastImport.php +++ b/modules/PodcastImport/Language/sv/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/uk/PodcastImport.php b/modules/PodcastImport/Language/uk/PodcastImport.php index 3708fb06..8bf494d3 100644 --- a/modules/PodcastImport/Language/uk/PodcastImport.php +++ b/modules/PodcastImport/Language/uk/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => 'Delete', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', 'notRunning' => 'Cannot cancel Import Task as it is not running.', diff --git a/modules/PodcastImport/Language/zh-Hans/PodcastImport.php b/modules/PodcastImport/Language/zh-Hans/PodcastImport.php index 7572a396..ca714eec 100644 --- a/modules/PodcastImport/Language/zh-Hans/PodcastImport.php +++ b/modules/PodcastImport/Language/zh-Hans/PodcastImport.php @@ -48,6 +48,12 @@ return [ 'delete' => '删除', ], ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], 'messages' => [ 'canceled' => '导入任务已成功取消!', 'notRunning' => '无法取消导入任务,因为它未运行。', diff --git a/modules/PremiumPodcasts/Language/de/Subscription.php b/modules/PremiumPodcasts/Language/de/Subscription.php index 17e6fe9e..e57db5a2 100644 --- a/modules/PremiumPodcasts/Language/de/Subscription.php +++ b/modules/PremiumPodcasts/Language/de/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'E-Mail', 'expiration_date' => 'Ablaufdatum', 'expiration_date_hint' => 'Das Datum und die Uhrzeit, zu der das Abonnement abläuft. Leer lassen für ein unbegrenztes Abonnement.', - 'submit_add' => 'Abonnement hinzufügen', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Abonnement bearbeiten', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/es/Subscription.php b/modules/PremiumPodcasts/Language/es/Subscription.php index 4d81bc70..76df4e21 100644 --- a/modules/PremiumPodcasts/Language/es/Subscription.php +++ b/modules/PremiumPodcasts/Language/es/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Correo electrónico', 'expiration_date' => 'Fecha de expiración', 'expiration_date_hint' => 'La fecha y hora en que caduca la suscripción. Dejar en blanco para una suscripción ilimitada.', - 'submit_add' => 'Añadir suscripción', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Editar la suscripción', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/fr/Subscription.php b/modules/PremiumPodcasts/Language/fr/Subscription.php index c20be9d2..cbeb3713 100644 --- a/modules/PremiumPodcasts/Language/fr/Subscription.php +++ b/modules/PremiumPodcasts/Language/fr/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Adresse e-mail', 'expiration_date' => 'Date d\'expiration', 'expiration_date_hint' => 'La date et l\'heure à laquelle l\'abonnement expire. Laissez vide pour un abonnement illimité.', - 'submit_add' => 'Ajouter un abonnement', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Modifier l\'inscription', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/gd/Subscription.php b/modules/PremiumPodcasts/Language/gd/Subscription.php index 3ee140dd..2dbfdeb6 100644 --- a/modules/PremiumPodcasts/Language/gd/Subscription.php +++ b/modules/PremiumPodcasts/Language/gd/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Post-d', 'expiration_date' => 'Ceann-là crìochnachaidh', 'expiration_date_hint' => 'An ceann-là ’s àm a dh’fhalbhas an ùine air an fho-sgrìobhadh. Fàg bàn e airson fo-sgrìobhadh gun chrìoch.', - 'submit_add' => 'Cuir fo-sgrìobhadh ris', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Deasaich am fo-sgrìobhadh', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/kk/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/kk/PremiumPodcasts.php new file mode 100644 index 00000000..18c0dd4e --- /dev/null +++ b/modules/PremiumPodcasts/Language/kk/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Podcast contains premium episodes', + 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', + 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', + 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', + 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'subscribe' => 'Subscribe', + 'lock' => 'Lock', + 'unlock' => 'Unlock', + 'unlock_form' => [ + 'title' => 'Premium content', + 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'token' => 'Enter your key', + 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'submit' => 'Unlock all episodes!', + 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'subscribe_cta' => 'Subscribe now!', + ], + 'messages' => [ + 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', + 'unlockBadAttempt' => 'Your key does not seem to be working…', + 'lockSuccess' => 'Podcast was successfully locked!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/kk/Subscription.php b/modules/PremiumPodcasts/Language/kk/Subscription.php new file mode 100644 index 00000000..e83f0cb2 --- /dev/null +++ b/modules/PremiumPodcasts/Language/kk/Subscription.php @@ -0,0 +1,100 @@ + 'Podcast subscriptions', + 'add' => 'New subscription', + 'view' => 'View subscription', + 'edit' => 'Edit subscription', + 'regenerate_token' => 'Regenerate token', + 'suspend' => 'Suspend subscription', + 'resume' => 'Resume subscription', + 'delete' => 'Delete subscription', + 'status' => [ + 'active' => 'Active', + 'suspended' => 'Suspended', + 'expired' => 'Expired', + ], + 'list' => [ + 'number' => 'Number', + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'unlimited' => 'Unlimited', + 'downloads' => 'Downloads', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'submit_create' => 'Create subscription', + 'submit_edit' => 'Edit subscription', + ], + 'form_link_add' => [ + 'link' => 'Subscription page link', + 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'submit' => 'Save link', + ], + 'suspend_form' => [ + 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'reason' => 'Reason', + 'reason_placeholder' => 'Why are you suspending the subscription?', + "submit" => 'Suspend subscription', + ], + 'delete_form' => [ + 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'understand' => 'I understand, remove the subscription permanently', + 'submit' => 'Remove subscription', + ], + 'messages' => [ + 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', + 'addError' => 'Subscription could not be added.', + 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'editError' => 'Subscription could not be edited.', + 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenError' => 'Token could not be regenerated.', + 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', + 'deleteError' => 'Subscription could not be removed.', + 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', + 'suspendError' => 'Subscription could not be suspended.', + 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', + 'resumeError' => 'Subscription could not be resumed.', + 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', + 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + ], + 'emails' => [ + 'greeting' => 'Hey,', + 'token' => 'Your token: {0}', + 'unique_feed_link' => 'Your unique feed link: {0}', + 'how_to_use' => 'How to use?', + 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', + 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'welcome_subject' => 'Welcome to {podcastTitle}', + 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', + 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', + 'welcome_expires' => 'Your subscription was set to expire on {0}.', + 'welcome_never_expires' => 'Your subscription was set to never expire.', + 'reset_subject' => 'Your token was reset!', + 'reset_token' => 'Your access to {podcastTitle} has been reset!', + 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'edited_subject' => 'Your subscription has been updated!', + 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', + 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'suspended_subject' => 'Your subscription has been suspended!', + 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended_reason' => 'That is for the following reason: {0}', + 'resumed_subject' => 'Your subscription has been resumed!', + 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'deleted_subject' => 'Your subscription has been removed!', + 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'footer' => '{castopod} hosted on {host}', + ], +]; diff --git a/modules/PremiumPodcasts/Language/nl/Subscription.php b/modules/PremiumPodcasts/Language/nl/Subscription.php index 8834309c..f01244cb 100644 --- a/modules/PremiumPodcasts/Language/nl/Subscription.php +++ b/modules/PremiumPodcasts/Language/nl/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'E-mail', 'expiration_date' => 'Vervaldatum', 'expiration_date_hint' => 'De datum en tijd waarop het abonnement verloopt. Laat leeg voor een onbeperkt abonnement.', - 'submit_add' => 'Abonnement toevoegen', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Bewerk abonnement', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php index 18c0dd4e..4decf740 100644 --- a/modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'podcast_is_premium' => 'Podkasten inneheld betalte episodar', + 'episode_is_premium' => 'Episoden er bak betalingsmur. Berre betalande abonnentar har tilgang', + 'unlock_episode' => 'Denne episoden er berre for betalande abonnentar. Klikk for å få tilgang!', + 'banner_unlock' => 'Denne podkasten inneheld episodar som berre er tilgjengelege for betalande abonnentar.', + 'banner_lock' => 'Podkasten er låst opp, så no kan du høyra på dei betalte episodane!', + 'subscribe' => 'Abonner', + 'lock' => 'Lås', + 'unlock' => 'Lås opp', 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'title' => 'Betalt innhald', + 'subtitle' => 'Denne podkasten inneheld episodar bak betalingsmur. Har du nykelen for å få tilgang til dei?', + 'token' => 'Skriv inn nykelen', + 'token_hint' => 'Viss du abonnerer på {podcastTitle}, kan du kopiera nykelen du fekk på epost og lima han inn her.', + 'submit' => 'Få tilgang til alle episodane!', + 'call_to_action' => 'Få tilgang til alle episodane av {podcastTitle}:', + 'subscribe_cta' => 'Abonner no!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Podkasten er låst opp. No kan du høyra på dei betalte episodane!', + 'unlockBadAttempt' => 'Nykelen din fungerer ikkje…', + 'lockSuccess' => 'Podkasten er låst.', ], ]; diff --git a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php index f08fe770..a7bc5620 100644 --- a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php +++ b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php @@ -9,61 +9,61 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Abonnement til podkasten', + 'add' => 'Nytt abonnement', + 'view' => 'Vis abonnementet', + 'edit' => 'Rediger abonnementet', + 'regenerate_token' => 'Regenerer nykel', + 'suspend' => 'Stopp abonnementet', + 'resume' => 'Start oppatt abonnementet', + 'delete' => 'Slett abonnementet', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Aktiv', + 'suspended' => 'Stoppa', + 'expired' => 'Utgått', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', + 'number' => 'Nummer', + 'email' => 'Epost', + 'expiration_date' => 'Gyldig til', + 'unlimited' => 'Uavgrensa', + 'downloads' => 'Nedlastingar', 'status' => 'Status', ], 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'email' => 'Epost', + 'expiration_date' => 'Gyldig til', + 'expiration_date_hint' => 'Datoen og tidspunket abonnementet stoppar. La det stå tomt viss abonnementet skal gå utan sluttdato.', 'submit_create' => 'Create subscription', - 'submit_edit' => 'Edit subscription', + 'submit_edit' => 'Rediger abonnementet', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'link' => 'Lenke til abonnementssida', + 'link_hint' => 'Her legg du til ei oppmoding på nettsida di, der du inviterer lyttarane til å abonnera på podkasten din.', + 'submit' => 'Lagre lenka', ], 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', + 'disclaimer' => 'Viss du stoppar abonnementet, vil ikkje abonnenten lenger få tilgang til betalt innhald. Du kan starta abonnementet att seinare.', + 'reason' => 'Grunngjeving', + 'reason_placeholder' => 'Kvifor stoppar du abonnementet?', + "submit" => 'Stopp abonnementet', ], 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', - 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', + 'disclaimer' => 'Viss du slettar abonnementet til {subscriber}, slettar du òg alle analysedata knytt til abonnementet.', + 'understand' => 'Eg forstår, slett abonnementet', + 'submit' => 'Slett abonnementet', ], 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', - 'editError' => 'Subscription could not be edited.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', - 'regenerateTokenError' => 'Token could not be regenerated.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', + 'addSuccess' => 'Du har fått ein ny abonnent! Me har sendt ein velkomstepost til {subscriber}.', + 'addError' => 'Greidde ikkje leggja til abonnementet.', + 'editSuccess' => 'Stoppdatoen for abonnementet er oppdatert! Me har sendt ein epost til {subscriber}.', + 'editError' => 'Greidde ikkje redigera abonnementet.', + 'regenerateTokenSuccess' => 'Nykelen er regenerert! Me sende ein epost til {subscriber} med den nye nykelen.', + 'regenerateTokenError' => 'Greidde ikkje regenerera nykelen.', + 'deleteSuccess' => 'Abonnementet er sletta! Me sende ein epost til {subscriber}.', + 'deleteError' => 'Greidde ikkje sletta abonnementet.', + 'suspendSuccess' => 'Abonnementet vart stoppa! Me sende ein epost til {subscriber}.', + 'suspendError' => 'Greidde ikkje stoppa abonnementet.', 'resumeSuccess' => 'Abonnementet er starta att! Me sende ein epost til {subscriber}.', 'resumeError' => 'Greidde ikkje starta abonnementet att.', 'linkSaveSuccess' => 'Abonnementslenka er lagra. Ho vil visa på nettstaden som ei handlingsvarsling.', @@ -71,30 +71,30 @@ return [ ], 'emails' => [ 'greeting' => 'Hei', - 'token' => 'Teiknet ditt: {0}', + 'token' => 'Nykelen din: {0}', 'unique_feed_link' => 'Den unike lenka til straumen: {0}', 'how_to_use' => 'Korleis skal eg bruka dette?', 'two_ways' => 'Du kan låsa opp betalte episodar på to måtar:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', - 'welcome_subject' => 'Welcome to {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', - 'edited_subject' => 'Your subscription has been updated!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', - 'suspended_subject' => 'Your subscription has been suspended!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', - 'suspended_reason' => 'That is for the following reason: {0}', - 'resumed_subject' => 'Your subscription has been resumed!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', - 'deleted_subject' => 'Your subscription has been removed!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', - 'footer' => '{castopod} hosted on {host}', + 'import_into_app' => 'Kopier den unike adressa til podkaststraumen til favoritt-podkastappen din (importer adressa som ein privat straum slik at du ikkje avslører innloggingsopplysingane dine).', + 'go_to_website' => 'Gå til heimesida til {podcastWebsite} og lås opp podkasten med nykelen.', + 'welcome_subject' => 'Velkomen til {podcastTitle}', + 'welcome' => 'Du abonnerer på {podcastTitle}. Takk, og velkomen ombord!', + 'welcome_token_title' => 'Her er nykelen for å få tilgang til dei betalte episodane til podkasten:', + 'welcome_expires' => 'Abonnementet ditt hadde stoppdato {0}.', + 'welcome_never_expires' => 'Abonnementet ditt hadde ingen stoppdato.', + 'reset_subject' => 'Nykelen din er nullstilt!', + 'reset_token' => 'Tilgangen din til {podcastTitle} er nullstilt!', + 'reset_token_title' => 'Me har laga nye tilgangsopplysingar for deg for å få tilgang til dei betalte episodane til podkasten:', + 'edited_subject' => 'Abonnementet ditt er oppdatert!', + 'edited_expires' => 'Abonnementet ditt på {podcastTitle} hadde stoppdato {expiresAt}.', + 'edited_never_expires' => 'Abonnementet ditt på {podcastTitle} hadde ingen stoppdato!', + 'suspended_subject' => 'Abonnementet ditt er stoppa!', + 'suspended' => 'Abonnementet ditt på {podcastTitle} er stoppa! Du har ikkje lenger tilgang til dei betalte episodane til denne podkasten.', + 'suspended_reason' => 'Det er av desse grunnane: {0}', + 'resumed_subject' => 'Abonnementet ditt har starta att!', + 'resumed' => 'Abonnementet ditt på {podcastTitle} har starta att! Du har tilgang til dei betalte episodane til denne podkasten.', + 'deleted_subject' => 'Abonnementet ditt er sletta!', + 'deleted' => 'Abonnementet ditt på {podcastTitle} er sletta! Du har ikkje lenger tilgang til dei betalte episodane til podkasten.', + 'footer' => '{castopod} køyrer på {host}', ], ]; diff --git a/modules/PremiumPodcasts/Language/pl/Subscription.php b/modules/PremiumPodcasts/Language/pl/Subscription.php index 0d90840d..ba68a80a 100644 --- a/modules/PremiumPodcasts/Language/pl/Subscription.php +++ b/modules/PremiumPodcasts/Language/pl/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Email', 'expiration_date' => 'Data ważności', 'expiration_date_hint' => 'Data i godzina wygaśnięcia subskrypcji. Pozostaw puste dla nieograniczonej subskrypcji.', - 'submit_add' => 'Dodaj subskrypcję', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Edytuj subskrypcję', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/ro/Subscription.php b/modules/PremiumPodcasts/Language/ro/Subscription.php index 19b901ee..86a77ad8 100644 --- a/modules/PremiumPodcasts/Language/ro/Subscription.php +++ b/modules/PremiumPodcasts/Language/ro/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'E-mail', 'expiration_date' => 'Data expirării', 'expiration_date_hint' => 'Data și ora la care expiră abonamentul. Lăsați gol pentru un abonament nelimitat.', - 'submit_add' => 'Adaugă abonament', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Editare abonament', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/sr_Latn/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/sr_Latn/PremiumPodcasts.php index b1a684cf..6da5e74e 100644 --- a/modules/PremiumPodcasts/Language/sr_Latn/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/sr_Latn/PremiumPodcasts.php @@ -10,25 +10,25 @@ declare(strict_types=1); return [ 'podcast_is_premium' => 'Podcast sadrži premijerne epizode', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'episode_is_premium' => 'Epizoda je premijum, dostupna je samo premijum pretplatnicima', + 'unlock_episode' => 'Ova epizoda je samo za premijum pretplatnike. Klikni da je otključaš!', + 'banner_unlock' => 'Ovaj podkast sadrži premijum epizode, dostupne samo premijum pretplatnicima.', + 'banner_lock' => 'Podkast je otključan, uživajte u premijum epizodama!', 'subscribe' => 'Pretplatite se', 'lock' => 'Zaključaj', 'unlock' => 'Otključaj', 'unlock_form' => [ 'title' => 'Premijum sadržaj', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'subtitle' => 'Ovaj podkat sadrži zaključane premijum epizode! Da li imate ključ?', 'token' => 'Unesite ključ', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'token_hint' => 'Ako ste pretplaćeni na {podcastTitle}, možete kopirati ključ koji vam je poslat na E poštu i zalepiti ga ovde.', 'submit' => 'Otključaj sve epizode!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'call_to_action' => 'Otključaj sve epizode {podcastTitle}:', 'subscribe_cta' => 'Pretplati se sada!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Podkast je uspešno otključan, uživajte u premijum epizodama!', + 'unlockBadAttempt' => 'Izgleda da vaš ključ ne radi…', + 'lockSuccess' => 'Podkast je uspešno zaključan!', ], ]; diff --git a/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php b/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php index e83f0cb2..0fbeb3aa 100644 --- a/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php +++ b/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php @@ -9,92 +9,92 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Podkast pretplate', + 'add' => 'Nova pretplata', + 'view' => 'Pogledaj pretplatu', + 'edit' => 'Uredi pretplatu', + 'regenerate_token' => 'Regeneriši token', + 'suspend' => 'Ukini pretplatu', + 'resume' => 'Nastavi pretplatu', + 'delete' => 'Obriši pretplatu', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Aktivno', + 'suspended' => 'Ukinuto', + 'expired' => 'Isteklo', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', + 'number' => 'Broj', + 'email' => 'E-pošta', + 'expiration_date' => 'Datum Isteka', + 'unlimited' => 'Neograničeno', + 'downloads' => 'Preuzimanja', 'status' => 'Status', ], 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_create' => 'Create subscription', - 'submit_edit' => 'Edit subscription', + 'email' => 'E-pošta', + 'expiration_date' => 'Datum Isteka', + 'expiration_date_hint' => 'Datum i vreme kada pretplata ističe. Ostavite prazno za neograničenu pretplatu.', + 'submit_create' => 'Napravi pretplatu', + 'submit_edit' => 'Uredi pretplatu', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'link' => 'Veza strane za pretplate', + 'link_hint' => 'Ovo će dodati poziv na akciju na veb lokaciji koji poziva slušaoce da se pretplate na podkast.', + 'submit' => 'Sačuvaj vezu', ], 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', + 'disclaimer' => 'Obustavljanje pretplate će ograničiti pretplatniku pristup premijum sadržaju. I dalje ćete moći da uklonite obustavu nakon toga.', + 'reason' => 'Razlog', + 'reason_placeholder' => 'Zašto ukidate pretplatu?', + "submit" => 'Ukini pretplatu', ], 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', - 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', + 'disclaimer' => 'Brisanje {subscriber} pretplate će ukloniti svu analitiku vezanu za tog pretplatnika.', + 'understand' => 'Razumem, želim da trajno ukinem pretplatu', + 'submit' => 'Ukloni pretplatu', ], 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', - 'editError' => 'Subscription could not be edited.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', - 'regenerateTokenError' => 'Token could not be regenerated.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + 'addSuccess' => 'Nova pretplata dodata! Poruka dobrodođlice je poslata {subscriber} putem E-pošte.', + 'addError' => 'Nije moguće dodati pretplatu.', + 'editSuccess' => 'Datum isteka pretplate je ažuriran! Poruka je poslata {subscriber} putem E-pošte.', + 'editError' => 'Nije moguće urediti pretplatu.', + 'regenerateTokenSuccess' => 'Token regenerisan! Novi token je poslat {subscriber} putem E-pošte.', + 'regenerateTokenError' => 'Token nije moguće regenerisati.', + 'deleteSuccess' => 'Pretplata je uklonjena! Poruka je poslata {subscriber} putem E-pošte.', + 'deleteError' => 'Nije moguće ukloniti pretplatu.', + 'suspendSuccess' => 'Pretplata je ukinuta! Poruka je poslata {subscriber} putem E-pošte.', + 'suspendError' => 'Nije moguće prekinuti pretplatu.', + 'resumeSuccess' => 'Pretplana je obnovljena! Poruka je poslata {subscriber} putem E-pošte.', + 'resumeError' => 'Nije moguće obnoviti pretplatu.', + 'linkSaveSuccess' => 'Veza za pretplatu je uspešno sačuvana! Pojaviće se na Veb strani kao poziv na akciju!', + 'linkRemoveSuccess' => 'Veza za pretplatu je uspešno uklonjena!', ], 'emails' => [ - 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', - 'welcome_subject' => 'Welcome to {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', - 'edited_subject' => 'Your subscription has been updated!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', - 'suspended_subject' => 'Your subscription has been suspended!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', - 'suspended_reason' => 'That is for the following reason: {0}', - 'resumed_subject' => 'Your subscription has been resumed!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', - 'deleted_subject' => 'Your subscription has been removed!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', - 'footer' => '{castopod} hosted on {host}', + 'greeting' => 'Hej,', + 'token' => 'Vaš token: {0}', + 'unique_feed_link' => 'Vaša jedinstvena veza sa fidom: {0}', + 'how_to_use' => 'Kako se koristi?', + 'two_ways' => 'Imate dva načina kako možete otključati premijum epizode:', + 'import_into_app' => 'Kopirajte svoj jedinstveni url fid u svoju omiljenu aplikaciju za podkaste (uvezite ga kao privatni fid da biste sprečili otkrivanje vaših akreditiva).', + 'go_to_website' => 'Idite na {podcastWebsite} veb stranicu i otključajte podkast koristeći vaš token.', + 'welcome_subject' => 'Dobrodošli na {podcastTitle}', + 'welcome' => 'Pretplatili ste se na {podcastTitle}, hvala vam i dobrodošli!', + 'welcome_token_title' => 'Evo vaših akreditiva kojima otključavate premijum epizode ovog podkasta:', + 'welcome_expires' => 'Vaša pretplata ističe {0}.', + 'welcome_never_expires' => 'Vaša pretplata je podešena tako da ne može da istekne.', + 'reset_subject' => 'Vaš token je resetovan!', + 'reset_token' => 'Vaš pristup {podcastTitle} je resetovan!', + 'reset_token_title' => 'Nove akreditive su kreirane kako bi ste pristupili premijum epizodama podkasta:', + 'edited_subject' => 'Vaša pretplata je ažurirana!', + 'edited_expires' => 'Vaša pretplata na {podcastTitle} ističe {expiresAt}.', + 'edited_never_expires' => 'Vaša pretplata na {podcastTitle} je podešena tako da nikad ne istekne!', + 'suspended_subject' => 'Vaša pretplata je ukinuta!', + 'suspended' => 'Vaša pretplata na {podcastTitle} je ukinuta! Više ne možete pristupiti premijum epizodama ovog podkasta.', + 'suspended_reason' => 'Razlog: {0}', + 'resumed_subject' => 'Vaša pretplata je ponovo pokrenuta!', + 'resumed' => 'Vaša pretplata na {podcastTitle} je ponovo pokrenuta! Sada ponovo možete pristupiti premijum epizodama ovog podkasta.', + 'deleted_subject' => 'Vaša pretplata je uklonjena!', + 'deleted' => 'Vaša pretplata na {podcastTitle} je uklonjena! Vipe ne možete pristupiti premijum epizodama ovog podkasta.', + 'footer' => '{castopod} hostovan na {host}', ], ]; diff --git a/modules/PremiumPodcasts/Language/sv/Subscription.php b/modules/PremiumPodcasts/Language/sv/Subscription.php index c2dee29e..06caf6cc 100644 --- a/modules/PremiumPodcasts/Language/sv/Subscription.php +++ b/modules/PremiumPodcasts/Language/sv/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Epost', 'expiration_date' => 'Utgångsdatum', 'expiration_date_hint' => 'Datum och tid då prenumerationen går ut. Lämna tomt för ett obegränsat abonnemang.', - 'submit_add' => 'Lägg till en prenumeration', + 'submit_create' => 'Create subscription', 'submit_edit' => 'Ändra prenumeration', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php b/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php index ce755d24..7b8e3d5b 100644 --- a/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php +++ b/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => '邮箱', 'expiration_date' => '到期日', 'expiration_date_hint' => '订阅到期的日期和时间。 留空时没有订阅限制。', - 'submit_add' => '添加订阅', + 'submit_create' => 'Create subscription', 'submit_edit' => '编辑订阅', ], 'form_link_add' => [ From de8b84c8741f0f4e48a84e518c521b2a340f3f14 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 29 Nov 2023 19:23:23 +0000 Subject: [PATCH 250/477] chore(release): 1.7.0 [skip ci] # [1.7.0](https://code.castopod.org/adaures/castopod/compare/v1.6.5...v1.7.0) (11/29/2023) ### Bug Fixes * **admin-ux:** hide navigation submenus in details panel for easier scanning ([b047a3c](https://code.castopod.org/adaures/castopod/commit/b047a3c6707114d04c276758f2e543eef90d72f5)) * **admin:** remove episode title truncation + display description in two lines in episode list ([f4ffa30](https://code.castopod.org/adaures/castopod/commit/f4ffa30ec4341f43e22b1f983781ad04c956aa25)), closes [#386](https://code.castopod.org/adaures/castopod/issues/386) * **auth:** display error messages from validator ([5a834c0](https://code.castopod.org/adaures/castopod/commit/5a834c0f8957fc016e73325a3c3ff05e524d0755)) * **housekeeping:** remove unnecessary $tablePrefix variable when resetting post count ([97d793f](https://code.castopod.org/adaures/castopod/commit/97d793f55e7eb3b049980e5081950baa2bb1b881)), closes [#383](https://code.castopod.org/adaures/castopod/issues/383) * **import:** handle bad values for location attributes ([642981f](https://code.castopod.org/adaures/castopod/commit/642981fd358ccf118d3d7a957fb6be7933c016ac)) * **import:** use cocur/slugify library to handle non latin text ([4ca7f9c](https://code.castopod.org/adaures/castopod/commit/4ca7f9ccae1e352bf26a3b6db4de73bac7b84382)) * move monetization outside of podcast form + add broadcast section to podcast menu ([dff8516](https://code.castopod.org/adaures/castopod/commit/dff85168b32a6df77425ef51865588ebcd8b8ba9)) * **nodeinfo2:** import database config + use dynamic table prefix for active local actors query ([6a7ef01](https://code.castopod.org/adaures/castopod/commit/6a7ef0109a6e52144ca687b979ffe56fba66165b)) * **persons:** set roles field as optional + set `Cast > Host` as default value ([02132dc](https://code.castopod.org/adaures/castopod/commit/02132dc46640807e2bc4cfc406c911fa097f36fe)), closes [#347](https://code.castopod.org/adaures/castopod/issues/347) * **platforms:** make platforms' websites and submit urls more prominent ([61cf8fa](https://code.castopod.org/adaures/castopod/commit/61cf8fa3e2435ee2a9bdd8e711b8d69d4ca4ec4c)) * **podcast-form:** move fediverse section below author section ([1861d67](https://code.castopod.org/adaures/castopod/commit/1861d67971e2cc0c20ace091f037f6436437a50d)) * reorder podcast form fields + extract sync feeds to its own form ([2d52fa1](https://code.castopod.org/adaures/castopod/commit/2d52fa1046faf1b8d81304e35fc24a7874315e6e)) ### Features * **admin:** add rss feed link to podcast side navigation ([18e2633](https://code.castopod.org/adaures/castopod/commit/18e2633a49dbbeb57a685f129a2ab158397de61e)) * **icons:** update new Deezer logo ([f2d5b27](https://code.castopod.org/adaures/castopod/commit/f2d5b272ac385a978d7e173121faafe03d7a7200)) * **install:** init database and create superadmin using CLI ([02d4ba6](https://code.castopod.org/adaures/castopod/commit/02d4ba69ac007ebd1eccab428a98b54051aaf70c)), closes [#380](https://code.castopod.org/adaures/castopod/issues/380) * **ux:** add episode description to episode cards ([5f8d413](https://code.castopod.org/adaures/castopod/commit/5f8d413b84b236077a75934da9409f37d34cb4a5)) --- CHANGELOG.md | 48 ++++++++++++++++++++++++++++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1ad0610..def2659b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,51 @@ +# [1.7.0](https://code.castopod.org/adaures/castopod/compare/v1.6.5...v1.7.0) (11/29/2023) + +### Bug Fixes + +- **admin-ux:** hide navigation submenus in details panel for easier scanning + ([b047a3c](https://code.castopod.org/adaures/castopod/commit/b047a3c6707114d04c276758f2e543eef90d72f5)) +- **admin:** remove episode title truncation + display description in two lines + in episode list + ([f4ffa30](https://code.castopod.org/adaures/castopod/commit/f4ffa30ec4341f43e22b1f983781ad04c956aa25)), + closes [#386](https://code.castopod.org/adaures/castopod/issues/386) +- **auth:** display error messages from validator + ([5a834c0](https://code.castopod.org/adaures/castopod/commit/5a834c0f8957fc016e73325a3c3ff05e524d0755)) +- **housekeeping:** remove unnecessary $tablePrefix variable when resetting post + count + ([97d793f](https://code.castopod.org/adaures/castopod/commit/97d793f55e7eb3b049980e5081950baa2bb1b881)), + closes [#383](https://code.castopod.org/adaures/castopod/issues/383) +- **import:** handle bad values for location attributes + ([642981f](https://code.castopod.org/adaures/castopod/commit/642981fd358ccf118d3d7a957fb6be7933c016ac)) +- **import:** use cocur/slugify library to handle non latin text + ([4ca7f9c](https://code.castopod.org/adaures/castopod/commit/4ca7f9ccae1e352bf26a3b6db4de73bac7b84382)) +- move monetization outside of podcast form + add broadcast section to podcast + menu + ([dff8516](https://code.castopod.org/adaures/castopod/commit/dff85168b32a6df77425ef51865588ebcd8b8ba9)) +- **nodeinfo2:** import database config + use dynamic table prefix for active + local actors query + ([6a7ef01](https://code.castopod.org/adaures/castopod/commit/6a7ef0109a6e52144ca687b979ffe56fba66165b)) +- **persons:** set roles field as optional + set `Cast > Host` as default value + ([02132dc](https://code.castopod.org/adaures/castopod/commit/02132dc46640807e2bc4cfc406c911fa097f36fe)), + closes [#347](https://code.castopod.org/adaures/castopod/issues/347) +- **platforms:** make platforms' websites and submit urls more prominent + ([61cf8fa](https://code.castopod.org/adaures/castopod/commit/61cf8fa3e2435ee2a9bdd8e711b8d69d4ca4ec4c)) +- **podcast-form:** move fediverse section below author section + ([1861d67](https://code.castopod.org/adaures/castopod/commit/1861d67971e2cc0c20ace091f037f6436437a50d)) +- reorder podcast form fields + extract sync feeds to its own form + ([2d52fa1](https://code.castopod.org/adaures/castopod/commit/2d52fa1046faf1b8d81304e35fc24a7874315e6e)) + +### Features + +- **admin:** add rss feed link to podcast side navigation + ([18e2633](https://code.castopod.org/adaures/castopod/commit/18e2633a49dbbeb57a685f129a2ab158397de61e)) +- **icons:** update new Deezer logo + ([f2d5b27](https://code.castopod.org/adaures/castopod/commit/f2d5b272ac385a978d7e173121faafe03d7a7200)) +- **install:** init database and create superadmin using CLI + ([02d4ba6](https://code.castopod.org/adaures/castopod/commit/02d4ba69ac007ebd1eccab428a98b54051aaf70c)), + closes [#380](https://code.castopod.org/adaures/castopod/issues/380) +- **ux:** add episode description to episode cards + ([5f8d413](https://code.castopod.org/adaures/castopod/commit/5f8d413b84b236077a75934da9409f37d34cb4a5)) + ## [1.6.5](https://code.castopod.org/adaures/castopod/compare/v1.6.4...v1.6.5) (2023-09-26) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 7c3ca92a..5e6c9205 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.6.5'); +defined('CP_VERSION') || define('CP_VERSION', '1.7.0'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index cf466c22..8c6cd80c 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.6.5", + "version": "1.7.0", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 8356d77a..6a428117 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.6.5", + "version": "1.7.0", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 119742cdbb2c2f7f847692fb76f6ff1dbb2e25b6 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 30 Nov 2023 15:46:00 +0000 Subject: [PATCH 251/477] fix(housekeeping): add where clause to check episode_id is not null on reset comments count --- app/Models/EpisodeModel.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php index 339acfb5..cb4b813f 100644 --- a/app/Models/EpisodeModel.php +++ b/app/Models/EpisodeModel.php @@ -386,6 +386,7 @@ class EpisodeModel extends UuidModel ->select('fediverse_posts.episode_id as episode_id, COUNT(*) as `comments_count`') ->join('fediverse_posts as fp', 'fediverse_posts.id = fp.in_reply_to_id') ->where('fediverse_posts.in_reply_to_id', null) + ->where('fediverse_posts.episode_id IS NOT', null) ->groupBy('fediverse_posts.episode_id') ->getCompiledSelect(); From aeaee8ae64df485f7f0863e1947f06dafd5204cb Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 1 Dec 2023 09:46:02 +0000 Subject: [PATCH 252/477] chore(release): 1.7.1 [skip ci] ## [1.7.1](https://code.castopod.org/adaures/castopod/compare/v1.7.0...v1.7.1) (12/1/2023) ### Bug Fixes * **housekeeping:** add where clause to check episode_id is not null on reset comments count ([119742c](https://code.castopod.org/adaures/castopod/commit/119742cdbb2c2f7f847692fb76f6ff1dbb2e25b6)) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index def2659b..1faa20bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.7.1](https://code.castopod.org/adaures/castopod/compare/v1.7.0...v1.7.1) (12/1/2023) + +### Bug Fixes + +- **housekeeping:** add where clause to check episode_id is not null on reset + comments count + ([119742c](https://code.castopod.org/adaures/castopod/commit/119742cdbb2c2f7f847692fb76f6ff1dbb2e25b6)) + # [1.7.0](https://code.castopod.org/adaures/castopod/compare/v1.6.5...v1.7.0) (11/29/2023) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 5e6c9205..8ac246b1 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.7.0'); +defined('CP_VERSION') || define('CP_VERSION', '1.7.1'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 8c6cd80c..62d55c12 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.7.0", + "version": "1.7.1", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 6a428117..645d804f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.7.0", + "version": "1.7.1", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From f5189055ffdbf1458a139e372f4db0c905635c67 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 5 Dec 2023 13:08:08 +0000 Subject: [PATCH 253/477] build(dev): increase phpmyadmin's upload limit in docker-compose.yml --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 43a05a53..f9cbabab 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,7 +58,7 @@ services: environment: PMA_HOST: mariadb PMA_PORT: 3306 - UPLOAD_LIMIT: 30M + UPLOAD_LIMIT: 300M ports: - 8888:80 volumes: From 694328f10865b2fcd6436122de46866dae81f945 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 12 Dec 2023 15:45:38 +0000 Subject: [PATCH 254/477] fix(episode-form): render episode number optional when episode type is trailer or bonus --- modules/Admin/Controllers/EpisodeController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 4b60b4fd..8f2b8701 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -164,7 +164,7 @@ class EpisodeController extends BaseController 'chapters_file' => 'ext_in[chapters,json]|permit_empty', ]; - if ($this->podcast->type === 'serial') { + if ($this->podcast->type === 'serial' && $this->request->getPost('type') === 'full') { $rules['episode_number'] = 'required'; } @@ -301,7 +301,7 @@ class EpisodeController extends BaseController 'chapters_file' => 'ext_in[chapters_file,json]|permit_empty', ]; - if ($this->podcast->type === 'serial') { + if ($this->podcast->type === 'serial' && $this->request->getPost('type') === 'full') { $rules['episode_number'] = 'required'; } From 98ed36d7a40abd7f57f88d1f4eb933967c022c2d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 12 Dec 2023 16:12:45 +0000 Subject: [PATCH 255/477] chore(release): 1.7.2 [skip ci] ## [1.7.2](https://code.castopod.org/adaures/castopod/compare/v1.7.1...v1.7.2) (12/12/2023) ### Bug Fixes * **episode-form:** render episode number optional when episode type is trailer or bonus ([694328f](https://code.castopod.org/adaures/castopod/commit/694328f10865b2fcd6436122de46866dae81f945)) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1faa20bf..e798720c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.7.2](https://code.castopod.org/adaures/castopod/compare/v1.7.1...v1.7.2) (12/12/2023) + +### Bug Fixes + +- **episode-form:** render episode number optional when episode type is trailer + or bonus + ([694328f](https://code.castopod.org/adaures/castopod/commit/694328f10865b2fcd6436122de46866dae81f945)) + ## [1.7.1](https://code.castopod.org/adaures/castopod/compare/v1.7.0...v1.7.1) (12/1/2023) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 8ac246b1..4347d673 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.7.1'); +defined('CP_VERSION') || define('CP_VERSION', '1.7.2'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 62d55c12..cdb88fe3 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.7.1", + "version": "1.7.2", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 645d804f..7cdc5e44 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.7.1", + "version": "1.7.2", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 9264a2d74cc95278c9d84c99ef914fdbcaf8a97f Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 20 Dec 2023 17:10:18 +0000 Subject: [PATCH 256/477] fix(platforms): add Threads and YouTube Music --- app/Database/Seeds/PlatformSeeder.php | 16 +++++++++++++++- app/Resources/icons/podcasting/youtube-music.svg | 1 + app/Resources/icons/social/threads.svg | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100755 app/Resources/icons/podcasting/youtube-music.svg create mode 100644 app/Resources/icons/social/threads.svg diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index 2762bbb9..eb0fd9e6 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -383,6 +383,13 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://www.tsacdop.app/', 'submit_url' => '', ], + [ + 'slug' => 'youtube-music', + 'type' => 'podcasting', + 'label' => 'YouTube Music', + 'home_url' => 'https://www.youtube.com/creators/podcasts/', + 'submit_url' => 'https://studio.youtube.com/channel/content/podcasts', + ], ]; $fundingData = [ @@ -571,10 +578,17 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://slack.com/', 'submit_url' => 'https://slack.com/get-started#/create', ], + [ + 'slug' => 'threads', + 'type' => 'social', + 'label' => 'Threads', + 'home_url' => 'https://www.threads.net/', + 'submit_url' => 'https://www.threads.net/login', + ], [ 'slug' => 'tiktok', 'type' => 'social', - 'label' => 'Tiktok', + 'label' => 'TikTok', 'home_url' => 'https://www.tiktok.com/', 'submit_url' => 'https://www.tiktok.com/signup', ], diff --git a/app/Resources/icons/podcasting/youtube-music.svg b/app/Resources/icons/podcasting/youtube-music.svg new file mode 100755 index 00000000..d8dc6a17 --- /dev/null +++ b/app/Resources/icons/podcasting/youtube-music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/Resources/icons/social/threads.svg b/app/Resources/icons/social/threads.svg new file mode 100644 index 00000000..dd499a6f --- /dev/null +++ b/app/Resources/icons/social/threads.svg @@ -0,0 +1 @@ + \ No newline at end of file From 8cd78866762e26aa63c224dace6c247e0e9dc068 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 21 Dec 2023 15:21:45 +0000 Subject: [PATCH 257/477] fix(analytics): upgrade opawg's user-agents-php to user-agents-v2-php update php and js dependencies to latest --- app/Controllers/FeedController.php | 2 +- composer.json | 28 +- composer.lock | 391 ++-- docker/development/Dockerfile | 2 +- .../Entities/AnalyticsPodcastsByService.php | 2 +- .../Analytics/Helpers/analytics_helper.php | 2 +- modules/Auth/Filters/PermissionFilter.php | 4 +- package.json | 48 +- pnpm-lock.yaml | 1969 +++++++---------- 9 files changed, 1115 insertions(+), 1333 deletions(-) diff --git a/app/Controllers/FeedController.php b/app/Controllers/FeedController.php index a99cfcda..ea4ebeea 100644 --- a/app/Controllers/FeedController.php +++ b/app/Controllers/FeedController.php @@ -20,7 +20,7 @@ use CodeIgniter\HTTP\ResponseInterface; use Exception; use Modules\PremiumPodcasts\Entities\Subscription; use Modules\PremiumPodcasts\Models\SubscriptionModel; -use Opawg\UserAgentsPhp\UserAgentsRSS; +use Opawg\UserAgentsV2Php\UserAgentsRSS; class FeedController extends Controller { diff --git a/composer.json b/composer.json index cdb88fe3..a3a62e5f 100644 --- a/composer.json +++ b/composer.json @@ -9,36 +9,36 @@ "php": "^8.1", "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.1", - "aws/aws-sdk-php": "^3.291.0", + "aws/aws-sdk-php": "^3.294.4", "chrisjean/php-ico": "^1.0.4", "cocur/slugify": "^v4.5.1", "codeigniter4/framework": "v4.4.3", "codeigniter4/settings": "v2.1.2", "codeigniter4/shield": "v1.0.0-beta.8", "codeigniter4/tasks": "dev-develop", - "geoip2/geoip2": "v2.13.0", + "geoip2/geoip2": "v3.0.0", "james-heinrich/getid3": "^2.0.0-beta5", "league/commonmark": "^2.4.1", "league/html-to-markdown": "5.1.1", "melbahja/seo": "^v2.1.1", "michalsn/codeigniter4-uuid": "v1.0.2", "mpratt/embera": "^2.0.36", - "opawg/user-agents-php": "^v1.0", + "opawg/user-agents-v2-php": "dev-main", "phpseclib/phpseclib": "~2.0.45", "vlucas/phpdotenv": "v5.6.0", "whichbrowser/parser": "^v2.1.7", "yassinedoghri/podcast-feed": "dev-main" }, "require-dev": { - "captainhook/captainhook": "^5.18.3", - "codeigniter/phpstan-codeigniter": "^v1.4.2", + "captainhook/captainhook": "^5.19.2", + "codeigniter/phpstan-codeigniter": "v1.4.3", "mikey179/vfsstream": "^v1.6.11", "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.10.46", - "phpunit/phpunit": "^10.4.2", - "rector/rector": "^0.18.11", - "symplify/coding-standard": "^12.0.4", - "symplify/easy-coding-standard": "^12.0.8" + "phpstan/phpstan": "^1.10.50", + "phpunit/phpunit": "^10.5.3", + "rector/rector": "^0.18.13", + "symplify/coding-standard": "^12.0.7", + "symplify/easy-coding-standard": "^12.0.13" }, "autoload": { "exclude-from-classmap": [ @@ -60,8 +60,8 @@ "style:fix": "vendor/bin/ecs check --fix --ansi", "generate:auth-docs": "php spark auth:generate-docs", "post-install-cmd": [ - "@php vendor/opawg/user-agents-php/src/UserAgentsGenerate.php > vendor/opawg/user-agents-php/src/UserAgents.php", - "@php vendor/opawg/user-agents-php/src/UserAgentsRSSGenerate.php > vendor/opawg/user-agents-php/src/UserAgentsRSS.php", + "@php vendor/opawg/user-agents-v2-php/src/UserAgentsGenerate.php > vendor/opawg/user-agents-v2-php/src/UserAgents.php", + "@php vendor/opawg/user-agents-v2-php/src/UserAgentsRSSGenerate.php > vendor/opawg/user-agents-v2-php/src/UserAgentsRSS.php", "@php vendor/adaures/ipcat-php/src/IpDbGenerate.php > vendor/adaures/ipcat-php/src/IpDb.php", "@php vendor/adaures/podcast-persons-taxonomy/src/TaxonomyGenerate.php https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/main/taxonomy-en.json > modules/Admin/Language/en/PersonsTaxonomy.php", "@php vendor/adaures/podcast-persons-taxonomy/src/TaxonomyGenerate.php https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/main/taxonomy-fr.json > modules/Admin/Language/fr/PersonsTaxonomy.php", @@ -69,8 +69,8 @@ ], "post-update-cmd": [ "@composer dump-autoload", - "@php vendor/opawg/user-agents-php/src/UserAgentsGenerate.php > vendor/opawg/user-agents-php/src/UserAgents.php", - "@php vendor/opawg/user-agents-php/src/UserAgentsRSSGenerate.php > vendor/opawg/user-agents-php/src/UserAgentsRSS.php", + "@php vendor/opawg/user-agents-v2-php/src/UserAgentsGenerate.php > vendor/opawg/user-agents-v2-php/src/UserAgents.php", + "@php vendor/opawg/user-agents-v2-php/src/UserAgentsRSSGenerate.php > vendor/opawg/user-agents-v2-php/src/UserAgentsRSS.php", "@php vendor/adaures/ipcat-php/src/IpDbGenerate.php > vendor/adaures/ipcat-php/src/IpDb.php", "@php vendor/adaures/podcast-persons-taxonomy/src/TaxonomyGenerate.php https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/main/taxonomy-en.json > modules/Admin/Language/en/PersonsTaxonomy.php", "@php vendor/adaures/podcast-persons-taxonomy/src/TaxonomyGenerate.php https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/main/taxonomy-fr.json > modules/Admin/Language/fr/PersonsTaxonomy.php", diff --git a/composer.lock b/composer.lock index 96580ce2..9618a1d1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "394896879a8bd70127600aaff71249b7", + "content-hash": "52c31397606207e9d7f5f459c9ee9c8e", "packages": [ { "name": "adaures/ipcat-php", @@ -120,16 +120,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.291.0", + "version": "3.294.4", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "c114ca013dd99d79d61914def93ecf80665b6df9" + "reference": "4f59bf50aa445fc3ec0b10648b205dd2465e9bec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c114ca013dd99d79d61914def93ecf80665b6df9", - "reference": "c114ca013dd99d79d61914def93ecf80665b6df9", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4f59bf50aa445fc3ec0b10648b205dd2465e9bec", + "reference": "4f59bf50aa445fc3ec0b10648b205dd2465e9bec", "shasum": "" }, "require": { @@ -205,9 +205,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.291.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.294.4" }, - "time": "2023-11-28T20:23:07+00:00" + "time": "2023-12-20T19:21:19+00:00" }, { "name": "brick/math", @@ -563,12 +563,12 @@ "source": { "type": "git", "url": "https://github.com/codeigniter4/tasks.git", - "reference": "9f7d4e69a1bf5590c333cf178530033aab4ecb9c" + "reference": "f9a94eb7a4817ea74fa0c193626671922d1ac5fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/9f7d4e69a1bf5590c333cf178530033aab4ecb9c", - "reference": "9f7d4e69a1bf5590c333cf178530033aab4ecb9c", + "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/f9a94eb7a4817ea74fa0c193626671922d1ac5fc", + "reference": "f9a94eb7a4817ea74fa0c193626671922d1ac5fc", "shasum": "" }, "require": { @@ -579,7 +579,7 @@ "require-dev": { "codeigniter4/devkit": "^1.0", "codeigniter4/framework": "^4.1", - "rector/rector": "0.18.11" + "rector/rector": "0.18.12" }, "default-branch": true, "type": "library", @@ -637,20 +637,20 @@ "source": "https://github.com/codeigniter4/tasks/tree/develop", "issues": "https://github.com/codeigniter4/tasks/issues" }, - "time": "2023-11-28T12:19:12+00:00" + "time": "2023-12-17T16:05:01+00:00" }, { "name": "composer/ca-bundle", - "version": "1.3.7", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" + "reference": "b66d11b7479109ab547f9405b97205640b17d385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", + "reference": "b66d11b7479109ab547f9405b97205640b17d385", "shasum": "" }, "require": { @@ -662,7 +662,7 @@ "phpstan/phpstan": "^0.12.55", "psr/log": "^1.0", "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -689,7 +689,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.7" + "source": "https://github.com/composer/ca-bundle/tree/1.4.0" }, "funding": [ { @@ -705,7 +705,7 @@ "type": "tidelift" } ], - "time": "2023-08-30T09:31:38+00:00" + "time": "2023-12-18T12:05:55+00:00" }, { "name": "dflydev/dot-access-data", @@ -777,28 +777,28 @@ }, { "name": "geoip2/geoip2", - "version": "v2.13.0", + "version": "v3.0.0", "source": { "type": "git", "url": "git@github.com:maxmind/GeoIP2-php.git", - "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23" + "reference": "1a802ce9356cdd1c6b681c030fd9563750e11e6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/6a41d8fbd6b90052bc34dff3b4252d0f88067b23", - "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23", + "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/1a802ce9356cdd1c6b681c030fd9563750e11e6a", + "reference": "1a802ce9356cdd1c6b681c030fd9563750e11e6a", "shasum": "" }, "require": { "ext-json": "*", - "maxmind-db/reader": "~1.8", + "maxmind-db/reader": "^1.11.1", "maxmind/web-service-common": "~0.8", - "php": ">=7.2" + "php": ">=8.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "3.*", "phpstan/phpstan": "*", - "phpunit/phpunit": "^8.0 || ^9.0", + "phpunit/phpunit": "^10.0", "squizlabs/php_codesniffer": "3.*" }, "type": "library", @@ -819,7 +819,7 @@ "description": "MaxMind GeoIP2 PHP API", "homepage": "https://github.com/maxmind/GeoIP2-php", "keywords": ["IP", "geoip", "geoip2", "geolocation", "maxmind"], - "time": "2022-08-05T20:32:58+00:00" + "time": "2023-12-04T17:16:34+00:00" }, { "name": "graham-campbell/result-type", @@ -883,16 +883,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { @@ -907,11 +907,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -985,7 +985,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -1001,28 +1001,28 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:20:53+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", "extra": { @@ -1064,7 +1064,7 @@ "keywords": ["promise"], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.1" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -1080,20 +1080,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:11:55+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { @@ -1107,9 +1107,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1178,7 +1178,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.1" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -1194,7 +1194,7 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:13:57+00:00" + "time": "2023-12-03T20:05:35+00:00" }, { "name": "james-heinrich/getid3", @@ -1595,23 +1595,23 @@ }, { "name": "maxmind-db/reader", - "version": "v1.11.0", + "version": "v1.11.1", "source": { "type": "git", - "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git", - "reference": "b1f3c0699525336d09cc5161a2861268d9f2ae5b" + "url": "git@github.com:maxmind/MaxMind-DB-Reader-php.git", + "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/b1f3c0699525336d09cc5161a2861268d9f2ae5b", - "reference": "b1f3c0699525336d09cc5161a2861268d9f2ae5b", + "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1e66f73ffcf25e17c7a910a1317e9720a95497c7", + "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7", "shasum": "" }, "require": { "php": ">=7.2" }, "conflict": { - "ext-maxminddb": "<1.10.1,>=2.0.0" + "ext-maxminddb": "<1.11.1,>=2.0.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "3.*", @@ -1644,11 +1644,7 @@ "description": "MaxMind DB Reader API", "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php", "keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"], - "support": { - "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", - "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.11.0" - }, - "time": "2021-10-18T15:23:10+00:00" + "time": "2023-12-02T00:09:23+00:00" }, { "name": "maxmind/web-service-common", @@ -2062,23 +2058,24 @@ "time": "2023-07-30T15:38:18+00:00" }, { - "name": "opawg/user-agents-php", - "version": "v1.0", + "name": "opawg/user-agents-v2-php", + "version": "dev-main", "source": { "type": "git", - "url": "https://github.com/opawg/user-agents-php.git", - "reference": "e22c7be05f475b44d0e6ecd76acf1617a2efef85" + "url": "https://github.com/opawg/user-agents-v2-php.git", + "reference": "1b7646bc6e82501c99466fcdef23700604966b97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opawg/user-agents-php/zipball/e22c7be05f475b44d0e6ecd76acf1617a2efef85", - "reference": "e22c7be05f475b44d0e6ecd76acf1617a2efef85", + "url": "https://api.github.com/repos/opawg/user-agents-v2-php/zipball/1b7646bc6e82501c99466fcdef23700604966b97", + "reference": "1b7646bc6e82501c99466fcdef23700604966b97", "shasum": "" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { - "Opawg\\UserAgentsPhp\\": "src/" + "Opawg\\UserAgentsV2Php\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2086,16 +2083,17 @@ "authors": [ { "name": "Benjamin Bellamy", - "email": "ben@podlibre.org", - "homepage": "https://podlibre.org/" + "email": "benjamin@castopod.org", + "homepage": "https://castopod.org/" } ], - "description": "PHP implementation for opawg/user-agents.", - "homepage": "https://github.com/opawg/user-agents-php", + "description": "PHP implementation for opawg/user-agents-v2.", + "homepage": "https://github.com/opawg/user-agents-v2-php", "support": { - "source": "https://github.com/opawg/user-agents-php/tree/v1.0" + "issues": "https://github.com/opawg/user-agents-v2-php/issues", + "source": "https://github.com/opawg/user-agents-v2-php/tree/main" }, - "time": "2020-11-28T10:54:05+00:00" + "time": "2023-12-20T16:54:44+00:00" }, { "name": "phpoption/phpoption", @@ -3221,29 +3219,30 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.18.3", + "version": "5.19.2", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "b7bc503a40ccfe80ea9638e4921b4697669d725f" + "reference": "604bfc55fa40d6fe8c0275ca707ee80920b3b3f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/b7bc503a40ccfe80ea9638e4921b4697669d725f", - "reference": "b7bc503a40ccfe80ea9638e4921b4697669d725f", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/604bfc55fa40d6fe8c0275ca707ee80920b3b3f1", + "reference": "604bfc55fa40d6fe8c0275ca707ee80920b3b3f1", "shasum": "" }, "require": { + "captainhook/secrets": "^0.9.4", "ext-json": "*", "ext-spl": "*", "ext-xml": "*", - "php": ">=7.4", + "php": ">=8.0", "sebastianfeldmann/camino": "^0.9.2", "sebastianfeldmann/cli": "^3.3", "sebastianfeldmann/git": "^3.9", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "replace": { "sebastianfeldmann/captainhook": "*" @@ -3276,7 +3275,7 @@ } ], "description": "PHP git hook manager", - "homepage": "https://github.com/captainhookphp/captainhook", + "homepage": "http://php.captainhook.info/", "keywords": [ "commit-msg", "git", @@ -3288,7 +3287,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.18.3" + "source": "https://github.com/captainhookphp/captainhook/tree/5.19.2" }, "funding": [ { @@ -3296,24 +3295,79 @@ "type": "github" } ], - "time": "2023-11-05T13:56:19+00:00" + "time": "2023-12-18T14:06:12+00:00" }, { - "name": "codeigniter/phpstan-codeigniter", - "version": "v1.4.2.70400", + "name": "captainhook/secrets", + "version": "0.9.5", "source": { "type": "git", - "url": "https://github.com/CodeIgniter/phpstan-codeigniter.git", - "reference": "8aded99455244e5580d71931c38ac8120163f0bf" + "url": "https://github.com/captainhookphp/secrets.git", + "reference": "8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/8aded99455244e5580d71931c38ac8120163f0bf", - "reference": "8aded99455244e5580d71931c38ac8120163f0bf", + "url": "https://api.github.com/repos/captainhookphp/secrets/zipball/8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe", + "reference": "8aa90d5b9b7892abd11b9da2fc172a7b32b90cbe", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0", + "ext-mbstring": "*", + "php": ">=8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "CaptainHook\\Secrets\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": ["MIT"], + "authors": [ + { + "name": "Sebastian Feldmann", + "email": "sf@sebastian-feldmann.info" + } + ], + "description": "Utility classes to detect secrets", + "keywords": [ + "commit-msg", + "keys", + "passwords", + "post-merge", + "prepare-commit-msg", + "secrets", + "tokens" + ], + "support": { + "issues": "https://github.com/captainhookphp/secrets/issues", + "source": "https://github.com/captainhookphp/secrets/tree/0.9.5" + }, + "funding": [ + { + "url": "https://github.com/sponsors/sebastianfeldmann", + "type": "github" + } + ], + "time": "2023-11-30T18:10:18+00:00" + }, + { + "name": "codeigniter/phpstan-codeigniter", + "version": "v1.4.3", + "source": { + "type": "git", + "url": "https://github.com/CodeIgniter/phpstan-codeigniter.git", + "reference": "bff4a7cfe251bb288223e95d6f588e956dfc0a93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CodeIgniter/phpstan-codeigniter/zipball/bff4a7cfe251bb288223e95d6f588e956dfc0a93", + "reference": "bff4a7cfe251bb288223e95d6f588e956dfc0a93", + "shasum": "" + }, + "require": { + "codeigniter4/framework": "^4.4", + "php": "^8.1", "phpstan/phpstan": "^1.10" }, "conflict": { @@ -3321,10 +3375,10 @@ }, "require-dev": { "codeigniter/coding-standard": "^1.7", - "codeigniter4/framework": "^4.3", "codeigniter4/shield": "^1.0@beta", "friendsofphp/php-cs-fixer": "^3.20", "nexusphp/cs-config": "^3.12", + "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/extension-installer": "^1.3", "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.3", @@ -3365,7 +3419,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/CodeIgniter/phpstan-codeigniter" }, - "time": "2023-11-05T10:43:01+00:00" + "time": "2023-12-21T03:39:48+00:00" }, { "name": "composer/pcre", @@ -3568,16 +3622,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.40.0", + "version": "v3.41.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "27d2b3265b5d550ec411b4319967ae7cfddfb2e0" + "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/27d2b3265b5d550ec411b4319967ae7cfddfb2e0", - "reference": "27d2b3265b5d550ec411b4319967ae7cfddfb2e0", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8b6ae8dcbaf23f09680643ab832a4a3a260265f6", + "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6", "shasum": "" }, "require": { @@ -3607,8 +3661,6 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpspec/prophecy": "^1.17", - "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.6", "symfony/phpunit-bridge": "^6.3.8 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" @@ -3645,7 +3697,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.40.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.41.1" }, "funding": [ { @@ -3653,7 +3705,7 @@ "type": "github" } ], - "time": "2023-11-26T09:25:53+00:00" + "time": "2023-12-10T19:59:27+00:00" }, { "name": "mikey179/vfsstream", @@ -3755,16 +3807,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -3798,9 +3850,9 @@ "keywords": ["parser", "php"], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "phar-io/manifest", @@ -3949,16 +4001,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.46", + "version": "1.10.50", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70" + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", - "reference": "90d3d25c5b98b8068916bbf08ce42d5cb6c54e70", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/06a98513ac72c03e8366b5a0cb00750b487032e4", + "reference": "06a98513ac72c03e8366b5a0cb00750b487032e4", "shasum": "" }, "require": { @@ -3997,20 +4049,20 @@ "type": "tidelift" } ], - "time": "2023-11-28T14:57:26+00:00" + "time": "2023-12-13T10:59:42+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.9", + "version": "10.1.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" + "reference": "599109c8ca6bae97b23482d557d2874c25a65e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", - "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59", + "reference": "599109c8ca6bae97b23482d557d2874c25a65e59", "shasum": "" }, "require": { @@ -4059,7 +4111,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.10" }, "funding": [ { @@ -4067,7 +4119,7 @@ "type": "github" } ], - "time": "2023-11-23T12:23:20+00:00" + "time": "2023-12-11T06:28:43+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4289,16 +4341,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.4.2", + "version": "10.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1" + "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", - "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6fce887c71076a73f32fd3e0774a6833fc5c7f19", + "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19", "shasum": "" }, "require": { @@ -4336,7 +4388,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.4-dev" + "dev-main": "10.5-dev" } }, "autoload": { @@ -4358,7 +4410,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.3" }, "funding": [ { @@ -4374,7 +4426,7 @@ "type": "tidelift" } ], - "time": "2023-10-26T07:21:45+00:00" + "time": "2023-12-13T07:25:23+00:00" }, { "name": "psr/container", @@ -4429,16 +4481,16 @@ }, { "name": "rector/rector", - "version": "0.18.11", + "version": "0.18.13", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "9621124c860066f56a4ab841349cb7c284edfaee" + "reference": "f8011a76d36aa4f839f60f3b4f97707d97176618" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/9621124c860066f56a4ab841349cb7c284edfaee", - "reference": "9621124c860066f56a4ab841349cb7c284edfaee", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f8011a76d36aa4f839f60f3b4f97707d97176618", + "reference": "f8011a76d36aa4f839f60f3b4f97707d97176618", "shasum": "" }, "require": { @@ -4462,7 +4514,7 @@ "keywords": ["automation", "dev", "migration", "refactoring"], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.18.11" + "source": "https://github.com/rectorphp/rector/tree/0.18.13" }, "funding": [ { @@ -4470,7 +4522,7 @@ "type": "github" } ], - "time": "2023-11-27T13:27:43+00:00" + "time": "2023-12-20T16:08:01+00:00" }, { "name": "sebastian/cli-parser", @@ -4698,20 +4750,20 @@ }, { "name": "sebastian/complexity", - "version": "3.1.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68cfb347a44871f01e33ab0ef8215966432f6957", - "reference": "68cfb347a44871f01e33ab0ef8215966432f6957", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -4720,7 +4772,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -4740,7 +4792,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.1.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -4748,7 +4800,7 @@ "type": "github" } ], - "time": "2023-09-28T11:50:59+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", @@ -4993,20 +5045,20 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -5035,7 +5087,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -5043,7 +5095,7 @@ "type": "github" } ], - "time": "2023-08-31T09:25:50+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", @@ -5473,16 +5525,16 @@ }, { "name": "symfony/console", - "version": "v6.4.0", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "cd9864b47c367450e14ab32f78fdbf98c44c26b6" + "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cd9864b47c367450e14ab32f78fdbf98c44c26b6", - "reference": "cd9864b47c367450e14ab32f78fdbf98c44c26b6", + "url": "https://api.github.com/repos/symfony/console/zipball/a550a7c99daeedef3f9d23fb82e3531525ff11fd", + "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd", "shasum": "" }, "require": { @@ -5538,7 +5590,7 @@ "homepage": "https://symfony.com", "keywords": ["cli", "command-line", "console", "terminal"], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.0" + "source": "https://github.com/symfony/console/tree/v6.4.1" }, "funding": [ { @@ -5554,7 +5606,7 @@ "type": "tidelift" } ], - "time": "2023-11-20T16:41:16+00:00" + "time": "2023-11-30T10:54:28+00:00" }, { "name": "symfony/event-dispatcher", @@ -6375,16 +6427,16 @@ }, { "name": "symplify/coding-standard", - "version": "12.0.4", + "version": "12.0.7", "source": { "type": "git", "url": "https://github.com/symplify/coding-standard.git", - "reference": "ff41218eb2e3cc4aacbb5d85b3e59f4a17f1842c" + "reference": "199f1e5e2b2bd67eac392ab1d3c6c04bf7ebce3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symplify/coding-standard/zipball/ff41218eb2e3cc4aacbb5d85b3e59f4a17f1842c", - "reference": "ff41218eb2e3cc4aacbb5d85b3e59f4a17f1842c", + "url": "https://api.github.com/repos/symplify/coding-standard/zipball/199f1e5e2b2bd67eac392ab1d3c6c04bf7ebce3c", + "reference": "199f1e5e2b2bd67eac392ab1d3c6c04bf7ebce3c", "shasum": "" }, "require": { @@ -6400,7 +6452,7 @@ "rector/rector": "^0.17.7", "squizlabs/php_codesniffer": "^3.7.2", "symplify/easy-ci": "^11.3", - "symplify/easy-coding-standard": "^12.0.8", + "symplify/easy-coding-standard": "^12.0.11", "symplify/phpstan-extensions": "^11.2", "symplify/rule-doc-generator": "^12.0", "tomasvotruba/class-leak": "^0.2", @@ -6419,7 +6471,7 @@ "description": "Set of Symplify rules for PHP_CodeSniffer and PHP CS Fixer.", "support": { "issues": "https://github.com/symplify/coding-standard/issues", - "source": "https://github.com/symplify/coding-standard/tree/12.0.4" + "source": "https://github.com/symplify/coding-standard/tree/12.0.7" }, "funding": [ { @@ -6431,20 +6483,20 @@ "type": "github" } ], - "time": "2023-11-29T09:22:08+00:00" + "time": "2023-12-07T09:18:34+00:00" }, { "name": "symplify/easy-coding-standard", - "version": "12.0.9", + "version": "12.0.13", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "24b7b28c25d698e64496c4d19c798ccd01617c7d" + "reference": "d15707b14d50b7cb6d656f7a7a5e5b9a17099b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/24b7b28c25d698e64496c4d19c798ccd01617c7d", - "reference": "24b7b28c25d698e64496c4d19c798ccd01617c7d", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/d15707b14d50b7cb6d656f7a7a5e5b9a17099b3c", + "reference": "d15707b14d50b7cb6d656f7a7a5e5b9a17099b3c", "shasum": "" }, "require": { @@ -6452,7 +6504,7 @@ }, "conflict": { "friendsofphp/php-cs-fixer": "<3.0", - "squizlabs/php_codesniffer": "<3.6", + "phpcsstandards/php_codesniffer": "<3.6", "symplify/coding-standard": "<11.3" }, "bin": ["bin/ecs"], @@ -6466,7 +6518,7 @@ "keywords": ["Code style", "automation", "fixer", "static analysis"], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.0.9" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.0.13" }, "funding": [ { @@ -6478,7 +6530,7 @@ "type": "github" } ], - "time": "2023-11-29T09:35:09+00:00" + "time": "2023-12-07T09:18:07+00:00" }, { "name": "symplify/rule-doc-generator-contracts", @@ -6591,6 +6643,7 @@ "codeigniter4/shield": 10, "codeigniter4/tasks": 20, "james-heinrich/getid3": 10, + "opawg/user-agents-v2-php": 20, "yassinedoghri/podcast-feed": 20 }, "prefer-stable": true, @@ -6599,5 +6652,5 @@ "php": "^8.1" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index 7becf7f1..edb0ac01 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -15,7 +15,7 @@ WORKDIR /castopod COPY --from=composer:2 /usr/bin/composer /usr/bin/composer # Install server requirements -RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \ && apt-get update \ && apt-get install --yes --no-install-recommends nodejs \ # gnupg to sign commits with gpg diff --git a/modules/Analytics/Entities/AnalyticsPodcastsByService.php b/modules/Analytics/Entities/AnalyticsPodcastsByService.php index 1acd1050..0b024b96 100644 --- a/modules/Analytics/Entities/AnalyticsPodcastsByService.php +++ b/modules/Analytics/Entities/AnalyticsPodcastsByService.php @@ -13,7 +13,7 @@ declare(strict_types=1); namespace Modules\Analytics\Entities; use CodeIgniter\Entity\Entity; -use Opawg\UserAgentsPhp\UserAgentsRSS; +use Opawg\UserAgentsV2Php\UserAgentsRSS; /** * @property int $podcast_id diff --git a/modules/Analytics/Helpers/analytics_helper.php b/modules/Analytics/Helpers/analytics_helper.php index 3c294c58..da7b2e04 100644 --- a/modules/Analytics/Helpers/analytics_helper.php +++ b/modules/Analytics/Helpers/analytics_helper.php @@ -12,7 +12,7 @@ use AdAures\Ipcat\IpDb; use Config\Services; use GeoIp2\Database\Reader; use Modules\Analytics\Config\Analytics; -use Opawg\UserAgentsPhp\UserAgents; +use Opawg\UserAgentsV2Php\UserAgents; use WhichBrowser\Parser; if (! function_exists('base64_url_encode')) { diff --git a/modules/Auth/Filters/PermissionFilter.php b/modules/Auth/Filters/PermissionFilter.php index 2e65271d..f223789b 100644 --- a/modules/Auth/Filters/PermissionFilter.php +++ b/modules/Auth/Filters/PermissionFilter.php @@ -19,7 +19,8 @@ class PermissionFilter implements FilterInterface { /** * @param string[]|null $arguments - * @return mixed + * + * @return RequestInterface|ResponseInterface|string|void */ public function before(RequestInterface $request, $arguments = null) { @@ -40,7 +41,6 @@ class PermissionFilter implements FilterInterface /** * @param string[]|null $arguments - * @return mixed */ public function after(RequestInterface $request, ResponseInterface $response, $arguments = null): void { diff --git a/package.json b/package.json index 7cdc5e44..eab4930c 100644 --- a/package.json +++ b/package.json @@ -29,15 +29,15 @@ }, "dependencies": { "@amcharts/amcharts4": "^4.10.38", - "@amcharts/amcharts4-geodata": "^4.1.27", + "@amcharts/amcharts4-geodata": "^4.1.28", "@codemirror/commands": "^6.3.2", "@codemirror/lang-xml": "^6.0.2", "@codemirror/language": "^6.9.3", - "@codemirror/state": "^6.3.2", - "@codemirror/view": "^6.22.1", + "@codemirror/state": "^6.3.3", + "@codemirror/view": "^6.22.3", "@floating-ui/dom": "^1.5.3", "@github/clipboard-copy-element": "^1.3.0", - "@github/hotkey": "^2.3.0", + "@github/hotkey": "^3.1.0", "@github/markdown-toolbar-element": "^2.2.1", "@github/relative-time-element": "^4.3.0", "@tailwindcss/nesting": "0.0.0-insiders.565cd3e", @@ -48,49 +48,49 @@ "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", "lit": "^3.1.0", - "marked": "^11.0.0", - "wavesurfer.js": "^7.4.12", + "marked": "^11.1.0", + "wavesurfer.js": "^7.5.3", "xml-formatter": "^3.6.0" }, "devDependencies": { "@commitlint/cli": "^18.4.3", - "@commitlint/config-conventional": "^18.4.2", - "@csstools/css-tokenizer": "^2.2.1", + "@commitlint/config-conventional": "^18.4.3", + "@csstools/css-tokenizer": "^2.2.2", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", - "@semantic-release/gitlab": "^12.1.1", + "@semantic-release/gitlab": "^13.0.0", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.10", "@types/leaflet": "^1.9.8", - "@typescript-eslint/eslint-plugin": "^6.13.1", - "@typescript-eslint/parser": "^6.13.1", + "@typescript-eslint/eslint-plugin": "^6.15.0", + "@typescript-eslint/parser": "^6.15.0", "all-contributors-cli": "^6.26.1", "commitizen": "^4.3.0", "cross-env": "^7.0.3", - "cssnano": "^6.0.1", + "cssnano": "^6.0.2", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.54.0", + "eslint": "^8.56.0", "eslint-config-prettier": "^8.10.0", "eslint-plugin-prettier": "^4.2.1", "husky": "^8.0.3", "is-ci": "^3.0.1", - "lint-staged": "^15.1.0", - "postcss": "^8.4.31", + "lint-staged": "^15.2.0", + "postcss": "^8.4.32", "postcss-import": "^15.1.0", - "postcss-nesting": "^12.0.1", + "postcss-nesting": "^12.0.2", "postcss-preset-env": "^9.3.0", "postcss-reporter": "^7.0.5", "prettier": "2.8.8", "prettier-plugin-organize-imports": "^3.2.4", - "semantic-release": "^22.0.8", - "stylelint": "^15.11.0", - "stylelint-config-standard": "^34.0.0", - "svgo": "^3.0.4", - "tailwindcss": "^3.3.5", - "typescript": "^5.3.2", - "vite": "^5.0.4", - "vite-plugin-pwa": "^0.17.2", + "semantic-release": "^22.0.12", + "stylelint": "^16.0.2", + "stylelint-config-standard": "^35.0.0", + "svgo": "^3.1.0", + "tailwindcss": "^3.4.0", + "typescript": "^5.3.3", + "vite": "^5.0.10", + "vite-plugin-pwa": "^0.17.4", "workbox-build": "^7.0.0", "workbox-core": "^7.0.0", "workbox-routing": "^7.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b54c4902..ab6339c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,23 +9,23 @@ dependencies: specifier: ^4.10.38 version: 4.10.38 "@amcharts/amcharts4-geodata": - specifier: ^4.1.27 - version: 4.1.27 + specifier: ^4.1.28 + version: 4.1.28 "@codemirror/commands": specifier: ^6.3.2 version: 6.3.2 "@codemirror/lang-xml": specifier: ^6.0.2 - version: 6.0.2(@codemirror/view@6.22.1) + version: 6.0.2(@codemirror/view@6.22.3) "@codemirror/language": specifier: ^6.9.3 version: 6.9.3 "@codemirror/state": - specifier: ^6.3.2 - version: 6.3.2 + specifier: ^6.3.3 + version: 6.3.3 "@codemirror/view": - specifier: ^6.22.1 - version: 6.22.1 + specifier: ^6.22.3 + version: 6.22.3 "@floating-ui/dom": specifier: ^1.5.3 version: 1.5.3 @@ -33,8 +33,8 @@ dependencies: specifier: ^1.3.0 version: 1.3.0 "@github/hotkey": - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^3.1.0 + version: 3.1.0 "@github/markdown-toolbar-element": specifier: ^2.2.1 version: 2.2.1 @@ -43,7 +43,7 @@ dependencies: version: 4.3.0 "@tailwindcss/nesting": specifier: 0.0.0-insiders.565cd3e - version: 0.0.0-insiders.565cd3e(postcss@8.4.31) + version: 0.0.0-insiders.565cd3e(postcss@8.4.32) "@vime/core": specifier: ^5.4.1 version: 5.4.1 @@ -66,11 +66,11 @@ dependencies: specifier: ^3.1.0 version: 3.1.0 marked: - specifier: ^11.0.0 - version: 11.0.0 + specifier: ^11.1.0 + version: 11.1.0 wavesurfer.js: - specifier: ^7.4.12 - version: 7.4.12 + specifier: ^7.5.3 + version: 7.5.3 xml-formatter: specifier: ^3.6.0 version: 3.6.0 @@ -78,64 +78,64 @@ dependencies: devDependencies: "@commitlint/cli": specifier: ^18.4.3 - version: 18.4.3(typescript@5.3.2) + version: 18.4.3(typescript@5.3.3) "@commitlint/config-conventional": - specifier: ^18.4.2 - version: 18.4.2 + specifier: ^18.4.3 + version: 18.4.3 "@csstools/css-tokenizer": - specifier: ^2.2.1 - version: 2.2.1 + specifier: ^2.2.2 + version: 2.2.2 "@semantic-release/changelog": specifier: ^6.0.3 - version: 6.0.3(semantic-release@22.0.8) + version: 6.0.3(semantic-release@22.0.12) "@semantic-release/exec": specifier: ^6.0.3 - version: 6.0.3(semantic-release@22.0.8) + version: 6.0.3(semantic-release@22.0.12) "@semantic-release/git": specifier: ^10.0.1 - version: 10.0.1(semantic-release@22.0.8) + version: 10.0.1(semantic-release@22.0.12) "@semantic-release/gitlab": - specifier: ^12.1.1 - version: 12.1.1(semantic-release@22.0.8) + specifier: ^13.0.0 + version: 13.0.0(semantic-release@22.0.12) "@tailwindcss/forms": specifier: ^0.5.7 - version: 0.5.7(tailwindcss@3.3.5) + version: 0.5.7(tailwindcss@3.4.0) "@tailwindcss/typography": specifier: ^0.5.10 - version: 0.5.10(tailwindcss@3.3.5) + version: 0.5.10(tailwindcss@3.4.0) "@types/leaflet": specifier: ^1.9.8 version: 1.9.8 "@typescript-eslint/eslint-plugin": - specifier: ^6.13.1 - version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2) + specifier: ^6.15.0 + version: 6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3) "@typescript-eslint/parser": - specifier: ^6.13.1 - version: 6.13.1(eslint@8.54.0)(typescript@5.3.2) + specifier: ^6.15.0 + version: 6.15.0(eslint@8.56.0)(typescript@5.3.3) all-contributors-cli: specifier: ^6.26.1 version: 6.26.1 commitizen: specifier: ^4.3.0 - version: 4.3.0(typescript@5.3.2) + version: 4.3.0(typescript@5.3.3) cross-env: specifier: ^7.0.3 version: 7.0.3 cssnano: - specifier: ^6.0.1 - version: 6.0.1(postcss@8.4.31) + specifier: ^6.0.2 + version: 6.0.2(postcss@8.4.32) cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(typescript@5.3.2) + version: 3.3.0(typescript@5.3.3) eslint: - specifier: ^8.54.0 - version: 8.54.0 + specifier: ^8.56.0 + version: 8.56.0 eslint-config-prettier: specifier: ^8.10.0 - version: 8.10.0(eslint@8.54.0) + version: 8.10.0(eslint@8.56.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.54.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.8.8) husky: specifier: ^8.0.3 version: 8.0.3 @@ -143,53 +143,53 @@ devDependencies: specifier: ^3.0.1 version: 3.0.1 lint-staged: - specifier: ^15.1.0 - version: 15.1.0 + specifier: ^15.2.0 + version: 15.2.0 postcss: - specifier: ^8.4.31 - version: 8.4.31 + specifier: ^8.4.32 + version: 8.4.32 postcss-import: specifier: ^15.1.0 - version: 15.1.0(postcss@8.4.31) + version: 15.1.0(postcss@8.4.32) postcss-nesting: - specifier: ^12.0.1 - version: 12.0.1(postcss@8.4.31) + specifier: ^12.0.2 + version: 12.0.2(postcss@8.4.32) postcss-preset-env: specifier: ^9.3.0 - version: 9.3.0(postcss@8.4.31) + version: 9.3.0(postcss@8.4.32) postcss-reporter: specifier: ^7.0.5 - version: 7.0.5(postcss@8.4.31) + version: 7.0.5(postcss@8.4.32) prettier: specifier: 2.8.8 version: 2.8.8 prettier-plugin-organize-imports: specifier: ^3.2.4 - version: 3.2.4(prettier@2.8.8)(typescript@5.3.2) + version: 3.2.4(prettier@2.8.8)(typescript@5.3.3) semantic-release: - specifier: ^22.0.8 - version: 22.0.8 + specifier: ^22.0.12 + version: 22.0.12(typescript@5.3.3) stylelint: - specifier: ^15.11.0 - version: 15.11.0 + specifier: ^16.0.2 + version: 16.0.2(typescript@5.3.3) stylelint-config-standard: - specifier: ^34.0.0 - version: 34.0.0(stylelint@15.11.0) + specifier: ^35.0.0 + version: 35.0.0(stylelint@16.0.2) svgo: - specifier: ^3.0.4 - version: 3.0.4 + specifier: ^3.1.0 + version: 3.1.0 tailwindcss: - specifier: ^3.3.5 - version: 3.3.5 + specifier: ^3.4.0 + version: 3.4.0 typescript: - specifier: ^5.3.2 - version: 5.3.2 + specifier: ^5.3.3 + version: 5.3.3 vite: - specifier: ^5.0.4 - version: 5.0.4(@types/node@18.18.9) + specifier: ^5.0.10 + version: 5.0.10(@types/node@18.18.9) vite-plugin-pwa: - specifier: ^0.17.2 - version: 0.17.2(vite@5.0.4)(workbox-build@7.0.0)(workbox-window@7.0.0) + specifier: ^0.17.4 + version: 0.17.4(vite@5.0.10)(workbox-build@7.0.0)(workbox-window@7.0.0) workbox-build: specifier: ^7.0.0 version: 7.0.0 @@ -220,10 +220,10 @@ packages: engines: { node: ">=10" } dev: true - /@amcharts/amcharts4-geodata@4.1.27: + /@amcharts/amcharts4-geodata@4.1.28: resolution: { - integrity: sha512-e0nO0nxU5EmXdYaM0Bma1fvoohbIT0paTmusQy2b8BHCJgtAVjoq1JHhwUWqjt87aLDomgqwghumLr+nsawqvQ==, + integrity: sha512-qJ113Zlxava1lyL+F5G+PRDRqF4clA+oUKcBS1jvtU0oqUgAKsdg3sanfO1mwsJyM1xeBuRnkMr+mM6uoMD3wQ==, } dev: false @@ -373,7 +373,7 @@ packages: dependencies: "@babel/compat-data": 7.22.9 "@babel/helper-validator-option": 7.22.5 - browserslist: 4.21.10 + browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true @@ -495,7 +495,7 @@ packages: "@babel/helper-module-imports": 7.22.5 "@babel/helper-simple-access": 7.22.5 "@babel/helper-split-export-declaration": 7.22.6 - "@babel/helper-validator-identifier": 7.22.5 + "@babel/helper-validator-identifier": 7.22.20 dev: true /@babel/helper-optimise-call-expression@7.22.5: @@ -1272,7 +1272,7 @@ packages: "@babel/helper-hoist-variables": 7.22.5 "@babel/helper-module-transforms": 7.22.9(@babel/core@7.22.11) "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-validator-identifier": 7.22.5 + "@babel/helper-validator-identifier": 7.22.20 dev: true /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11): @@ -1739,7 +1739,7 @@ packages: } engines: { node: ">=6.9.0" } dependencies: - "@babel/code-frame": 7.22.10 + "@babel/code-frame": 7.22.13 "@babel/parser": 7.22.11 "@babel/types": 7.22.11 dev: true @@ -1751,7 +1751,7 @@ packages: } engines: { node: ">=6.9.0" } dependencies: - "@babel/code-frame": 7.22.10 + "@babel/code-frame": 7.22.13 "@babel/generator": 7.22.10 "@babel/helper-environment-visitor": 7.22.5 "@babel/helper-function-name": 7.22.5 @@ -1773,11 +1773,11 @@ packages: engines: { node: ">=6.9.0" } dependencies: "@babel/helper-string-parser": 7.22.5 - "@babel/helper-validator-identifier": 7.22.5 + "@babel/helper-validator-identifier": 7.22.20 to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.0.4): + /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.0.4): resolution: { integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==, @@ -1789,12 +1789,12 @@ packages: "@lezer/common": ^1.0.0 dependencies: "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.2 - "@codemirror/view": 6.22.1 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 "@lezer/common": 1.0.4 dev: false - /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1): + /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.1): resolution: { integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==, @@ -1806,8 +1806,8 @@ packages: "@lezer/common": ^1.0.0 dependencies: "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.2 - "@codemirror/view": 6.22.1 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 "@lezer/common": 1.1.1 dev: false @@ -1818,20 +1818,20 @@ packages: } dependencies: "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.2 - "@codemirror/view": 6.22.1 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 "@lezer/common": 1.1.1 dev: false - /@codemirror/lang-xml@6.0.2(@codemirror/view@6.22.1): + /@codemirror/lang-xml@6.0.2(@codemirror/view@6.22.3): resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.0.4) + "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.0.4) "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.2 + "@codemirror/state": 6.3.3 "@lezer/common": 1.0.4 "@lezer/xml": 1.0.2 transitivePeerDependencies: @@ -1844,8 +1844,8 @@ packages: integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==, } dependencies: - "@codemirror/state": 6.3.2 - "@codemirror/view": 6.22.1 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 "@lezer/common": 1.1.1 "@lezer/highlight": 1.1.6 "@lezer/lr": 1.3.10 @@ -1858,8 +1858,8 @@ packages: integrity: sha512-6VZ44Ysh/Zn07xrGkdtNfmHCbGSHZzFBdzWi0pbd7chAQ/iUcpLGX99NYRZTa7Ugqg4kEHCqiHhcZnH0gLIgSg==, } dependencies: - "@codemirror/state": 6.3.2 - "@codemirror/view": 6.22.1 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 crelt: 1.0.6 dev: false @@ -1869,25 +1869,25 @@ packages: integrity: sha512-4jupk4JwkeVbrN2pStY74q6OJEYqwosB4koA66nyLeVedadtX9MHI38j2vbYmnfDGurDApP3OZO46MrWalcjiQ==, } dependencies: - "@codemirror/state": 6.3.2 - "@codemirror/view": 6.22.1 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 crelt: 1.0.6 dev: false - /@codemirror/state@6.3.2: + /@codemirror/state@6.3.3: resolution: { - integrity: sha512-5jEikOfU0r9y+OTlZn5AEQB15mibu3deLBUp+GnLzVUNezEEuPt/JdSeniQNi+0YviblAvOPO2JQAlgJ3SYYaA==, + integrity: sha512-0wufKcTw2dEwEaADajjHf6hBy1sh3M6V0e+q4JKIhLuiMSe5td5HOWpUdvKth1fT1M9VYOboajoBHpkCd7PG7A==, } dev: false - /@codemirror/view@6.22.1: + /@codemirror/view@6.22.3: resolution: { - integrity: sha512-38BRn1nPqZqiHbmWfI8zri23IbRVbmSpSmh1E/Ysvc+lIGGdBC17K8zlK7ZU6fhfy9x4De9Zyj5JQqScPq5DkA==, + integrity: sha512-rqnq+Zospwoi3x1vZ8BGV1MlRsaGljX+6qiGYmIpJ++M+LCC+wjfDaPklhwpWSgv7pr/qx29KiAKQBH5+DOn4w==, } dependencies: - "@codemirror/state": 6.3.2 + "@codemirror/state": 6.3.3 style-mod: 4.1.0 w3c-keyname: 2.2.8 dev: false @@ -1902,7 +1902,7 @@ packages: dev: true optional: true - /@commitlint/cli@18.4.3(typescript@5.3.2): + /@commitlint/cli@18.4.3(typescript@5.3.3): resolution: { integrity: sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==, @@ -1912,7 +1912,7 @@ packages: dependencies: "@commitlint/format": 18.4.3 "@commitlint/lint": 18.4.3 - "@commitlint/load": 18.4.3(typescript@5.3.2) + "@commitlint/load": 18.4.3(typescript@5.3.3) "@commitlint/read": 18.4.3 "@commitlint/types": 18.4.3 execa: 5.1.1 @@ -1924,35 +1924,23 @@ packages: - typescript dev: true - /@commitlint/config-conventional@18.4.2: + /@commitlint/config-conventional@18.4.3: resolution: { - integrity: sha512-qFjIqgKGV89lzUGHxanq2WJDXk5wZIxoZmZvf0I4i4CirL06Xj8qRh1shPsXNyI15d8Rj2HExww6cGJSFU9DdA==, + integrity: sha512-729eRRaNta7JZF07qf6SAGSghoDEp9mH7yHU0m7ff0q89W97wDrWCyZ3yoV3mcQJwbhlmVmZPTkPcm7qiAu8WA==, } engines: { node: ">=v18" } dependencies: conventional-changelog-conventionalcommits: 7.0.2 dev: true - /@commitlint/config-validator@18.4.0: - resolution: - { - integrity: sha512-1y6qHMU3o4cYQSK+Y9EnmH6H1GRiwQGjnLIUOIKlekrmfc8MrMk1ByNmb8od4vK3qHJAaL/77/5n+1uyyIF5dA==, - } - engines: { node: ">=v18" } - requiresBuild: true - dependencies: - "@commitlint/types": 18.4.0 - ajv: 8.12.0 - dev: true - optional: true - /@commitlint/config-validator@18.4.3: resolution: { integrity: sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/types": 18.4.3 ajv: 8.12.0 @@ -1973,22 +1961,13 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule@18.4.0: - resolution: - { - integrity: sha512-g013SWki6ZWhURBLOSXTaVQGWHdA0QlPJGiW4a+YpThezmJOemvc4LiKVpn13AjSKQ40QnmBqpBrxujOaSo+3A==, - } - engines: { node: ">=v18" } - requiresBuild: true - dev: true - optional: true - /@commitlint/execute-rule@18.4.3: resolution: { integrity: sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==, } engines: { node: ">=v18" } + requiresBuild: true dev: true /@commitlint/format@18.4.3: @@ -2026,37 +2005,13 @@ packages: "@commitlint/types": 18.4.3 dev: true - /@commitlint/load@18.4.2(typescript@5.3.2): - resolution: - { - integrity: sha512-CKmzXdF9XwZJoVijAqpUlV9qzZOkyiYni4KuSCtTZVAAVudi9H84cJ4FqZxSwEP9G21vmoJiNrW8G042AsduVg==, - } - engines: { node: ">=v18" } - requiresBuild: true - dependencies: - "@commitlint/config-validator": 18.4.0 - "@commitlint/execute-rule": 18.4.0 - "@commitlint/resolve-extends": 18.4.0 - "@commitlint/types": 18.4.0 - "@types/node": 18.18.9 - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.3.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - transitivePeerDependencies: - - typescript - dev: true - optional: true - - /@commitlint/load@18.4.3(typescript@5.3.2): + /@commitlint/load@18.4.3(typescript@5.3.3): resolution: { integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/config-validator": 18.4.3 "@commitlint/execute-rule": 18.4.3 @@ -2064,8 +2019,8 @@ packages: "@commitlint/types": 18.4.3 "@types/node": 18.18.9 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.3.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.2) + cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -2108,29 +2063,13 @@ packages: minimist: 1.2.8 dev: true - /@commitlint/resolve-extends@18.4.0: - resolution: - { - integrity: sha512-qhgU6ach+S6sJMD9NjCYiEycOObGhxzWQLQzqlScJCv9zkPs15Bg0ffLXTQ3z7ipXv46XEKYMnSJzjLRw2Tlkg==, - } - engines: { node: ">=v18" } - requiresBuild: true - dependencies: - "@commitlint/config-validator": 18.4.0 - "@commitlint/types": 18.4.0 - import-fresh: 3.3.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - optional: true - /@commitlint/resolve-extends@18.4.3: resolution: { integrity: sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/config-validator": 18.4.3 "@commitlint/types": 18.4.3 @@ -2172,18 +2111,6 @@ packages: find-up: 5.0.0 dev: true - /@commitlint/types@18.4.0: - resolution: - { - integrity: sha512-MKeaFxt0I9fhqUb2E+YIzX/gZtmkuodJET/XKiZIMvXUff8Ee4Ih86eLg+yAm2jf1pwGBmU02uNOp0y094w2Uw==, - } - engines: { node: ">=v18" } - requiresBuild: true - dependencies: - chalk: 4.1.2 - dev: true - optional: true - /@commitlint/types@18.4.3: resolution: { @@ -2194,7 +2121,7 @@ packages: chalk: 4.1.2 dev: true - /@csstools/cascade-layer-name-parser@1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): + /@csstools/cascade-layer-name-parser@1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2): resolution: { integrity: sha512-v/5ODKNBMfBl0us/WQjlfsvSlYxfZLhNMVIsuCPib2ulTwGKYbKJbwqw671+qH9Y4wvWVnu7LBChvml/wBKjFg==, @@ -2204,8 +2131,8 @@ packages: "@csstools/css-parser-algorithms": ^2.3.2 "@csstools/css-tokenizer": ^2.2.1 dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 dev: true /@csstools/color-helpers@3.0.2: @@ -2216,7 +2143,7 @@ packages: engines: { node: ^14 || ^16 || >=18 } dev: true - /@csstools/css-calc@1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): + /@csstools/css-calc@1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2): resolution: { integrity: sha512-ZV1TSmToiNcQL1P3hfzlzZzA02mmVkVmXGaUDUqpYUG84PmLhVSZpKX+KfxAuOcK7de04UXSQPBrAvaya6iiGg==, @@ -2226,11 +2153,11 @@ packages: "@csstools/css-parser-algorithms": ^2.3.2 "@csstools/css-tokenizer": ^2.2.1 dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 dev: true - /@csstools/css-color-parser@1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): + /@csstools/css-color-parser@1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2): resolution: { integrity: sha512-SlGd8E6ron24JYQPQAIzu5tvmWi1H4sDKTdA7UDnwF45oJv7AVESbOlOO1YjfBhrQFuvLWUgKiOY9DwGoAxwTA==, @@ -2241,24 +2168,12 @@ packages: "@csstools/css-tokenizer": ^2.2.1 dependencies: "@csstools/color-helpers": 3.0.2 - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 + "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 dev: true - /@csstools/css-parser-algorithms@2.3.1(@csstools/css-tokenizer@2.2.1): - resolution: - { - integrity: sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-tokenizer": ^2.2.0 - dependencies: - "@csstools/css-tokenizer": 2.2.1 - dev: true - - /@csstools/css-parser-algorithms@2.3.2(@csstools/css-tokenizer@2.2.1): + /@csstools/css-parser-algorithms@2.3.2(@csstools/css-tokenizer@2.2.2): resolution: { integrity: sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==, @@ -2267,32 +2182,18 @@ packages: peerDependencies: "@csstools/css-tokenizer": ^2.2.1 dependencies: - "@csstools/css-tokenizer": 2.2.1 + "@csstools/css-tokenizer": 2.2.2 dev: true - /@csstools/css-tokenizer@2.2.1: + /@csstools/css-tokenizer@2.2.2: resolution: { - integrity: sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg==, + integrity: sha512-wCDUe/MAw7npAHFLyW3QjSyLA66S5QFaV1jIXlNQvdJ8RzXDSgALa49eWcUO6P55ARQaz0TsDdAgdRgkXFYY8g==, } engines: { node: ^14 || ^16 || >=18 } dev: true - /@csstools/media-query-list-parser@2.1.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.1): - resolution: - { - integrity: sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.1 - "@csstools/css-tokenizer": ^2.2.0 - dependencies: - "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - dev: true - - /@csstools/media-query-list-parser@2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1): + /@csstools/media-query-list-parser@2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2): resolution: { integrity: sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==, @@ -2302,11 +2203,11 @@ packages: "@csstools/css-parser-algorithms": ^2.3.2 "@csstools/css-tokenizer": ^2.2.1 dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 dev: true - /@csstools/postcss-cascade-layers@4.0.1(postcss@8.4.31): + /@csstools/postcss-cascade-layers@4.0.1(postcss@8.4.32): resolution: { integrity: sha512-UYFuFL9GgVnftg9v7tBvVEBRLaBeAD66euD+yYy5fYCUld9ZIWTJNCE30hm6STMEdt6FL5xzeVw1lAZ1tpvUEg==, @@ -2316,11 +2217,11 @@ packages: postcss: ^8.4 dependencies: "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-color-function@3.0.7(postcss@8.4.31): + /@csstools/postcss-color-function@3.0.7(postcss@8.4.32): resolution: { integrity: sha512-/PIB20G1TPCXmQlaJLWIYzTZRZpj6csT4ijgnshIj/kcmniIRroAfDa0xSWnfuO1eNo0NptIaPU7jzUukWn55Q==, @@ -2329,14 +2230,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 dev: true - /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.31): + /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.32): resolution: { integrity: sha512-57/g8aGo5eKFjEeJMiRKh8Qq43K2rCyk5ZZTvJ34TNl4zUtYU5DvLkIkOnhCtL8/a4z9oMA42aOnFPddRrScUQ==, @@ -2345,14 +2246,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 dev: true - /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.31): + /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.32): resolution: { integrity: sha512-ZLK2iSK4DUxeypGce2PnQSdYugUqDTwxnhNiq1o6OyKMNYgYs4eKbvEhFG8JKr1sJWbeqBi5jRr0017l2EWVvg==, @@ -2361,13 +2262,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - postcss: 8.4.31 + "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + postcss: 8.4.32 dev: true - /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.31): + /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.32): resolution: { integrity: sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==, @@ -2376,11 +2277,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.31): + /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.32): resolution: { integrity: sha512-6UQyK8l9YaG5Ao5rBDcCnKHrLsHiQ1E0zeFQuqDJqEtinVzAPb/MwSw3TenZXL1Rnd7th3tb+4CBFHBXdW5tbQ==, @@ -2389,13 +2290,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - postcss: 8.4.31 + "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + postcss: 8.4.32 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.31): + /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.32): resolution: { integrity: sha512-GT1CzE/Tyr/ei4j5BwKESkHAgg+Gzys/0mAY7W+UiR+XrcYk5hDbOrE/YJIx1rflfO/7La1bDoZtA0YnLl4qNA==, @@ -2404,14 +2305,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 dev: true - /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.31): + /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.32): resolution: { integrity: sha512-uQgWt2Ho2yy2S6qthWY7mD5v57NKxi6dD1NB8nAybU5bJSsm+hLXRGm3/zbOH4xNrqO3Cl60DFSNlSrUME3Xjg==, @@ -2420,13 +2321,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - postcss: 8.4.31 + "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + postcss: 8.4.32 dev: true - /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.31): + /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.32): resolution: { integrity: sha512-n28Er7W9qc48zNjJnvTKuVHY26/+6YlA9WzJRksIHiAWOMxSH5IksXkw7FpkIOd+jLi59BMrX/BWrZMgjkLBHg==, @@ -2435,12 +2336,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-initial@1.0.0(postcss@8.4.31): + /@csstools/postcss-initial@1.0.0(postcss@8.4.32): resolution: { integrity: sha512-1l7iHHjIl5qmVeGItugr4ZOlCREDP71mNKqoEyxlosIoiu3Os1nPWMHpuCvDLCLiWI/ONTOg3nzJh7gwHOrqUA==, @@ -2449,10 +2350,10 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.31): + /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.32): resolution: { integrity: sha512-/dt5M9Ty/x3Yiq0Nm/5PJJzwkVFchJgdjKVnryBPtoMCb9ohb/nDIJOwr/Wr3hK3FDs1EA1GE6PyRYsUmQPS8Q==, @@ -2462,11 +2363,11 @@ packages: postcss: ^8.4 dependencies: "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.31): + /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.32): resolution: { integrity: sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==, @@ -2475,10 +2376,10 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /@csstools/postcss-logical-overflow@1.0.0(postcss@8.4.31): + /@csstools/postcss-logical-overflow@1.0.0(postcss@8.4.32): resolution: { integrity: sha512-cIrZ8f7bGGvr+W53nEuMspcwaeaI2YTmz6LZ4yiAO5z14/PQgOOv+Pn+qjvPOPoadeY2BmpaoTzZKvdAQuM17w==, @@ -2487,10 +2388,10 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /@csstools/postcss-logical-overscroll-behavior@1.0.0(postcss@8.4.31): + /@csstools/postcss-logical-overscroll-behavior@1.0.0(postcss@8.4.32): resolution: { integrity: sha512-e89S2LWjnxf0SB2wNUAbqDyFb/Fow/tlOe1XqOLbNx4rf3LrQokM9qldVx7sarnddml3ORE5LDUmlKpPOOeJTA==, @@ -2499,10 +2400,10 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.31): + /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.32): resolution: { integrity: sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==, @@ -2511,11 +2412,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.31): + /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.32): resolution: { integrity: sha512-xeVxqND5rlQyqLGdH7rX34sIm/JbbQKxpKQP8oD1YQqUHHCLQR9NUS57WqJKajxKN6AcNAMWJhb5LUH5RfPcyA==, @@ -2524,11 +2425,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-tokenizer": 2.2.1 - postcss: 8.4.31 + "@csstools/css-tokenizer": 2.2.2 + postcss: 8.4.32 dev: true - /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.31): + /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.32): resolution: { integrity: sha512-t5Li/DPC5QmW/6VFLfUvsw/4dNYYseWR0tOXDeJg/9EKUodBgNawz5tuk5vYKtNvoj+Q08odMuXcpS5YJj0AFA==, @@ -2537,14 +2438,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.31 + "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + postcss: 8.4.32 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.31): + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.32): resolution: { integrity: sha512-IPL8AvnwMYW+cWtp+j8cW3MFN0RyXNT4hLOvs6Rf2N+NcbvXhSyKxZuE3W9Cv4KjaNoNoGx1d0UhT6tktq6tUw==, @@ -2553,13 +2454,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.31 + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + postcss: 8.4.32 dev: true - /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.31): + /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.32): resolution: { integrity: sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==, @@ -2568,11 +2469,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.31): + /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.32): resolution: { integrity: sha512-nUvRxI+ALJwkxZdPU4EDyuM380vP91sAGvI3jAOHs/sr3jfcCOzLkY6xKI1Mr526kZ3RivmMoYM/xq+XFyE/bw==, @@ -2581,11 +2482,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.31): + /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.32): resolution: { integrity: sha512-vBFTQD3CARB3u/XIGO44wWbcO7xG/4GsYqJlcPuUGRSK8mtxes6n4vvNFlIByyAZy2k4d4RY63nyvTbMpeNTaQ==, @@ -2594,14 +2495,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 dev: true - /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.31): + /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.32): resolution: { integrity: sha512-YEvTozk1SxnV/PGL5DllBVDuLQ+jiQhyCSQiZJ6CwBMU5JQ9hFde3i1qqzZHuclZfptjrU0JjlX4ePsOhxNzHw==, @@ -2610,11 +2511,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.31): + /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.32): resolution: { integrity: sha512-2AiFbJSVF4EyymLxme4JzSrbXykHolx8DdZECHjYKMhoulhKLltx5ccYgtrK3BmXGd3v3nJrWFCc8JM8bjuiOg==, @@ -2623,14 +2524,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 dev: true - /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.31): + /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.32): resolution: { integrity: sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==, @@ -2639,11 +2540,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.31): + /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.32): resolution: { integrity: sha512-I3wX44MZVv+tDuWfrd3BTvRB/YRIM2F5v1MBtTI89sxpFn47mNpTwpPYUOGPVCgKlRDfZSlxIUYhUQmqRQZZFQ==, @@ -2652,13 +2553,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - postcss: 8.4.31 + "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + postcss: 8.4.32 dev: true - /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.31): + /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.32): resolution: { integrity: sha512-d5J9m49HhqXRcw1S6vTZuviHi/iknUKGjBpChiNK1ARg9sSa3b8m5lsWz5Izs8ISORZdv2bZRwbw5Z2R6gQ9kQ==, @@ -2668,11 +2569,11 @@ packages: postcss: ^8.4 dependencies: "@csstools/color-helpers": 3.0.2 - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.31): + /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.32): resolution: { integrity: sha512-AwzNhF4QOKaLOKvMljwwFkeYXwufhRO15G+kKohHkyoNOL75xWkN+W2Y9ik9tSeAyDv+cYNlYaF+o/a79WjVjg==, @@ -2681,13 +2582,13 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - postcss: 8.4.31 + "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + postcss: 8.4.32 dev: true - /@csstools/postcss-unset-value@3.0.0(postcss@8.4.31): + /@csstools/postcss-unset-value@3.0.0(postcss@8.4.32): resolution: { integrity: sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==, @@ -2696,7 +2597,7 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13): @@ -2711,6 +2612,18 @@ packages: postcss-selector-parser: 6.0.13 dev: true + /@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.13): + resolution: + { + integrity: sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss-selector-parser: ^6.0.13 + dependencies: + postcss-selector-parser: 6.0.13 + dev: true + /@esbuild/android-arm64@0.19.5: resolution: { @@ -2975,7 +2888,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -2984,7 +2897,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.54.0 + eslint: 8.56.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2996,10 +2909,10 @@ packages: engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } dev: true - /@eslint/eslintrc@2.1.3: + /@eslint/eslintrc@2.1.4: resolution: { - integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==, + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: @@ -3016,10 +2929,10 @@ packages: - supports-color dev: true - /@eslint/js@8.54.0: + /@eslint/js@8.56.0: resolution: { - integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==, + integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true @@ -3105,10 +3018,10 @@ packages: } dev: false - /@github/hotkey@2.3.0: + /@github/hotkey@3.1.0: resolution: { - integrity: sha512-XVvFrubecf1VPofEiVJMZ60fye+EegbB/+ZSuieFihZ3xMTD0NYNrd3n+RHAA9W1gUNl2Yuyj1alrAp+2tmISw==, + integrity: sha512-Lj9QjYa+b+Nk5U1nZtlXLdx3HI8/EeM6ZNwBjpYcGVYqpwHdM2ScRH0p7+5zh28JG6SPbTM9+Rb1dFd742qMTw==, } dev: false @@ -3658,7 +3571,7 @@ packages: dev: true optional: true - /@semantic-release/changelog@6.0.3(semantic-release@22.0.8): + /@semantic-release/changelog@6.0.3(semantic-release@22.0.12): resolution: { integrity: sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==, @@ -3671,10 +3584,10 @@ packages: aggregate-error: 3.1.0 fs-extra: 11.1.1 lodash: 4.17.21 - semantic-release: 22.0.8 + semantic-release: 22.0.12(typescript@5.3.3) dev: true - /@semantic-release/commit-analyzer@11.1.0(semantic-release@22.0.8): + /@semantic-release/commit-analyzer@11.1.0(semantic-release@22.0.12): resolution: { integrity: sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==, @@ -3690,7 +3603,7 @@ packages: import-from-esm: 1.3.1 lodash-es: 4.17.21 micromatch: 4.0.5 - semantic-release: 22.0.8 + semantic-release: 22.0.12(typescript@5.3.3) transitivePeerDependencies: - supports-color dev: true @@ -3711,7 +3624,7 @@ packages: engines: { node: ">=18" } dev: true - /@semantic-release/exec@6.0.3(semantic-release@22.0.8): + /@semantic-release/exec@6.0.3(semantic-release@22.0.12): resolution: { integrity: sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==, @@ -3726,12 +3639,12 @@ packages: execa: 5.1.1 lodash: 4.17.21 parse-json: 5.2.0 - semantic-release: 22.0.8 + semantic-release: 22.0.12(typescript@5.3.3) transitivePeerDependencies: - supports-color dev: true - /@semantic-release/git@10.0.1(semantic-release@22.0.8): + /@semantic-release/git@10.0.1(semantic-release@22.0.12): resolution: { integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==, @@ -3748,12 +3661,12 @@ packages: lodash: 4.17.21 micromatch: 4.0.5 p-reduce: 2.1.0 - semantic-release: 22.0.8 + semantic-release: 22.0.12(typescript@5.3.3) transitivePeerDependencies: - supports-color dev: true - /@semantic-release/github@9.0.4(semantic-release@22.0.8): + /@semantic-release/github@9.0.4(semantic-release@22.0.12): resolution: { integrity: sha512-kQCGFAsBErvCR6hzNuzu63cj4erQN2krm9zQlg8vl4j5X0mL0d/Ras0wmL5Gkr1TuSS2lweME7M4J5zvtDDDSA==, @@ -3777,18 +3690,18 @@ packages: lodash-es: 4.17.21 mime: 3.0.0 p-filter: 3.0.0 - semantic-release: 22.0.8 + semantic-release: 22.0.12(typescript@5.3.3) url-join: 5.0.0 transitivePeerDependencies: - supports-color dev: true - /@semantic-release/gitlab@12.1.1(semantic-release@22.0.8): + /@semantic-release/gitlab@13.0.0(semantic-release@22.0.12): resolution: { - integrity: sha512-vM8mqMmegRJB4+9MJCYeCt5Gn4C2rpF0bNOzKOHq1IaI4FleIV5sss0fn55jVCuVVztTnoPQylnti5Tkdg3uaw==, + integrity: sha512-76EAVOWHz2m17H0oUzZxC6hvrVmHNE0fzwbrgz7s/NhtUdJeqrO0v1n4SrnJTu3oqKZnZze1hhzvXJUp//rutA==, } - engines: { node: ">=18" } + engines: { node: ">=20.8.1" } peerDependencies: semantic-release: ">=20.1.0" dependencies: @@ -3797,20 +3710,20 @@ packages: debug: 4.3.4 dir-glob: 3.0.1 escape-string-regexp: 5.0.0 - form-data: 4.0.0 + formdata-node: 6.0.3 fs-extra: 11.1.1 globby: 14.0.0 got: 13.0.0 hpagent: 1.2.0 lodash-es: 4.17.21 parse-url: 8.1.0 - semantic-release: 22.0.8 + semantic-release: 22.0.12(typescript@5.3.3) url-join: 4.0.1 transitivePeerDependencies: - supports-color dev: true - /@semantic-release/npm@11.0.1(semantic-release@22.0.8): + /@semantic-release/npm@11.0.1(semantic-release@22.0.12): resolution: { integrity: sha512-nFcT0pgVwpXsPkzjqP3ObH+pILeN1AbYscCDuYwgZEPZukL+RsGhrtdT4HA1Gjb/y1bVbE90JNtMIcgRi5z/Fg==, @@ -3830,12 +3743,12 @@ packages: rc: 1.2.8 read-pkg: 9.0.0 registry-auth-token: 5.0.2 - semantic-release: 22.0.8 + semantic-release: 22.0.12(typescript@5.3.3) semver: 7.5.4 tempy: 3.1.0 dev: true - /@semantic-release/release-notes-generator@12.1.0(semantic-release@22.0.8): + /@semantic-release/release-notes-generator@12.1.0(semantic-release@22.0.12): resolution: { integrity: sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==, @@ -3854,7 +3767,7 @@ packages: into-stream: 7.0.0 lodash-es: 4.17.21 read-pkg-up: 11.0.0 - semantic-release: 22.0.8 + semantic-release: 22.0.12(typescript@5.3.3) transitivePeerDependencies: - supports-color dev: true @@ -3914,7 +3827,7 @@ packages: defer-to-connect: 2.0.1 dev: true - /@tailwindcss/forms@0.5.7(tailwindcss@3.3.5): + /@tailwindcss/forms@0.5.7(tailwindcss@3.4.0): resolution: { integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==, @@ -3923,10 +3836,10 @@ packages: tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1" dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.3.5 + tailwindcss: 3.4.0 dev: true - /@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.31): + /@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.32): resolution: { integrity: sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==, @@ -3934,11 +3847,11 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 - postcss-nested: 5.0.6(postcss@8.4.31) + postcss: 8.4.32 + postcss-nested: 5.0.6(postcss@8.4.32) dev: false - /@tailwindcss/typography@0.5.10(tailwindcss@3.3.5): + /@tailwindcss/typography@0.5.10(tailwindcss@3.4.0): resolution: { integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==, @@ -3950,7 +3863,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.3.5 + tailwindcss: 3.4.0 dev: true /@trysound/sax@0.2.0: @@ -4017,6 +3930,7 @@ packages: { integrity: sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==, } + requiresBuild: true dependencies: undici-types: 5.26.5 dev: true @@ -4057,10 +3971,10 @@ packages: integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==, } - /@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.54.0)(typescript@5.3.2): + /@typescript-eslint/eslint-plugin@6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==, + integrity: sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4072,27 +3986,27 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.8.0 - "@typescript-eslint/parser": 6.13.1(eslint@8.54.0)(typescript@5.3.2) - "@typescript-eslint/scope-manager": 6.13.1 - "@typescript-eslint/type-utils": 6.13.1(eslint@8.54.0)(typescript@5.3.2) - "@typescript-eslint/utils": 6.13.1(eslint@8.54.0)(typescript@5.3.2) - "@typescript-eslint/visitor-keys": 6.13.1 + "@typescript-eslint/parser": 6.15.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.15.0 + "@typescript-eslint/type-utils": 6.15.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.15.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.15.0 debug: 4.3.4 - eslint: 8.54.0 + eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.3.2) - typescript: 5.3.2 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.13.1(eslint@8.54.0)(typescript@5.3.2): + /@typescript-eslint/parser@6.15.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==, + integrity: sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4102,32 +4016,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.13.1 - "@typescript-eslint/types": 6.13.1 - "@typescript-eslint/typescript-estree": 6.13.1(typescript@5.3.2) - "@typescript-eslint/visitor-keys": 6.13.1 + "@typescript-eslint/scope-manager": 6.15.0 + "@typescript-eslint/types": 6.15.0 + "@typescript-eslint/typescript-estree": 6.15.0(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.15.0 debug: 4.3.4 - eslint: 8.54.0 - typescript: 5.3.2 + eslint: 8.56.0 + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.13.1: + /@typescript-eslint/scope-manager@6.15.0: resolution: { - integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==, + integrity: sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.13.1 - "@typescript-eslint/visitor-keys": 6.13.1 + "@typescript-eslint/types": 6.15.0 + "@typescript-eslint/visitor-keys": 6.15.0 dev: true - /@typescript-eslint/type-utils@6.13.1(eslint@8.54.0)(typescript@5.3.2): + /@typescript-eslint/type-utils@6.15.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==, + integrity: sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4137,28 +4051,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.13.1(typescript@5.3.2) - "@typescript-eslint/utils": 6.13.1(eslint@8.54.0)(typescript@5.3.2) + "@typescript-eslint/typescript-estree": 6.15.0(typescript@5.3.3) + "@typescript-eslint/utils": 6.15.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 - eslint: 8.54.0 - ts-api-utils: 1.0.2(typescript@5.3.2) - typescript: 5.3.2 + eslint: 8.56.0 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.13.1: + /@typescript-eslint/types@6.15.0: resolution: { - integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==, + integrity: sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: true - /@typescript-eslint/typescript-estree@6.13.1(typescript@5.3.2): + /@typescript-eslint/typescript-estree@6.15.0(typescript@5.3.3): resolution: { - integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==, + integrity: sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4167,48 +4081,48 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.13.1 - "@typescript-eslint/visitor-keys": 6.13.1 + "@typescript-eslint/types": 6.15.0 + "@typescript-eslint/visitor-keys": 6.15.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.3.2) - typescript: 5.3.2 + ts-api-utils: 1.0.2(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.13.1(eslint@8.54.0)(typescript@5.3.2): + /@typescript-eslint/utils@6.15.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==, + integrity: sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) "@types/json-schema": 7.0.12 "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 6.13.1 - "@typescript-eslint/types": 6.13.1 - "@typescript-eslint/typescript-estree": 6.13.1(typescript@5.3.2) - eslint: 8.54.0 + "@typescript-eslint/scope-manager": 6.15.0 + "@typescript-eslint/types": 6.15.0 + "@typescript-eslint/typescript-estree": 6.15.0(typescript@5.3.3) + eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.13.1: + /@typescript-eslint/visitor-keys@6.15.0: resolution: { - integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==, + integrity: sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.13.1 + "@typescript-eslint/types": 6.15.0 eslint-visitor-keys: 3.4.3 dev: true @@ -4404,16 +4318,6 @@ packages: type-fest: 0.21.3 dev: true - /ansi-escapes@5.0.0: - resolution: - { - integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==, - } - engines: { node: ">=12" } - dependencies: - type-fest: 1.4.0 - dev: true - /ansi-escapes@6.2.0: resolution: { @@ -4603,13 +4507,6 @@ packages: } dev: true - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: true - /at-least-node@1.0.0: resolution: { @@ -4618,7 +4515,7 @@ packages: engines: { node: ">= 4.0.0" } dev: true - /autoprefixer@10.4.16(postcss@8.4.31): + /autoprefixer@10.4.16(postcss@8.4.32): resolution: { integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==, @@ -4633,7 +4530,7 @@ packages: fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true @@ -4828,20 +4725,6 @@ packages: browser-resolve: 1.11.3 dev: false - /browserslist@4.21.10: - resolution: - { - integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - dependencies: - caniuse-lite: 1.0.30001523 - electron-to-chromium: 1.4.503 - node-releases: 2.0.13 - update-browserslist-db: 1.0.11(browserslist@4.21.10) - dev: true - /browserslist@4.22.1: resolution: { @@ -4957,19 +4840,6 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase-keys@7.0.2: - resolution: - { - integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==, - } - engines: { node: ">=12" } - dependencies: - camelcase: 6.3.0 - map-obj: 4.3.0 - quick-lru: 5.1.1 - type-fest: 1.4.0 - dev: true - /camelcase@5.3.1: resolution: { @@ -4978,33 +4848,18 @@ packages: engines: { node: ">=6" } dev: true - /camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: ">=10" } - dev: true - /caniuse-api@3.0.0: resolution: { integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, } dependencies: - browserslist: 4.21.10 - caniuse-lite: 1.0.30001523 + browserslist: 4.22.1 + caniuse-lite: 1.0.30001562 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001523: - resolution: - { - integrity: sha512-I5q5cisATTPZ1mc588Z//pj/Ox80ERYDfR71YnvY7raS/NOk8xXlZcB0sF7JdqaV//kOaa6aus7lRfpdnt1eBA==, - } - dev: true - /caniuse-lite@1.0.30001562: resolution: { @@ -5174,15 +5029,15 @@ packages: "@colors/colors": 1.5.0 dev: true - /cli-truncate@3.1.0: + /cli-truncate@4.0.0: resolution: { - integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==, + integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==, } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + engines: { node: ">=18" } dependencies: slice-ansi: 5.0.0 - string-width: 5.1.2 + string-width: 7.0.0 dev: true /cli-width@3.0.0: @@ -5229,13 +5084,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1) + "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.1) "@codemirror/commands": 6.3.2 "@codemirror/language": 6.9.3 "@codemirror/lint": 6.4.0 "@codemirror/search": 6.5.1 - "@codemirror/state": 6.3.2 - "@codemirror/view": 6.22.1 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 transitivePeerDependencies: - "@lezer/common" dev: false @@ -5287,16 +5142,6 @@ packages: } dev: true - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - dev: true - /commander@11.1.0: resolution: { @@ -5327,7 +5172,7 @@ packages: } engines: { node: ">= 10" } - /commitizen@4.3.0(typescript@5.3.2): + /commitizen@4.3.0(typescript@5.3.3): resolution: { integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==, @@ -5336,7 +5181,7 @@ packages: hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(typescript@5.3.2) + cz-conventional-changelog: 3.3.0(typescript@5.3.3) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -5478,7 +5323,7 @@ packages: integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==, } dependencies: - browserslist: 4.21.10 + browserslist: 4.22.1 dev: true /core-js@3.32.1: @@ -5495,37 +5340,25 @@ packages: integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, } - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.2): + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.3): resolution: { integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==, } engines: { node: ">=v16" } + requiresBuild: true peerDependencies: "@types/node": "*" cosmiconfig: ">=8.2" typescript: ">=4" dependencies: "@types/node": 18.18.9 - cosmiconfig: 8.3.6(typescript@5.3.2) + cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.19.3 - typescript: 5.3.2 + typescript: 5.3.3 dev: true - /cosmiconfig@8.2.0: - resolution: - { - integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==, - } - engines: { node: ">=14" } - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - - /cosmiconfig@8.3.6(typescript@5.3.2): + /cosmiconfig@8.3.6(typescript@5.3.3): resolution: { integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==, @@ -5541,7 +5374,26 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.3.2 + typescript: 5.3.3 + dev: true + + /cosmiconfig@9.0.0(typescript@5.3.3): + resolution: + { + integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, + } + engines: { node: ">=14" } + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.3.3 dev: true /crelt@1.0.6: @@ -5599,7 +5451,7 @@ packages: type-fest: 1.4.0 dev: true - /css-blank-pseudo@6.0.0(postcss@8.4.31): + /css-blank-pseudo@6.0.0(postcss@8.4.32): resolution: { integrity: sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==, @@ -5608,20 +5460,20 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /css-declaration-sorter@6.4.1(postcss@8.4.31): + /css-declaration-sorter@7.1.1(postcss@8.4.32): resolution: { - integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==, + integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==, } - engines: { node: ^10 || ^12 || >=14 } + engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true /css-functions-list@3.2.1: @@ -5632,7 +5484,7 @@ packages: engines: { node: ">=12 || >=16" } dev: true - /css-has-pseudo@6.0.0(postcss@8.4.31): + /css-has-pseudo@6.0.0(postcss@8.4.32): resolution: { integrity: sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==, @@ -5642,12 +5494,12 @@ packages: postcss: ^8.4 dependencies: "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: true - /css-prefers-color-scheme@9.0.0(postcss@8.4.31): + /css-prefers-color-scheme@9.0.0(postcss@8.4.32): resolution: { integrity: sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==, @@ -5656,7 +5508,7 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true /css-select@5.1.0: @@ -5717,71 +5569,71 @@ packages: engines: { node: ">=4" } hasBin: true - /cssnano-preset-default@6.0.1(postcss@8.4.31): + /cssnano-preset-default@6.0.2(postcss@8.4.32): resolution: { - integrity: sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==, + integrity: sha512-VnZybFeZ63AiVqIUNlxqMxpj9VU8B5j0oKgP7WyVt/7mkyf97KsYkNzsPTV/RVmy54Pg7cBhOK4WATbdCB44gw==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.31) - cssnano-utils: 4.0.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-calc: 9.0.1(postcss@8.4.31) - postcss-colormin: 6.0.0(postcss@8.4.31) - postcss-convert-values: 6.0.0(postcss@8.4.31) - postcss-discard-comments: 6.0.0(postcss@8.4.31) - postcss-discard-duplicates: 6.0.0(postcss@8.4.31) - postcss-discard-empty: 6.0.0(postcss@8.4.31) - postcss-discard-overridden: 6.0.0(postcss@8.4.31) - postcss-merge-longhand: 6.0.0(postcss@8.4.31) - postcss-merge-rules: 6.0.1(postcss@8.4.31) - postcss-minify-font-values: 6.0.0(postcss@8.4.31) - postcss-minify-gradients: 6.0.0(postcss@8.4.31) - postcss-minify-params: 6.0.0(postcss@8.4.31) - postcss-minify-selectors: 6.0.0(postcss@8.4.31) - postcss-normalize-charset: 6.0.0(postcss@8.4.31) - postcss-normalize-display-values: 6.0.0(postcss@8.4.31) - postcss-normalize-positions: 6.0.0(postcss@8.4.31) - postcss-normalize-repeat-style: 6.0.0(postcss@8.4.31) - postcss-normalize-string: 6.0.0(postcss@8.4.31) - postcss-normalize-timing-functions: 6.0.0(postcss@8.4.31) - postcss-normalize-unicode: 6.0.0(postcss@8.4.31) - postcss-normalize-url: 6.0.0(postcss@8.4.31) - postcss-normalize-whitespace: 6.0.0(postcss@8.4.31) - postcss-ordered-values: 6.0.0(postcss@8.4.31) - postcss-reduce-initial: 6.0.0(postcss@8.4.31) - postcss-reduce-transforms: 6.0.0(postcss@8.4.31) - postcss-svgo: 6.0.0(postcss@8.4.31) - postcss-unique-selectors: 6.0.0(postcss@8.4.31) + css-declaration-sorter: 7.1.1(postcss@8.4.32) + cssnano-utils: 4.0.1(postcss@8.4.32) + postcss: 8.4.32 + postcss-calc: 9.0.1(postcss@8.4.32) + postcss-colormin: 6.0.1(postcss@8.4.32) + postcss-convert-values: 6.0.1(postcss@8.4.32) + postcss-discard-comments: 6.0.1(postcss@8.4.32) + postcss-discard-duplicates: 6.0.1(postcss@8.4.32) + postcss-discard-empty: 6.0.1(postcss@8.4.32) + postcss-discard-overridden: 6.0.1(postcss@8.4.32) + postcss-merge-longhand: 6.0.1(postcss@8.4.32) + postcss-merge-rules: 6.0.2(postcss@8.4.32) + postcss-minify-font-values: 6.0.1(postcss@8.4.32) + postcss-minify-gradients: 6.0.1(postcss@8.4.32) + postcss-minify-params: 6.0.1(postcss@8.4.32) + postcss-minify-selectors: 6.0.1(postcss@8.4.32) + postcss-normalize-charset: 6.0.1(postcss@8.4.32) + postcss-normalize-display-values: 6.0.1(postcss@8.4.32) + postcss-normalize-positions: 6.0.1(postcss@8.4.32) + postcss-normalize-repeat-style: 6.0.1(postcss@8.4.32) + postcss-normalize-string: 6.0.1(postcss@8.4.32) + postcss-normalize-timing-functions: 6.0.1(postcss@8.4.32) + postcss-normalize-unicode: 6.0.1(postcss@8.4.32) + postcss-normalize-url: 6.0.1(postcss@8.4.32) + postcss-normalize-whitespace: 6.0.1(postcss@8.4.32) + postcss-ordered-values: 6.0.1(postcss@8.4.32) + postcss-reduce-initial: 6.0.1(postcss@8.4.32) + postcss-reduce-transforms: 6.0.1(postcss@8.4.32) + postcss-svgo: 6.0.1(postcss@8.4.32) + postcss-unique-selectors: 6.0.1(postcss@8.4.32) dev: true - /cssnano-utils@4.0.0(postcss@8.4.31): + /cssnano-utils@4.0.1(postcss@8.4.32): resolution: { - integrity: sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==, + integrity: sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /cssnano@6.0.1(postcss@8.4.31): + /cssnano@6.0.2(postcss@8.4.32): resolution: { - integrity: sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==, + integrity: sha512-Tu9wv8UdN6CoiQnIVkCNvi+0rw/BwFWOJBlg2bVfEyKaadSuE3Gq/DD8tniVvggTJGwK88UjqZp7zL5sv6t1aA==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - cssnano-preset-default: 6.0.1(postcss@8.4.31) - lilconfig: 2.1.0 - postcss: 8.4.31 + cssnano-preset-default: 6.0.2(postcss@8.4.32) + lilconfig: 3.0.0 + postcss: 8.4.32 dev: true /csso@5.0.5: @@ -5794,7 +5646,7 @@ packages: css-tree: 2.2.1 dev: true - /cz-conventional-changelog@3.3.0(typescript@5.3.2): + /cz-conventional-changelog@3.3.0(typescript@5.3.3): resolution: { integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, @@ -5802,13 +5654,13 @@ packages: engines: { node: ">= 10" } dependencies: chalk: 2.4.2 - commitizen: 4.3.0(typescript@5.3.2) + commitizen: 4.3.0(typescript@5.3.3) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - "@commitlint/load": 18.4.2(typescript@5.3.2) + "@commitlint/load": 18.4.3(typescript@5.3.3) transitivePeerDependencies: - typescript dev: true @@ -5992,14 +5844,6 @@ packages: engines: { node: ">=0.10.0" } dev: true - /decamelize@5.0.1: - resolution: - { - integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==, - } - engines: { node: ">=10" } - dev: true - /decompress-response@6.0.0: resolution: { @@ -6079,14 +5923,6 @@ packages: has-property-descriptors: 1.0.0 object-keys: 1.1.1 - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - dev: true - /deprecation@2.3.1: resolution: { @@ -6208,13 +6044,6 @@ packages: dependencies: readable-stream: 2.3.8 - /eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } - dev: true - /ejs@3.1.9: resolution: { @@ -6226,13 +6055,6 @@ packages: jake: 10.8.7 dev: true - /electron-to-chromium@1.4.503: - resolution: - { - integrity: sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==, - } - dev: true - /electron-to-chromium@1.4.583: resolution: { @@ -6240,6 +6062,13 @@ packages: } dev: true + /emoji-regex@10.3.0: + resolution: + { + integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==, + } + dev: true + /emoji-regex@8.0.0: resolution: { @@ -6247,13 +6076,6 @@ packages: } dev: true - /emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } - dev: true - /emojilib@2.4.0: resolution: { @@ -6280,6 +6102,14 @@ packages: java-properties: 1.0.2 dev: true + /env-paths@2.2.1: + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: ">=6" } + dev: true + /error-ex@1.3.2: resolution: { @@ -6520,7 +6350,7 @@ packages: source-map: 0.1.43 dev: false - /eslint-config-prettier@8.10.0(eslint@8.54.0): + /eslint-config-prettier@8.10.0(eslint@8.56.0): resolution: { integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==, @@ -6529,10 +6359,10 @@ packages: peerDependencies: eslint: ">=7.0.0" dependencies: - eslint: 8.54.0 + eslint: 8.56.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.54.0)(prettier@2.8.8): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.8.8): resolution: { integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, @@ -6546,8 +6376,8 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.54.0 - eslint-config-prettier: 8.10.0(eslint@8.54.0) + eslint: 8.56.0 + eslint-config-prettier: 8.10.0(eslint@8.56.0) prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true @@ -6571,18 +6401,18 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /eslint@8.54.0: + /eslint@8.56.0: resolution: { - integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==, + integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) "@eslint-community/regexpp": 4.8.0 - "@eslint/eslintrc": 2.1.3 - "@eslint/js": 8.54.0 + "@eslint/eslintrc": 2.1.4 + "@eslint/js": 8.56.0 "@humanwhocodes/config-array": 0.11.13 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -6821,20 +6651,6 @@ packages: } dev: true - /fast-glob@3.3.1: - resolution: - { - integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - /fast-glob@3.3.2: resolution: { @@ -6919,10 +6735,10 @@ packages: flat-cache: 3.2.0 dev: true - /file-entry-cache@7.0.1: + /file-entry-cache@7.0.2: resolution: { - integrity: sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==, + integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==, } engines: { node: ">=12.0.0" } dependencies: @@ -7071,16 +6887,12 @@ packages: engines: { node: ">= 14.17" } dev: true - /form-data@4.0.0: + /formdata-node@6.0.3: resolution: { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==, } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 + engines: { node: ">= 18" } dev: true /fraction.js@4.3.7: @@ -7206,6 +7018,14 @@ packages: engines: { node: 6.* || 8.* || >= 10.* } dev: true + /get-east-asian-width@1.2.0: + resolution: + { + integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==, + } + engines: { node: ">=18" } + dev: true + /get-intrinsic@1.2.1: resolution: { @@ -7431,8 +7251,8 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 + fast-glob: 3.3.2 + ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -7445,7 +7265,7 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dependencies: dir-glob: 3.0.1 - fast-glob: 3.3.1 + fast-glob: 3.3.2 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 @@ -7782,6 +7602,14 @@ packages: engines: { node: ">= 4" } dev: true + /ignore@5.3.0: + resolution: + { + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + } + engines: { node: ">= 4" } + dev: true + /import-fresh@3.3.0: resolution: { @@ -7806,14 +7634,6 @@ packages: - supports-color dev: true - /import-lazy@4.0.0: - resolution: - { - integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==, - } - engines: { node: ">=8" } - dev: true - /import-meta-resolve@4.0.0: resolution: { @@ -8071,6 +7891,16 @@ packages: engines: { node: ">=12" } dev: true + /is-fullwidth-code-point@5.0.0: + resolution: + { + integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==, + } + engines: { node: ">=18" } + dependencies: + get-east-asian-width: 1.2.0 + dev: true + /is-glob@4.0.3: resolution: { @@ -8587,6 +8417,14 @@ packages: engines: { node: ">=10" } dev: true + /lilconfig@3.0.0: + resolution: + { + integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==, + } + engines: { node: ">=14" } + dev: true + /lines-and-columns@1.2.4: resolution: { @@ -8594,10 +8432,10 @@ packages: } dev: true - /lint-staged@15.1.0: + /lint-staged@15.2.0: resolution: { - integrity: sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==, + integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==, } engines: { node: ">=18.12.0" } hasBin: true @@ -8606,8 +8444,8 @@ packages: commander: 11.1.0 debug: 4.3.4 execa: 8.0.1 - lilconfig: 2.1.0 - listr2: 7.0.2 + lilconfig: 3.0.0 + listr2: 8.0.0 micromatch: 4.0.5 pidtree: 0.6.0 string-argv: 0.3.2 @@ -8616,19 +8454,19 @@ packages: - supports-color dev: true - /listr2@7.0.2: + /listr2@8.0.0: resolution: { - integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==, + integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==, } - engines: { node: ">=16.0.0" } + engines: { node: ">=18.0.0" } dependencies: - cli-truncate: 3.1.0 + cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 - log-update: 5.0.1 + log-update: 6.0.0 rfdc: 1.3.0 - wrap-ansi: 8.1.0 + wrap-ansi: 9.0.0 dev: true /lit-element@4.0.1: @@ -8802,6 +8640,7 @@ packages: { integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, } + requiresBuild: true dev: true /lodash.snakecase@4.1.1: @@ -8871,18 +8710,18 @@ packages: is-unicode-supported: 0.1.0 dev: true - /log-update@5.0.1: + /log-update@6.0.0: resolution: { - integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==, + integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==, } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + engines: { node: ">=18" } dependencies: - ansi-escapes: 5.0.0 + ansi-escapes: 6.2.0 cli-cursor: 4.0.0 - slice-ansi: 5.0.0 + slice-ansi: 7.1.0 strip-ansi: 7.1.0 - wrap-ansi: 8.1.0 + wrap-ansi: 9.0.0 dev: true /longest@2.0.1: @@ -8980,10 +8819,10 @@ packages: supports-hyperlinks: 3.0.0 dev: true - /marked@11.0.0: + /marked@11.1.0: resolution: { - integrity: sha512-2GsW34uXaFEGTQ/+3rCnNC6vUYTAgFuDLGl70v/aWinA5mIJtTrrFAmfbLOfVvgPyxXuDVL9He/7reCK+6j3Sw==, + integrity: sha512-fvKJWAPEafVj1dwGwcPI5mBB/0pvViL6NlCbNDG1HOIRwwAU/jeMoFxfbRLuirO1wRH7m4yPvBqD/O1wyWvayw==, } engines: { node: ">= 18" } hasBin: true @@ -9019,27 +8858,6 @@ packages: } dev: true - /meow@10.1.5: - resolution: - { - integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - "@types/minimist": 1.2.2 - camelcase-keys: 7.0.2 - decamelize: 5.0.1 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 8.0.0 - redent: 4.0.0 - trim-newlines: 4.1.1 - type-fest: 1.4.0 - yargs-parser: 20.2.9 - dev: true - /meow@12.1.1: resolution: { @@ -9110,24 +8928,6 @@ packages: picomatch: 2.3.1 dev: true - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - dev: true - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - dev: true - /mime@3.0.0: resolution: { @@ -9261,10 +9061,10 @@ packages: thenify-all: 1.6.0 dev: true - /nanoid@3.3.6: + /nanoid@3.3.7: resolution: { - integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, } engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true @@ -10030,7 +9830,7 @@ packages: tinyqueue: 2.0.3 dev: false - /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.31): + /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.32): resolution: { integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==, @@ -10039,11 +9839,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-calc@9.0.1(postcss@8.4.31): + /postcss-calc@9.0.1(postcss@8.4.32): resolution: { integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==, @@ -10052,12 +9852,12 @@ packages: peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: true - /postcss-clamp@4.1.0(postcss@8.4.31): + /postcss-clamp@4.1.0(postcss@8.4.32): resolution: { integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, @@ -10066,11 +9866,11 @@ packages: peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.2(postcss@8.4.31): + /postcss-color-functional-notation@6.0.2(postcss@8.4.32): resolution: { integrity: sha512-FsjSmlSufuiFBsIqQ++VxFmvX7zKndZpBkHmfXr4wqhvzM92FTEkAh703iqWTl1U3faTgqioIqCbfqdWiFVwtw==, @@ -10079,12 +9879,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-color-hex-alpha@9.0.2(postcss@8.4.31): + /postcss-color-hex-alpha@9.0.2(postcss@8.4.32): resolution: { integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==, @@ -10093,11 +9893,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.1(postcss@8.4.31): + /postcss-color-rebeccapurple@9.0.1(postcss@8.4.32): resolution: { integrity: sha512-ds4cq5BjRieizVb2PnvbJ0omg9VCo2/KzluvoFZbxuGpsGJ5BQSD93CHBooinEtangCM5YqUOerGDl4xGmOb6Q==, @@ -10106,41 +9906,41 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-colormin@6.0.0(postcss@8.4.31): + /postcss-colormin@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==, + integrity: sha512-Tb9aR2wCJCzKuNjIeMzVNd0nXjQy25HDgFmmaRsHnP0eP/k8uQWE4S8voX5S2coO5CeKrp+USFs1Ayv9Tpxx6w==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - browserslist: 4.21.10 + browserslist: 4.22.1 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values@6.0.0(postcss@8.4.31): + /postcss-convert-values@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==, + integrity: sha512-zTd4Vh0HxGkhg5aHtfCogcRHzGkvblfdWlQ53lIh1cJhYcGyIxh2hgtKoVh40AMktRERet+JKdB04nNG19kjmA==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - browserslist: 4.21.10 - postcss: 8.4.31 + browserslist: 4.22.1 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@10.0.2(postcss@8.4.31): + /postcss-custom-media@10.0.2(postcss@8.4.32): resolution: { integrity: sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==, @@ -10149,14 +9949,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - postcss: 8.4.31 + "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + postcss: 8.4.32 dev: true - /postcss-custom-properties@13.3.2(postcss@8.4.31): + /postcss-custom-properties@13.3.2(postcss@8.4.32): resolution: { integrity: sha512-2Coszybpo8lpLY24vy2CYv9AasiZ39/bs8Imv0pWMq55Gl8NWzfc24OAo3zIX7rc6uUJAqESnVOMZ6V6lpMjJA==, @@ -10165,14 +9965,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - postcss: 8.4.31 + "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors@7.1.6(postcss@8.4.31): + /postcss-custom-selectors@7.1.6(postcss@8.4.32): resolution: { integrity: sha512-svsjWRaxqL3vAzv71dV0/65P24/FB8TbPX+lWyyf9SZ7aZm4S4NhCn7N3Bg+Z5sZunG3FS8xQ80LrCU9hb37cw==, @@ -10181,14 +9981,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - postcss: 8.4.31 + "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-dir-pseudo-class@8.0.0(postcss@8.4.31): + /postcss-dir-pseudo-class@8.0.0(postcss@8.4.32): resolution: { integrity: sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==, @@ -10197,59 +9997,59 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-discard-comments@6.0.0(postcss@8.4.31): + /postcss-discard-comments@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==, + integrity: sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-discard-duplicates@6.0.0(postcss@8.4.31): + /postcss-discard-duplicates@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==, + integrity: sha512-1hvUs76HLYR8zkScbwyJ8oJEugfPV+WchpnA+26fpJ7Smzs51CzGBHC32RS03psuX/2l0l0UKh2StzNxOrKCYg==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-discard-empty@6.0.0(postcss@8.4.31): + /postcss-discard-empty@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==, + integrity: sha512-yitcmKwmVWtNsrrRqGJ7/C0YRy53i0mjexBDQ9zYxDwTWVBgbU4+C9jIZLmQlTDT9zhml+u0OMFJh8+31krmOg==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-discard-overridden@6.0.0(postcss@8.4.31): + /postcss-discard-overridden@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==, + integrity: sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-double-position-gradients@5.0.2(postcss@8.4.31): + /postcss-double-position-gradients@5.0.2(postcss@8.4.32): resolution: { integrity: sha512-KTbvdOOy8z8zb0BTkEg4/1vqlRlApdvjw8/pFoehgQl0WVO+fezDGlvo0B8xRA+XccA7ohkQCULKNsiNOx70Cw==, @@ -10258,12 +10058,12 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-focus-visible@9.0.0(postcss@8.4.31): + /postcss-focus-visible@9.0.0(postcss@8.4.32): resolution: { integrity: sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==, @@ -10272,11 +10072,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-focus-within@8.0.0(postcss@8.4.31): + /postcss-focus-within@8.0.0(postcss@8.4.32): resolution: { integrity: sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==, @@ -10285,11 +10085,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-font-variant@5.0.0(postcss@8.4.31): + /postcss-font-variant@5.0.0(postcss@8.4.32): resolution: { integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, @@ -10297,10 +10097,10 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-gap-properties@5.0.0(postcss@8.4.31): + /postcss-gap-properties@5.0.0(postcss@8.4.32): resolution: { integrity: sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==, @@ -10309,10 +10109,10 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-image-set-function@6.0.1(postcss@8.4.31): + /postcss-image-set-function@6.0.1(postcss@8.4.32): resolution: { integrity: sha512-VlZncC9hhZ5tg0JllY4g6Z28BeoPO8DIkelioEEkXL0AA0IORlqYpTi2L8TUnl4YQrlwvBgxVy+mdZJw5R/cIQ==, @@ -10321,11 +10121,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-import@15.1.0(postcss@8.4.31): + /postcss-import@15.1.0(postcss@8.4.32): resolution: { integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, @@ -10334,13 +10134,13 @@ packages: peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.4 dev: true - /postcss-js@4.0.1(postcss@8.4.31): + /postcss-js@4.0.1(postcss@8.4.32): resolution: { integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, @@ -10350,10 +10150,10 @@ packages: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-lab-function@6.0.7(postcss@8.4.31): + /postcss-lab-function@6.0.7(postcss@8.4.32): resolution: { integrity: sha512-4d1lhDVPukHFqkMv4G5vVcK+tgY52vwb5uR1SWKOaO5389r2q8fMxBWuXSW+YtbCOEGP0/X9KERi9E9le2pJuw==, @@ -10362,14 +10162,14 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.1) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - postcss: 8.4.31 + "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + postcss: 8.4.32 dev: true - /postcss-load-config@4.0.1(postcss@8.4.31): + /postcss-load-config@4.0.1(postcss@8.4.32): resolution: { integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==, @@ -10385,11 +10185,11 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.31 - yaml: 2.3.1 + postcss: 8.4.32 + yaml: 2.3.4 dev: true - /postcss-logical@7.0.0(postcss@8.4.31): + /postcss-logical@7.0.0(postcss@8.4.32): resolution: { integrity: sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==, @@ -10398,97 +10198,97 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-merge-longhand@6.0.0(postcss@8.4.31): + /postcss-merge-longhand@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==, + integrity: sha512-vmr/HZQzaPXc45FRvSctqFTF05UaDnTn5ABX+UtQPJznDWT/QaFbVc/pJ5C2YPxx2J2XcfmWowlKwtCDwiQ5hA==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 - stylehacks: 6.0.0(postcss@8.4.31) + stylehacks: 6.0.1(postcss@8.4.32) dev: true - /postcss-merge-rules@6.0.1(postcss@8.4.31): + /postcss-merge-rules@6.0.2(postcss@8.4.32): resolution: { - integrity: sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==, + integrity: sha512-6lm8bl0UfriSfxI+F/cezrebqqP8w702UC6SjZlUlBYwuRVNbmgcJuQU7yePIvD4MNT53r/acQCUAyulrpgmeQ==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - browserslist: 4.21.10 + browserslist: 4.22.1 caniuse-api: 3.0.0 - cssnano-utils: 4.0.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 4.0.1(postcss@8.4.32) + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-minify-font-values@6.0.0(postcss@8.4.31): + /postcss-minify-font-values@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==, + integrity: sha512-tIwmF1zUPoN6xOtA/2FgVk1ZKrLcCvE0dpZLtzyyte0j9zUeB8RTbCqrHZGjJlxOvNWKMYtunLrrl7HPOiR46w==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients@6.0.0(postcss@8.4.31): + /postcss-minify-gradients@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==, + integrity: sha512-M1RJWVjd6IOLPl1hYiOd5HQHgpp6cvJVLrieQYS9y07Yo8itAr6jaekzJphaJFR0tcg4kRewCk3kna9uHBxn/w==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: colord: 2.9.3 - cssnano-utils: 4.0.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 4.0.1(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params@6.0.0(postcss@8.4.31): + /postcss-minify-params@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==, + integrity: sha512-eFvGWArqh4khPIgPDu6SZNcaLctx97nO7c59OXnRtGntAp5/VS4gjMhhW9qUFsK6mQ27pEZGt2kR+mPizI+Z9g==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - browserslist: 4.21.10 - cssnano-utils: 4.0.0(postcss@8.4.31) - postcss: 8.4.31 + browserslist: 4.22.1 + cssnano-utils: 4.0.1(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-selectors@6.0.0(postcss@8.4.31): + /postcss-minify-selectors@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==, + integrity: sha512-mfReq5wrS6vkunxvJp6GDuOk+Ak6JV7134gp8L+ANRnV9VwqzTvBtX6lpohooVU750AR0D3pVx2Zn6uCCwOAfQ==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-nested@5.0.6(postcss@8.4.31): + /postcss-nested@5.0.6(postcss@8.4.32): resolution: { integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, @@ -10497,11 +10297,11 @@ packages: peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: false - /postcss-nested@6.0.1(postcss@8.4.31): + /postcss-nested@6.0.1(postcss@8.4.32): resolution: { integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, @@ -10510,142 +10310,142 @@ packages: peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-nesting@12.0.1(postcss@8.4.31): + /postcss-nesting@12.0.2(postcss@8.4.32): resolution: { - integrity: sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==, + integrity: sha512-63PpJHSeNs93S3ZUIyi+7kKx4JqOIEJ6QYtG3x+0qA4J03+4n0iwsyA1GAHyWxsHYljQS4/4ZK1o2sMi70b5wQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) - postcss: 8.4.31 + "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.13) + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-normalize-charset@6.0.0(postcss@8.4.31): + /postcss-normalize-charset@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==, + integrity: sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-normalize-display-values@6.0.0(postcss@8.4.31): + /postcss-normalize-display-values@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==, + integrity: sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions@6.0.0(postcss@8.4.31): + /postcss-normalize-positions@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==, + integrity: sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style@6.0.0(postcss@8.4.31): + /postcss-normalize-repeat-style@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==, + integrity: sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string@6.0.0(postcss@8.4.31): + /postcss-normalize-string@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==, + integrity: sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions@6.0.0(postcss@8.4.31): + /postcss-normalize-timing-functions@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==, + integrity: sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode@6.0.0(postcss@8.4.31): + /postcss-normalize-unicode@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==, + integrity: sha512-ok9DsI94nEF79MkvmLfHfn8ddnKXA7w+8YuUoz5m7b6TOdoaRCpvu/QMHXQs9+DwUbvp+ytzz04J55CPy77PuQ==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - browserslist: 4.21.10 - postcss: 8.4.31 + browserslist: 4.22.1 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url@6.0.0(postcss@8.4.31): + /postcss-normalize-url@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==, + integrity: sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace@6.0.0(postcss@8.4.31): + /postcss-normalize-whitespace@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==, + integrity: sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-opacity-percentage@2.0.0(postcss@8.4.31): + /postcss-opacity-percentage@2.0.0(postcss@8.4.32): resolution: { integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==, @@ -10654,24 +10454,24 @@ packages: peerDependencies: postcss: ^8.2 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-ordered-values@6.0.0(postcss@8.4.31): + /postcss-ordered-values@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==, + integrity: sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - cssnano-utils: 4.0.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 4.0.1(postcss@8.4.32) + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-overflow-shorthand@5.0.0(postcss@8.4.31): + /postcss-overflow-shorthand@5.0.0(postcss@8.4.32): resolution: { integrity: sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==, @@ -10680,11 +10480,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-page-break@3.0.4(postcss@8.4.31): + /postcss-page-break@3.0.4(postcss@8.4.32): resolution: { integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, @@ -10692,10 +10492,10 @@ packages: peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-place@9.0.0(postcss@8.4.31): + /postcss-place@9.0.0(postcss@8.4.32): resolution: { integrity: sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==, @@ -10704,11 +10504,11 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.3.0(postcss@8.4.31): + /postcss-preset-env@9.3.0(postcss@8.4.32): resolution: { integrity: sha512-ycw6doPrqV6QxDCtgiyGDef61bEfiSc59HGM4gOw/wxQxmKnhuEery61oOC/5ViENz/ycpRsuhTexs1kUBTvVw==, @@ -10717,70 +10517,70 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-cascade-layers": 4.0.1(postcss@8.4.31) - "@csstools/postcss-color-function": 3.0.7(postcss@8.4.31) - "@csstools/postcss-color-mix-function": 2.0.7(postcss@8.4.31) - "@csstools/postcss-exponential-functions": 1.0.1(postcss@8.4.31) - "@csstools/postcss-font-format-keywords": 3.0.0(postcss@8.4.31) - "@csstools/postcss-gamut-mapping": 1.0.0(postcss@8.4.31) - "@csstools/postcss-gradients-interpolation-method": 4.0.7(postcss@8.4.31) - "@csstools/postcss-hwb-function": 3.0.6(postcss@8.4.31) - "@csstools/postcss-ic-unit": 3.0.2(postcss@8.4.31) - "@csstools/postcss-initial": 1.0.0(postcss@8.4.31) - "@csstools/postcss-is-pseudo-class": 4.0.3(postcss@8.4.31) - "@csstools/postcss-logical-float-and-clear": 2.0.0(postcss@8.4.31) - "@csstools/postcss-logical-overflow": 1.0.0(postcss@8.4.31) - "@csstools/postcss-logical-overscroll-behavior": 1.0.0(postcss@8.4.31) - "@csstools/postcss-logical-resize": 2.0.0(postcss@8.4.31) - "@csstools/postcss-logical-viewport-units": 2.0.3(postcss@8.4.31) - "@csstools/postcss-media-minmax": 1.1.0(postcss@8.4.31) - "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.3(postcss@8.4.31) - "@csstools/postcss-nested-calc": 3.0.0(postcss@8.4.31) - "@csstools/postcss-normalize-display-values": 3.0.1(postcss@8.4.31) - "@csstools/postcss-oklab-function": 3.0.7(postcss@8.4.31) - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.31) - "@csstools/postcss-relative-color-syntax": 2.0.7(postcss@8.4.31) - "@csstools/postcss-scope-pseudo-class": 3.0.0(postcss@8.4.31) - "@csstools/postcss-stepped-value-functions": 3.0.2(postcss@8.4.31) - "@csstools/postcss-text-decoration-shorthand": 3.0.3(postcss@8.4.31) - "@csstools/postcss-trigonometric-functions": 3.0.2(postcss@8.4.31) - "@csstools/postcss-unset-value": 3.0.0(postcss@8.4.31) - autoprefixer: 10.4.16(postcss@8.4.31) + "@csstools/postcss-cascade-layers": 4.0.1(postcss@8.4.32) + "@csstools/postcss-color-function": 3.0.7(postcss@8.4.32) + "@csstools/postcss-color-mix-function": 2.0.7(postcss@8.4.32) + "@csstools/postcss-exponential-functions": 1.0.1(postcss@8.4.32) + "@csstools/postcss-font-format-keywords": 3.0.0(postcss@8.4.32) + "@csstools/postcss-gamut-mapping": 1.0.0(postcss@8.4.32) + "@csstools/postcss-gradients-interpolation-method": 4.0.7(postcss@8.4.32) + "@csstools/postcss-hwb-function": 3.0.6(postcss@8.4.32) + "@csstools/postcss-ic-unit": 3.0.2(postcss@8.4.32) + "@csstools/postcss-initial": 1.0.0(postcss@8.4.32) + "@csstools/postcss-is-pseudo-class": 4.0.3(postcss@8.4.32) + "@csstools/postcss-logical-float-and-clear": 2.0.0(postcss@8.4.32) + "@csstools/postcss-logical-overflow": 1.0.0(postcss@8.4.32) + "@csstools/postcss-logical-overscroll-behavior": 1.0.0(postcss@8.4.32) + "@csstools/postcss-logical-resize": 2.0.0(postcss@8.4.32) + "@csstools/postcss-logical-viewport-units": 2.0.3(postcss@8.4.32) + "@csstools/postcss-media-minmax": 1.1.0(postcss@8.4.32) + "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.3(postcss@8.4.32) + "@csstools/postcss-nested-calc": 3.0.0(postcss@8.4.32) + "@csstools/postcss-normalize-display-values": 3.0.1(postcss@8.4.32) + "@csstools/postcss-oklab-function": 3.0.7(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-relative-color-syntax": 2.0.7(postcss@8.4.32) + "@csstools/postcss-scope-pseudo-class": 3.0.0(postcss@8.4.32) + "@csstools/postcss-stepped-value-functions": 3.0.2(postcss@8.4.32) + "@csstools/postcss-text-decoration-shorthand": 3.0.3(postcss@8.4.32) + "@csstools/postcss-trigonometric-functions": 3.0.2(postcss@8.4.32) + "@csstools/postcss-unset-value": 3.0.0(postcss@8.4.32) + autoprefixer: 10.4.16(postcss@8.4.32) browserslist: 4.22.1 - css-blank-pseudo: 6.0.0(postcss@8.4.31) - css-has-pseudo: 6.0.0(postcss@8.4.31) - css-prefers-color-scheme: 9.0.0(postcss@8.4.31) + css-blank-pseudo: 6.0.0(postcss@8.4.32) + css-has-pseudo: 6.0.0(postcss@8.4.32) + css-prefers-color-scheme: 9.0.0(postcss@8.4.32) cssdb: 7.9.0 - postcss: 8.4.31 - postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.31) - postcss-clamp: 4.1.0(postcss@8.4.31) - postcss-color-functional-notation: 6.0.2(postcss@8.4.31) - postcss-color-hex-alpha: 9.0.2(postcss@8.4.31) - postcss-color-rebeccapurple: 9.0.1(postcss@8.4.31) - postcss-custom-media: 10.0.2(postcss@8.4.31) - postcss-custom-properties: 13.3.2(postcss@8.4.31) - postcss-custom-selectors: 7.1.6(postcss@8.4.31) - postcss-dir-pseudo-class: 8.0.0(postcss@8.4.31) - postcss-double-position-gradients: 5.0.2(postcss@8.4.31) - postcss-focus-visible: 9.0.0(postcss@8.4.31) - postcss-focus-within: 8.0.0(postcss@8.4.31) - postcss-font-variant: 5.0.0(postcss@8.4.31) - postcss-gap-properties: 5.0.0(postcss@8.4.31) - postcss-image-set-function: 6.0.1(postcss@8.4.31) - postcss-lab-function: 6.0.7(postcss@8.4.31) - postcss-logical: 7.0.0(postcss@8.4.31) - postcss-nesting: 12.0.1(postcss@8.4.31) - postcss-opacity-percentage: 2.0.0(postcss@8.4.31) - postcss-overflow-shorthand: 5.0.0(postcss@8.4.31) - postcss-page-break: 3.0.4(postcss@8.4.31) - postcss-place: 9.0.0(postcss@8.4.31) - postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.31) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.31) - postcss-selector-not: 7.0.1(postcss@8.4.31) + postcss: 8.4.32 + postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.32) + postcss-clamp: 4.1.0(postcss@8.4.32) + postcss-color-functional-notation: 6.0.2(postcss@8.4.32) + postcss-color-hex-alpha: 9.0.2(postcss@8.4.32) + postcss-color-rebeccapurple: 9.0.1(postcss@8.4.32) + postcss-custom-media: 10.0.2(postcss@8.4.32) + postcss-custom-properties: 13.3.2(postcss@8.4.32) + postcss-custom-selectors: 7.1.6(postcss@8.4.32) + postcss-dir-pseudo-class: 8.0.0(postcss@8.4.32) + postcss-double-position-gradients: 5.0.2(postcss@8.4.32) + postcss-focus-visible: 9.0.0(postcss@8.4.32) + postcss-focus-within: 8.0.0(postcss@8.4.32) + postcss-font-variant: 5.0.0(postcss@8.4.32) + postcss-gap-properties: 5.0.0(postcss@8.4.32) + postcss-image-set-function: 6.0.1(postcss@8.4.32) + postcss-lab-function: 6.0.7(postcss@8.4.32) + postcss-logical: 7.0.0(postcss@8.4.32) + postcss-nesting: 12.0.2(postcss@8.4.32) + postcss-opacity-percentage: 2.0.0(postcss@8.4.32) + postcss-overflow-shorthand: 5.0.0(postcss@8.4.32) + postcss-page-break: 3.0.4(postcss@8.4.32) + postcss-place: 9.0.0(postcss@8.4.32) + postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.32) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.32) + postcss-selector-not: 7.0.1(postcss@8.4.32) postcss-value-parser: 4.2.0 dev: true - /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.31): + /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.32): resolution: { integrity: sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==, @@ -10789,38 +10589,38 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /postcss-reduce-initial@6.0.0(postcss@8.4.31): + /postcss-reduce-initial@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==, + integrity: sha512-cgzsI2ThG1PMSdSyM9A+bVxiiVgPIVz9f5c6H+TqEv0CA89iCOO81mwLWRWLgOKFtQkKob9nNpnkxG/1RlgFcA==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - browserslist: 4.21.10 + browserslist: 4.22.1 caniuse-api: 3.0.0 - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-reduce-transforms@6.0.0(postcss@8.4.31): + /postcss-reduce-transforms@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==, + integrity: sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.31): + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.32): resolution: { integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, @@ -10828,10 +10628,10 @@ packages: peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-reporter@7.0.5(postcss@8.4.31): + /postcss-reporter@7.0.5(postcss@8.4.32): resolution: { integrity: sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==, @@ -10841,7 +10641,7 @@ packages: postcss: ^8.1.0 dependencies: picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.32 thenby: 1.3.4 dev: true @@ -10852,19 +10652,19 @@ packages: } dev: true - /postcss-safe-parser@6.0.0(postcss@8.4.31): + /postcss-safe-parser@7.0.0(postcss@8.4.32): resolution: { - integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==, + integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==, } - engines: { node: ">=12.0" } + engines: { node: ">=18.0" } peerDependencies: - postcss: ^8.3.3 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 dev: true - /postcss-selector-not@7.0.1(postcss@8.4.31): + /postcss-selector-not@7.0.1(postcss@8.4.32): resolution: { integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==, @@ -10873,7 +10673,7 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true @@ -10898,30 +10698,30 @@ packages: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-svgo@6.0.0(postcss@8.4.31): + /postcss-svgo@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==, + integrity: sha512-eWV4Rrqa06LzTgqirOv5Ln6WTGyU7Pbeqj9WEyKo9tpnWixNATVJMeaEcOHOW1ZYyjcG8wSJwX/28DvU3oy3HA==, } engines: { node: ^14 || ^16 || >= 18 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-value-parser: 4.2.0 - svgo: 3.0.4 + svgo: 3.1.0 dev: true - /postcss-unique-selectors@6.0.0(postcss@8.4.31): + /postcss-unique-selectors@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==, + integrity: sha512-/KCCEpNNR7oXVJ38/Id7GC9Nt0zxO1T3zVbhVaq6F6LSG+3gU3B7+QuTHfD0v8NPEHlzewAout29S0InmB78EQ==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - postcss: 8.4.31 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true @@ -10932,14 +10732,14 @@ packages: } dev: true - /postcss@8.4.31: + /postcss@8.4.32: resolution: { - integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, + integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==, } engines: { node: ^10 || ^12 || >=14 } dependencies: - nanoid: 3.3.6 + nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 @@ -10969,7 +10769,7 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-organize-imports@3.2.4(prettier@2.8.8)(typescript@5.3.2): + /prettier-plugin-organize-imports@3.2.4(prettier@2.8.8)(typescript@5.3.3): resolution: { integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==, @@ -10986,7 +10786,7 @@ packages: optional: true dependencies: prettier: 2.8.8 - typescript: 5.3.2 + typescript: 5.3.3 dev: true /prettier@2.8.8: @@ -11142,18 +10942,6 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg-up@8.0.0: - resolution: - { - integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==, - } - engines: { node: ">=12" } - dependencies: - find-up: 5.0.0 - read-pkg: 6.0.0 - type-fest: 1.4.0 - dev: true - /read-pkg@5.2.0: resolution: { @@ -11167,19 +10955,6 @@ packages: type-fest: 0.6.0 dev: true - /read-pkg@6.0.0: - resolution: - { - integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==, - } - engines: { node: ">=12" } - dependencies: - "@types/normalize-package-data": 2.4.4 - normalize-package-data: 3.0.3 - parse-json: 5.2.0 - type-fest: 1.4.0 - dev: true - /read-pkg@9.0.0: resolution: { @@ -11240,17 +11015,6 @@ packages: strip-indent: 3.0.0 dev: true - /redent@4.0.0: - resolution: - { - integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==, - } - engines: { node: ">=12" } - dependencies: - indent-string: 5.0.0 - strip-indent: 4.0.0 - dev: true - /redeyed@2.1.1: resolution: { @@ -11655,21 +11419,21 @@ packages: get-assigned-identifiers: 1.2.0 dev: false - /semantic-release@22.0.8: + /semantic-release@22.0.12(typescript@5.3.3): resolution: { - integrity: sha512-55rb31jygqIYsGU/rY+gXXm2fnxBIWo9azOjxbqKsPnq7p70zwZ5v+xnD7TxJC+zvS3sy1eHLGXYWCaX3WI76A==, + integrity: sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==, } engines: { node: ^18.17 || >=20.6.1 } hasBin: true dependencies: - "@semantic-release/commit-analyzer": 11.1.0(semantic-release@22.0.8) + "@semantic-release/commit-analyzer": 11.1.0(semantic-release@22.0.12) "@semantic-release/error": 4.0.0 - "@semantic-release/github": 9.0.4(semantic-release@22.0.8) - "@semantic-release/npm": 11.0.1(semantic-release@22.0.8) - "@semantic-release/release-notes-generator": 12.1.0(semantic-release@22.0.8) + "@semantic-release/github": 9.0.4(semantic-release@22.0.12) + "@semantic-release/npm": 11.0.1(semantic-release@22.0.12) + "@semantic-release/release-notes-generator": 12.1.0(semantic-release@22.0.12) aggregate-error: 5.0.0 - cosmiconfig: 8.2.0 + cosmiconfig: 8.3.6(typescript@5.3.3) debug: 4.3.4 env-ci: 10.0.0 execa: 8.0.1 @@ -11694,6 +11458,7 @@ packages: yargs: 17.7.2 transitivePeerDependencies: - supports-color + - typescript dev: true /semver-diff@4.0.0: @@ -11877,6 +11642,17 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true + /slice-ansi@7.1.0: + resolution: + { + integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==, + } + engines: { node: ">=18" } + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + /source-map-js@1.0.2: resolution: { @@ -12081,15 +11857,15 @@ packages: strip-ansi: 6.0.1 dev: true - /string-width@5.1.2: + /string-width@7.0.0: resolution: { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==, } - engines: { node: ">=12" } + engines: { node: ">=18" } dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 dev: true @@ -12242,16 +12018,6 @@ packages: min-indent: 1.0.1 dev: true - /strip-indent@4.0.0: - resolution: - { - integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==, - } - engines: { node: ">=12" } - dependencies: - min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: resolution: { @@ -12275,102 +12041,94 @@ packages: } dev: false - /style-search@0.1.0: + /stylehacks@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==, - } - dev: true - - /stylehacks@6.0.0(postcss@8.4.31): - resolution: - { - integrity: sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==, + integrity: sha512-jTqG2aIoX2fYg0YsGvqE4ooE/e75WmaEjnNiP6Ag7irLtHxML8NJRxRxS0HyDpde8DRGuEXTFVHVfR5Tmbxqzg==, } engines: { node: ^14 || ^16 || >=18.0 } peerDependencies: - postcss: ^8.2.15 + postcss: ^8.4.31 dependencies: - browserslist: 4.21.10 - postcss: 8.4.31 + browserslist: 4.22.1 + postcss: 8.4.32 postcss-selector-parser: 6.0.13 dev: true - /stylelint-config-recommended@13.0.0(stylelint@15.11.0): + /stylelint-config-recommended@14.0.0(stylelint@16.0.2): resolution: { - integrity: sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==, + integrity: sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==, } - engines: { node: ^14.13.1 || >=16.0.0 } + engines: { node: ">=18.12.0" } peerDependencies: - stylelint: ^15.10.0 + stylelint: ^16.0.0 dependencies: - stylelint: 15.11.0 + stylelint: 16.0.2(typescript@5.3.3) dev: true - /stylelint-config-standard@34.0.0(stylelint@15.11.0): + /stylelint-config-standard@35.0.0(stylelint@16.0.2): resolution: { - integrity: sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==, + integrity: sha512-JyQrNZk2BZwVKFauGGxW2U6RuhIfQ4XoHHo+rBzMHcAkLnwI/knpszwXjzxiMgSfcxbZBckM7Vq4LHoANTR85g==, } - engines: { node: ^14.13.1 || >=16.0.0 } + engines: { node: ">=18.12.0" } peerDependencies: - stylelint: ^15.10.0 + stylelint: ^16.0.0 dependencies: - stylelint: 15.11.0 - stylelint-config-recommended: 13.0.0(stylelint@15.11.0) + stylelint: 16.0.2(typescript@5.3.3) + stylelint-config-recommended: 14.0.0(stylelint@16.0.2) dev: true - /stylelint@15.11.0: + /stylelint@16.0.2(typescript@5.3.3): resolution: { - integrity: sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==, + integrity: sha512-SxA/rg3VWxdoHZlW0nmVueWO1E7TAKW4W6mmA3iTxxEF9bIeQdFZu2oiBlQYyNe1pGnOamOqo2XYnI7cs5Bgow==, } - engines: { node: ^14.13.1 || >=16.0.0 } + engines: { node: ">=18.12.0" } hasBin: true dependencies: - "@csstools/css-parser-algorithms": 2.3.1(@csstools/css-tokenizer@2.2.1) - "@csstools/css-tokenizer": 2.2.1 - "@csstools/media-query-list-parser": 2.1.4(@csstools/css-parser-algorithms@2.3.1)(@csstools/css-tokenizer@2.2.1) + "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 8.2.0 + cosmiconfig: 9.0.0(typescript@5.3.3) css-functions-list: 3.2.1 css-tree: 2.3.1 debug: 4.3.4 - fast-glob: 3.3.1 + fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 - file-entry-cache: 7.0.1 + file-entry-cache: 7.0.2 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 html-tags: 3.3.1 - ignore: 5.2.4 - import-lazy: 4.0.0 + ignore: 5.3.0 imurmurhash: 0.1.4 is-plain-object: 5.0.0 known-css-properties: 0.29.0 mathml-tag-names: 2.1.3 - meow: 10.1.5 + meow: 12.1.1 micromatch: 4.0.5 normalize-path: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.32 postcss-resolve-nested-selector: 0.1.1 - postcss-safe-parser: 6.0.0(postcss@8.4.31) + postcss-safe-parser: 7.0.0(postcss@8.4.32) postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 string-width: 4.2.3 - strip-ansi: 6.0.1 - style-search: 0.1.0 + strip-ansi: 7.1.0 supports-hyperlinks: 3.0.0 svg-tags: 1.0.0 table: 6.8.1 write-file-atomic: 5.0.1 transitivePeerDependencies: - supports-color + - typescript dev: true /sucrase@3.34.0: @@ -12435,10 +12193,10 @@ packages: } dev: true - /svgo@3.0.4: + /svgo@3.1.0: resolution: { - integrity: sha512-T+Xul3JwuJ6VGXKo/p2ndqx1ibxNKnLTvRc1ZTWKCfyKS/GgNjRZcYsK84fxTsy/izr91g/Rwx6fGnVgaFSI5g==, + integrity: sha512-R5SnNA89w1dYgNv570591F66v34b3eQShpIBcQtZtM5trJwm1VvxbIoMpRYY3ybTAutcKTLEmTsdnaknOHbiQA==, } engines: { node: ">=14.0.0" } hasBin: true @@ -12466,10 +12224,10 @@ packages: strip-ansi: 6.0.1 dev: true - /tailwindcss@3.3.5: + /tailwindcss@3.4.0: resolution: { - integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==, + integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==, } engines: { node: ">=14.0.0" } hasBin: true @@ -12479,7 +12237,7 @@ packages: chokidar: 3.5.3 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.1 + fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.19.3 @@ -12488,11 +12246,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.31 - postcss-import: 15.1.0(postcss@8.4.31) - postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.1(postcss@8.4.31) - postcss-nested: 6.0.1(postcss@8.4.31) + postcss: 8.4.32 + postcss-import: 15.1.0(postcss@8.4.32) + postcss-js: 4.0.1(postcss@8.4.32) + postcss-load-config: 4.0.1(postcss@8.4.32) + postcss-nested: 6.0.1(postcss@8.4.32) postcss-selector-parser: 6.0.13 resolve: 1.22.4 sucrase: 3.34.0 @@ -12694,15 +12452,7 @@ packages: engines: { node: ">=8" } dev: true - /trim-newlines@4.1.1: - resolution: - { - integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==, - } - engines: { node: ">=12" } - dev: true - - /ts-api-utils@1.0.2(typescript@5.3.2): + /ts-api-utils@1.0.2(typescript@5.3.3): resolution: { integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==, @@ -12711,7 +12461,7 @@ packages: peerDependencies: typescript: ">=4.2.0" dependencies: - typescript: 5.3.2 + typescript: 5.3.3 dev: true /ts-interface-checker@0.1.13: @@ -12905,10 +12655,10 @@ packages: } dev: false - /typescript@5.3.2: + /typescript@5.3.3: resolution: { - integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==, + integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, } engines: { node: ">=14.17" } hasBin: true @@ -12942,6 +12692,7 @@ packages: { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, } + requiresBuild: true dev: true /unicode-canonical-property-names-ecmascript@2.0.0: @@ -13058,20 +12809,6 @@ packages: engines: { node: ">=4" } dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: - { - integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==, - } - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" - dependencies: - browserslist: 4.21.10 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: { @@ -13126,10 +12863,10 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-plugin-pwa@0.17.2(vite@5.0.4)(workbox-build@7.0.0)(workbox-window@7.0.0): + /vite-plugin-pwa@0.17.4(vite@5.0.10)(workbox-build@7.0.0)(workbox-window@7.0.0): resolution: { - integrity: sha512-aVH9sxcTDumiWYiNcLrFqu+FdL79I2cT5EhlVe5V6nGcC64yQNGT1jamMytwi+OdfXl4VYic0LtoJ6JHMkM3ZQ==, + integrity: sha512-j9iiyinFOYyof4Zk3Q+DtmYyDVBDAi6PuMGNGq6uGI0pw7E+LNm9e+nQ2ep9obMP/kjdWwzilqUrlfVRj9OobA==, } engines: { node: ">=16.0.0" } peerDependencies: @@ -13140,17 +12877,17 @@ packages: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.0.4(@types/node@18.18.9) + vite: 5.0.10(@types/node@18.18.9) workbox-build: 7.0.0 workbox-window: 7.0.0 transitivePeerDependencies: - supports-color dev: true - /vite@5.0.4(@types/node@18.18.9): + /vite@5.0.10(@types/node@18.18.9): resolution: { - integrity: sha512-RzAr8LSvM8lmhB4tQ5OPcBhpjOZRZjuxv9zO5UcxeoY2bd3kP3Ticd40Qma9/BqZ8JS96Ll/jeBX9u+LJZrhVg==, + integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==, } engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true @@ -13180,7 +12917,7 @@ packages: dependencies: "@types/node": 18.18.9 esbuild: 0.19.5 - postcss: 8.4.31 + postcss: 8.4.32 rollup: 4.4.1 optionalDependencies: fsevents: 2.3.3 @@ -13193,10 +12930,10 @@ packages: } dev: false - /wavesurfer.js@7.4.12: + /wavesurfer.js@7.5.3: resolution: { - integrity: sha512-KzH4LkcOp8LECs9cOVIPBl6vsSoICKuZz+v5kh/zvxilpaVszU+QKC+4s2KEAqcCxBCecg3cNSg4RqAx278F8g==, + integrity: sha512-nYK6svXBJaQAuIOa9YQ69njwRs8OnD1FkGE0uVRVuci2STQGsaEVJg13NEr3X02lXAh1ggllwqbh3JLcpG9c9A==, } dev: false @@ -13531,15 +13268,15 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi@8.1.0: + /wrap-ansi@9.0.0: resolution: { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, } - engines: { node: ">=12" } + engines: { node: ">=18" } dependencies: ansi-styles: 6.2.1 - string-width: 5.1.2 + string-width: 7.0.0 strip-ansi: 7.1.0 dev: true @@ -13624,14 +13361,6 @@ packages: } dev: true - /yaml@2.3.1: - resolution: - { - integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==, - } - engines: { node: ">= 14" } - dev: true - /yaml@2.3.4: resolution: { From af6fe1e4efcf7983e7d3b86dc9c7364028b4e6b8 Mon Sep 17 00:00:00 2001 From: crowdin Date: Thu, 21 Dec 2023 15:57:44 +0000 Subject: [PATCH 258/477] chore(i18n): new Crowdin updates + sync composer.lock file using composer update --- app/Language/gl/Podcast.php | 2 +- composer.lock | 16 +- docs/src/sk/getting-started/install.md | 6 +- docs/src/sk/getting-started/security.md | 2 +- docs/src/sk/getting-started/update.md | 4 +- docs/src/sk/index.md | 4 +- docs/src/sr_Latn/getting-started/docker.md | 145 ++++----- docs/src/sr_Latn/getting-started/install.md | 187 ++++++------ docs/src/sr_Latn/getting-started/security.md | 27 +- docs/src/sr_Latn/getting-started/update.md | 112 ++++--- docs/src/sr_Latn/index.md | 282 +++++++++--------- modules/Admin/Language/da/AboutCastopod.php | 12 +- modules/Admin/Language/gl/Breadcrumb.php | 4 +- modules/Admin/Language/gl/Common.php | 2 +- modules/Admin/Language/gl/Countries.php | 6 +- modules/Admin/Language/gl/Platforms.php | 20 +- modules/Admin/Language/gl/Podcast.php | 50 ++-- modules/Admin/Language/sk/Common.php | 2 +- modules/Admin/Language/sk/Page.php | 4 +- modules/Admin/Language/sk/Platforms.php | 8 +- modules/Admin/Language/sk/Podcast.php | 48 +-- .../Admin/Language/sk/PodcastNavigation.php | 8 +- modules/Admin/Language/sk/Settings.php | 12 +- modules/Admin/Language/sk/Soundbite.php | 14 +- modules/Admin/Language/sk/VideoClip.php | 10 +- .../Language/sr_Latn/PodcastNavigation.php | 2 +- modules/Auth/Language/da/Contributor.php | 48 +-- modules/Install/Language/sk/Install.php | 18 +- 28 files changed, 530 insertions(+), 525 deletions(-) diff --git a/app/Language/gl/Podcast.php b/app/Language/gl/Podcast.php index 84e71982..9ceb5331 100644 --- a/app/Language/gl/Podcast.php +++ b/app/Language/gl/Podcast.php @@ -51,5 +51,5 @@ return [ other {# persoas} }', 'persons_list' => 'Persoas', - 'castopod_website' => 'Castopod (website)', + 'castopod_website' => 'Castopod (sitio web)', ]; diff --git a/composer.lock b/composer.lock index 9618a1d1..5622644a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "52c31397606207e9d7f5f459c9ee9c8e", + "content-hash": "2127030d8f3ed9c557e03a6ea20f11e2", "packages": [ { "name": "adaures/ipcat-php", @@ -4053,23 +4053,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.10", + "version": "10.1.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "599109c8ca6bae97b23482d557d2874c25a65e59" + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/599109c8ca6bae97b23482d557d2874c25a65e59", - "reference": "599109c8ca6bae97b23482d557d2874c25a65e59", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1", "phpunit/php-file-iterator": "^4.0", "phpunit/php-text-template": "^3.0", @@ -4111,7 +4111,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.10" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" }, "funding": [ { @@ -4119,7 +4119,7 @@ "type": "github" } ], - "time": "2023-12-11T06:28:43+00:00" + "time": "2023-12-21T15:38:30+00:00" }, { "name": "phpunit/php-file-iterator", diff --git a/docs/src/sk/getting-started/install.md b/docs/src/sk/getting-started/install.md index cdea18ec..6caca438 100644 --- a/docs/src/sk/getting-started/install.md +++ b/docs/src/sk/getting-started/install.md @@ -1,5 +1,5 @@ --- -title: Installation +title: Inštalácia sidebarDepth: 3 --- @@ -25,7 +25,7 @@ If you prefer using Docker, you may skip this and go straight to the - An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's incoming requests -### PHP v8.1 or higher +### PHP v8.1, alebo vyššia PHP version 8.1 or higher is required, with the following extensions installed: @@ -113,7 +113,7 @@ want to generate Video Clips. The following extensions must be installed: 1. Run the Castopod install script by going to the install wizard page (`https://your_domain_name.com/cp-install`) in your favorite web browser. 2. Follow the instructions on your screen. -3. Start podcasting! +3. Začať podcastovať! ::: info Note diff --git a/docs/src/sk/getting-started/security.md b/docs/src/sk/getting-started/security.md index e205698d..d752add8 100644 --- a/docs/src/sk/getting-started/security.md +++ b/docs/src/sk/getting-started/security.md @@ -1,5 +1,5 @@ --- -title: Security +title: Zabezpečenie --- # Security concerns diff --git a/docs/src/sk/getting-started/update.md b/docs/src/sk/getting-started/update.md index 98e019fb..1c840346 100644 --- a/docs/src/sk/getting-started/update.md +++ b/docs/src/sk/getting-started/update.md @@ -1,9 +1,9 @@ --- -title: Update +title: Aktualizácia sidebarDepth: 3 --- -# How to update Castopod? +# Ako aktualizovať Castopod? After installing Castopod, you may want to update your instance to the latest version in order to enjoy the latest features ✨, bug fixes 🐛 and performance diff --git a/docs/src/sk/index.md b/docs/src/sk/index.md index 42ec8ed0..53630d69 100644 --- a/docs/src/sk/index.md +++ b/docs/src/sk/index.md @@ -55,7 +55,7 @@ small footprint. Brazilian Portuguese & Spanish… with [more to come](https://translate.castopod.org)! -## Motivation +## Motivácia The podcasting ecosystem is decentralized by nature: you can create your podcast as an RSS file, publish it on the web and have it shared everywhere online. @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/sr_Latn/getting-started/docker.md b/docs/src/sr_Latn/getting-started/docker.md index 75158bd6..b73daca5 100644 --- a/docs/src/sr_Latn/getting-started/docker.md +++ b/docs/src/sr_Latn/getting-started/docker.md @@ -1,35 +1,35 @@ --- -title: Official Docker images +title: Zvanične Docker slike sidebarDepth: 3 --- -# Official Docker images +# Zvanične Docker slike -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: +Castopod gura 3 Docker slike u Docker Hub tokom njegovog automatizovanog procesa +izrade: -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - with all of Castopod dependencies -- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - Nginx configuration for Castopod +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): sve u + jednoj castopod slici koristeći ngink jedinicu +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): paket aplikacija + sa svim Castopod zavisnostima +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): + Nginx konfiguracija za Castopod -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. +Pored toga, Castopod zahteva MySQL kompatibilnu bazu podataka. Redis baza +podataka može se dodati kao obrađivač keša. -## Supported tags +## Podržani tagovi -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) +- `develop` [nestabilno], najnoviji razvojni ogranak +- `beta` [stabilno], poslednja beta verzija +- `latest` [stabilno], poslednja verzija +- `1.x.x` [stabilno], specifična verzija (od `1.0.0`) -## Example usage +## Primer upotrebe -1. Install [docker](https://docs.docker.com/get-docker/) and +1. Instalirajte [docker](https://docs.docker.com/get-docker/) i [docker-compose](https://docs.docker.com/compose/install/) -2. Create a `docker-compose.yml` file with the following: +2. Napravite `docker-compose.yml` datoteku sa sledećim: ```yml version: "3.7" @@ -87,13 +87,13 @@ can be added as a cache handler. castopod-db: ``` - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + Morate prilagoditi neke varijable svojim potrebama (npr. `CP_BASEURL`, `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). -3. Setup a reverse proxy for TLS (SSL/HTTPS) +3. Podesite obrnuti proksi za TLS (SSL/HTTPS) - TLS is mandatory for ActivityPub to work. This job can easily be handled by - a reverse proxy, for example with [Caddy](https://caddyserver.com/): + TLS je obavezan da bu ActivityPub radio. Ovaj posao se lako može obaviti + obrnutim proksijem, na primer sa [Caddy-ijem](https://caddyserver.com/): ``` #castopod @@ -102,57 +102,58 @@ can be added as a cache handler. } ``` -4. Run `docker-compose up -d`, wait for it to initialize and head on to - `https://castopod.example.com/cp-install` to finish setting up Castopod! +4. Pokrenite `docker-compose up -d`, sačekajte da se pokrene i idite na + `https://castopod.example.com/cp-install` da biste završili instalaciju + Castopod-a! -5. You're all set, start podcasting! 🎙️🚀 +5. Sve je spremno, započnite sa podkastingom! 🎙️🚀 -## Environment Variables +## Promenljive okruženja -- **castopod/castopod** and **castopod/app** +- **castopod/castopod** i **castopod/app** - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | - | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | - | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | - | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | - | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | - | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | - | **`CP_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | - | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | - | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | - | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | - | **`CP_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | + | Naziv promenljive | Vrsta (`uobičajeno`) | Podrazumevano | + | ------------------------------------- | ---------------------------- | ---------------- | + | **`CP_BASEURL`** | string | `nedefinisano` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `nedefinisano` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"datoteka"` ili `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `nedefinisano` | + | **`CP_EMAIL_FROM`** | ?string | `nedefinisano` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` ili `"ssl"`] | `"tls"` | + | **`CP_ENABLE_2FA`** | ?boolean | `nedefinisano` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_KEY`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_REGION`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `nedefinisano` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `nedefinisano` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `nedefinisano` | + | **`CP_DISABLE_HTTPS`** | ?[`0` ili `1`] | `nedefinisano` | + | **`CP_MAX_BODY_SIZE`** | ?number (sa sufiksom) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (sa sufiksom) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | -- **castopod/web-server** +- **castopod/veb server** - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | + | Naziv promenljive | Vrsta | Podrazumevano | + | ---------------------- | --------------------- | ------------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (sa sufiksom) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/sr_Latn/getting-started/install.md b/docs/src/sr_Latn/getting-started/install.md index a95643c2..be94565a 100644 --- a/docs/src/sr_Latn/getting-started/install.md +++ b/docs/src/sr_Latn/getting-started/install.md @@ -55,99 +55,100 @@ februara 2021. ::: -You will need the server hostname, database name, username and password to -complete the installation process. If you do not have these, please contact your -server administrator. +Trebaće vam ime servera, ime baze podataka, korisničko ime i lozinka za završite +proces instalacije. Ako ih nemate, obratite se svom administratoru servera. -#### Privileges +#### Privilegije -User must have at least these privileges on the database for Castopod to work: -`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, -`REFERENCES`, `CREATE VIEW`. +Korisnik mora imati najmanje ove privilegije u bazi podataka da bi Castopod +radio: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, +`UPDATE`, `REFERENCES`, `CREATE VIEW`. -### (Optional) FFmpeg v4.1.8 or higher for Video Clips +### (Opciono) FFmpeg v4.1.8 ili kasnija verzija za video isečke -[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you -want to generate Video Clips. The following extensions must be installed: +[FFmpeg](https://www.ffmpeg.org/) verzija 4.1.8 ili kasnija je neophodna ukoliko +želite da pravite video isečke. Sledeće ekstenzije moraju biti instalirane: -- **FreeType 2** library for +- **FreeType 2** biblioteka za [gd](https://www.php.net/manual/en/image.installation.php). -### (Optional) Other recommendations +### (Opciono) Ostale preporuke -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. +- Redis za bolje performanse keša. +- CDN za keširanje statičnih datoteka i bolje performanse. +- e-mail gateway za izgubljene lozinke. -## Install instructions +## Uputstva za instalaciju -### Pre-requisites +### Preduslovi -0. Get a Web Server with [requirements](#requirements) installed -1. Create a MySQL database for Castopod with a user having access and - modification privileges (for more info, see - [MySQL compatible database](#mysql-compatible-database)). -2. Activate HTTPS on your domain with an _SSL certificate_. -3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto - the web server if you haven’t already. - - ⚠️ Set the web server document root to the `public/` sub-folder within the - `castopod` folder. -4. Add **cron tasks** on your web server for various background processes - (replace the paths accordingly): +0. Nabavite veb server sa instaliranim [preduslovima](#requirements) +1. Napravite MySQL bazu podataka za Castopod sa korisnikom koji ima pristup i + privilegije da modifikuje (za više informacija, pogledajte + [MySQL kompatibilna baza podataka](#mysql-compatible-database)). +2. Aktivirajte HTTPS na vašem domenu sa _SSL sertifikatom_. +3. Preuzmite i otpakujte najnoviji [Castopod Paket](https://castopod.org/) na + veb server ako to već niste uradili. + - ⚠️ Podesite root dokument veb servera na `public/` poddirektorijum u okviru + `castopod` direktorijuma. +4. Dodajte **cron zadatke** na vašem veb serveru za različite zadatke u pozadini + (zamenite staze u skladu sa tim): ```bash * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 ``` - **Note** - If you do not add this cron task, the following Castopod features - will not work: + **Pažnja** - ukoliko ne dodate ovaj cron zadatak, sledeće opcije Castopod-a + neće raditi: - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + - Uvoz podkasta iz postojeće RSS veze + - Objava društvenih aktivnosti vašim pratiocima u Fediverzumu + - Objava epizoda u otvorenim hub-ovima uz pomoć + [WebSub-a](https://en.wikipedia.org/wiki/WebSub) + - Pravljenje video isečaka - + [zahteva FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) -### (recommended) Install Wizard +### (preporučeno) Čarobnjak za instalaciju -1. Run the Castopod install script by going to the install wizard page - (`https://your_domain_name.com/cp-install`) in your favorite web browser. -2. Follow the instructions on your screen. -3. Start podcasting! +1. Pokrenite Castopod-ovu instalacionu skriptu tako što ćete otići na stranicu + čarobnjaka za instalaciju (`https://your_domain_name.com/cp-install`) u važem + omiljenom pretraživaču. +2. Pratite uputstva na ekranu. +3. Počnite sa podkastingom! -::: info Note +::: info Napomena -The install script writes a `.env` file in the package root. If you cannot go -through the install wizard, you can create and edit the `.env` file manually -based on the `.env.example` file. +Instalaciona skripta upisuje `.env` datoteku u root paketa. Ukoliko ne možete da +prođete kroz čarobnjaka za instalaciju, možete sami napraviti i urediti `.env` +datoteku ručno po uzoru na `.env.example` datoteku. ::: -### Using CLI +### Korišćenje CLI -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: +1. Napravite `.env` datoteku u root-u paketa, po uzoru na `.env.example` + datoteku. +2. Inicirajte bazu podataka koristeći: ```sh php spark install:init-database ``` -3. Create the superadmin user using: +3. Napravite super administratora koristeći: ```sh php spark install:create-superadmin ``` -4. Head on to your admin gateway to start podcasting! +4. Idite na vaš administratorski pristup i krenite sa podkastingom! -### Email/SMTP setup +### Podešavanja Elektronske pošte/SMTP-a -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) +Podešavanja elektronske pošte su potrebna kako bi neke opcije radile kako treba +(npr. povratak izgubljene lozinke, slanje uputstava premijum pretplatnicima, …) -You may add your email configuration in your instance's `.env` like so: +Možete dodati konfiguraciju elektronske pošte u vašu `.env` datoteku instance na +sledeći način: ```ini # […] @@ -158,23 +159,24 @@ email.SMTPUser="your_smtp_user" email.SMTPPass="your_smtp_password" ``` -#### Email config options +#### Opcije konfigurisanja elektronske pošte -| Variable name | Type | Default | -| ---------------- | -------------------- | ------------ | -| **`fromEmail`** | string | `undefined` | -| **`fromName`** | string | `"Castopod"` | -| **`SMTPHost`** | string | `undefined` | -| **`SMTPUser`** | string | `undefined` | -| **`SMTPPass`** | string | `undefined` | -| **`SMTPPort`** | number | `25` | -| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +| Naziv promenljive | Vrsta | Podrazumevano | +| ----------------- | --------------------- | -------------- | +| **`fromEmail`** | string | `nedefinisano` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `nedefinisano` | +| **`SMTPUser`** | string | `nedefinisano` | +| **`SMTPPass`** | string | `nedefinisano` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` ili `"ssl"`] | `"tls"` | -### Media storage +### Multimedijalno skladište -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: +Podrazumevano, datoteke se čuvaju u `public/media` direktorijumu koristeći +sistem datoteka. Ukoliko želite da prebacite `media` direktorijum na drugo +mesto, možete to odrediti u svojoj `.env` datoteci na način koji je prikazan +ispod: ```ini # […] @@ -183,13 +185,14 @@ media.root="media" media.storage="/mnt/storage" ``` -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. +U ovom primeru, datoteke će biti sačuvane u /mnt/storage/media direktorijumu. +Obavezno ažurirajte konfiguraciju svog veb servera kako biste odrazili ovu +promenu. ### S3 -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: +Ako više volite da čuvate svoje medijske datoteke na S3 kompatibilnom skladištu, +možete da ga navedete u svojoj `.env` datoteci: ```ini # […] @@ -201,34 +204,34 @@ media.s3.secret="your_s3_secret" media.s3.region="your_s3_region" ``` -#### S3 config options +#### Opcije konfigurisanja S3 skladišta -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | +| Naziv promenljive | Vrsta | Podrazumevano | +| ----------------------- | ------- | -------------- | +| **`endpoint`** | string | `nedefinisano` | +| **`key`** | string | `nedefinisano` | +| **`secret`** | string | `nedefinisano` | +| **`region`** | string | `nedefinisano` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `nedefinisano` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `nedefinisano` | -## Community packages +## Paketi iz zajednice -If you don't want to bother with installing Castopod manually, you may use one -of the packages created and maintained by the open-source community. +Ukoliko ne želite da sami instalirate Castopod ručno, moežete iskoristiti jedan +od paketa koji je napravila i o kome brine zajednica otvorenog koda. -### Install with YunoHost +### Instalirajte sa YunoHost-om -[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux -made up of free and open-source software packages. It manages the hardships of -self-hosting for you. +[YunoHost](https://yunohost.org/) je je distribucija zasnovana na Debian +GNU/Linux-u sačinjena od besplatnih softverskih paketa otvorenog koda. Ona +upravlja teškoćama samo-hostovanje za vas.
    - Install Castopod with YunoHost + Instalirajte Castopod sa YunoHost-om `About` page or by - running: +4. Ažurirajte svoju šemu baze podataka iz vaše `Castopod Admin` > `About` + stranice ili tako što ćete pokrenuti: ```bash php spark castopod:database-update ``` -5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > - `Housekeeping` -6. ✨ Enjoy your fresh instance, you're all done! +5. Očistite keš iz `Castopod Admin` > `Settings` > `general` > `Housekeeping` +6. ✨ Uživajte u svežoj instanci, završili ste! -::: info Note +::: info Napomena -Releases may come with additional update instructions (see -[releases page](https://code.castopod.org/adaures/castopod/-/releases)). +Izdanja mogu doći sa dodatnim uputstvima za ažuriranje (pogledajte +[stranicu izdanja](https://code.castopod.org/adaures/castopod/-/releases)). - cf. - [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + [Nisam ažurirao/la svoju instancu jako dugo… Šta treba da uradim?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) ::: -## Fully Automated updates +## Potpuno automatsko ažuriranje -> Coming soon... 👀 +> Stiže uskoro... 👀 -## Frequently asked questions (FAQ) +## Često postavljana pitanja (česta pitanja) -### Where can I find my Castopod version? +### Gde mogu da pronađem svoju verziju Castopod-a? -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. +Idite na administratorski panel vašeg Castopod-a, verziju možete pronaći u +donjem levom uglu. -Alternatively, you can find the version in the `app > Config > Constants.php` -file. +Alternativno, verziju možete pronaći u `app > Config > Constants.php` datoteci. -### I haven't updated my instance in a long time… What should I do? +### Nisam ažurirao/la svoju instancu veoma dugo… Šta treba da uradim? -No problem! Just get the latest release as described above. Only, when going -through the release instructions (4), perform them sequentially, from the oldest -to the newest. +Nema problema! Samo preuzmite poslednju verziju na način opisan iznad. Samo, +kada idete kroz uputstva izdanja (4), izvodite ih jedno za drugim, od +najstarijih do najnovijih. -> You may want to backup your instance depending on how long you haven't updated -> Castopod. +> Možda ćete želeti da napravite rezervnu kopiju instance u zavisnosti od toga +> koliko dugo niste ažurirali Castopod. -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: +Na primer, ako koristite verziju `v1.0.0-alpha.42` i želite da ažurirate na +verziju `v1.0.0-beta.1`: -0. (highly recommended) Make a backup of your files and database. +0. (toplo preporučujemo) Napravite kopiju važih datoteka i baze podataka. -1. Download the latest release, overwrite your files whilst keeping `.env` and +1. Preuzmite najnovije izdanje, preišite svoje datoteke čuvajući `.env` i `public/media`. -2. Go through each release update instructions sequentially (from oldest to - newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, +2. Prođite kroz uputstva za ažuriranje svakog izdanja po redu (od najstarijeg do + najnovijeg) počevši sa `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. -3. ✨ Enjoy your fresh instance, you're all done! +3. ✨ Uživajte u svežoj instanci, završili ste! -### Should I make a backup before updating? +### Da li treba da napravim kopiju pre ažuriranja? -We advise you do, so you don't lose everything if anything goes wrong! +Savetujemo vam da to uradite, tako da ne izgubite sve ako nešto krene po zlu! -More generally, we advise you make regular backups of your Castopod files and -database to prevent you from losing it all… +Uopštenije, savetujemo vam da redovno pravite rezervne kopije vaših Castopod +datoteka i baze podataka kako biste sprečili da sve izgubite… diff --git a/docs/src/sr_Latn/index.md b/docs/src/sr_Latn/index.md index 42ec8ed0..1bf9bfe0 100644 --- a/docs/src/sr_Latn/index.md +++ b/docs/src/sr_Latn/index.md @@ -2,171 +2,173 @@ sidebarDepth: 2 --- -# Welcome 👋 +# Dobrodošli 👋 [![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. +Castopod je besplatna platforma otvorenog koda napravljena za podkastere koji +žele interakciju sa svojom publikom. -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. +Castopod se lako instalira i napravljen je na +[CodeIgniter4](https://codeigniter.com/), moćnom PHP okviru sa jako malim +otiskom (footprint). -## Features +## Funkcionalnosti -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](https://translate.castopod.org)! +- 🌱 Besplatan i otvorenog koda (AGPL v3 License) +- 🔐 Fokusiran an suverenitet podataka: vaš sadržaj, publika i analitika pripada + vama i samo vama +- 🪄  Podkasting 2.0 funkcionalnosti: GUID, zaključan, transkripti, + podrška, poglavlja, lokacija, posobe, zvučni isečci, … +- 💬  Ugrađena društvena mreža: + - 🚀  Castopod je deo Fediversa, decentralizovane društvene mreže + - ❤️  Napravite objave, delite, dodajte u omiljene i komentarišite + epizode +- 📈  Ugrađena analitika: + - ⚖️  U skladu sa GDPR / CCPA / LGPD + - 🪙  Merenje publike putem IABv2 standarda + - 🏡  Analitika na licu mesta, bez uključenosti trećih strana +- 📢  Ugrađeni marketinški alati: + - ✅  SEO spremno (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: instalirajte kao samostojeću aplikaciju + - 🎨  Prilagodljive boje teme + - 🎬  Napravite video isečke iz epizoda koji su spremni za deljenje + - 🔉  Napravite audio isečke + - ▶️  Plejer koji možete koristiti na svom sajtu (embed) +- 💸  Monetizacija: + - 🔗  Linkovi za podršku publike + - 📲  Slušaj i klikni reklame + - 🤝  value4value / Veb Monetizacija + - 💎  Premijum podkasti +- 📡  Objavite svoje epizode svugde uz RSS: + - 📱  Na svim agregatorima i aplikacijama: Podcast Index, Apple Podcasts, + Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Emitujte svoje epizode instant uz WebSub +- 📥  Uvoz podkasta: prebacite svoj postojeći podkast na Castopod +- 📤  Prebacite svoj podkast sa Castopod-a +- 🔀  Mreža: hostujte koliko god želite podkasta +- 👥  Više korisnika: dodajte saradnike i odredite njihove uloge +- 🌎  i18n podrška: prevedeno na engleski, francuski, poljski, nemački, + brazilski portugalski, španski… + [još jezika uskoro](https://translate.castopod.org)! -## Motivation +## Motivacija -The podcasting ecosystem is decentralized by nature: you can create your podcast -as an RSS file, publish it on the web and have it shared everywhere online. +Ekosistem podcasta je po prirodi decentralizovan: možete kreirati svoj podkast +kao RSS datoteku, objavite je na vebu i deliti svuda na mreži. -It is in fact one of the only media to have stayed this way for a long time. +To je zapravo jedan od retkih medija koji je ostao decentralizovan ovako dugo. -As usages are evolving, more and more people are getting into podcasts: whether -it is creators finding new ways to share their ideas, or listeners in the search -for better content. +Kako se upotreba razvija, sve više ljudi ulazi u podkaste: ili kao kreatori koji +pronalaze nove načine da podele svoje ideje ili kao slušaoci u potrazi za boljim +sadržajem. -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized medium. +Kako podkasting postaje sve više korišćen, neke kompanije pokušavaju da ga +promene ka kontrolisanijem i centralizovanijem mediju. -Castopod was created in an effort to provide an open and sustainable alternative -to hosting your podcasts, promoting decentralization to ensure that podcasters -creativity can express itself. +Castopod je stvoren u nastojanju da pruži otvorenu i održivu alternativu za +hostovanje vaših podkasta, promovišući decentralizaciju kako bi se osiguralo da +podkasterska kreativnost može da se izrazi. -This project is pushed by the open-source community, and specifically by the -[Fediverse](https://fediverse.party/en/fediverse/) and -[Podcasting 2.0](https://podcastindex.org/) movements. +Ovaj projekat gura zajednica otvorenog koda, ponajviše +[Fedivers](https://fediverse.party/en/fediverse/) i +[Podcasting 2.0](https://podcastindex.org/) pokreti. -## Comparison with other solutions +## Poređenje sa drugim rešenjima -We believe that a solution is not necessarily right for everyone, it highly -depends on your needs. So, here are comparisons with other tools to help you to -gauge whether Castopod is the right fit for you. +Verujemo da jedno rešenje nije dobro za sve, već da sve zavisi od vaših potreba. +Tako da evo poređenja sa drugim alatima kako bi ste mogli da procenite da li je +Castopod prava stvar za vas. -### Castopod vs Wordpress +### Castopod protiv Wordpress-a -Castopod is often referred to as "the Wordpress for podcasts" because of the -similarities between the two. In some ways this is true. And actually, Castopod -was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption -from the community and the number of websites running it. +Castopod je često nazivan "Wordpress-om za podkaste" zbog sličnosti koje deli sa +ovom ploatformom. U neku ruku ovo je tačno. I zapravo, Castopod bio je u velikoj +meri inspirisan Wordpress ekosistemom, videvši lakoću usvajanja od zajednice i +broja veb lokacija koje rade na njemu. -Just like Wordpress, Castopod is free & open source, built using PHP with a -MySQL database and is packaged in a way that you can easily install on most web -servers. +Isto kao i Wordpress, Castopod je besplatan i otvorenog koda, napravljen +koristeći PHP i MySQL baze podataka i spakovan na način koji vam omogućava +jednostavnu instalaciju na većini veb servera. -Wordpress is a great way to create your website and extend it with plugins to -get what you want. It is a full fledged CMS that helps you get any type of -website online. +Wordpress je odličan način na napravite veb stranicu i upotpunite je dodatcima +kako bi dobili ono što želite. To je potpuno razvijen CMS koji vam pomaže da +dobijete bilo koju vrstu veb stranica na mreži. -On the other hand, Castopod is meant to address the podcasters needs -specifically, focusing on podcasting, and nothing else. You don't need any -plugin to get you started on your podcasting journey. +S druge strane, Castopod treba da odgovori na posebne potrebe podkastera, +fokusirajući se na podkasting, i ništa drugo. Nisu vam potrebni nikakvi dodatci +kako bi ste krenuli na svoje podkastersko putovanje. -This allows optimizing the processes specific to podcasting: ranging from the -creation of your podcasts and the publication of new episodes all the way to -broadcasting, marketing and analytics. +Ovo omogućava optimizaciju procesa specifičnih za podcasting: u rasponu od +kreiranja vaših podkasta i objavljivanja novih epizoda sve do emitovanja, +marketinga i analitike. -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! +Konačno, u zavisnosti od vaših potreba, Wordpress i Castopod mogu čak i da +funkcionišu zajedno jer dele iste zahteve! -### Castopod vs Funkwhale +### Castopod protiv Funkwhale-a -Funkwhale is a self-hosted, modern free and open-source music server. Just as -Castopod, Funkwhale is on the fediverse, a decentralized social network allowing -interoperability between the two. +Funkwhale je moderan besplatni muzički server otvorenog koda koji se samostalno +hostuje. Kao i Castopod, Funkwhale je deo Fedivers-a, decentralizovane društvene +mreže što omogućava kompatibilnost između njih. -Funkwhale was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. +Funkwhale je u početku napravljen oko muzike. Kasnije, kako je projekat +napredovao, dodata je opcija hostovanja podkasta. -Unlike Funkwhale, Castopod has been designed and built around podcasting -exclusively. This allows easier implementation for features related to the -podcasting ecosystem, such as the podcasting 2.0 features (transcripts, -chapters, locations, persons, …). +Za razliku od Funkwhale-a, Castopod je dizajniran i napravljen isključivo oko +podkasta. Ovo omogućava lakšu implementaciju funkcionalnosti koje se odnose na +podkast ekosistem, kao što su podkasting 2.0 alati (transkripti, poglavlja, +lokacije, osobe, ...). -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. +Tako da bi ste verovatno trebali da koristite Funkwhale ukoliko želite da +hostujete svoju muziku a Castopod ukoliko želite da hostujete svoje podkaste. -### Castopod vs other podcast hosts +### Castopod protiv drugih podkast hosting-a -There are many solutions for you to host your podcasts, some of which are really -great and [a lot of them](https://podcastindex.org/apps) are jumping into the -Podcasting 2.0 wagon just like Castopod! +Postoji mnogo različitih rešenja za hostovanje vaših podkasta, neka od njih su +stvarno fantastična i [ dosta njih](https://podcastindex.org/apps) se +priključuje Podcasting 2.0 trendu, isto kao i Castopod! -Each of these solutions differ from one another, you may compare with the -[list of features](#features). +Svako od ovih rešenja se razlikuje jedno od drugog, možete ih uporediti sa +[listom funkcionalnosti](#features). -That being said, there are two main differences with other podcasting solutions: +Imajući to u vidu, postoje dve glavne razlike u odnosu na druga rešenja za +podkasting: -- Castopod can be self-hosted and is the only solution that allows you to keep - full control over what you produce. Also, as it is open-source, you can even - customize it as you wish. +- Castopod može biti samostalno hostovan i jedino je rešenje koje vam omogućava + da zadržite punu kontrolu nad onim što proizvodite. Takođe, pošto je otvorenog + koda, možete ga čak prilagoditi kako želite. -- Castopod is the only solution that currently integrates both a decentralized - social network with ActivityPub as well as many of the podcasting 2.0 - features, hoping to bridge the gap between the two. +- Castopod je jedino rešenje koje trenutno uklapa decentralizovanu društvenu + mrežu sa ActivityPub-om kao i mnoge funkcionalnosti podkasting-a 2.0, nadajući + se da će ih tako približiti. -## Contributing +## Doprinos -Love Castopod and would like to help? Take a look at the following documentation -to get you started. +Volite Catsopod i voleli bi ste da pomognete? Pogledajte dokumentaciju koja +sledi kako bi ste počeli. -### Code of conduct +### Kodeks ponašanja -Castopod has adopted a Code of Conduct that we expect project participants to -adhere to. Please read the -[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -so that you can understand what actions will and will not be tolerated. +Castopod je usvojio Kodeks ponašanja kojeg očekujemo da se učesnici u projektu +pridržavaju. Molimo da pročitate +[Uputstvo Kodeksa ponašanja](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +kako bi ste razumeli šta hoće a šta neće biti tolerisano. -### Contributing guide +### Vodič za doprinos -Read our [contributing guide](./contributing/guidelines.md) to learn about our -development process, how to propose bugfixes and improvements, and how to build -and test your changes to Castopod. +Pročitajte naše [uputstvo za doprinos](../contributing/guidelines.md) kako bi +ste bolje razumeli naš proces razvoja, kako da predložite popravke bagova i +unapređenja i kako da napravite i testirate svoje promene na Castopod-u. -## Contributors ✨ +## Saradnici ✨ -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): +Veliko hvala ovim divnim ljudima +([ključ emotikona](https://allcontributors.org/docs/en/emoji-key)): @@ -211,7 +213,7 @@ Thanks goes to these wonderful people glottis0q
    glottis0q

    🌍 - ButterflyOfFire
    ButterflyOfFire

    🌍 + glottis0q
    glottis0q

    🌍 Lucian I. Last
    Lucian I. Last

    🌍 LuuzViir
    LuuzViir

    🌍 CTHTC
    CTHTC

    🌍 @@ -247,43 +249,43 @@ Thanks goes to these wonderful people -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! +Ovaj projekat prati specifikaciju +[svih saradnika](https://github.com/all-contributors/all-contributors). +Doprinosi bilo koje vrste su dobrodošli! -## Contact +## Kontakt -You may reach us for help or ask any question you have on: +Možete nas kontaktirati za pomoć ili postaviti bilo koje pitanje koje imate na: -- [Discord](https://castopod.org/discord) (for direct interaction with - developers and the community) -- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for - feature requests & bug reports) +- [Discord-u](https://castopod.org/discord) (za direktnu interakciju sa + programerima i zajednicom) +- [Listi pitanja](https://code.castopod.org/adaures/castopod/-/issues) (za + zahteve za funkcionalnostima i prijavu bagova) -Alternatively, you can follow us on social media platforms to get news about -Castopod: +Takođe, možete nas pratiti na društvenim mrežama kako bi ste dobili najnovije +vesti o Castopod-u: -- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [podlibre.social](https://podlibre.social/@Castopod) (instanca Mastodon-a) - [Twitter](https://twitter.com/castopod) - [LinkedIn](https://linkedin.com/company/castopod) - [Facebook](https://www.facebook.com/castopod) -## Sponsors +## Sponzori -The ongoing development of Castopod is made possible with the support of its -backers. If you'd like to help, please consider -[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). +Tekući razvoj Castopod-a je omogućen uz podršku vas koji nas podržavate. Ukoliko +želite da pomognete, razmislite o +[sponzorisanju razvoja Castopod-a](https://opencollective.com/castopod/contribute).
    Ad Aures Logo NLnet Logo
    -## License +## Licenca [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -Copyright © 2020-present, [Ad Aures](https://adaures.com/). +Autorska prava © 2020-danas, [Ad Aures](https://adaures.com/). https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/modules/Admin/Language/da/AboutCastopod.php b/modules/Admin/Language/da/AboutCastopod.php index 3fb62aff..7ac4aeca 100644 --- a/modules/Admin/Language/da/AboutCastopod.php +++ b/modules/Admin/Language/da/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', + 'title' => 'Om Castopod', + 'host_name' => 'Værtsnavn', 'version' => 'Castopod version', 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'os' => 'Operativsystem', + 'languages' => 'Sprog', + 'update_database' => 'Opdater databasen', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'Databasen er opdateret!', ], ]; diff --git a/modules/Admin/Language/gl/Breadcrumb.php b/modules/Admin/Language/gl/Breadcrumb.php index c6236fe0..3c49d0e6 100644 --- a/modules/Admin/Language/gl/Breadcrumb.php +++ b/modules/Admin/Language/gl/Breadcrumb.php @@ -39,11 +39,11 @@ return [ 'my-account' => 'a miña conta', 'change-password' => 'cambiar contrasinal', 'imports' => 'importacións', - 'sync-feeds' => 'synchronize feeds', + 'sync-feeds' => 'sincronizar fontes', 'platforms' => 'plataformas', 'social' => 'redes sociais', 'funding' => 'financiamento', - 'monetization-other' => 'other monetization', + 'monetization-other' => 'outros xeitos', 'analytics' => 'análise', 'locations' => 'localizacións', 'webpages' => 'páxinas web', diff --git a/modules/Admin/Language/gl/Common.php b/modules/Admin/Language/gl/Common.php index bdccefcf..97f03466 100644 --- a/modules/Admin/Language/gl/Common.php +++ b/modules/Admin/Language/gl/Common.php @@ -40,7 +40,7 @@ return [ ], 'upload_file' => 'Subir un ficheiro', 'remote_url' => 'URL remoto', - 'save' => 'Save', + 'save' => 'Gardar', ], 'play_episode_button' => [ 'play' => 'Reproducir', diff --git a/modules/Admin/Language/gl/Countries.php b/modules/Admin/Language/gl/Countries.php index 6731e923..c79e1632 100644 --- a/modules/Admin/Language/gl/Countries.php +++ b/modules/Admin/Language/gl/Countries.php @@ -35,9 +35,9 @@ return [ 'BG' => 'Bulgaria', 'BH' => 'Bahrain', 'BI' => 'Burundi', - 'BJ' => 'Benin', - 'BL' => 'Saint Barthélemy', - 'BM' => 'Bermuda', + 'BJ' => 'Benín', + 'BL' => 'San Bartolomé', + 'BM' => 'Bermudas', 'BN' => 'Brunei Darussalam', 'BO' => 'Bolivia, Plurinational State of', 'BQ' => 'Bonaire, Sint Eustatius and Saba', diff --git a/modules/Admin/Language/gl/Platforms.php b/modules/Admin/Language/gl/Platforms.php index d9c98818..9d34da3a 100644 --- a/modules/Admin/Language/gl/Platforms.php +++ b/modules/Admin/Language/gl/Platforms.php @@ -10,21 +10,21 @@ declare(strict_types=1); return [ 'title' => [ - 'podcasting' => 'Podcasting platforms', - 'social' => 'Social networks', - 'funding' => 'Funding links', + 'podcasting' => 'Plataformas de podcast', + 'social' => 'Redes sociais', + 'funding' => 'Finanzamento', ], - 'website' => 'Website', + 'website' => 'Sitio web', 'home_url' => 'Ir á web de {platformName}', - 'register' => 'Register', + 'register' => 'Crear conta', 'submit_url' => 'Envía o teu podcast en {platformName}', - 'your_link' => 'Your link', + 'your_link' => 'A túa ligazón', 'your_id' => [ - 'podcasting' => 'Your ID', - 'social' => 'Your ID', - 'funding' => 'Your CTA', + 'podcasting' => 'O teu ID', + 'social' => 'O teu ID', + 'funding' => 'O teu CTA', ], - 'your_cta' => 'Your call to action', + 'your_cta' => 'Chamar á acción', 'visible' => 'Mostrar na páxina de inicio do podcast?', 'on_embed' => 'Mostrar no navegador incrustable?', 'remove' => 'Eliminar {platformName}', diff --git a/modules/Admin/Language/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php index b16aade1..a687f275 100644 --- a/modules/Admin/Language/gl/Podcast.php +++ b/modules/Admin/Language/gl/Podcast.php @@ -13,7 +13,7 @@ return [ 'no_podcast' => 'Non se atopan podcast!', 'create' => 'Crear un podcast', 'import' => 'Importar podcast', - 'all_imports' => 'Podcast imports', + 'all_imports' => 'Importacións de podcasts', 'new_episode' => 'Novo Episodio', 'view' => 'Ver podcast', 'edit' => 'Editar podcast', @@ -22,7 +22,7 @@ return [ 'delete' => 'Eliminar podcast', 'see_episodes' => 'Ver episodios', 'see_contributors' => 'Ver colaboradoras', - 'monetization_other' => 'Other monetization', + 'monetization_other' => 'Outros xeitos', 'go_to_page' => 'Ir á páxina', 'latest_episodes' => 'Últimos episodios', 'see_all_episodes' => 'Ver tódolos episodios', @@ -58,7 +58,7 @@ return [ 'form' => [ 'identity_section_title' => 'Identidade do podcast', 'identity_section_subtitle' => 'Estes campos permítenche recibir notificacións.', - 'fediverse_section_title' => 'Fediverse identity', + 'fediverse_section_title' => 'Identidade no fediverso', 'cover' => 'Portada do podcast', 'cover_size_hint' => 'A portada ten que ser cadrada e como mínimo de 1400px de alto e ancho.', @@ -85,34 +85,34 @@ return [ 'category_placeholder' => 'Elixe unha categoría…', 'other_categories' => 'Outras categorías', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does it contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'label' => 'Aviso parental', + 'hint' => 'Inclúe contidos explícitos?', + 'undefined' => 'sen definir', + 'clean' => 'Aceptable', + 'explicit' => 'Explícito', ], - 'author_section_title' => 'Author', - 'author_section_subtitle' => 'Who is managing the podcast?', - 'owner_name' => 'Owner name', + 'author_section_title' => 'Autoría', + 'author_section_subtitle' => 'Quen xestiona o podcast?', + 'owner_name' => 'Nome da propietaria', 'owner_name_hint' => - 'For administrative use only. Visible in the public RSS feed.', - 'owner_email' => 'Owner email', + 'Só para uso administrativo. Visible na fonte RSS pública.', + 'owner_email' => 'Correo da propietaria', 'owner_email_hint' => - 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', - 'publisher' => 'Publisher', + 'Será utilizado pola maioría das plataformas para verificar a propiedade do podcast. Visible na fonte RSS pública.', + 'publisher' => 'Editorial', 'publisher_hint' => - 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', - 'copyright' => 'Copyright', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this podcast about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real place or fictional', - 'monetization_section_title' => 'Monetization', + 'O grupo responsable da creación do programa. Normalmente refírese á empresa nai ou rede do podcast. O campo a veces etiquétase como \'Autor\'.', + 'copyright' => 'Dereitos', + 'location_section_title' => 'Localización', + 'location_section_subtitle' => 'De qué lugar trata o podcast?', + 'location_name' => 'Nome do lugar ou enderezo', + 'location_name_hint' => 'Pode ser un lugar real ou ficticio', + 'monetization_section_title' => 'Monetización', 'monetization_section_subtitle' => - 'Earn money thanks to your audience.', + 'Obter cartos grazas á túa audiencia.', 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'premium_by_default' => 'Os episodios estableceranse por defecto como premium', + 'premium_by_default_hint' => 'Os episodios vanse marcar por defecto como premium. Podes igualmente elexir algúns episodios, mostras ou extras como públicos.', 'op3' => 'Open Podcast Prefix Project (OP3)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', diff --git a/modules/Admin/Language/sk/Common.php b/modules/Admin/Language/sk/Common.php index a8fc2465..584c05bf 100644 --- a/modules/Admin/Language/sk/Common.php +++ b/modules/Admin/Language/sk/Common.php @@ -40,7 +40,7 @@ return [ ], 'upload_file' => 'Nahrať súbor', 'remote_url' => 'Vzdialená adresa URL', - 'save' => 'Save', + 'save' => 'Uložiť', ], 'play_episode_button' => [ 'play' => 'Prehrať', diff --git a/modules/Admin/Language/sk/Page.php b/modules/Admin/Language/sk/Page.php index 8122ca81..9b2fa2e6 100644 --- a/modules/Admin/Language/sk/Page.php +++ b/modules/Admin/Language/sk/Page.php @@ -24,7 +24,7 @@ return [ 'submit_edit' => 'Uložiť', ], 'messages' => [ - 'createSuccess' => 'The page “{pageTitle}” was created successfully!', - 'editSuccess' => 'The page was successfully updated!', + 'createSuccess' => 'Stránka “{pageTitle}” bola úspešne vytvorená!', + 'editSuccess' => 'Stránka bola úspešne aktualizovaná!', ], ]; diff --git a/modules/Admin/Language/sk/Platforms.php b/modules/Admin/Language/sk/Platforms.php index d8654a77..71829629 100644 --- a/modules/Admin/Language/sk/Platforms.php +++ b/modules/Admin/Language/sk/Platforms.php @@ -11,14 +11,14 @@ declare(strict_types=1); return [ 'title' => [ 'podcasting' => 'Podcasting platforms', - 'social' => 'Social networks', + 'social' => 'Sociálne siete', 'funding' => 'Funding links', ], - 'website' => 'Website', + 'website' => 'Webová stránka', 'home_url' => 'Prejsť na stránku {platformName}', - 'register' => 'Register', + 'register' => 'Registrovať', 'submit_url' => 'Uverejniť podcast na platforme {platformName}', - 'your_link' => 'Your link', + 'your_link' => 'Váš odkaz', 'your_id' => [ 'podcasting' => 'Your ID', 'social' => 'Your ID', diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php index 8e6d5d07..4c33631e 100644 --- a/modules/Admin/Language/sk/Podcast.php +++ b/modules/Admin/Language/sk/Podcast.php @@ -86,8 +86,8 @@ return [ 'other_categories' => 'Ostatné kategórie', 'parental_advisory' => [ 'label' => 'Parental advisory', - 'hint' => 'Does it contain explicit content?', - 'undefined' => 'undefined', + 'hint' => 'Obsahuje explicitný obsah?', + 'undefined' => 'neuvedené', 'clean' => 'Clean', 'explicit' => 'Chúlostivé', ], @@ -142,19 +142,19 @@ return [ 'lock' => 'Prevent podcast from being copied', 'lock_hint' => 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', - 'submit_create' => 'Create podcast', - 'submit_edit' => 'Save podcast', + 'submit_create' => 'Vytvoriť podcast', + 'submit_edit' => 'Uložiť podcast', ], 'category_options' => [ - 'uncategorized' => 'uncategorized', - 'arts' => 'Arts', - 'business' => 'Business', - 'comedy' => 'Comedy', - 'education' => 'Education', - 'fiction' => 'Fiction', - 'government' => 'Government', - 'health_and_fitness' => 'Health & Fitness', - 'history' => 'History', + 'uncategorized' => 'nezaradený', + 'arts' => 'Umenia', + 'business' => 'Podnikanie', + 'comedy' => 'Komédia', + 'education' => 'Vzdelanie', + 'fiction' => 'Fikcia', + 'government' => 'Štátna správa', + 'health_and_fitness' => 'Zdravie a fitnes', + 'history' => 'História', 'kids_and_family' => 'Kids & Family', 'leisure' => 'Voľný čas', 'music' => 'Hudba', @@ -166,16 +166,16 @@ return [ 'technology' => 'Technológia', 'true_crime' => 'True Crime', 'tv_and_film' => 'TV & Film', - 'books' => 'Books', - 'design' => 'Design', + 'books' => 'Knihy', + 'design' => 'Dizajn', 'fashion_and_beauty' => 'Fashion & Beauty', 'food' => 'Food', - 'performing_arts' => 'Performing Arts', - 'visual_arts' => 'Visual Arts', - 'careers' => 'Careers', + 'performing_arts' => 'Divadelné umenie', + 'visual_arts' => 'Vizuálni umelci', + 'careers' => 'Kariéra', 'entrepreneurship' => 'Podnikateľský', 'investing' => 'Investičný', - 'management' => 'Management', + 'management' => 'Manažment', 'marketing' => 'Marketing', 'non_profit' => 'Neziskový', 'comedy_interviews' => 'Comedy Interviews', @@ -210,12 +210,12 @@ return [ 'music_history' => 'Hudobná história', 'music_interviews' => 'Hudobné rozhovory', 'business_news' => 'Business News', - 'daily_news' => 'Daily News', + 'daily_news' => 'Denné správy', 'entertainment_news' => 'Entertainment News', 'news_commentary' => 'News Commentary', 'politics' => 'Politika', 'sports_news' => 'Športové správy', - 'tech_news' => 'Tech News', + 'tech_news' => 'Technologické novinky', 'buddhism' => 'Buddhism', 'christianity' => 'Kresťanstvo', 'hinduism' => 'Hinduism', @@ -288,14 +288,14 @@ return [ 'disclaimer' => "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", 'understand' => 'I understand, I want the podcast to be permanently deleted', - 'submit' => 'Delete', + 'submit' => 'Vymazať', ], - 'by' => 'By {publisher}', + 'by' => 'Od {publisher}', 'season' => 'Season {seasonNumber}', 'list_of_episodes_year' => '{year} episodes ({episodeCount})', 'list_of_episodes_season' => 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', + 'no_episode' => 'Žiadna epizóda nenájdená!', 'follow' => 'Follow', 'followers' => '{numberOfFollowers, plural, one {# follower} diff --git a/modules/Admin/Language/sk/PodcastNavigation.php b/modules/Admin/Language/sk/PodcastNavigation.php index bb777707..b44491df 100644 --- a/modules/Admin/Language/sk/PodcastNavigation.php +++ b/modules/Admin/Language/sk/PodcastNavigation.php @@ -17,9 +17,9 @@ return [ 'podcast-persons-manage' => 'Manage persons', 'podcast-imports' => 'Podcast imports', 'podcast-imports-sync' => 'Sync feeds', - 'episodes' => 'Episodes', - 'episode-list' => 'All episodes', - 'episode-create' => 'New episode', + 'episodes' => 'Časti', + 'episode-list' => 'Všetky časti', + 'episode-create' => 'Nová časť', 'analytics' => 'Analytics', 'podcast-analytics' => 'Audience overview', 'podcast-analytics-webpages' => 'Web pages visits', @@ -27,7 +27,7 @@ return [ 'podcast-analytics-unique-listeners' => 'Unique listeners', 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', - 'podcast-analytics-time-periods' => 'Time periods', + 'podcast-analytics-time-periods' => 'Časové úseky', 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', diff --git a/modules/Admin/Language/sk/Settings.php b/modules/Admin/Language/sk/Settings.php index 4a70dcba..007a681d 100644 --- a/modules/Admin/Language/sk/Settings.php +++ b/modules/Admin/Language/sk/Settings.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'General settings', + 'title' => 'Všeobecné nastavenia', 'instance' => [ - 'title' => 'Instance', - 'site_icon' => 'Site icon', - 'site_icon_delete' => 'Delete site icon', + 'title' => 'Inštancia', + 'site_icon' => 'Ikona stránky', + 'site_icon_delete' => 'Odstrániť ikonu stránky', 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', 'site_name' => 'Site name', @@ -43,7 +43,7 @@ return [ 'runSuccess' => 'Housekeeping has been run successfully!', ], 'theme' => [ - 'title' => 'Theme', + 'title' => 'Vzhľad', 'accent_section_title' => 'Accent color', 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', 'pine' => 'Pine', @@ -52,7 +52,7 @@ return [ 'lake' => 'Lake', 'jacaranda' => 'Jacaranda', 'onyx' => 'Onyx', - 'submit' => 'Save', + 'submit' => 'Uložiť', 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', ], ]; diff --git a/modules/Admin/Language/sk/Soundbite.php b/modules/Admin/Language/sk/Soundbite.php index a3f828fe..6b118afb 100644 --- a/modules/Admin/Language/sk/Soundbite.php +++ b/modules/Admin/Language/sk/Soundbite.php @@ -10,8 +10,8 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Soundbites', - 'soundbite' => 'Soundbite', + 'title' => 'Zvukové ukážky', + 'soundbite' => 'Zvuková ukážka', ], 'messages' => [ 'createSuccess' => 'Soundbite has been successfully created!', @@ -19,13 +19,13 @@ return [ ], 'form' => [ 'title' => 'New soundbite', - 'soundbite_title' => 'Soundbite title', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'submit' => 'Create soundbite', + 'soundbite_title' => 'Názov zvukovej ukážky', + 'start_time' => 'Začiatok na', + 'duration' => 'Trvanie', + 'submit' => 'Vytvoriť zvukovú ukážku', ], 'play' => 'Play soundbite', 'stop' => 'Stop soundbite', 'create' => 'New soundbite', - 'delete' => 'Delete soundbite', + 'delete' => 'Vymazať zvukovú ukážku', ]; diff --git a/modules/Admin/Language/sk/VideoClip.php b/modules/Admin/Language/sk/VideoClip.php index 638de697..cfe35050 100644 --- a/modules/Admin/Language/sk/VideoClip.php +++ b/modules/Admin/Language/sk/VideoClip.php @@ -12,10 +12,10 @@ return [ 'list' => [ 'title' => 'Video clips', 'status' => [ - 'label' => 'Status', - 'queued' => 'queued', + 'label' => 'Stav', + 'queued' => 'v poradí', 'queued_hint' => 'Clip is waiting to be processed.', - 'pending' => 'pending', + 'pending' => 'čaká', 'pending_hint' => 'Clip will be generated shortly.', 'running' => 'running', 'running_hint' => 'Clip is being generated.', @@ -55,8 +55,8 @@ return [ 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', ], 'theme' => 'Select a theme', - 'start_time' => 'Start at', - 'duration' => 'Duration', + 'start_time' => 'Začiatok na', + 'duration' => 'Trvanie', 'trim_start' => 'Trim start', 'trim_end' => 'Trim end', 'submit' => 'Create video clip', diff --git a/modules/Admin/Language/sr_Latn/PodcastNavigation.php b/modules/Admin/Language/sr_Latn/PodcastNavigation.php index d2357d86..5958a625 100644 --- a/modules/Admin/Language/sr_Latn/PodcastNavigation.php +++ b/modules/Admin/Language/sr_Latn/PodcastNavigation.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'go_to_page' => 'Idite na stranu podkasta', - 'rss_feed' => 'RSS feed', + 'rss_feed' => 'RSS izvor', 'dashboard' => 'Kontrolna strana podkasta', 'podcast-view' => 'Početna stranica', 'podcast-edit' => 'Uredi podkast', diff --git a/modules/Auth/Language/da/Contributor.php b/modules/Auth/Language/da/Contributor.php index c70badc0..f2685498 100644 --- a/modules/Auth/Language/da/Contributor.php +++ b/modules/Auth/Language/da/Contributor.php @@ -9,39 +9,39 @@ declare(strict_types=1); */ return [ - 'podcast_contributors' => 'Podcast contributors', - 'view' => "{username}'s contribution to {podcastTitle}", - 'add' => 'Add contributor', - 'add_contributor' => 'Add a contributor for {0}', - 'edit_role' => 'Update role for {0}', - 'edit' => 'Edit', - 'remove' => 'Remove', + 'podcast_contributors' => 'Podcast bidragsydere', + 'view' => "{username}s bidrag til {podcastTitle}", + 'add' => 'Tilføj bidragyder', + 'add_contributor' => 'Tilføj bidragyder til {0}', + 'edit_role' => 'Opdatér rolle for {0}', + 'edit' => 'Redigér', + 'remove' => 'Fjern', 'list' => [ - 'username' => 'Username', - 'role' => 'Role', + 'username' => 'Brugernavn', + 'role' => 'Rolle', ], 'form' => [ - 'user' => 'User', - 'user_placeholder' => 'Select a user…', - 'role' => 'Role', - 'role_placeholder' => 'Select its role…', - 'submit_add' => 'Add contributor', - 'submit_edit' => 'Update role', + 'user' => 'Bruger', + 'user_placeholder' => 'Vælg en bruger…', + 'role' => 'Rolle', + 'role_placeholder' => 'Vælg dens rolle…', + 'submit_add' => 'Tilføj bidragyder', + 'submit_edit' => 'Opdatér rolle', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Fjern {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'Du er ved at fjerne {contributor} fra bidragydere. De vil ikke længere kunne få adgang til "{podcastTitle}".', + 'understand' => 'Jeg forstår, jeg vil fjerne {contributor} fra "{podcastTitle}"', + 'submit' => 'Fjern', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", - 'removeOwnerError' => "You can't remove the podcast owner!", + 'editSuccess' => 'Rolle ændret!', + 'editOwnerError' => "Du kan ikke redigere podcast-ejeren!", + 'removeOwnerError' => "Du kan ikke fjerne podcast-ejeren!", 'removeSuccess' => - 'You have successfully removed {username} from {podcastTitle}', + 'Du har fjernet {username} fra {podcastTitle}', 'alreadyAddedError' => - "The contributor you're trying to add has already been added!", + "Den bidragsyder, du forsøger at tilføje, er allerede blevet tilføjet!", ], ]; diff --git a/modules/Install/Language/sk/Install.php b/modules/Install/Language/sk/Install.php index 2dc1ed4d..d6eaaf2d 100644 --- a/modules/Install/Language/sk/Install.php +++ b/modules/Install/Language/sk/Install.php @@ -29,10 +29,10 @@ return [ 'database_config_hint' => 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', + 'db_name' => 'Názov databázy', + 'db_username' => 'Prihlasovacie meno do databázy', + 'db_password' => 'Heslo k databáze', + 'db_prefix' => 'Prefix databázy', 'db_prefix_hint' => "The prefix of the Castopod table names, leave as is if you don't know what it means.", 'cache_config' => 'Cache configuration', @@ -44,18 +44,18 @@ return [ 'redis' => 'Redis', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', + 'next' => 'Ďalej', + 'submit' => 'Dokončiť inštaláciu', 'create_superadmin' => 'Create your superadmin account', 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', + 'username' => 'Používateľské meno', + 'password' => 'Heslo', ], 'messages' => [ 'createSuperAdminSuccess' => 'Your superadmin account has been created successfully. Login to start podcasting!', 'databaseConnectError' => - 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'Castopod sa nemohol pripojiť k vašej databáze. Upravte konfiguráciu svojej databázy a skúste to znovu.', 'writeError' => "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", ], From cc85637e1883c6b426e994b50a7fd6de62669e90 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 21 Dec 2023 16:34:24 +0000 Subject: [PATCH 259/477] chore(release): 1.7.3 [skip ci] ## [1.7.3](https://code.castopod.org/adaures/castopod/compare/v1.7.2...v1.7.3) (12/21/2023) ### Bug Fixes * **analytics:** upgrade opawg's user-agents-php to user-agents-v2-php ([8cd7886](https://code.castopod.org/adaures/castopod/commit/8cd78866762e26aa63c224dace6c247e0e9dc068)) * **platforms:** add Threads and YouTube Music ([9264a2d](https://code.castopod.org/adaures/castopod/commit/9264a2d74cc95278c9d84c99ef914fdbcaf8a97f)) --- CHANGELOG.md | 9 +++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e798720c..6ff4bc05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [1.7.3](https://code.castopod.org/adaures/castopod/compare/v1.7.2...v1.7.3) (12/21/2023) + +### Bug Fixes + +- **analytics:** upgrade opawg's user-agents-php to user-agents-v2-php + ([8cd7886](https://code.castopod.org/adaures/castopod/commit/8cd78866762e26aa63c224dace6c247e0e9dc068)) +- **platforms:** add Threads and YouTube Music + ([9264a2d](https://code.castopod.org/adaures/castopod/commit/9264a2d74cc95278c9d84c99ef914fdbcaf8a97f)) + ## [1.7.2](https://code.castopod.org/adaures/castopod/compare/v1.7.1...v1.7.2) (12/12/2023) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 4347d673..40926367 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.7.2'); +defined('CP_VERSION') || define('CP_VERSION', '1.7.3'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index a3a62e5f..e61b36e0 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.7.2", + "version": "1.7.3", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index eab4930c..cb6e1109 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.7.2", + "version": "1.7.3", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From b61a32c8a9b10e129666804d533487430ce7432c Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 3 Jan 2024 14:57:44 +0000 Subject: [PATCH 260/477] fix(media): add missing HEAD route for static assets served with S3 --- modules/Media/Config/Routes.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/Media/Config/Routes.php b/modules/Media/Config/Routes.php index c8d4703a..a9984bfb 100644 --- a/modules/Media/Config/Routes.php +++ b/modules/Media/Config/Routes.php @@ -12,6 +12,11 @@ use CodeIgniter\Router\RouteCollection; /** @var RouteCollection $routes */ +$routes->head('static/(:any)', 'MediaController::serve/$1', [ + 'as' => 'media-serve', + 'namespace' => 'Modules\Media\Controllers', + 'filter' => 'allow-cors', +]); $routes->get('static/(:any)', 'MediaController::serve/$1', [ 'as' => 'media-serve', 'namespace' => 'Modules\Media\Controllers', From 1001ec6b76c5ff3cd5a6c5b2599cfbb4c21b80a3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 3 Jan 2024 15:07:01 +0000 Subject: [PATCH 261/477] chore(release): 1.7.4 [skip ci] ## [1.7.4](https://code.castopod.org/adaures/castopod/compare/v1.7.3...v1.7.4) (1/3/2024) ### Bug Fixes * **media:** add missing HEAD route for static assets served with S3 ([b61a32c](https://code.castopod.org/adaures/castopod/commit/b61a32c8a9b10e129666804d533487430ce7432c)) --- CHANGELOG.md | 7 +++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ff4bc05..774a3fe5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.7.4](https://code.castopod.org/adaures/castopod/compare/v1.7.3...v1.7.4) (1/3/2024) + +### Bug Fixes + +- **media:** add missing HEAD route for static assets served with S3 + ([b61a32c](https://code.castopod.org/adaures/castopod/commit/b61a32c8a9b10e129666804d533487430ce7432c)) + ## [1.7.3](https://code.castopod.org/adaures/castopod/compare/v1.7.2...v1.7.3) (12/21/2023) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 40926367..ebdb4807 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.7.3'); +defined('CP_VERSION') || define('CP_VERSION', '1.7.4'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index e61b36e0..0fdcfb62 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.7.3", + "version": "1.7.4", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index cb6e1109..a585193f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.7.3", + "version": "1.7.4", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From ac5336fbc5fb8038de541dd06938a8beb2e8d733 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 26 Dec 2023 15:52:46 +0000 Subject: [PATCH 262/477] fix(import): check for empty string when generating podcast guid for feeds not including one --- app/Models/PodcastModel.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 40e94720..719bff32 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -502,7 +502,10 @@ class PodcastModel extends Model */ protected function setPodcastGUID(array $data): array { - if (! array_key_exists('guid', $data['data']) || $data['data']['guid'] === null) { + if (! array_key_exists( + 'guid', + $data['data'] + ) || $data['data']['guid'] === null || $data['data']['guid'] === '') { $uuid = service('uuid'); $feedUrl = url_to('podcast-rss-feed', $data['data']['handle']); // 'ead4c236-bf58-58c6-a2c6-a6b28d128cb6' is the uuid of the podcast namespace From 30a34738635bf4f4a4c6b2a7174f7e439f0dfc6e Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 28 Dec 2023 13:40:21 +0000 Subject: [PATCH 263/477] fix(episode-form): add required validation rules for title and slug fixes #420 --- modules/Admin/Controllers/EpisodeController.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 8f2b8701..33cdc865 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -157,7 +157,8 @@ class EpisodeController extends BaseController public function attemptCreate(): RedirectResponse { $rules = [ - 'slug' => 'max_length[128]', + 'title' => 'required', + 'slug' => 'required|max_length[128]', 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]', 'cover' => 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', 'transcript_file' => 'ext_in[transcript,srt]|permit_empty', @@ -243,6 +244,7 @@ class EpisodeController extends BaseController $episodeModel = new EpisodeModel(); if (! ($newEpisodeId = $episodeModel->insert($newEpisode, true))) { + dd($episodeModel->errors()); $db->transRollback(); return redirect() ->back() @@ -294,7 +296,8 @@ class EpisodeController extends BaseController public function attemptEdit(): RedirectResponse { $rules = [ - 'slug' => 'max_length[128]', + 'title' => 'required', + 'slug' => 'required|max_length[128]', 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]|permit_empty', 'cover' => 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', 'transcript_file' => 'ext_in[transcript_file,txt,html,srt,json]|permit_empty', From c1ec98c95656844712011ff30b84c397b78da311 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 28 Dec 2023 13:58:19 +0000 Subject: [PATCH 264/477] fix(persons): delete person avatar when deleting a person fixes #419 --- modules/Admin/Controllers/PersonController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/Admin/Controllers/PersonController.php b/modules/Admin/Controllers/PersonController.php index 17266de7..278edd4a 100644 --- a/modules/Admin/Controllers/PersonController.php +++ b/modules/Admin/Controllers/PersonController.php @@ -14,6 +14,7 @@ use App\Entities\Person; use App\Models\PersonModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; +use Modules\Media\Models\MediaModel; class PersonController extends BaseController { @@ -151,6 +152,11 @@ class PersonController extends BaseController public function delete(): RedirectResponse { + if ($this->person->avatar_id !== null) { + // delete avatar to prevent collision if recreating person + (new MediaModel())->deleteMedia($this->person->avatar); + } + (new PersonModel())->delete($this->person->id); return redirect()->route('person-list') From 9178c3f3afa16e104d25ae159728e90a3bbd57c3 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 28 Dec 2023 16:34:32 +0000 Subject: [PATCH 265/477] fix(platforms): add matrix.org as a social platform closes #421 --- app/Database/Seeds/PlatformSeeder.php | 7 +++++++ app/Resources/icons/social/matrix.svg | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 app/Resources/icons/social/matrix.svg diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index eb0fd9e6..fb322041 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -529,6 +529,13 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://joinmastodon.org/', 'submit_url' => 'https://joinmastodon.org/communities', ], + [ + 'slug' => 'matrix', + 'type' => 'social', + 'label' => 'Matrix', + 'home_url' => 'https://matrix.org/', + 'submit_url' => 'https://matrix.org/try-matrix/', + ], [ 'slug' => 'misskey', 'type' => 'social', diff --git a/app/Resources/icons/social/matrix.svg b/app/Resources/icons/social/matrix.svg new file mode 100644 index 00000000..25644485 --- /dev/null +++ b/app/Resources/icons/social/matrix.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 222e02a2af9ecb8b8768a63d3054f4c3ef54e991 Mon Sep 17 00:00:00 2001 From: Ewen Korr Date: Mon, 1 Jan 2024 10:11:29 +0000 Subject: [PATCH 266/477] feat: allow hiding owner's email in public RSS feed --- ...9-150000_add_podcasts_owner_email_feed.php | 36 +++++++++++++++++++ app/Entities/Podcast.php | 2 ++ app/Helpers/rss_helper.php | 16 ++++++--- app/Models/PodcastModel.php | 1 + .../Admin/Controllers/PodcastController.php | 13 +++---- modules/Admin/Language/en/Podcast.php | 2 ++ themes/cp_admin/podcast/create.php | 3 ++ themes/cp_admin/podcast/edit.php | 3 ++ 8 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 app/Database/Migrations/2023-12-29-150000_add_podcasts_owner_email_feed.php diff --git a/app/Database/Migrations/2023-12-29-150000_add_podcasts_owner_email_feed.php b/app/Database/Migrations/2023-12-29-150000_add_podcasts_owner_email_feed.php new file mode 100644 index 00000000..88765f1e --- /dev/null +++ b/app/Database/Migrations/2023-12-29-150000_add_podcasts_owner_email_feed.php @@ -0,0 +1,36 @@ + [ + 'type' => 'BOOLEAN', + 'null' => false, + 'default' => 0, + 'after' => 'owner_email', + ], + ]; + + $this->forge->addColumn('podcasts', $fields); + } + + public function down(): void + { + $fields = ['is_owner_email_removed_from_feed']; + $this->forge->dropColumn('podcasts', $fields); + } +} diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index 23fd04e7..649d1f1b 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -62,6 +62,7 @@ use RuntimeException; * @property string|null $publisher * @property string $owner_name * @property string $owner_email + * @property bool $is_owner_email_removed_from_feed * @property string $type * @property string|null $copyright * @property string|null $episode_description_footer_markdown @@ -191,6 +192,7 @@ class Podcast extends Entity 'publisher' => '?string', 'owner_name' => 'string', 'owner_email' => 'string', + 'is_owner_email_removed_from_feed' => 'boolean', 'type' => 'string', 'copyright' => '?string', 'episode_description_footer_markdown' => '?string', diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index cde17a2d..ddcdf36c 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -101,9 +101,15 @@ if (! function_exists('get_rss_feed')) { $recipientElement->addAttribute('split', '100'); } - $channel - ->addChild('locked', $podcast->is_locked ? 'yes' : 'no', $podcastNamespace) - ->addAttribute('owner', $podcast->owner_email); + if ($podcast->is_owner_email_removed_from_feed) { + $channel + ->addChild('locked', $podcast->is_locked ? 'yes' : 'no', $podcastNamespace); + } else { + $channel + ->addChild('locked', $podcast->is_locked ? 'yes' : 'no', $podcastNamespace) + ->addAttribute('owner', $podcast->owner_email); + } + if ($podcast->imported_feed_url !== null) { $channel->addChild('previousUrl', $podcast->imported_feed_url, $podcastNamespace); } @@ -249,7 +255,9 @@ if (! function_exists('get_rss_feed')) { $owner->addChild('name', $podcast->owner_name, $itunesNamespace, false); - $owner->addChild('email', $podcast->owner_email, $itunesNamespace); + if (! $podcast->is_owner_email_removed_from_feed) { + $owner->addChild('email', $podcast->owner_email, $itunesNamespace); + } $channel->addChild('type', $podcast->type, $itunesNamespace); $podcast->copyright && diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 719bff32..aa905ba2 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -48,6 +48,7 @@ class PodcastModel extends Model 'parental_advisory', 'owner_name', 'owner_email', + 'is_owner_email_removed_from_feed', 'publisher', 'type', 'copyright', diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index ea650a5a..4ac1157f 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -214,12 +214,13 @@ class PodcastController extends BaseController 'parental_advisory' => $this->request->getPost('parental_advisory') !== 'undefined' ? $this->request->getPost('parental_advisory') : null, - 'owner_name' => $this->request->getPost('owner_name'), - 'owner_email' => $this->request->getPost('owner_email'), - 'publisher' => $this->request->getPost('publisher'), - 'type' => $this->request->getPost('type'), - 'copyright' => $this->request->getPost('copyright'), - 'location' => $this->request->getPost('location_name') === '' ? null : new Location( + 'owner_name' => $this->request->getPost('owner_name'), + 'owner_email' => $this->request->getPost('owner_email'), + 'is_owner_email_removed_from_feed' => $this->request->getPost('is_owner_email_removed_from_feed') === 'yes', + 'publisher' => $this->request->getPost('publisher'), + 'type' => $this->request->getPost('type'), + 'copyright' => $this->request->getPost('copyright'), + 'location' => $this->request->getPost('location_name') === '' ? null : new Location( $this->request->getPost('location_name') ), 'custom_rss_string' => $this->request->getPost('custom_rss'), diff --git a/modules/Admin/Language/en/Podcast.php b/modules/Admin/Language/en/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/en/Podcast.php +++ b/modules/Admin/Language/en/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/themes/cp_admin/podcast/create.php b/themes/cp_admin/podcast/create.php index 62c3b642..c2a9ac65 100644 --- a/themes/cp_admin/podcast/create.php +++ b/themes/cp_admin/podcast/create.php @@ -121,6 +121,9 @@ hint="" required="true" /> + + + + + + Date: Mon, 1 Jan 2024 22:54:59 +0000 Subject: [PATCH 267/477] chore: update CI4 + shield + other php and js packages --- app/Config/App.php | 3 +- app/Config/Autoload.php | 9 +- app/Config/Boot/development.php | 2 +- app/Config/Boot/testing.php | 2 +- app/Config/Cache.php | 3 +- app/Config/Email.php | 2 +- app/Config/Filters.php | 8 +- app/Config/Kint.php | 15 +- app/Config/Modules.php | 4 +- app/Config/Publisher.php | 2 +- app/Config/Session.php | 2 +- app/Models/EpisodeModel.php | 1 + app/Models/PlatformModel.php | 2 +- app/Views/errors/cli/error_exception.php | 17 +- app/Views/errors/html/error_exception.php | 33 +- composer.json | 10 +- composer.lock | 119 +- env | 2 +- package.json | 18 +- pnpm-lock.yaml | 3211 +++++++++++---------- spark | 2 +- 21 files changed, 1808 insertions(+), 1659 deletions(-) diff --git a/app/Config/App.php b/app/Config/App.php index 164763a3..52613a86 100644 --- a/app/Config/App.php +++ b/app/Config/App.php @@ -29,8 +29,7 @@ class App extends BaseConfig * 'http://accounts.example.com/': * ['media.example.com', 'accounts.example.com'] * - * @var string[] - * @phpstan-var list + * @var list */ public array $allowedHostnames = []; diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index 47a8548f..051f0529 100644 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -41,8 +41,7 @@ class Autoload extends AutoloadConfig * 'App' => APPPATH * ]; * - * @var array|string> - * @phpstan-var array> + * @var array|string> */ public $psr4 = [ APP_NAMESPACE => APPPATH, @@ -100,8 +99,7 @@ class Autoload extends AutoloadConfig * '/path/to/my/file.php', * ]; * - * @var string[] - * @phpstan-var list + * @var list */ public $files = [APPPATH . 'Libraries/ViewComponents/Helpers/view_components_helper.php']; @@ -114,8 +112,7 @@ class Autoload extends AutoloadConfig * 'form', * ]; * - * @var string[] - * @phpstan-var list + * @var list */ public $helpers = ['auth', 'setting']; } diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php index 3f6dd938..e131d316 100644 --- a/app/Config/Boot/development.php +++ b/app/Config/Boot/development.php @@ -12,7 +12,7 @@ declare(strict_types=1); * * If you set 'display_errors' to '1', CI4's detailed error report will show. */ -error_reporting(-1); +error_reporting(E_ALL); ini_set('display_errors', '1'); /** diff --git a/app/Config/Boot/testing.php b/app/Config/Boot/testing.php index ae8eb6b4..46e757da 100644 --- a/app/Config/Boot/testing.php +++ b/app/Config/Boot/testing.php @@ -16,7 +16,7 @@ declare(strict_types=1); * make sure they don't make it to production. And save us hours of * painful debugging. */ -error_reporting(-1); +error_reporting(E_ALL); ini_set('display_errors', '1'); /** diff --git a/app/Config/Cache.php b/app/Config/Cache.php index 7a938005..ecf562ff 100644 --- a/app/Config/Cache.php +++ b/app/Config/Cache.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Config; +use CodeIgniter\Cache\CacheInterface; use CodeIgniter\Cache\Handlers\DummyHandler; use CodeIgniter\Cache\Handlers\FileHandler; use CodeIgniter\Cache\Handlers\MemcachedHandler; @@ -159,7 +160,7 @@ class Cache extends BaseConfig * This is an array of cache engine alias' and class names. Only engines * that are listed here are allowed to be used. * - * @var array + * @var array> */ public array $validHandlers = [ 'dummy' => DummyHandler::class, diff --git a/app/Config/Email.php b/app/Config/Email.php index 588d064f..79948ba0 100644 --- a/app/Config/Email.php +++ b/app/Config/Email.php @@ -30,7 +30,7 @@ class Email extends BaseConfig public string $mailPath = '/usr/sbin/sendmail'; /** - * SMTP Server Address + * SMTP Server Hostname */ public string $SMTPHost = ''; diff --git a/app/Config/Filters.php b/app/Config/Filters.php index 632aec72..d057d6f2 100644 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -18,9 +18,8 @@ class Filters extends BaseConfig /** * Configures aliases for Filter classes to make reading things nicer and simpler. * - * @var array|string> [filter_name => classname] - * or [filter_name => [classname1, classname2, ...]] - * @phpstan-var array> + * @var array> [filter_name => classname] + * or [filter_name => [classname1, classname2, ...]] */ public array $aliases = [ 'csrf' => CSRF::class, @@ -34,8 +33,7 @@ class Filters extends BaseConfig /** * List of filter aliases that are always applied before and after every request. * - * @var array>>|array> - * @phpstan-var array>|array>> + * @var array>>|array> */ public array $globals = [ 'before' => [ diff --git a/app/Config/Kint.php b/app/Config/Kint.php index d68979ab..0ef705ea 100644 --- a/app/Config/Kint.php +++ b/app/Config/Kint.php @@ -5,7 +5,10 @@ declare(strict_types=1); namespace Config; use CodeIgniter\Config\BaseConfig; +use Kint\Parser\ConstructablePluginInterface; use Kint\Renderer\AbstractRenderer; +use Kint\Renderer\Rich\TabPluginInterface; +use Kint\Renderer\Rich\ValuePluginInterface; /** * -------------------------------------------------------------------------- @@ -26,9 +29,9 @@ class Kint extends BaseConfig */ /** - * @var string[] + * @var list|ConstructablePluginInterface>|null */ - public array $plugins = []; + public ?array $plugins = []; public int $maxDepth = 6; @@ -49,14 +52,14 @@ class Kint extends BaseConfig public int $richSort = AbstractRenderer::SORT_FULL; /** - * @var string[] + * @var array>|null */ - public array $richObjectPlugins = []; + public ?array $richObjectPlugins = []; /** - * @var string[] + * @var array>|null */ - public array $richTabPlugins = []; + public ?array $richTabPlugins = []; /* |-------------------------------------------------------------------------- diff --git a/app/Config/Modules.php b/app/Config/Modules.php index 206bb473..bfceb1f3 100644 --- a/app/Config/Modules.php +++ b/app/Config/Modules.php @@ -60,7 +60,7 @@ class Modules extends BaseModules * ], * ] * - * @var array{only?:string[], exclude?:string[]} + * @var array{only?: list, exclude?: list} */ public $composerPackages = []; @@ -74,7 +74,7 @@ class Modules extends BaseModules * * If it is not listed, only the base application elements will be used. * - * @var string[] + * @var list */ public $aliases = ['events', 'filters', 'registrars', 'routes', 'services']; } diff --git a/app/Config/Publisher.php b/app/Config/Publisher.php index 103f1eef..16dd6783 100644 --- a/app/Config/Publisher.php +++ b/app/Config/Publisher.php @@ -19,7 +19,7 @@ class Publisher extends BasePublisher * to directories not in this list will result in a PublisherException. Files that do no fit the pattern will cause * copy/merge to fail. * - * @var array + * @var array */ public $restrictions = [ ROOTPATH => '*', diff --git a/app/Config/Session.php b/app/Config/Session.php index 73ad8e56..34439837 100644 --- a/app/Config/Session.php +++ b/app/Config/Session.php @@ -21,7 +21,7 @@ class Session extends BaseConfig * - `CodeIgniter\Session\Handlers\MemcachedHandler` * - `CodeIgniter\Session\Handlers\RedisHandler` * - * @phpstan-var class-string + * @var class-string */ public string $driver = FileHandler::class; diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php index cb4b813f..4af946e5 100644 --- a/app/Models/EpisodeModel.php +++ b/app/Models/EpisodeModel.php @@ -218,6 +218,7 @@ class EpisodeModel extends UuidModel /** @var LazyUuidFromString $uuid */ $uuid = $this->uuid->{$this->uuidVersion}(); + // @phpstan-ignore-next-line if (! $this->update($episodeId, [ 'preview_id' => $uuid, ])) { diff --git a/app/Models/PlatformModel.php b/app/Models/PlatformModel.php index 7665a6f5..98a20c2c 100644 --- a/app/Models/PlatformModel.php +++ b/app/Models/PlatformModel.php @@ -84,7 +84,7 @@ class PlatformModel extends Model string $label, string $homeUrl, string $submitUrl = null - ): int | false { + ): bool { $data = [ 'slug' => $slug, 'type' => $type, diff --git a/app/Views/errors/cli/error_exception.php b/app/Views/errors/cli/error_exception.php index aa946812..d88d0ca3 100644 --- a/app/Views/errors/cli/error_exception.php +++ b/app/Views/errors/cli/error_exception.php @@ -5,17 +5,26 @@ declare(strict_types=1); use CodeIgniter\CLI\CLI; // The main Exception -CLI::newLine(); CLI::write('[' . get_class($exception) . ']', 'light_gray', 'red'); -CLI::newLine(); CLI::write($message); -CLI::newLine(); CLI::write('at ' . CLI::color(clean_path($exception->getFile()) . ':' . $exception->getLine(), 'green')); CLI::newLine(); +$last = $exception; + +while ($prevException = $last->getPrevious()) { + $last = $prevException; + + CLI::write(' Caused by:'); + CLI::write(' [' . get_class($prevException) . ']', 'red'); + CLI::write(' ' . $prevException->getMessage()); + CLI::write(' at ' . CLI::color(clean_path($prevException->getFile()) . ':' . $prevException->getLine(), 'green')); + CLI::newLine(); +} + // The backtrace if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE) { - $backtraces = $exception->getTrace(); + $backtraces = $last->getTrace(); if ($backtraces) { CLI::write('Backtrace:', 'green'); diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php index 6f9383a3..7c1c2521 100644 --- a/app/Views/errors/html/error_exception.php +++ b/app/Views/errors/html/error_exception.php @@ -47,6 +47,29 @@ $errorId = uniqid('error', true);
    +
    + getPrevious()) { + $last = $prevException; + ?> + +
    +    Caused by:
    +    getCode() ? ' #' . $prevException->getCode() : '') ?>
    +
    +    getMessage())) ?>
    +    getMessage())) ?>"
    +       rel="noreferrer" target="_blank">search →
    +    getFile()) . ':' . $prevException->getLine()) ?>
    +    
    + + +
    +
    @@ -72,11 +95,11 @@ $errorId = uniqid('error', true); {PHP internal code} diff --git a/composer.json b/composer.json index 0fdcfb62..e225dae7 100644 --- a/composer.json +++ b/composer.json @@ -9,12 +9,12 @@ "php": "^8.1", "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.1", - "aws/aws-sdk-php": "^3.294.4", + "aws/aws-sdk-php": "^3.295.3", "chrisjean/php-ico": "^1.0.4", "cocur/slugify": "^v4.5.1", - "codeigniter4/framework": "v4.4.3", + "codeigniter4/framework": "v4.4.4", "codeigniter4/settings": "v2.1.2", - "codeigniter4/shield": "v1.0.0-beta.8", + "codeigniter4/shield": "v1.0.0", "codeigniter4/tasks": "dev-develop", "geoip2/geoip2": "v3.0.0", "james-heinrich/getid3": "^2.0.0-beta5", @@ -24,7 +24,7 @@ "michalsn/codeigniter4-uuid": "v1.0.2", "mpratt/embera": "^2.0.36", "opawg/user-agents-v2-php": "dev-main", - "phpseclib/phpseclib": "~2.0.45", + "phpseclib/phpseclib": "~2.0.46", "vlucas/phpdotenv": "v5.6.0", "whichbrowser/parser": "^v2.1.7", "yassinedoghri/podcast-feed": "dev-main" @@ -35,7 +35,7 @@ "mikey179/vfsstream": "^v1.6.11", "phpstan/extension-installer": "^1.3.1", "phpstan/phpstan": "^1.10.50", - "phpunit/phpunit": "^10.5.3", + "phpunit/phpunit": "^10.5.5", "rector/rector": "^0.18.13", "symplify/coding-standard": "^12.0.7", "symplify/easy-coding-standard": "^12.0.13" diff --git a/composer.lock b/composer.lock index 5622644a..87b2f984 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2127030d8f3ed9c557e03a6ea20f11e2", + "content-hash": "69ff48ebf4e599995465a1839dc6001c", "packages": [ { "name": "adaures/ipcat-php", @@ -120,16 +120,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.294.4", + "version": "3.295.3", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "4f59bf50aa445fc3ec0b10648b205dd2465e9bec" + "reference": "3346f60c6c5075453f90f703693f764dad76a3a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4f59bf50aa445fc3ec0b10648b205dd2465e9bec", - "reference": "4f59bf50aa445fc3ec0b10648b205dd2465e9bec", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3346f60c6c5075453f90f703693f764dad76a3a8", + "reference": "3346f60c6c5075453f90f703693f764dad76a3a8", "shasum": "" }, "require": { @@ -205,9 +205,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.294.4" + "source": "https://github.com/aws/aws-sdk-php/tree/3.295.3" }, - "time": "2023-12-20T19:21:19+00:00" + "time": "2023-12-28T19:32:33+00:00" }, { "name": "brick/math", @@ -373,16 +373,16 @@ }, { "name": "codeigniter4/framework", - "version": "v4.4.3", + "version": "v4.4.4", "source": { "type": "git", "url": "https://github.com/codeigniter4/framework.git", - "reference": "a0339851ed3fa122a4a0e7930c62a1463e0cb257" + "reference": "7c170c4e6bde1b879ee67a8a5457c06cfc3ad07a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/a0339851ed3fa122a4a0e7930c62a1463e0cb257", - "reference": "a0339851ed3fa122a4a0e7930c62a1463e0cb257", + "url": "https://api.github.com/repos/codeigniter4/framework/zipball/7c170c4e6bde1b879ee67a8a5457c06cfc3ad07a", + "reference": "7c170c4e6bde1b879ee67a8a5457c06cfc3ad07a", "shasum": "" }, "require": { @@ -396,7 +396,7 @@ "require-dev": { "codeigniter/coding-standard": "^1.5", "fakerphp/faker": "^1.9", - "friendsofphp/php-cs-fixer": "3.13.0", + "friendsofphp/php-cs-fixer": "~3.41.0", "kint-php/kint": "^5.0.4", "mikey179/vfsstream": "^1.6", "nexusphp/cs-config": "^3.6", @@ -419,6 +419,7 @@ "ext-readline": "Improves CLI::input() usability", "ext-redis": "If you use Cache class RedisHandler", "ext-simplexml": "If you format XML", + "ext-sodium": "If you use Encryption SodiumHandler", "ext-sqlite3": "If you use SQLite3", "ext-sqlsrv": "If you use SQL Server", "ext-xdebug": "If you use CIUnitTestCase::assertHeaderEmitted()" @@ -439,7 +440,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/codeigniter4/CodeIgniter4" }, - "time": "2023-10-26T22:45:01+00:00" + "time": "2023-12-28T10:37:53+00:00" }, { "name": "codeigniter4/settings", @@ -490,16 +491,16 @@ }, { "name": "codeigniter4/shield", - "version": "v1.0.0-beta.8", + "version": "v1.0.0", "source": { "type": "git", "url": "https://github.com/codeigniter4/shield.git", - "reference": "434e5a0e550d24199dc4f04033a872e8d3d847d7" + "reference": "7be6b60250158ade521a6f0fdb15ece02254d09a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/shield/zipball/434e5a0e550d24199dc4f04033a872e8d3d847d7", - "reference": "434e5a0e550d24199dc4f04033a872e8d3d847d7", + "url": "https://api.github.com/repos/codeigniter4/shield/zipball/7be6b60250158ade521a6f0fdb15ece02254d09a", + "reference": "7be6b60250158ade521a6f0fdb15ece02254d09a", "shasum": "" }, "require": { @@ -518,7 +519,7 @@ "mockery/mockery": "^1.0", "phpstan/extension-installer": "^1.3", "phpstan/phpstan-strict-rules": "^1.5", - "rector/rector": "0.18.10" + "rector/rector": "0.18.13" }, "suggest": { "ext-curl": "Required to use the password validation rule via PwnedValidator class.", @@ -555,7 +556,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/codeigniter4/shield" }, - "time": "2023-11-22T23:56:12+00:00" + "time": "2023-12-27T06:55:58+00:00" }, { "name": "codeigniter4/tasks", @@ -563,12 +564,12 @@ "source": { "type": "git", "url": "https://github.com/codeigniter4/tasks.git", - "reference": "f9a94eb7a4817ea74fa0c193626671922d1ac5fc" + "reference": "429a51a2a99ad68c82b6583f5c4ad0de8ad88e46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/f9a94eb7a4817ea74fa0c193626671922d1ac5fc", - "reference": "f9a94eb7a4817ea74fa0c193626671922d1ac5fc", + "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/429a51a2a99ad68c82b6583f5c4ad0de8ad88e46", + "reference": "429a51a2a99ad68c82b6583f5c4ad0de8ad88e46", "shasum": "" }, "require": { @@ -579,7 +580,7 @@ "require-dev": { "codeigniter4/devkit": "^1.0", "codeigniter4/framework": "^4.1", - "rector/rector": "0.18.12" + "rector/rector": "0.18.13" }, "default-branch": true, "type": "library", @@ -637,7 +638,7 @@ "source": "https://github.com/codeigniter4/tasks/tree/develop", "issues": "https://github.com/codeigniter4/tasks/issues" }, - "time": "2023-12-17T16:05:01+00:00" + "time": "2023-12-22T18:29:10+00:00" }, { "name": "composer/ca-bundle", @@ -2165,16 +2166,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.45", + "version": "2.0.46", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "28d8f438a0064c9de80857e3270d071495544640" + "reference": "498e67a0c82bd5791fda9b0dd0f4ec8e8aebb02d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/28d8f438a0064c9de80857e3270d071495544640", - "reference": "28d8f438a0064c9de80857e3270d071495544640", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/498e67a0c82bd5791fda9b0dd0f4ec8e8aebb02d", + "reference": "498e67a0c82bd5791fda9b0dd0f4ec8e8aebb02d", "shasum": "" }, "require": { @@ -2251,7 +2252,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.45" + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.46" }, "funding": [ { @@ -2267,7 +2268,7 @@ "type": "tidelift" } ], - "time": "2023-09-15T20:55:47+00:00" + "time": "2023-12-29T01:52:43+00:00" }, { "name": "psr/cache", @@ -3622,16 +3623,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.41.1", + "version": "v3.43.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6" + "reference": "91c0b47216aa43b09656b4d99aa9dade2f3ad8fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8b6ae8dcbaf23f09680643ab832a4a3a260265f6", - "reference": "8b6ae8dcbaf23f09680643ab832a4a3a260265f6", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/91c0b47216aa43b09656b4d99aa9dade2f3ad8fc", + "reference": "91c0b47216aa43b09656b4d99aa9dade2f3ad8fc", "shasum": "" }, "require": { @@ -3661,8 +3662,7 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpunit/phpunit": "^9.6", - "symfony/phpunit-bridge": "^6.3.8 || ^7.0", + "phpunit/phpunit": "^9.6 || ^10.5.5", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { @@ -3697,7 +3697,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.41.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.43.1" }, "funding": [ { @@ -3705,7 +3705,7 @@ "type": "github" } ], - "time": "2023-12-10T19:59:27+00:00" + "time": "2023-12-29T09:42:16+00:00" }, { "name": "mikey179/vfsstream", @@ -4341,16 +4341,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.3", + "version": "10.5.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19" + "reference": "ed21115d505b4b4f7dc7b5651464e19a2c7f7856" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6fce887c71076a73f32fd3e0774a6833fc5c7f19", - "reference": "6fce887c71076a73f32fd3e0774a6833fc5c7f19", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ed21115d505b4b4f7dc7b5651464e19a2c7f7856", + "reference": "ed21115d505b4b4f7dc7b5651464e19a2c7f7856", "shasum": "" }, "require": { @@ -4410,7 +4410,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.5" }, "funding": [ { @@ -4426,7 +4426,7 @@ "type": "tidelift" } ], - "time": "2023-12-13T07:25:23+00:00" + "time": "2023-12-27T15:13:52+00:00" }, { "name": "psr/container", @@ -4804,16 +4804,16 @@ }, { "name": "sebastian/diff", - "version": "5.0.3", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", "shasum": "" }, "require": { @@ -4826,7 +4826,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -4850,7 +4850,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" }, "funding": [ { @@ -4858,7 +4858,7 @@ "type": "github" } ], - "time": "2023-05-01T07:48:21+00:00" + "time": "2023-12-22T10:55:06+00:00" }, { "name": "sebastian/environment", @@ -6218,21 +6218,21 @@ }, { "name": "symfony/service-contracts", - "version": "v3.4.0", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", - "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^2.0" + "psr/container": "^1.1|^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -6276,7 +6276,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" }, "funding": [ { @@ -6292,7 +6292,7 @@ "type": "tidelift" } ], - "time": "2023-07-30T20:28:31+00:00" + "time": "2023-12-26T14:02:43+00:00" }, { "name": "symfony/stopwatch", @@ -6640,7 +6640,6 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "codeigniter4/shield": 10, "codeigniter4/tasks": 20, "james-heinrich/getid3": 10, "opawg/user-agents-v2-php": 20, @@ -6652,5 +6651,5 @@ "php": "^8.1" }, "platform-dev": [], - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } diff --git a/env b/env index cb99e19c..e60354b3 100644 --- a/env +++ b/env @@ -140,4 +140,4 @@ # CURLRequest #-------------------------------------------------------------------- -# curlrequest.shareOptions = true +# curlrequest.shareOptions = false diff --git a/package.json b/package.json index a585193f..7c5e29b2 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,11 @@ "dependencies": { "@amcharts/amcharts4": "^4.10.38", "@amcharts/amcharts4-geodata": "^4.1.28", - "@codemirror/commands": "^6.3.2", + "@codemirror/commands": "^6.3.3", "@codemirror/lang-xml": "^6.0.2", - "@codemirror/language": "^6.9.3", - "@codemirror/state": "^6.3.3", - "@codemirror/view": "^6.22.3", + "@codemirror/language": "^6.10.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.23.0", "@floating-ui/dom": "^1.5.3", "@github/clipboard-copy-element": "^1.3.0", "@github/hotkey": "^3.1.0", @@ -49,7 +49,7 @@ "leaflet.markercluster": "^1.5.3", "lit": "^3.1.0", "marked": "^11.1.0", - "wavesurfer.js": "^7.5.3", + "wavesurfer.js": "^7.6.0", "xml-formatter": "^3.6.0" }, "devDependencies": { @@ -63,8 +63,8 @@ "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.10", "@types/leaflet": "^1.9.8", - "@typescript-eslint/eslint-plugin": "^6.15.0", - "@typescript-eslint/parser": "^6.15.0", + "@typescript-eslint/eslint-plugin": "^6.16.0", + "@typescript-eslint/parser": "^6.16.0", "all-contributors-cli": "^6.26.1", "commitizen": "^4.3.0", "cross-env": "^7.0.3", @@ -84,8 +84,8 @@ "prettier": "2.8.8", "prettier-plugin-organize-imports": "^3.2.4", "semantic-release": "^22.0.12", - "stylelint": "^16.0.2", - "stylelint-config-standard": "^35.0.0", + "stylelint": "^16.1.0", + "stylelint-config-standard": "^36.0.0", "svgo": "^3.1.0", "tailwindcss": "^3.4.0", "typescript": "^5.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab6339c1..284b8523 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,20 +12,20 @@ dependencies: specifier: ^4.1.28 version: 4.1.28 "@codemirror/commands": - specifier: ^6.3.2 - version: 6.3.2 - "@codemirror/lang-xml": - specifier: ^6.0.2 - version: 6.0.2(@codemirror/view@6.22.3) - "@codemirror/language": - specifier: ^6.9.3 - version: 6.9.3 - "@codemirror/state": specifier: ^6.3.3 version: 6.3.3 + "@codemirror/lang-xml": + specifier: ^6.0.2 + version: 6.0.2(@codemirror/view@6.23.0) + "@codemirror/language": + specifier: ^6.10.0 + version: 6.10.0 + "@codemirror/state": + specifier: ^6.4.0 + version: 6.4.0 "@codemirror/view": - specifier: ^6.22.3 - version: 6.22.3 + specifier: ^6.23.0 + version: 6.23.0 "@floating-ui/dom": specifier: ^1.5.3 version: 1.5.3 @@ -52,7 +52,7 @@ dependencies: version: 10.2.0 codemirror: specifier: ^6.0.1 - version: 6.0.1(@lezer/common@1.1.1) + version: 6.0.1(@lezer/common@1.2.0) flatpickr: specifier: ^4.6.13 version: 4.6.13 @@ -69,8 +69,8 @@ dependencies: specifier: ^11.1.0 version: 11.1.0 wavesurfer.js: - specifier: ^7.5.3 - version: 7.5.3 + specifier: ^7.6.0 + version: 7.6.0 xml-formatter: specifier: ^3.6.0 version: 3.6.0 @@ -107,11 +107,11 @@ devDependencies: specifier: ^1.9.8 version: 1.9.8 "@typescript-eslint/eslint-plugin": - specifier: ^6.15.0 - version: 6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.16.0 + version: 6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.3.3) "@typescript-eslint/parser": - specifier: ^6.15.0 - version: 6.15.0(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.16.0 + version: 6.16.0(eslint@8.56.0)(typescript@5.3.3) all-contributors-cli: specifier: ^6.26.1 version: 6.26.1 @@ -170,11 +170,11 @@ devDependencies: specifier: ^22.0.12 version: 22.0.12(typescript@5.3.3) stylelint: - specifier: ^16.0.2 - version: 16.0.2(typescript@5.3.3) + specifier: ^16.1.0 + version: 16.1.0(typescript@5.3.3) stylelint-config-standard: - specifier: ^35.0.0 - version: 35.0.0(stylelint@16.0.2) + specifier: ^36.0.0 + version: 36.0.0(stylelint@16.1.0) svgo: specifier: ^3.1.0 version: 3.1.0 @@ -186,7 +186,7 @@ devDependencies: version: 5.3.3 vite: specifier: ^5.0.10 - version: 5.0.10(@types/node@18.18.9) + version: 5.0.10(@types/node@18.19.3) vite-plugin-pwa: specifier: ^0.17.4 version: 0.17.4(vite@5.0.10)(workbox-build@7.0.0)(workbox-window@7.0.0) @@ -233,14 +233,14 @@ packages: integrity: sha512-mX1MYvXCU/wMr6q1WQRVRS1qAbxyiYBfkkdC2ZpT+0uKYIWVUHo+phtbRgAE9t/3ymfWiDEZ813lcAtbokMf3w==, } dependencies: - "@babel/runtime": 7.22.11 - core-js: 3.32.1 + "@babel/runtime": 7.23.6 + core-js: 3.35.0 d3-force: 3.0.0 d3-geo: 3.1.0 d3-geo-projection: 4.0.0 d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - pdfmake: 0.2.7 + pdfmake: 0.2.8 polylabel: 1.1.0 raf: 3.4.1 regression: 2.0.1 @@ -257,7 +257,7 @@ packages: engines: { node: ">=6.0.0" } dependencies: "@jridgewell/gen-mapping": 0.3.3 - "@jridgewell/trace-mapping": 0.3.19 + "@jridgewell/trace-mapping": 0.3.20 dev: true /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): @@ -275,54 +275,43 @@ packages: leven: 3.1.0 dev: true - /@babel/code-frame@7.22.10: + /@babel/code-frame@7.23.5: resolution: { - integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==, + integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/highlight": 7.22.10 + "@babel/highlight": 7.23.4 chalk: 2.4.2 dev: true - /@babel/code-frame@7.22.13: + /@babel/compat-data@7.23.5: resolution: { - integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==, - } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/highlight": 7.22.20 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.22.9: - resolution: - { - integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==, + integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==, } engines: { node: ">=6.9.0" } dev: true - /@babel/core@7.22.11: + /@babel/core@7.23.6: resolution: { - integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==, + integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==, } engines: { node: ">=6.9.0" } dependencies: "@ampproject/remapping": 2.2.1 - "@babel/code-frame": 7.22.10 - "@babel/generator": 7.22.10 - "@babel/helper-compilation-targets": 7.22.10 - "@babel/helper-module-transforms": 7.22.9(@babel/core@7.22.11) - "@babel/helpers": 7.22.11 - "@babel/parser": 7.22.11 - "@babel/template": 7.22.5 - "@babel/traverse": 7.22.11 - "@babel/types": 7.22.11 - convert-source-map: 1.9.0 + "@babel/code-frame": 7.23.5 + "@babel/generator": 7.23.6 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) + "@babel/helpers": 7.23.6 + "@babel/parser": 7.23.6 + "@babel/template": 7.22.15 + "@babel/traverse": 7.23.6 + "@babel/types": 7.23.6 + convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 @@ -331,16 +320,16 @@ packages: - supports-color dev: true - /@babel/generator@7.22.10: + /@babel/generator@7.23.6: resolution: { - integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==, + integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 "@jridgewell/gen-mapping": 0.3.3 - "@jridgewell/trace-mapping": 0.3.19 + "@jridgewell/trace-mapping": 0.3.20 jsesc: 2.5.2 dev: true @@ -351,104 +340,104 @@ packages: } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10: + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: { - integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==, + integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true - /@babel/helper-compilation-targets@7.22.10: + /@babel/helper-compilation-targets@7.23.6: resolution: { - integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==, + integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/compat-data": 7.22.9 - "@babel/helper-validator-option": 7.22.5 - browserslist: 4.22.1 + "@babel/compat-data": 7.23.5 + "@babel/helper-validator-option": 7.23.5 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.22.11(@babel/core@7.22.11): + /@babel/helper-create-class-features-plugin@7.23.6(@babel/core@7.23.6): resolution: { - integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==, + integrity: sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-environment-visitor": 7.22.5 - "@babel/helper-function-name": 7.22.5 - "@babel/helper-member-expression-to-functions": 7.22.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-member-expression-to-functions": 7.23.0 "@babel/helper-optimise-call-expression": 7.22.5 - "@babel/helper-replace-supers": 7.22.9(@babel/core@7.22.11) + "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.6) "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 "@babel/helper-split-export-declaration": 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.11): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.6): resolution: { - integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==, + integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.11): + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.6): resolution: { - integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==, + integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==, } peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-compilation-targets": 7.22.10 + "@babel/core": 7.23.6 + "@babel/helper-compilation-targets": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 - resolve: 1.22.4 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-environment-visitor@7.22.5: + /@babel/helper-environment-visitor@7.22.20: resolution: { - integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==, + integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, } engines: { node: ">=6.9.0" } dev: true - /@babel/helper-function-name@7.22.5: + /@babel/helper-function-name@7.23.0: resolution: { - integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==, + integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/template": 7.22.5 - "@babel/types": 7.22.11 + "@babel/template": 7.22.15 + "@babel/types": 7.23.6 dev: true /@babel/helper-hoist-variables@7.22.5: @@ -458,41 +447,41 @@ packages: } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true - /@babel/helper-member-expression-to-functions@7.22.5: + /@babel/helper-member-expression-to-functions@7.23.0: resolution: { - integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==, + integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true - /@babel/helper-module-imports@7.22.5: + /@babel/helper-module-imports@7.22.15: resolution: { - integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==, + integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==, + integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-environment-visitor": 7.22.5 - "@babel/helper-module-imports": 7.22.5 + "@babel/core": 7.23.6 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-module-imports": 7.22.15 "@babel/helper-simple-access": 7.22.5 "@babel/helper-split-export-declaration": 7.22.6 "@babel/helper-validator-identifier": 7.22.20 @@ -505,7 +494,7 @@ packages: } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -516,33 +505,33 @@ packages: engines: { node: ">=6.9.0" } dev: true - /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.11): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.6): resolution: { - integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==, + integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-environment-visitor": 7.22.5 - "@babel/helper-wrap-function": 7.22.10 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-wrap-function": 7.22.20 dev: true - /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.11): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): resolution: { - integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==, + integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-environment-visitor": 7.22.5 - "@babel/helper-member-expression-to-functions": 7.22.5 + "@babel/core": 7.23.6 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-member-expression-to-functions": 7.23.0 "@babel/helper-optimise-call-expression": 7.22.5 dev: true @@ -553,7 +542,7 @@ packages: } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true /@babel/helper-skip-transparent-expression-wrappers@7.22.5: @@ -563,7 +552,7 @@ packages: } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true /@babel/helper-split-export-declaration@7.22.6: @@ -573,13 +562,13 @@ packages: } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true - /@babel/helper-string-parser@7.22.5: + /@babel/helper-string-parser@7.23.4: resolution: { - integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, + integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, } engines: { node: ">=6.9.0" } dev: true @@ -592,64 +581,44 @@ packages: engines: { node: ">=6.9.0" } dev: true - /@babel/helper-validator-identifier@7.22.5: + /@babel/helper-validator-option@7.23.5: resolution: { - integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==, + integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, } engines: { node: ">=6.9.0" } dev: true - /@babel/helper-validator-option@7.22.5: + /@babel/helper-wrap-function@7.22.20: resolution: { - integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==, - } - engines: { node: ">=6.9.0" } - dev: true - - /@babel/helper-wrap-function@7.22.10: - resolution: - { - integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==, + integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/helper-function-name": 7.22.5 - "@babel/template": 7.22.5 - "@babel/types": 7.22.11 + "@babel/helper-function-name": 7.23.0 + "@babel/template": 7.22.15 + "@babel/types": 7.23.6 dev: true - /@babel/helpers@7.22.11: + /@babel/helpers@7.23.6: resolution: { - integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==, + integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/template": 7.22.5 - "@babel/traverse": 7.22.11 - "@babel/types": 7.22.11 + "@babel/template": 7.22.15 + "@babel/traverse": 7.23.6 + "@babel/types": 7.23.6 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.22.10: + /@babel/highlight@7.23.4: resolution: { - integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==, - } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-validator-identifier": 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/highlight@7.22.20: - resolution: - { - integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==, + integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==, } engines: { node: ">=6.9.0" } dependencies: @@ -658,46 +627,60 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.22.11: + /@babel/parser@7.23.6: resolution: { - integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==, + integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, } engines: { node: ">=6.0.0" } hasBin: true dependencies: - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.11): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==, + integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.11): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==, + integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.13.0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - "@babel/plugin-transform-optional-chaining": 7.22.12(@babel/core@7.22.11) + "@babel/plugin-transform-optional-chaining": 7.23.4(@babel/core@7.23.6) dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6): + resolution: + { + integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.23.6 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-plugin-utils": 7.22.5 + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6): resolution: { integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, @@ -706,10 +689,10 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6): resolution: { integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, @@ -717,11 +700,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): resolution: { integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, @@ -729,11 +712,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.11): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): resolution: { integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, @@ -742,11 +725,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6): resolution: { integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, @@ -754,11 +737,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): resolution: { integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, @@ -766,37 +749,37 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.11): + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==, + integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.11): + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==, + integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): resolution: { integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, @@ -804,11 +787,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6): resolution: { integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, @@ -816,11 +799,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.6): resolution: { integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, @@ -828,11 +811,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6): resolution: { integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, @@ -840,11 +823,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6): resolution: { integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, @@ -852,11 +835,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6): resolution: { integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, @@ -864,11 +847,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6): resolution: { integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, @@ -876,11 +859,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6): resolution: { integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, @@ -888,11 +871,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.11): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): resolution: { integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, @@ -901,11 +884,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6): resolution: { integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, @@ -914,11 +897,11 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.11): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.6): resolution: { integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, @@ -927,369 +910,370 @@ packages: peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-regexp-features-plugin": 7.22.9(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==, + integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==, + integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-environment-visitor": 7.22.5 + "@babel/core": 7.23.6 + "@babel/helper-environment-visitor": 7.22.20 "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-remap-async-to-generator": 7.22.9(@babel/core@7.22.11) - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.22.11) + "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.6) + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==, + integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-module-imports": 7.22.5 + "@babel/core": 7.23.6 + "@babel/helper-module-imports": 7.22.15 "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-remap-async-to-generator": 7.22.9(@babel/core@7.22.11) + "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==, + integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.11): + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==, + integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==, + integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-class-features-plugin": 7.22.11(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==, + integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.12.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-class-features-plugin": 7.22.11(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.22.11) + "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.11): + /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6): resolution: { - integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==, + integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-compilation-targets": 7.22.10 - "@babel/helper-environment-visitor": 7.22.5 - "@babel/helper-function-name": 7.22.5 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 "@babel/helper-optimise-call-expression": 7.22.5 "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-replace-supers": 7.22.9(@babel/core@7.22.11) + "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.6) "@babel/helper-split-export-declaration": 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==, + integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/template": 7.22.5 + "@babel/template": 7.22.15 dev: true - /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.11): + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==, + integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==, + integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-regexp-features-plugin": 7.22.9(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==, + integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==, + integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.22.11) + "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==, + integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-builder-binary-assignment-operator-visitor": 7.22.10 + "@babel/core": 7.23.6 + "@babel/helper-builder-binary-assignment-operator-visitor": 7.22.15 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==, + integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.22.11) + "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6): resolution: { - integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==, + integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6): + resolution: + { + integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.6 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-function-name": 7.23.0 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==, + integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-compilation-targets": 7.22.10 - "@babel/helper-function-name": 7.22.5 + "@babel/core": 7.23.6 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.6) + dev: true + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6): + resolution: + { + integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==, + integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.22.11) + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==, + integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==, + integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.22.11) - dev: true - - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11): - resolution: - { - integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==, + integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-module-transforms": 7.22.9(@babel/core@7.22.11) - "@babel/helper-plugin-utils": 7.22.5 - dev: true - - /@babel/plugin-transform-modules-commonjs@7.22.11(@babel/core@7.22.11): - resolution: - { - integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.22.11 - "@babel/helper-module-transforms": 7.22.9(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-simple-access": 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==, + integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-hoist-variables": 7.22.5 - "@babel/helper-module-transforms": 7.22.9(@babel/core@7.22.11) + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-validator-identifier": 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==, + integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-module-transforms": 7.22.9(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6): resolution: { integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==, @@ -1298,411 +1282,411 @@ packages: peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-regexp-features-plugin": 7.22.9(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==, + integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==, + integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.22.11) + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==, + integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.22.11) + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-object-rest-spread@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==, + integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/compat-data": 7.22.9 - "@babel/core": 7.22.11 - "@babel/helper-compilation-targets": 7.22.10 + "@babel/compat-data": 7.23.5 + "@babel/core": 7.23.6 + "@babel/helper-compilation-targets": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.22.11) - "@babel/plugin-transform-parameters": 7.22.5(@babel/core@7.22.11) + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.6) + "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==, + integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-replace-supers": 7.22.9(@babel/core@7.22.11) + "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==, + integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.22.11) + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-optional-chaining@7.22.12(@babel/core@7.22.11): + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-7XXCVqZtyFWqjDsYDY4T45w4mlx1rf7aOgkc/Ww76xkgBiOlmjPkx36PBLHa1k1rwWvVgYMPsbuVnIamx2ZQJw==, + integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.22.11) + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==, + integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==, + integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-class-features-plugin": 7.22.11(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.11): + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6): resolution: { - integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==, + integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-create-class-features-plugin": 7.22.11(@babel/core@7.22.11) + "@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.22.11) + "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.23.6) dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==, + integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.11): + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==, + integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==, + integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==, + integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==, + integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==, + integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==, + integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==, + integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.11): + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==, + integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==, + integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-regexp-features-plugin": 7.22.9(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==, + integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-regexp-features-plugin": 7.22.9(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6): resolution: { - integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==, + integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-create-regexp-features-plugin": 7.22.9(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 dev: true - /@babel/preset-env@7.22.10(@babel/core@7.22.11): + /@babel/preset-env@7.23.6(@babel/core@7.23.6): resolution: { - integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==, + integrity: sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 dependencies: - "@babel/compat-data": 7.22.9 - "@babel/core": 7.22.11 - "@babel/helper-compilation-targets": 7.22.10 + "@babel/compat-data": 7.23.5 + "@babel/core": 7.23.6 + "@babel/helper-compilation-targets": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-validator-option": 7.22.5 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11) - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.22.11) - "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.22.11) - "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.22.11) - "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.22.11) - "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.22.11) - "@babel/plugin-syntax-import-assertions": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-syntax-import-attributes": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.22.11) - "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.22.11) - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.22.11) - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.22.11) - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.22.11) - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.22.11) - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.22.11) - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.22.11) - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.22.11) - "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.22.11) - "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.22.11) - "@babel/plugin-transform-arrow-functions": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-async-generator-functions": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-async-to-generator": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-block-scoped-functions": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-block-scoping": 7.22.10(@babel/core@7.22.11) - "@babel/plugin-transform-class-properties": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-class-static-block": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-classes": 7.22.6(@babel/core@7.22.11) - "@babel/plugin-transform-computed-properties": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-destructuring": 7.22.10(@babel/core@7.22.11) - "@babel/plugin-transform-dotall-regex": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-duplicate-keys": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-dynamic-import": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-exponentiation-operator": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-export-namespace-from": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-for-of": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-function-name": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-json-strings": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-literals": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-logical-assignment-operators": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-member-expression-literals": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-modules-amd": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-modules-commonjs": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-modules-systemjs": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-modules-umd": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-named-capturing-groups-regex": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-new-target": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-nullish-coalescing-operator": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-numeric-separator": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-object-rest-spread": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-object-super": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-optional-catch-binding": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-optional-chaining": 7.22.12(@babel/core@7.22.11) - "@babel/plugin-transform-parameters": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-private-methods": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-private-property-in-object": 7.22.11(@babel/core@7.22.11) - "@babel/plugin-transform-property-literals": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-regenerator": 7.22.10(@babel/core@7.22.11) - "@babel/plugin-transform-reserved-words": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-shorthand-properties": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-spread": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-sticky-regex": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-template-literals": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-typeof-symbol": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-unicode-escapes": 7.22.10(@babel/core@7.22.11) - "@babel/plugin-transform-unicode-property-regex": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-unicode-regex": 7.22.5(@babel/core@7.22.11) - "@babel/plugin-transform-unicode-sets-regex": 7.22.5(@babel/core@7.22.11) - "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.22.11) - "@babel/types": 7.22.11 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.11) - babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.11) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.11) - core-js-compat: 3.32.1 + "@babel/helper-validator-option": 7.23.5 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6) + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.6) + "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.23.6) + "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.23.6) + "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.6) + "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.6) + "@babel/plugin-syntax-import-assertions": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-syntax-import-attributes": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.23.6) + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.6) + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.6) + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.6) + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.6) + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.6) + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.6) + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.6) + "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.23.6) + "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.23.6) + "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.23.6) + "@babel/plugin-transform-arrow-functions": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-async-generator-functions": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-async-to-generator": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-block-scoped-functions": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-block-scoping": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-class-properties": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-class-static-block": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-classes": 7.23.5(@babel/core@7.23.6) + "@babel/plugin-transform-computed-properties": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-destructuring": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-dotall-regex": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-duplicate-keys": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-dynamic-import": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-exponentiation-operator": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-export-namespace-from": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-for-of": 7.23.6(@babel/core@7.23.6) + "@babel/plugin-transform-function-name": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-json-strings": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-literals": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-logical-assignment-operators": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-member-expression-literals": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-modules-amd": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-modules-commonjs": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-modules-systemjs": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-modules-umd": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-named-capturing-groups-regex": 7.22.5(@babel/core@7.23.6) + "@babel/plugin-transform-new-target": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-nullish-coalescing-operator": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-numeric-separator": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-object-rest-spread": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-object-super": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-optional-catch-binding": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-optional-chaining": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-private-methods": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-private-property-in-object": 7.23.4(@babel/core@7.23.6) + "@babel/plugin-transform-property-literals": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-regenerator": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-reserved-words": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-shorthand-properties": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-spread": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-sticky-regex": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-template-literals": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-typeof-symbol": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-unicode-escapes": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-unicode-property-regex": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-unicode-regex": 7.23.3(@babel/core@7.23.6) + "@babel/plugin-transform-unicode-sets-regex": 7.23.3(@babel/core@7.23.6) + "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.23.6) + babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.6) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.6) + babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.6) + core-js-compat: 3.35.0 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.11): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6): resolution: { integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, @@ -1710,9 +1694,9 @@ packages: peerDependencies: "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - "@babel/core": 7.22.11 + "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - "@babel/types": 7.22.11 + "@babel/types": 7.23.6 esutils: 2.0.3 dev: true @@ -1723,64 +1707,64 @@ packages: } dev: true - /@babel/runtime@7.22.11: + /@babel/runtime@7.23.6: resolution: { - integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==, + integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==, } engines: { node: ">=6.9.0" } dependencies: - regenerator-runtime: 0.14.0 + regenerator-runtime: 0.14.1 - /@babel/template@7.22.5: + /@babel/template@7.22.15: resolution: { - integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==, + integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/code-frame": 7.22.13 - "@babel/parser": 7.22.11 - "@babel/types": 7.22.11 + "@babel/code-frame": 7.23.5 + "@babel/parser": 7.23.6 + "@babel/types": 7.23.6 dev: true - /@babel/traverse@7.22.11: + /@babel/traverse@7.23.6: resolution: { - integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==, + integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/code-frame": 7.22.13 - "@babel/generator": 7.22.10 - "@babel/helper-environment-visitor": 7.22.5 - "@babel/helper-function-name": 7.22.5 + "@babel/code-frame": 7.23.5 + "@babel/generator": 7.23.6 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 "@babel/helper-hoist-variables": 7.22.5 "@babel/helper-split-export-declaration": 7.22.6 - "@babel/parser": 7.22.11 - "@babel/types": 7.22.11 + "@babel/parser": 7.23.6 + "@babel/types": 7.23.6 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.22.11: + /@babel/types@7.23.6: resolution: { - integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==, + integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/helper-string-parser": 7.22.5 + "@babel/helper-string-parser": 7.23.4 "@babel/helper-validator-identifier": 7.22.20 to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.0.4): + /@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0): resolution: { - integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==, + integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==, } peerDependencies: "@codemirror/language": ^6.0.0 @@ -1788,106 +1772,89 @@ packages: "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 dependencies: - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.0.4 + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 dev: false - /@codemirror/autocomplete@6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.1): + /@codemirror/commands@6.3.3: resolution: { - integrity: sha512-Fbwm0V/Wn3BkEJZRhr0hi5BhCo5a7eBL6LYaliPjOSwCyfOpnjXY59HruSxOUNV+1OYer0Tgx1zRNQttjXyDog==, - } - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 - dependencies: - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.1 - dev: false - - /@codemirror/commands@6.3.2: - resolution: - { - integrity: sha512-tjoi4MCWDNxgIpoLZ7+tezdS9OEB6pkiDKhfKx9ReJ/XBcs2G2RXIu+/FxXBlWsPTsz6C9q/r4gjzrsxpcnqCQ==, + integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, } dependencies: - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.1 + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 dev: false - /@codemirror/lang-xml@6.0.2(@codemirror/view@6.22.3): + /@codemirror/lang-xml@6.0.2(@codemirror/view@6.23.0): resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.0.4) - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@lezer/common": 1.0.4 - "@lezer/xml": 1.0.2 + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@lezer/common": 1.2.0 + "@lezer/xml": 1.0.4 transitivePeerDependencies: - "@codemirror/view" dev: false - /@codemirror/language@6.9.3: + /@codemirror/language@6.10.0: resolution: { - integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==, + integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==, } dependencies: - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.1 - "@lezer/highlight": 1.1.6 - "@lezer/lr": 1.3.10 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 style-mod: 4.1.0 dev: false - /@codemirror/lint@6.4.0: + /@codemirror/lint@6.4.2: resolution: { - integrity: sha512-6VZ44Ysh/Zn07xrGkdtNfmHCbGSHZzFBdzWi0pbd7chAQ/iUcpLGX99NYRZTa7Ugqg4kEHCqiHhcZnH0gLIgSg==, + integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, } dependencies: - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 crelt: 1.0.6 dev: false - /@codemirror/search@6.5.1: + /@codemirror/search@6.5.5: resolution: { - integrity: sha512-4jupk4JwkeVbrN2pStY74q6OJEYqwosB4koA66nyLeVedadtX9MHI38j2vbYmnfDGurDApP3OZO46MrWalcjiQ==, + integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, } dependencies: - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 crelt: 1.0.6 dev: false - /@codemirror/state@6.3.3: + /@codemirror/state@6.4.0: resolution: { - integrity: sha512-0wufKcTw2dEwEaADajjHf6hBy1sh3M6V0e+q4JKIhLuiMSe5td5HOWpUdvKth1fT1M9VYOboajoBHpkCd7PG7A==, + integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==, } dev: false - /@codemirror/view@6.22.3: + /@codemirror/view@6.23.0: resolution: { - integrity: sha512-rqnq+Zospwoi3x1vZ8BGV1MlRsaGljX+6qiGYmIpJ++M+LCC+wjfDaPklhwpWSgv7pr/qx29KiAKQBH5+DOn4w==, + integrity: sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==, } dependencies: - "@codemirror/state": 6.3.3 + "@codemirror/state": 6.4.0 style-mod: 4.1.0 w3c-keyname: 2.2.8 dev: false @@ -2017,10 +1984,10 @@ packages: "@commitlint/execute-rule": 18.4.3 "@commitlint/resolve-extends": 18.4.3 "@commitlint/types": 18.4.3 - "@types/node": 18.18.9 + "@types/node": 18.19.3 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.3.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -2058,7 +2025,7 @@ packages: dependencies: "@commitlint/top-level": 18.4.3 "@commitlint/types": 18.4.3 - fs-extra: 11.1.1 + fs-extra: 11.2.0 git-raw-commits: 2.0.11 minimist: 1.2.8 dev: true @@ -2121,66 +2088,66 @@ packages: chalk: 4.1.2 dev: true - /@csstools/cascade-layer-name-parser@1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2): + /@csstools/cascade-layer-name-parser@1.0.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2): resolution: { - integrity: sha512-v/5ODKNBMfBl0us/WQjlfsvSlYxfZLhNMVIsuCPib2ulTwGKYbKJbwqw671+qH9Y4wvWVnu7LBChvml/wBKjFg==, + integrity: sha512-HkxRNs6ZIV0VjLFw6k5G8K35vd9r+O8B1Vr+QVD8M5Y44eQxyHtc42BdF74FQatXACPnitOR1+sRx2oWdnKTQw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.2 - "@csstools/css-tokenizer": ^2.2.1 + "@csstools/css-parser-algorithms": ^2.4.0 + "@csstools/css-tokenizer": ^2.2.2 dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 dev: true - /@csstools/color-helpers@3.0.2: + /@csstools/color-helpers@4.0.0: resolution: { - integrity: sha512-NMVs/l7Y9eIKL5XjbCHEgGcG8LOUT2qVcRjX6EzkCdlvftHVKr2tHIPzHavfrULRZ5Q2gxrJ9f44dAlj6fX97Q==, + integrity: sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w==, } engines: { node: ^14 || ^16 || >=18 } dev: true - /@csstools/css-calc@1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2): + /@csstools/css-calc@1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2): resolution: { - integrity: sha512-ZV1TSmToiNcQL1P3hfzlzZzA02mmVkVmXGaUDUqpYUG84PmLhVSZpKX+KfxAuOcK7de04UXSQPBrAvaya6iiGg==, + integrity: sha512-UhI5oSRAUtTHY3MyGahqn0ZzQOHVoPpfvUcOmYipAZ1rILAvCBoyiLSsa/clv1Xxct0SMKIq93KO5Bfl1cb6tQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.2 - "@csstools/css-tokenizer": ^2.2.1 + "@csstools/css-parser-algorithms": ^2.4.0 + "@csstools/css-tokenizer": ^2.2.2 dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 dev: true - /@csstools/css-color-parser@1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2): + /@csstools/css-color-parser@1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2): resolution: { - integrity: sha512-SlGd8E6ron24JYQPQAIzu5tvmWi1H4sDKTdA7UDnwF45oJv7AVESbOlOO1YjfBhrQFuvLWUgKiOY9DwGoAxwTA==, + integrity: sha512-PUhSg1MgU2sjYhA6moOmxYesqVqYTJwcVw12boTNbDX7Af+VK02MkgvmBBY2Z2qU6UN5HOQ+wrF0qQJGsTFY7w==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.2 - "@csstools/css-tokenizer": ^2.2.1 + "@csstools/css-parser-algorithms": ^2.4.0 + "@csstools/css-tokenizer": ^2.2.2 dependencies: - "@csstools/color-helpers": 3.0.2 - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/color-helpers": 4.0.0 + "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 dev: true - /@csstools/css-parser-algorithms@2.3.2(@csstools/css-tokenizer@2.2.2): + /@csstools/css-parser-algorithms@2.4.0(@csstools/css-tokenizer@2.2.2): resolution: { - integrity: sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA==, + integrity: sha512-/PPLr2g5PAUCKAPEbfyk6/baZA+WJHQtUhPkoCQMpyRE8I0lXrG1QFRN8e5s3ZYxM8d/g5BZc6lH3s8Op7/VEg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - "@csstools/css-tokenizer": ^2.2.1 + "@csstools/css-tokenizer": ^2.2.2 dependencies: "@csstools/css-tokenizer": 2.2.2 dev: true @@ -2193,85 +2160,85 @@ packages: engines: { node: ^14 || ^16 || >=18 } dev: true - /@csstools/media-query-list-parser@2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2): + /@csstools/media-query-list-parser@2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2): resolution: { - integrity: sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ==, + integrity: sha512-R6AKl9vaU0It7D7TR2lQn0pre5aQfdeqHRePlaRCY8rHL3l9eVlNRpsEVDKFi/zAjzv68CxH2M5kqbhPFPKjvw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.2 - "@csstools/css-tokenizer": ^2.2.1 + "@csstools/css-parser-algorithms": ^2.4.0 + "@csstools/css-tokenizer": ^2.2.2 dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 dev: true - /@csstools/postcss-cascade-layers@4.0.1(postcss@8.4.32): + /@csstools/postcss-cascade-layers@4.0.2(postcss@8.4.32): resolution: { - integrity: sha512-UYFuFL9GgVnftg9v7tBvVEBRLaBeAD66euD+yYy5fYCUld9ZIWTJNCE30hm6STMEdt6FL5xzeVw1lAZ1tpvUEg==, + integrity: sha512-PqM+jvg5T2tB4FHX+akrMGNWAygLupD4FNUjcv4PSvtVuWZ6ISxuo37m4jFGU7Jg3rCfloGzKd0+xfr5Ec3vZQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) + "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true - /@csstools/postcss-color-function@3.0.7(postcss@8.4.32): + /@csstools/postcss-color-function@3.0.8(postcss@8.4.32): resolution: { - integrity: sha512-/PIB20G1TPCXmQlaJLWIYzTZRZpj6csT4ijgnshIj/kcmniIRroAfDa0xSWnfuO1eNo0NptIaPU7jzUukWn55Q==, + integrity: sha512-jvbF7eCRbIcxWqby0kk2Mt85QtGzRRpFFYdlJCJ80Tuiv43PY+auS/nBl8pDQQ4Ndm4vsm4IC/wCZDcJUmpJmg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 dev: true - /@csstools/postcss-color-mix-function@2.0.7(postcss@8.4.32): + /@csstools/postcss-color-mix-function@2.0.8(postcss@8.4.32): resolution: { - integrity: sha512-57/g8aGo5eKFjEeJMiRKh8Qq43K2rCyk5ZZTvJ34TNl4zUtYU5DvLkIkOnhCtL8/a4z9oMA42aOnFPddRrScUQ==, + integrity: sha512-sGhk+TdZ2TeXspc6LSYSYC8WgzLlxoknUaObKgB0mk+dNjRQgSSIeCU+qrCwvHmwM+uTNKtiS8mntDzyQLHTTA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 dev: true - /@csstools/postcss-exponential-functions@1.0.1(postcss@8.4.32): + /@csstools/postcss-exponential-functions@1.0.2(postcss@8.4.32): resolution: { - integrity: sha512-ZLK2iSK4DUxeypGce2PnQSdYugUqDTwxnhNiq1o6OyKMNYgYs4eKbvEhFG8JKr1sJWbeqBi5jRr0017l2EWVvg==, + integrity: sha512-VRIYrwNCkZRqzsGB4jGT+XcNXsoiwyqy0Vf7C3I/5OPcf7WcWK3G1sBYFqqgWLGtpwc7m1m8TcorGY1xdh5abg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 postcss: 8.4.32 dev: true - /@csstools/postcss-font-format-keywords@3.0.0(postcss@8.4.32): + /@csstools/postcss-font-format-keywords@3.0.1(postcss@8.4.32): resolution: { - integrity: sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==, + integrity: sha512-D1lcG2sfotTq6yBEOMV3myFxJLT10F3DLYZJMbiny5YToqzHWodZen8WId3UTimm0mEHitXqAUNL5jdd6RzVdA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2281,70 +2248,70 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gamut-mapping@1.0.0(postcss@8.4.32): + /@csstools/postcss-gamut-mapping@1.0.1(postcss@8.4.32): resolution: { - integrity: sha512-6UQyK8l9YaG5Ao5rBDcCnKHrLsHiQ1E0zeFQuqDJqEtinVzAPb/MwSw3TenZXL1Rnd7th3tb+4CBFHBXdW5tbQ==, + integrity: sha512-GDVzfNbnc7x3GusFklvt0mYXIWVzxEtEtTFEW664NgZh/5V7Z89hZKBMl9piOAHXuxijfHtE+kul/ShfeLUvcA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 postcss: 8.4.32 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.7(postcss@8.4.32): + /@csstools/postcss-gradients-interpolation-method@4.0.8(postcss@8.4.32): resolution: { - integrity: sha512-GT1CzE/Tyr/ei4j5BwKESkHAgg+Gzys/0mAY7W+UiR+XrcYk5hDbOrE/YJIx1rflfO/7La1bDoZtA0YnLl4qNA==, + integrity: sha512-bmvCNzuUvWPPdgASh0T14ffTay/FdzXsXfp0wXT1pYoUPmkH9M6yyxwPEkHq5djjzSb2jiLl4Ta3XM1uOREQ2w==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 dev: true - /@csstools/postcss-hwb-function@3.0.6(postcss@8.4.32): + /@csstools/postcss-hwb-function@3.0.7(postcss@8.4.32): resolution: { - integrity: sha512-uQgWt2Ho2yy2S6qthWY7mD5v57NKxi6dD1NB8nAybU5bJSsm+hLXRGm3/zbOH4xNrqO3Cl60DFSNlSrUME3Xjg==, + integrity: sha512-iXs1gxKtev8YNP5bOF26TAsnMfcxnCRLpKItQ067RphYECKEK/xWm4Z0r4ChmV1U1eq+lbdH5ZIb2cju4o5akA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 postcss: 8.4.32 dev: true - /@csstools/postcss-ic-unit@3.0.2(postcss@8.4.32): + /@csstools/postcss-ic-unit@3.0.3(postcss@8.4.32): resolution: { - integrity: sha512-n28Er7W9qc48zNjJnvTKuVHY26/+6YlA9WzJRksIHiAWOMxSH5IksXkw7FpkIOd+jLi59BMrX/BWrZMgjkLBHg==, + integrity: sha512-MpcmIL0/uMm/cFWh5V/9nbKKJ7jRr2qTYW5Q6zoE6HZ6uzOBJr2KRERv5/x8xzEBQ1MthDT7iP1EBp9luSQy7g==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-initial@1.0.0(postcss@8.4.32): + /@csstools/postcss-initial@1.0.1(postcss@8.4.32): resolution: { - integrity: sha512-1l7iHHjIl5qmVeGItugr4ZOlCREDP71mNKqoEyxlosIoiu3Os1nPWMHpuCvDLCLiWI/ONTOg3nzJh7gwHOrqUA==, + integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2353,24 +2320,24 @@ packages: postcss: 8.4.32 dev: true - /@csstools/postcss-is-pseudo-class@4.0.3(postcss@8.4.32): + /@csstools/postcss-is-pseudo-class@4.0.4(postcss@8.4.32): resolution: { - integrity: sha512-/dt5M9Ty/x3Yiq0Nm/5PJJzwkVFchJgdjKVnryBPtoMCb9ohb/nDIJOwr/Wr3hK3FDs1EA1GE6PyRYsUmQPS8Q==, + integrity: sha512-vTVO/uZixpTVAOQt3qZRUFJ/K1L03OfNkeJ8sFNDVNdVy/zW0h1L5WT7HIPMDUkvSrxQkFaCCybTZkUP7UESlQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) + "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true - /@csstools/postcss-logical-float-and-clear@2.0.0(postcss@8.4.32): + /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.32): resolution: { - integrity: sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==, + integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2379,10 +2346,10 @@ packages: postcss: 8.4.32 dev: true - /@csstools/postcss-logical-overflow@1.0.0(postcss@8.4.32): + /@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.32): resolution: { - integrity: sha512-cIrZ8f7bGGvr+W53nEuMspcwaeaI2YTmz6LZ4yiAO5z14/PQgOOv+Pn+qjvPOPoadeY2BmpaoTzZKvdAQuM17w==, + integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2391,10 +2358,10 @@ packages: postcss: 8.4.32 dev: true - /@csstools/postcss-logical-overscroll-behavior@1.0.0(postcss@8.4.32): + /@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.32): resolution: { - integrity: sha512-e89S2LWjnxf0SB2wNUAbqDyFb/Fow/tlOe1XqOLbNx4rf3LrQokM9qldVx7sarnddml3ORE5LDUmlKpPOOeJTA==, + integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2403,10 +2370,10 @@ packages: postcss: 8.4.32 dev: true - /@csstools/postcss-logical-resize@2.0.0(postcss@8.4.32): + /@csstools/postcss-logical-resize@2.0.1(postcss@8.4.32): resolution: { - integrity: sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==, + integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2416,10 +2383,10 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.3(postcss@8.4.32): + /@csstools/postcss-logical-viewport-units@2.0.4(postcss@8.4.32): resolution: { - integrity: sha512-xeVxqND5rlQyqLGdH7rX34sIm/JbbQKxpKQP8oD1YQqUHHCLQR9NUS57WqJKajxKN6AcNAMWJhb5LUH5RfPcyA==, + integrity: sha512-jetp/ArGAniWbjWBh5UQ07ztawfSbqCFd0QelX4R4pVIxrXahUEhz5VZHebMPVCg02J8GsQn0br6fdRpY6t7lw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2429,41 +2396,41 @@ packages: postcss: 8.4.32 dev: true - /@csstools/postcss-media-minmax@1.1.0(postcss@8.4.32): + /@csstools/postcss-media-minmax@1.1.1(postcss@8.4.32): resolution: { - integrity: sha512-t5Li/DPC5QmW/6VFLfUvsw/4dNYYseWR0tOXDeJg/9EKUodBgNawz5tuk5vYKtNvoj+Q08odMuXcpS5YJj0AFA==, + integrity: sha512-mBY46/Hr+A8cDjoX0OoPRBOVrkANym9540dSB9rN3dllPZdM1E112i/tVxWsrR1s1yE9gfF0pk+7lf9l+qSeHA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/media-query-list-parser": 2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) postcss: 8.4.32 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.3(postcss@8.4.32): + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.4(postcss@8.4.32): resolution: { - integrity: sha512-IPL8AvnwMYW+cWtp+j8cW3MFN0RyXNT4hLOvs6Rf2N+NcbvXhSyKxZuE3W9Cv4KjaNoNoGx1d0UhT6tktq6tUw==, + integrity: sha512-IaIZZhH0Qy9UDn7u+N3cuwwPG0Po3ZKOdDh+ClR7xvisSqniG+PuVrOEWYJrFKOt2//UHLhd7KHDqr2u9LKS9Q==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/media-query-list-parser": 2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) postcss: 8.4.32 dev: true - /@csstools/postcss-nested-calc@3.0.0(postcss@8.4.32): + /@csstools/postcss-nested-calc@3.0.1(postcss@8.4.32): resolution: { - integrity: sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==, + integrity: sha512-bwwababZpWRm0ByHaWBxTsDGTMhZKmtUNl3Wt0Eom8AY7ORgXx5qF9SSk1vEFrCi+HOfJT6M6W5KPgzXuQNRwQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2473,10 +2440,10 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-normalize-display-values@3.0.1(postcss@8.4.32): + /@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.32): resolution: { - integrity: sha512-nUvRxI+ALJwkxZdPU4EDyuM380vP91sAGvI3jAOHs/sr3jfcCOzLkY6xKI1Mr526kZ3RivmMoYM/xq+XFyE/bw==, + integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2486,26 +2453,26 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.7(postcss@8.4.32): + /@csstools/postcss-oklab-function@3.0.8(postcss@8.4.32): resolution: { - integrity: sha512-vBFTQD3CARB3u/XIGO44wWbcO7xG/4GsYqJlcPuUGRSK8mtxes6n4vvNFlIByyAZy2k4d4RY63nyvTbMpeNTaQ==, + integrity: sha512-L4xrwbgg+k08v+a88LDxJeIM6+kqaBJlYb/QgmEMfQpUbrfXTp87DuRc7utcRdDvY+qWK5vqz3h1xUtceB5LJQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 dev: true - /@csstools/postcss-progressive-custom-properties@3.0.2(postcss@8.4.32): + /@csstools/postcss-progressive-custom-properties@3.0.3(postcss@8.4.32): resolution: { - integrity: sha512-YEvTozk1SxnV/PGL5DllBVDuLQ+jiQhyCSQiZJ6CwBMU5JQ9hFde3i1qqzZHuclZfptjrU0JjlX4ePsOhxNzHw==, + integrity: sha512-WipTVh6JTMQfeIrzDV4wEPsV9NTzMK2jwXxyH6CGBktuWdivHnkioP/smp1x/0QDPQyx7NTS14RB+GV3zZZYEw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2515,83 +2482,83 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-relative-color-syntax@2.0.7(postcss@8.4.32): + /@csstools/postcss-relative-color-syntax@2.0.8(postcss@8.4.32): resolution: { - integrity: sha512-2AiFbJSVF4EyymLxme4JzSrbXykHolx8DdZECHjYKMhoulhKLltx5ccYgtrK3BmXGd3v3nJrWFCc8JM8bjuiOg==, + integrity: sha512-wu/Oh7QKINpRXnmLMUbObVNlqwr843PSF4a3x3fMC0I+vUeoGqMfZuSPFtT+NnYYxfzUjEZ091GURPxee22VLQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 dev: true - /@csstools/postcss-scope-pseudo-class@3.0.0(postcss@8.4.32): + /@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.32): resolution: { - integrity: sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==, + integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true - /@csstools/postcss-stepped-value-functions@3.0.2(postcss@8.4.32): + /@csstools/postcss-stepped-value-functions@3.0.3(postcss@8.4.32): resolution: { - integrity: sha512-I3wX44MZVv+tDuWfrd3BTvRB/YRIM2F5v1MBtTI89sxpFn47mNpTwpPYUOGPVCgKlRDfZSlxIUYhUQmqRQZZFQ==, + integrity: sha512-hzo9Wr3u7JJiM65/EyHgE/gJpBzhDwBSGOobFs2YQ0ZNTywUliYQoYJud1KKlByMRuhqvDLh9V95eIkLf/fZTQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 postcss: 8.4.32 dev: true - /@csstools/postcss-text-decoration-shorthand@3.0.3(postcss@8.4.32): + /@csstools/postcss-text-decoration-shorthand@3.0.4(postcss@8.4.32): resolution: { - integrity: sha512-d5J9m49HhqXRcw1S6vTZuviHi/iknUKGjBpChiNK1ARg9sSa3b8m5lsWz5Izs8ISORZdv2bZRwbw5Z2R6gQ9kQ==, + integrity: sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/color-helpers": 3.0.2 + "@csstools/color-helpers": 4.0.0 postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-trigonometric-functions@3.0.2(postcss@8.4.32): + /@csstools/postcss-trigonometric-functions@3.0.3(postcss@8.4.32): resolution: { - integrity: sha512-AwzNhF4QOKaLOKvMljwwFkeYXwufhRO15G+kKohHkyoNOL75xWkN+W2Y9ik9tSeAyDv+cYNlYaF+o/a79WjVjg==, + integrity: sha512-T/npTbDuMZ3vktEMuA05p1oeVd12Sy47qZP1vFhzNMUOdXGCK9vlm0tUSIlV5DdlbTJqKqq9FhGitZH9VTKrfQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.4(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 postcss: 8.4.32 dev: true - /@csstools/postcss-unset-value@3.0.0(postcss@8.4.32): + /@csstools/postcss-unset-value@3.0.1(postcss@8.4.32): resolution: { - integrity: sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==, + integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2600,19 +2567,7 @@ packages: postcss: 8.4.32 dev: true - /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13): - resolution: - { - integrity: sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss-selector-parser: ^6.0.13 - dependencies: - postcss-selector-parser: 6.0.13 - dev: true - - /@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.13): + /@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.14): resolution: { integrity: sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==, @@ -2621,13 +2576,25 @@ packages: peerDependencies: postcss-selector-parser: ^6.0.13 dependencies: - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true - /@esbuild/android-arm64@0.19.5: + /@esbuild/aix-ppc64@0.19.10: resolution: { - integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==, + integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.10: + resolution: + { + integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==, } engines: { node: ">=12" } cpu: [arm64] @@ -2636,10 +2603,10 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.5: + /@esbuild/android-arm@0.19.10: resolution: { - integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==, + integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==, } engines: { node: ">=12" } cpu: [arm] @@ -2648,10 +2615,10 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.5: + /@esbuild/android-x64@0.19.10: resolution: { - integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==, + integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==, } engines: { node: ">=12" } cpu: [x64] @@ -2660,10 +2627,10 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.5: + /@esbuild/darwin-arm64@0.19.10: resolution: { - integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==, + integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==, } engines: { node: ">=12" } cpu: [arm64] @@ -2672,10 +2639,10 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.5: + /@esbuild/darwin-x64@0.19.10: resolution: { - integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==, + integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==, } engines: { node: ">=12" } cpu: [x64] @@ -2684,10 +2651,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.5: + /@esbuild/freebsd-arm64@0.19.10: resolution: { - integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==, + integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==, } engines: { node: ">=12" } cpu: [arm64] @@ -2696,10 +2663,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.5: + /@esbuild/freebsd-x64@0.19.10: resolution: { - integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==, + integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==, } engines: { node: ">=12" } cpu: [x64] @@ -2708,10 +2675,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.5: + /@esbuild/linux-arm64@0.19.10: resolution: { - integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==, + integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==, } engines: { node: ">=12" } cpu: [arm64] @@ -2720,10 +2687,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.5: + /@esbuild/linux-arm@0.19.10: resolution: { - integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==, + integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==, } engines: { node: ">=12" } cpu: [arm] @@ -2732,10 +2699,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.5: + /@esbuild/linux-ia32@0.19.10: resolution: { - integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==, + integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==, } engines: { node: ">=12" } cpu: [ia32] @@ -2744,10 +2711,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.5: + /@esbuild/linux-loong64@0.19.10: resolution: { - integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==, + integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==, } engines: { node: ">=12" } cpu: [loong64] @@ -2756,10 +2723,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.5: + /@esbuild/linux-mips64el@0.19.10: resolution: { - integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==, + integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==, } engines: { node: ">=12" } cpu: [mips64el] @@ -2768,10 +2735,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.5: + /@esbuild/linux-ppc64@0.19.10: resolution: { - integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==, + integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==, } engines: { node: ">=12" } cpu: [ppc64] @@ -2780,10 +2747,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.5: + /@esbuild/linux-riscv64@0.19.10: resolution: { - integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==, + integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==, } engines: { node: ">=12" } cpu: [riscv64] @@ -2792,10 +2759,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.5: + /@esbuild/linux-s390x@0.19.10: resolution: { - integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==, + integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==, } engines: { node: ">=12" } cpu: [s390x] @@ -2804,10 +2771,10 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.5: + /@esbuild/linux-x64@0.19.10: resolution: { - integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==, + integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==, } engines: { node: ">=12" } cpu: [x64] @@ -2816,10 +2783,10 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.5: + /@esbuild/netbsd-x64@0.19.10: resolution: { - integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==, + integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==, } engines: { node: ">=12" } cpu: [x64] @@ -2828,10 +2795,10 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.5: + /@esbuild/openbsd-x64@0.19.10: resolution: { - integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==, + integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==, } engines: { node: ">=12" } cpu: [x64] @@ -2840,10 +2807,10 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.5: + /@esbuild/sunos-x64@0.19.10: resolution: { - integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==, + integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==, } engines: { node: ">=12" } cpu: [x64] @@ -2852,10 +2819,10 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.5: + /@esbuild/win32-arm64@0.19.10: resolution: { - integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==, + integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==, } engines: { node: ">=12" } cpu: [arm64] @@ -2864,10 +2831,10 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.5: + /@esbuild/win32-ia32@0.19.10: resolution: { - integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==, + integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==, } engines: { node: ">=12" } cpu: [ia32] @@ -2876,10 +2843,10 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.5: + /@esbuild/win32-x64@0.19.10: resolution: { - integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==, + integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==, } engines: { node: ">=12" } cpu: [x64] @@ -2901,10 +2868,10 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.8.0: + /@eslint-community/regexpp@4.10.0: resolution: { - integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==, + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } dev: true @@ -2919,8 +2886,8 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 + globals: 13.24.0 + ignore: 5.3.0 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2937,10 +2904,10 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /@floating-ui/core@1.5.0: + /@floating-ui/core@1.5.2: resolution: { - integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==, + integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==, } dependencies: "@floating-ui/utils": 0.1.6 @@ -2952,7 +2919,7 @@ packages: integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==, } dependencies: - "@floating-ui/core": 1.5.0 + "@floating-ui/core": 1.5.2 "@floating-ui/utils": 0.1.6 dev: false @@ -2974,7 +2941,7 @@ packages: brotli: 1.3.3 browserify-optional: 1.0.1 clone: 1.0.4 - deep-equal: 1.1.1 + deep-equal: 1.1.2 dfa: 1.2.0 tiny-inflate: 1.0.3 unicode-properties: 1.4.1 @@ -2992,15 +2959,15 @@ packages: unicode-trie: 2.0.0 dev: false - /@foliojs-fork/pdfkit@0.13.0: + /@foliojs-fork/pdfkit@0.14.0: resolution: { - integrity: sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==, + integrity: sha512-nMOiQAv6id89MT3tVTCgc7HxD5ZMANwio2o5yvs5sexQkC0KI3BLaLakpsrHmFfeGFAhqPmZATZGbJGXTUebpg==, } dependencies: "@foliojs-fork/fontkit": 1.9.1 "@foliojs-fork/linebreak": 1.1.1 - crypto-js: 4.1.1 + crypto-js: 4.2.0 png-js: 1.0.0 dev: false @@ -3068,6 +3035,21 @@ packages: } dev: true + /@isaacs/cliui@8.0.2: + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@jridgewell/gen-mapping@0.3.3: resolution: { @@ -3077,7 +3059,7 @@ packages: dependencies: "@jridgewell/set-array": 1.1.2 "@jridgewell/sourcemap-codec": 1.4.15 - "@jridgewell/trace-mapping": 0.3.19 + "@jridgewell/trace-mapping": 0.3.20 dev: true /@jridgewell/resolve-uri@3.1.1: @@ -3103,7 +3085,7 @@ packages: } dependencies: "@jridgewell/gen-mapping": 0.3.3 - "@jridgewell/trace-mapping": 0.3.19 + "@jridgewell/trace-mapping": 0.3.20 dev: true /@jridgewell/sourcemap-codec@1.4.15: @@ -3113,56 +3095,50 @@ packages: } dev: true - /@jridgewell/trace-mapping@0.3.19: + /@jridgewell/trace-mapping@0.3.20: resolution: { - integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==, + integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, } dependencies: "@jridgewell/resolve-uri": 3.1.1 "@jridgewell/sourcemap-codec": 1.4.15 dev: true - /@lezer/common@1.0.4: + /@lezer/common@1.2.0: resolution: { - integrity: sha512-lZHlk8p67x4aIDtJl6UQrXSOP6oi7dQR3W/geFVrENdA1JDaAJWldnVqVjPMJupbTKbzDfFcePfKttqVidS/dg==, + integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==, } dev: false - /@lezer/common@1.1.1: + /@lezer/highlight@1.2.0: resolution: { - integrity: sha512-aAPB9YbvZHqAW+bIwiuuTDGB4DG0sYNRObGLxud8cW7osw1ZQxfDuTZ8KQiqfZ0QJGcR34CvpTMDXEyo/+Htgg==, - } - dev: false - - /@lezer/highlight@1.1.6: - resolution: - { - integrity: sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==, + integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, } dependencies: - "@lezer/common": 1.1.1 + "@lezer/common": 1.2.0 dev: false - /@lezer/lr@1.3.10: + /@lezer/lr@1.3.14: resolution: { - integrity: sha512-BZfVvf7Re5BIwJHlZXbJn9L8lus5EonxQghyn+ih8Wl36XMFBPTXC0KM0IdUtj9w/diPHsKlXVgL+AlX2jYJ0Q==, + integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==, } dependencies: - "@lezer/common": 1.1.1 + "@lezer/common": 1.2.0 dev: false - /@lezer/xml@1.0.2: + /@lezer/xml@1.0.4: resolution: { - integrity: sha512-dlngsWceOtQBMuBPw5wtHpaxdPJ71aVntqjbpGkFtWsp4WtQmCnuTjQGocviymydN6M18fhj6UQX3oiEtSuY7w==, + integrity: sha512-WmXKb5eX8+rRfZYSNRR5TPee/ZoDgBdVS/rj1VCJGDKa5gNldIctQYibCoFVyNhvZsyL/8nHbZJZPM4gnXN2Vw==, } dependencies: - "@lezer/highlight": 1.1.6 - "@lezer/lr": 1.3.10 + "@lezer/common": 1.2.0 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 dev: false /@lit-labs/ssr-dom-shim@1.1.2: @@ -3172,10 +3148,10 @@ packages: } dev: false - /@lit/reactive-element@2.0.1: + /@lit/reactive-element@2.0.2: resolution: { - integrity: sha512-eu50SQXHRthFwWJMp0oAFg95Rvm6MTPjxSXWuvAu7It90WVFLFpNBoIno7XOXSDvVgTrtKnUV4OLJqys2Svn4g==, + integrity: sha512-SVOwLAWUQg3Ji1egtOt1UiFe4zdDpnWHyc5qctSceJ5XIu0Uc76YmGpIjZgx9YJ0XtdW0Jm507sDvjOu+HnB8w==, } dependencies: "@lit-labs/ssr-dom-shim": 1.1.2 @@ -3208,7 +3184,7 @@ packages: engines: { node: ">= 8" } dependencies: "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 + fastq: 1.16.0 dev: true /@octokit/auth-token@4.0.0: @@ -3219,130 +3195,138 @@ packages: engines: { node: ">= 18" } dev: true - /@octokit/core@5.0.0: + /@octokit/core@5.0.2: resolution: { - integrity: sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==, + integrity: sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==, } engines: { node: ">= 18" } dependencies: "@octokit/auth-token": 4.0.0 - "@octokit/graphql": 7.0.1 - "@octokit/request": 8.1.1 - "@octokit/request-error": 5.0.0 - "@octokit/types": 11.1.0 + "@octokit/graphql": 7.0.2 + "@octokit/request": 8.1.6 + "@octokit/request-error": 5.0.1 + "@octokit/types": 12.4.0 before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 + universal-user-agent: 6.0.1 dev: true - /@octokit/endpoint@9.0.0: + /@octokit/endpoint@9.0.4: resolution: { - integrity: sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==, + integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==, } engines: { node: ">= 18" } dependencies: - "@octokit/types": 11.1.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 + "@octokit/types": 12.4.0 + universal-user-agent: 6.0.1 dev: true - /@octokit/graphql@7.0.1: + /@octokit/graphql@7.0.2: resolution: { - integrity: sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==, + integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==, } engines: { node: ">= 18" } dependencies: - "@octokit/request": 8.1.1 - "@octokit/types": 11.1.0 - universal-user-agent: 6.0.0 + "@octokit/request": 8.1.6 + "@octokit/types": 12.4.0 + universal-user-agent: 6.0.1 dev: true - /@octokit/openapi-types@18.0.0: + /@octokit/openapi-types@19.1.0: resolution: { - integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==, + integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==, } dev: true - /@octokit/plugin-paginate-rest@8.0.0(@octokit/core@5.0.0): + /@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.0.2): resolution: { - integrity: sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==, + integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==, } engines: { node: ">= 18" } peerDependencies: "@octokit/core": ">=5" dependencies: - "@octokit/core": 5.0.0 - "@octokit/types": 11.1.0 + "@octokit/core": 5.0.2 + "@octokit/types": 12.4.0 dev: true - /@octokit/plugin-retry@6.0.0(@octokit/core@5.0.0): + /@octokit/plugin-retry@6.0.1(@octokit/core@5.0.2): resolution: { - integrity: sha512-a1/A4A+PB1QoAHQfLJxGHhLfSAT03bR1jJz3GgQJZvty2ozawFWs93MiBQXO7SL2YbO7CIq0Goj4qLOBj8JeMQ==, + integrity: sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==, } engines: { node: ">= 18" } peerDependencies: "@octokit/core": ">=5" dependencies: - "@octokit/core": 5.0.0 - "@octokit/request-error": 5.0.0 - "@octokit/types": 11.1.0 + "@octokit/core": 5.0.2 + "@octokit/request-error": 5.0.1 + "@octokit/types": 12.4.0 bottleneck: 2.19.5 dev: true - /@octokit/plugin-throttling@7.0.0(@octokit/core@5.0.0): + /@octokit/plugin-throttling@8.1.3(@octokit/core@5.0.2): resolution: { - integrity: sha512-KL2k/d0uANc8XqP5S64YcNFCudR3F5AaKO39XWdUtlJIjT9Ni79ekWJ6Kj5xvAw87udkOMEPcVf9xEge2+ahew==, + integrity: sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==, } engines: { node: ">= 18" } peerDependencies: "@octokit/core": ^5.0.0 dependencies: - "@octokit/core": 5.0.0 - "@octokit/types": 11.1.0 + "@octokit/core": 5.0.2 + "@octokit/types": 12.4.0 bottleneck: 2.19.5 dev: true - /@octokit/request-error@5.0.0: + /@octokit/request-error@5.0.1: resolution: { - integrity: sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==, + integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==, } engines: { node: ">= 18" } dependencies: - "@octokit/types": 11.1.0 + "@octokit/types": 12.4.0 deprecation: 2.3.1 once: 1.4.0 dev: true - /@octokit/request@8.1.1: + /@octokit/request@8.1.6: resolution: { - integrity: sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==, + integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==, } engines: { node: ">= 18" } dependencies: - "@octokit/endpoint": 9.0.0 - "@octokit/request-error": 5.0.0 - "@octokit/types": 11.1.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 + "@octokit/endpoint": 9.0.4 + "@octokit/request-error": 5.0.1 + "@octokit/types": 12.4.0 + universal-user-agent: 6.0.1 dev: true - /@octokit/types@11.1.0: + /@octokit/types@12.4.0: resolution: { - integrity: sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==, + integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==, } dependencies: - "@octokit/openapi-types": 18.0.0 + "@octokit/openapi-types": 19.1.0 dev: true + /@pkgjs/parseargs@0.11.0: + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + requiresBuild: true + dev: true + optional: true + /@pnpm/config.env-replace@1.1.0: resolution: { @@ -3373,7 +3357,7 @@ packages: config-chain: 1.1.13 dev: true - /@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(rollup@2.79.1): resolution: { integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, @@ -3387,8 +3371,8 @@ packages: "@types/babel__core": optional: true dependencies: - "@babel/core": 7.22.11 - "@babel/helper-module-imports": 7.22.5 + "@babel/core": 7.23.6 + "@babel/helper-module-imports": 7.22.15 "@rollup/pluginutils": 3.1.0(rollup@2.79.1) rollup: 2.79.1 dev: true @@ -3407,7 +3391,7 @@ packages: builtin-modules: 3.3.0 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.4 + resolve: 1.22.8 rollup: 2.79.1 dev: true @@ -3439,10 +3423,10 @@ packages: rollup: 2.79.1 dev: true - /@rollup/rollup-android-arm-eabi@4.4.1: + /@rollup/rollup-android-arm-eabi@4.9.1: resolution: { - integrity: sha512-Ss4suS/sd+6xLRu+MLCkED2mUrAyqHmmvZB+zpzZ9Znn9S8wCkTQCJaQ8P8aHofnvG5L16u9MVnJjCqioPErwQ==, + integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==, } cpu: [arm] os: [android] @@ -3450,10 +3434,10 @@ packages: dev: true optional: true - /@rollup/rollup-android-arm64@4.4.1: + /@rollup/rollup-android-arm64@4.9.1: resolution: { - integrity: sha512-sRSkGTvGsARwWd7TzC8LKRf8FiPn7257vd/edzmvG4RIr9x68KBN0/Ek48CkuUJ5Pj/Dp9vKWv6PEupjKWjTYA==, + integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==, } cpu: [arm64] os: [android] @@ -3461,10 +3445,10 @@ packages: dev: true optional: true - /@rollup/rollup-darwin-arm64@4.4.1: + /@rollup/rollup-darwin-arm64@4.9.1: resolution: { - integrity: sha512-nz0AiGrrXyaWpsmBXUGOBiRDU0wyfSXbFuF98pPvIO8O6auQsPG6riWsfQqmCCC5FNd8zKQ4JhgugRNAkBJ8mQ==, + integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==, } cpu: [arm64] os: [darwin] @@ -3472,10 +3456,10 @@ packages: dev: true optional: true - /@rollup/rollup-darwin-x64@4.4.1: + /@rollup/rollup-darwin-x64@4.9.1: resolution: { - integrity: sha512-Ogqvf4/Ve/faMaiPRvzsJEqajbqs00LO+8vtrPBVvLgdw4wBg6ZDXdkDAZO+4MLnrc8mhGV6VJAzYScZdPLtJg==, + integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==, } cpu: [x64] os: [darwin] @@ -3483,10 +3467,10 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.4.1: + /@rollup/rollup-linux-arm-gnueabihf@4.9.1: resolution: { - integrity: sha512-9zc2tqlr6HfO+hx9+wktUlWTRdje7Ub15iJqKcqg5uJZ+iKqmd2CMxlgPpXi7+bU7bjfDIuvCvnGk7wewFEhCg==, + integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==, } cpu: [arm] os: [linux] @@ -3494,10 +3478,10 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.4.1: + /@rollup/rollup-linux-arm64-gnu@4.9.1: resolution: { - integrity: sha512-phLb1fN3rq2o1j1v+nKxXUTSJnAhzhU0hLrl7Qzb0fLpwkGMHDem+o6d+ZI8+/BlTXfMU4kVWGvy6g9k/B8L6Q==, + integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==, } cpu: [arm64] os: [linux] @@ -3505,10 +3489,10 @@ packages: dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.4.1: + /@rollup/rollup-linux-arm64-musl@4.9.1: resolution: { - integrity: sha512-M2sDtw4tf57VPSjbTAN/lz1doWUqO2CbQuX3L9K6GWIR5uw9j+ROKCvvUNBY8WUbMxwaoc8mH9HmmBKsLht7+w==, + integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==, } cpu: [arm64] os: [linux] @@ -3516,10 +3500,21 @@ packages: dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.4.1: + /@rollup/rollup-linux-riscv64-gnu@4.9.1: resolution: { - integrity: sha512-mHIlRLX+hx+30cD6c4BaBOsSqdnCE4ok7/KDvjHYAHoSuveoMMxIisZFvcLhUnyZcPBXDGZTuBoalcuh43UfQQ==, + integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==, + } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.1: + resolution: + { + integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==, } cpu: [x64] os: [linux] @@ -3527,10 +3522,10 @@ packages: dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.4.1: + /@rollup/rollup-linux-x64-musl@4.9.1: resolution: { - integrity: sha512-tB+RZuDi3zxFx7vDrjTNGVLu2KNyzYv+UY8jz7e4TMEoAj7iEt8Qk6xVu6mo3pgjnsHj6jnq3uuRsHp97DLwOA==, + integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==, } cpu: [x64] os: [linux] @@ -3538,10 +3533,10 @@ packages: dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.4.1: + /@rollup/rollup-win32-arm64-msvc@4.9.1: resolution: { - integrity: sha512-Hdn39PzOQowK/HZzYpCuZdJC91PE6EaGbTe2VCA9oq2u18evkisQfws0Smh9QQGNNRa/T7MOuGNQoLeXhhE3PQ==, + integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==, } cpu: [arm64] os: [win32] @@ -3549,10 +3544,10 @@ packages: dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.4.1: + /@rollup/rollup-win32-ia32-msvc@4.9.1: resolution: { - integrity: sha512-tLpKb1Elm9fM8c5w3nl4N1eLTP4bCqTYw9tqUBxX8/hsxqHO3dxc2qPbZ9PNkdK4tg4iLEYn0pOUnVByRd2CbA==, + integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==, } cpu: [ia32] os: [win32] @@ -3560,10 +3555,10 @@ packages: dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.4.1: + /@rollup/rollup-win32-x64-msvc@4.9.1: resolution: { - integrity: sha512-eAhItDX9yQtZVM3yvXS/VR3qPqcnXvnLyx1pLXl4JzyNMBNO3KC986t/iAg2zcMzpAp9JSvxB5VZGnBiNoA98w==, + integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==, } cpu: [x64] os: [win32] @@ -3582,7 +3577,7 @@ packages: dependencies: "@semantic-release/error": 3.0.0 aggregate-error: 3.1.0 - fs-extra: 11.1.1 + fs-extra: 11.2.0 lodash: 4.17.21 semantic-release: 22.0.12(typescript@5.3.3) dev: true @@ -3600,7 +3595,7 @@ packages: conventional-commits-filter: 4.0.0 conventional-commits-parser: 5.0.0 debug: 4.3.4 - import-from-esm: 1.3.1 + import-from-esm: 1.3.3 lodash-es: 4.17.21 micromatch: 4.0.5 semantic-release: 22.0.12(typescript@5.3.3) @@ -3666,30 +3661,30 @@ packages: - supports-color dev: true - /@semantic-release/github@9.0.4(semantic-release@22.0.12): + /@semantic-release/github@9.2.6(semantic-release@22.0.12): resolution: { - integrity: sha512-kQCGFAsBErvCR6hzNuzu63cj4erQN2krm9zQlg8vl4j5X0mL0d/Ras0wmL5Gkr1TuSS2lweME7M4J5zvtDDDSA==, + integrity: sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==, } engines: { node: ">=18" } peerDependencies: semantic-release: ">=20.1.0" dependencies: - "@octokit/core": 5.0.0 - "@octokit/plugin-paginate-rest": 8.0.0(@octokit/core@5.0.0) - "@octokit/plugin-retry": 6.0.0(@octokit/core@5.0.0) - "@octokit/plugin-throttling": 7.0.0(@octokit/core@5.0.0) + "@octokit/core": 5.0.2 + "@octokit/plugin-paginate-rest": 9.1.5(@octokit/core@5.0.2) + "@octokit/plugin-retry": 6.0.1(@octokit/core@5.0.2) + "@octokit/plugin-throttling": 8.1.3(@octokit/core@5.0.2) "@semantic-release/error": 4.0.0 - aggregate-error: 4.0.1 + aggregate-error: 5.0.0 debug: 4.3.4 dir-glob: 3.0.1 - globby: 13.2.2 + globby: 14.0.0 http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.1 + https-proxy-agent: 7.0.2 issue-parser: 6.0.0 lodash-es: 4.17.21 - mime: 3.0.0 - p-filter: 3.0.0 + mime: 4.0.1 + p-filter: 4.1.0 semantic-release: 22.0.12(typescript@5.3.3) url-join: 5.0.0 transitivePeerDependencies: @@ -3711,7 +3706,7 @@ packages: dir-glob: 3.0.1 escape-string-regexp: 5.0.0 formdata-node: 6.0.3 - fs-extra: 11.1.1 + fs-extra: 11.2.0 globby: 14.0.0 got: 13.0.0 hpagent: 1.2.0 @@ -3723,10 +3718,10 @@ packages: - supports-color dev: true - /@semantic-release/npm@11.0.1(semantic-release@22.0.12): + /@semantic-release/npm@11.0.2(semantic-release@22.0.12): resolution: { - integrity: sha512-nFcT0pgVwpXsPkzjqP3ObH+pILeN1AbYscCDuYwgZEPZukL+RsGhrtdT4HA1Gjb/y1bVbE90JNtMIcgRi5z/Fg==, + integrity: sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==, } engines: { node: ^18.17 || >=20 } peerDependencies: @@ -3735,13 +3730,13 @@ packages: "@semantic-release/error": 4.0.0 aggregate-error: 5.0.0 execa: 8.0.1 - fs-extra: 11.1.1 + fs-extra: 11.2.0 lodash-es: 4.17.21 nerf-dart: 1.0.0 normalize-url: 8.0.0 - npm: 10.2.3 + npm: 10.2.5 rc: 1.2.8 - read-pkg: 9.0.0 + read-pkg: 9.0.1 registry-auth-token: 5.0.2 semantic-release: 22.0.12(typescript@5.3.3) semver: 7.5.4 @@ -3763,7 +3758,7 @@ packages: conventional-commits-parser: 5.0.0 debug: 4.3.4 get-stream: 7.0.1 - import-from-esm: 1.3.1 + import-from-esm: 1.3.3 into-stream: 7.0.0 lodash-es: 4.17.21 read-pkg-up: 11.0.0 @@ -3772,10 +3767,10 @@ packages: - supports-color dev: true - /@sindresorhus/is@3.1.2: + /@sindresorhus/is@4.6.0: resolution: { - integrity: sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==, + integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, } engines: { node: ">=10" } dev: true @@ -3814,7 +3809,7 @@ packages: ejs: 3.1.9 json5: 2.2.3 magic-string: 0.25.9 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.10 dev: true /@szmarczak/http-timer@5.0.1: @@ -3881,31 +3876,31 @@ packages: } dev: true - /@types/fscreen@1.0.1: + /@types/fscreen@1.0.4: resolution: { - integrity: sha512-hV2d0BreihMGtrg+EdAFOIl/O2EL5vhAheHJUztGE/lPFZIN8ZCpGFL8hCbtyi1CfhKjDRCf47sHjP+FwJ4q0Q==, + integrity: sha512-TsjxyAUvlvuQyao9vNk0yES4nY07K9xoAbkhgXU948JG39EqlLxniWuW9OiZde9Q8ACSpu3fmbXXRAfb/l/HqQ==, } dev: false - /@types/geojson@7946.0.10: + /@types/geojson@7946.0.13: resolution: { - integrity: sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==, + integrity: sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==, } dev: true - /@types/http-cache-semantics@4.0.1: + /@types/http-cache-semantics@4.0.4: resolution: { - integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==, + integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, } dev: true - /@types/json-schema@7.0.12: + /@types/json-schema@7.0.15: resolution: { - integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, } dev: true @@ -3915,31 +3910,33 @@ packages: integrity: sha512-EXdsL4EhoUtGm2GC2ZYtXn+Fzc6pluVgagvo2VC1RHWToLGlTRwVYoDpqS/7QXa01rmDyBjJk3Catpf60VMkwg==, } dependencies: - "@types/geojson": 7946.0.10 + "@types/geojson": 7946.0.13 dev: true - /@types/minimist@1.2.2: + /@types/minimist@1.2.5: resolution: { - integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==, + integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==, } dev: true - /@types/node@18.18.9: + /@types/node@18.19.3: resolution: { - integrity: sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==, + integrity: sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==, } requiresBuild: true dependencies: undici-types: 5.26.5 dev: true - /@types/node@20.5.6: + /@types/node@20.10.5: resolution: { - integrity: sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==, + integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==, } + dependencies: + undici-types: 5.26.5 dev: true /@types/normalize-package-data@2.4.4: @@ -3955,26 +3952,26 @@ packages: integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, } dependencies: - "@types/node": 20.5.6 + "@types/node": 20.10.5 dev: true - /@types/semver@7.5.0: + /@types/semver@7.5.6: resolution: { - integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==, + integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, } dev: true - /@types/trusted-types@2.0.3: + /@types/trusted-types@2.0.7: resolution: { - integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==, + integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, } - /@typescript-eslint/eslint-plugin@6.15.0(@typescript-eslint/parser@6.15.0)(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==, + integrity: sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -3985,28 +3982,28 @@ packages: typescript: optional: true dependencies: - "@eslint-community/regexpp": 4.8.0 - "@typescript-eslint/parser": 6.15.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.15.0 - "@typescript-eslint/type-utils": 6.15.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.15.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.15.0 + "@eslint-community/regexpp": 4.10.0 + "@typescript-eslint/parser": 6.16.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.16.0 + "@typescript-eslint/type-utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.16.0 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.3.3) + ts-api-utils: 1.0.3(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.15.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/parser@6.16.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==, + integrity: sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4016,10 +4013,10 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.15.0 - "@typescript-eslint/types": 6.15.0 - "@typescript-eslint/typescript-estree": 6.15.0(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.15.0 + "@typescript-eslint/scope-manager": 6.16.0 + "@typescript-eslint/types": 6.16.0 + "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.16.0 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -4027,21 +4024,21 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager@6.15.0: + /@typescript-eslint/scope-manager@6.16.0: resolution: { - integrity: sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==, + integrity: sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.15.0 - "@typescript-eslint/visitor-keys": 6.15.0 + "@typescript-eslint/types": 6.16.0 + "@typescript-eslint/visitor-keys": 6.16.0 dev: true - /@typescript-eslint/type-utils@6.15.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==, + integrity: sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4051,28 +4048,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.15.0(typescript@5.3.3) - "@typescript-eslint/utils": 6.15.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) + "@typescript-eslint/utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 - ts-api-utils: 1.0.2(typescript@5.3.3) + ts-api-utils: 1.0.3(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.15.0: + /@typescript-eslint/types@6.16.0: resolution: { - integrity: sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==, + integrity: sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: true - /@typescript-eslint/typescript-estree@6.15.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@6.16.0(typescript@5.3.3): resolution: { - integrity: sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==, + integrity: sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4081,33 +4078,34 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.15.0 - "@typescript-eslint/visitor-keys": 6.15.0 + "@typescript-eslint/types": 6.16.0 + "@typescript-eslint/visitor-keys": 6.16.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 + minimatch: 9.0.3 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.3.3) + ts-api-utils: 1.0.3(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.15.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==, + integrity: sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) - "@types/json-schema": 7.0.12 - "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 6.15.0 - "@typescript-eslint/types": 6.15.0 - "@typescript-eslint/typescript-estree": 6.15.0(typescript@5.3.3) + "@types/json-schema": 7.0.15 + "@types/semver": 7.5.6 + "@typescript-eslint/scope-manager": 6.16.0 + "@typescript-eslint/types": 6.16.0 + "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -4115,14 +4113,14 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys@6.15.0: + /@typescript-eslint/visitor-keys@6.16.0: resolution: { - integrity: sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==, + integrity: sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.15.0 + "@typescript-eslint/types": 6.16.0 eslint-visitor-keys: 3.4.3 dev: true @@ -4140,7 +4138,7 @@ packages: } dependencies: "@stencil/core": 2.5.2 - "@types/fscreen": 1.0.1 + "@types/fscreen": 1.0.4 fscreen: 1.2.0 mitt: 3.0.1 stencil-wormhole: 3.4.1 @@ -4157,7 +4155,7 @@ packages: through: 2.3.8 dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, @@ -4165,7 +4163,7 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.11.3 dev: true /acorn-node@1.8.2: @@ -4196,10 +4194,10 @@ packages: hasBin: true dev: false - /acorn@8.10.0: + /acorn@8.11.3: resolution: { - integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, } engines: { node: ">=0.4.0" } hasBin: true @@ -4228,17 +4226,6 @@ packages: indent-string: 4.0.0 dev: true - /aggregate-error@4.0.1: - resolution: - { - integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==, - } - engines: { node: ">=12" } - dependencies: - clean-stack: 4.2.0 - indent-string: 5.0.0 - dev: true - /aggregate-error@5.0.0: resolution: { @@ -4282,8 +4269,8 @@ packages: engines: { node: ">=4" } hasBin: true dependencies: - "@babel/runtime": 7.22.11 - async: 3.2.4 + "@babel/runtime": 7.23.6 + async: 3.2.5 chalk: 4.1.2 didyoumean: 1.2.2 inquirer: 7.3.3 @@ -4424,7 +4411,7 @@ packages: integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 is-array-buffer: 3.0.2 dev: true @@ -4450,17 +4437,18 @@ packages: engines: { node: ">=8" } dev: true - /arraybuffer.prototype.slice@1.0.1: + /arraybuffer.prototype.slice@1.0.2: resolution: { - integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==, + integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==, } engines: { node: ">= 0.4" } dependencies: array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - define-properties: 1.2.0 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 dev: true @@ -4500,10 +4488,10 @@ packages: engines: { node: ">=8" } dev: true - /async@3.2.4: + /async@3.2.5: resolution: { - integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, + integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, } dev: true @@ -4525,8 +4513,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001562 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001572 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -4542,47 +4530,47 @@ packages: engines: { node: ">= 0.4" } dev: true - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.11): + /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.6): resolution: { - integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==, + integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==, } peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - "@babel/compat-data": 7.22.9 - "@babel/core": 7.22.11 - "@babel/helper-define-polyfill-provider": 0.4.2(@babel/core@7.22.11) + "@babel/compat-data": 7.23.5 + "@babel/core": 7.23.6 + "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.6) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.11): + /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): resolution: { - integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==, + integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==, } peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-define-polyfill-provider": 0.4.2(@babel/core@7.22.11) - core-js-compat: 3.32.1 + "@babel/core": 7.23.6 + "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.6) + core-js-compat: 3.35.0 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.11): + /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.6): resolution: { - integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==, + integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==, } peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - "@babel/core": 7.22.11 - "@babel/helper-define-polyfill-provider": 0.4.2(@babel/core@7.22.11) + "@babel/core": 7.23.6 + "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.6) transitivePeerDependencies: - supports-color dev: true @@ -4691,7 +4679,7 @@ packages: hasBin: true dependencies: quote-stream: 1.0.2 - resolve: 1.22.4 + resolve: 1.22.8 static-module: 3.0.4 through2: 2.0.5 dev: false @@ -4725,18 +4713,18 @@ packages: browser-resolve: 1.11.3 dev: false - /browserslist@4.22.1: + /browserslist@4.22.2: resolution: { - integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==, + integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==, } engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true dependencies: - caniuse-lite: 1.0.30001562 - electron-to-chromium: 1.4.583 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) + caniuse-lite: 1.0.30001572 + electron-to-chromium: 1.4.616 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: true /buffer-equal@0.0.1: @@ -4779,17 +4767,17 @@ packages: engines: { node: ">=14.16" } dev: true - /cacheable-request@10.2.13: + /cacheable-request@10.2.14: resolution: { - integrity: sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==, + integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==, } engines: { node: ">=14.16" } dependencies: - "@types/http-cache-semantics": 4.0.1 + "@types/http-cache-semantics": 4.0.4 get-stream: 6.0.1 http-cache-semantics: 4.1.1 - keyv: 4.5.3 + keyv: 4.5.4 mimic-response: 4.0.0 normalize-url: 8.0.0 responselike: 3.0.0 @@ -4803,14 +4791,15 @@ packages: engines: { node: ">=6" } dev: true - /call-bind@1.0.2: + /call-bind@1.0.5: resolution: { - integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, + integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, } dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 /callsites@3.1.0: resolution: @@ -4854,16 +4843,16 @@ packages: integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, } dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001562 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001572 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true - /caniuse-lite@1.0.30001562: + /caniuse-lite@1.0.30001572: resolution: { - integrity: sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==, + integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==, } dev: true @@ -4953,10 +4942,10 @@ packages: fsevents: 2.3.3 dev: true - /ci-info@3.8.0: + /ci-info@3.9.0: resolution: { - integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==, + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, } engines: { node: ">=8" } dev: true @@ -4969,16 +4958,6 @@ packages: engines: { node: ">=6" } dev: true - /clean-stack@4.2.0: - resolution: - { - integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==, - } - engines: { node: ">=12" } - dependencies: - escape-string-regexp: 5.0.0 - dev: true - /clean-stack@5.2.0: resolution: { @@ -5009,10 +4988,10 @@ packages: restore-cursor: 4.0.0 dev: true - /cli-spinners@2.9.0: + /cli-spinners@2.9.2: resolution: { - integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==, + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, } engines: { node: ">=6" } dev: true @@ -5078,19 +5057,19 @@ packages: } engines: { node: ">=0.8" } - /codemirror@6.0.1(@lezer/common@1.1.1): + /codemirror@6.0.1(@lezer/common@1.2.0): resolution: { integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.9.0(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.1) - "@codemirror/commands": 6.3.2 - "@codemirror/language": 6.9.3 - "@codemirror/lint": 6.4.0 - "@codemirror/search": 6.5.1 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/commands": 6.3.3 + "@codemirror/language": 6.10.0 + "@codemirror/lint": 6.4.2 + "@codemirror/search": 6.5.5 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 transitivePeerDependencies: - "@lezer/common" dev: false @@ -5316,20 +5295,28 @@ packages: { integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, } + dev: false - /core-js-compat@3.32.1: + /convert-source-map@2.0.0: resolution: { - integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==, + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, } - dependencies: - browserslist: 4.22.1 dev: true - /core-js@3.32.1: + /core-js-compat@3.35.0: resolution: { - integrity: sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==, + integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==, + } + dependencies: + browserslist: 4.22.2 + dev: true + + /core-js@3.35.0: + resolution: + { + integrity: sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==, } requiresBuild: true dev: false @@ -5340,7 +5327,7 @@ packages: integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, } - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.9)(cosmiconfig@8.3.6)(typescript@5.3.3): + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.3.3): resolution: { integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==, @@ -5352,9 +5339,9 @@ packages: cosmiconfig: ">=8.2" typescript: ">=4" dependencies: - "@types/node": 18.18.9 + "@types/node": 18.19.3 cosmiconfig: 8.3.6(typescript@5.3.3) - jiti: 1.19.3 + jiti: 1.21.0 typescript: 5.3.3 dev: true @@ -5426,10 +5413,10 @@ packages: which: 2.0.2 dev: true - /crypto-js@4.1.1: + /crypto-js@4.2.0: resolution: { - integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==, + integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==, } dev: false @@ -5451,17 +5438,17 @@ packages: type-fest: 1.4.0 dev: true - /css-blank-pseudo@6.0.0(postcss@8.4.32): + /css-blank-pseudo@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==, + integrity: sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /css-declaration-sorter@7.1.1(postcss@8.4.32): @@ -5484,25 +5471,25 @@ packages: engines: { node: ">=12 || >=16" } dev: true - /css-has-pseudo@6.0.0(postcss@8.4.32): + /css-has-pseudo@6.0.1(postcss@8.4.32): resolution: { - integrity: sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==, + integrity: sha512-WwoVKqNxApfEI7dWFyaHoeFCcUPD+lPyjL6lNpRUNX7IyIUuVpawOTwwA5D0ZR6V2xQZonNPVj8kEcxzEaAQfQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) + "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 postcss-value-parser: 4.2.0 dev: true - /css-prefers-color-scheme@9.0.0(postcss@8.4.32): + /css-prefers-color-scheme@9.0.1(postcss@8.4.32): resolution: { - integrity: sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==, + integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -5554,10 +5541,10 @@ packages: engines: { node: ">= 6" } dev: true - /cssdb@7.9.0: + /cssdb@7.10.0: resolution: { - integrity: sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==, + integrity: sha512-yGZ5tmA57gWh/uvdQBHs45wwFY0IBh3ypABk5sEubPBPSzXzkNgsWReqx7gdx6uhC+QoFBe+V8JwBB9/hQ6cIA==, } dev: true @@ -5861,18 +5848,19 @@ packages: } dev: true - /deep-equal@1.1.1: + /deep-equal@1.1.2: resolution: { - integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==, + integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==, } + engines: { node: ">= 0.4" } dependencies: is-arguments: 1.1.1 is-date-object: 1.0.5 is-regex: 1.1.4 object-is: 1.1.5 object-keys: 1.1.1 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 dev: false /deep-extend@0.6.0: @@ -5913,14 +5901,26 @@ packages: engines: { node: ">=10" } dev: true - /define-properties@1.2.0: + /define-data-property@1.1.1: resolution: { - integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==, + integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, } engines: { node: ">= 0.4" } dependencies: - has-property-descriptors: 1.0.0 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /define-properties@1.2.1: + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 object-keys: 1.1.1 /deprecation@2.3.1: @@ -6044,6 +6044,13 @@ packages: dependencies: readable-stream: 2.3.8 + /eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + dev: true + /ejs@3.1.9: resolution: { @@ -6055,10 +6062,10 @@ packages: jake: 10.8.7 dev: true - /electron-to-chromium@1.4.583: + /electron-to-chromium@1.4.616: resolution: { - integrity: sha512-93y1gcONABZ7uqYe/JWDVQP/Pj/sQSunF0HVAPdlg/pfBnOyBMLlQUxWvkqcljJg1+W6cjvPuYD+r1Th9Tn8mA==, + integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==, } dev: true @@ -6076,6 +6083,13 @@ packages: } dev: true + /emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + dev: true + /emojilib@2.4.0: resolution: { @@ -6119,29 +6133,29 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.22.1: + /es-abstract@1.22.3: resolution: { - integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==, + integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==, } engines: { node: ">= 0.4" } dependencies: array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.1 + arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.1 has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 + hasown: 2.0.0 + internal-slot: 1.0.6 is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 @@ -6150,33 +6164,33 @@ packages: is-string: 1.0.7 is-typed-array: 1.1.12 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.13.1 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-array-concat: 1.0.0 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 typed-array-buffer: 1.0.0 typed-array-byte-length: 1.0.0 typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true - /es-set-tostringtag@2.0.1: + /es-set-tostringtag@2.0.2: resolution: { - integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==, + integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==, } engines: { node: ">= 0.4" } dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 + get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 + hasown: 2.0.0 dev: true /es-to-primitive@1.2.1: @@ -6254,37 +6268,38 @@ packages: ext: 1.7.0 dev: false - /esbuild@0.19.5: + /esbuild@0.19.10: resolution: { - integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==, + integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==, } engines: { node: ">=12" } hasBin: true requiresBuild: true optionalDependencies: - "@esbuild/android-arm": 0.19.5 - "@esbuild/android-arm64": 0.19.5 - "@esbuild/android-x64": 0.19.5 - "@esbuild/darwin-arm64": 0.19.5 - "@esbuild/darwin-x64": 0.19.5 - "@esbuild/freebsd-arm64": 0.19.5 - "@esbuild/freebsd-x64": 0.19.5 - "@esbuild/linux-arm": 0.19.5 - "@esbuild/linux-arm64": 0.19.5 - "@esbuild/linux-ia32": 0.19.5 - "@esbuild/linux-loong64": 0.19.5 - "@esbuild/linux-mips64el": 0.19.5 - "@esbuild/linux-ppc64": 0.19.5 - "@esbuild/linux-riscv64": 0.19.5 - "@esbuild/linux-s390x": 0.19.5 - "@esbuild/linux-x64": 0.19.5 - "@esbuild/netbsd-x64": 0.19.5 - "@esbuild/openbsd-x64": 0.19.5 - "@esbuild/sunos-x64": 0.19.5 - "@esbuild/win32-arm64": 0.19.5 - "@esbuild/win32-ia32": 0.19.5 - "@esbuild/win32-x64": 0.19.5 + "@esbuild/aix-ppc64": 0.19.10 + "@esbuild/android-arm": 0.19.10 + "@esbuild/android-arm64": 0.19.10 + "@esbuild/android-x64": 0.19.10 + "@esbuild/darwin-arm64": 0.19.10 + "@esbuild/darwin-x64": 0.19.10 + "@esbuild/freebsd-arm64": 0.19.10 + "@esbuild/freebsd-x64": 0.19.10 + "@esbuild/linux-arm": 0.19.10 + "@esbuild/linux-arm64": 0.19.10 + "@esbuild/linux-ia32": 0.19.10 + "@esbuild/linux-loong64": 0.19.10 + "@esbuild/linux-mips64el": 0.19.10 + "@esbuild/linux-ppc64": 0.19.10 + "@esbuild/linux-riscv64": 0.19.10 + "@esbuild/linux-s390x": 0.19.10 + "@esbuild/linux-x64": 0.19.10 + "@esbuild/netbsd-x64": 0.19.10 + "@esbuild/openbsd-x64": 0.19.10 + "@esbuild/sunos-x64": 0.19.10 + "@esbuild/win32-arm64": 0.19.10 + "@esbuild/win32-ia32": 0.19.10 + "@esbuild/win32-x64": 0.19.10 dev: true /escalade@3.1.1: @@ -6410,7 +6425,7 @@ packages: hasBin: true dependencies: "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) - "@eslint-community/regexpp": 4.8.0 + "@eslint-community/regexpp": 4.10.0 "@eslint/eslintrc": 2.1.4 "@eslint/js": 8.56.0 "@humanwhocodes/config-array": 0.11.13 @@ -6432,9 +6447,9 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.21.0 + globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -6458,8 +6473,8 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 dev: true @@ -6600,7 +6615,7 @@ packages: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.2.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -6686,10 +6701,10 @@ packages: engines: { node: ">= 4.9.1" } dev: true - /fastq@1.15.0: + /fastq@1.16.0: resolution: { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==, } dependencies: reusify: 1.0.4 @@ -6735,14 +6750,14 @@ packages: flat-cache: 3.2.0 dev: true - /file-entry-cache@7.0.2: + /file-entry-cache@8.0.0: resolution: { - integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==, + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, } - engines: { node: ">=12.0.0" } + engines: { node: ">=16.0.0" } dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.0 dev: true /filelist@1.0.4: @@ -6852,10 +6867,22 @@ packages: engines: { node: ^10.12.0 || >=12.0.0 } dependencies: flatted: 3.2.9 - keyv: 4.5.3 + keyv: 4.5.4 rimraf: 3.0.2 dev: true + /flat-cache@4.0.0: + resolution: + { + integrity: sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==, + } + engines: { node: ">=16" } + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 5.0.5 + dev: true + /flatpickr@4.6.13: resolution: { @@ -6879,6 +6906,17 @@ packages: is-callable: 1.2.7 dev: true + /foreground-child@3.1.1: + resolution: + { + integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, + } + engines: { node: ">=14" } + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /form-data-encoder@2.1.4: resolution: { @@ -6912,16 +6950,16 @@ packages: readable-stream: 2.3.8 dev: true - /fs-extra@11.1.1: + /fs-extra@11.2.0: resolution: { - integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==, + integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, } engines: { node: ">=14.14" } dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-extra@9.1.0: @@ -6934,7 +6972,7 @@ packages: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs.realpath@1.0.0: @@ -6962,22 +7000,22 @@ packages: dev: true optional: true - /function-bind@1.1.1: + /function-bind@1.1.2: resolution: { - integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, } - /function.prototype.name@1.1.5: + /function.prototype.name@1.1.6: resolution: { - integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==, + integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 functions-have-names: 1.2.3 dev: true @@ -7026,16 +7064,16 @@ packages: engines: { node: ">=18" } dev: true - /get-intrinsic@1.2.1: + /get-intrinsic@1.2.2: resolution: { - integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, + integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, } dependencies: - function-bind: 1.1.1 - has: 1.0.3 + function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 + hasown: 2.0.0 /get-own-enumerable-property-symbols@3.0.2: resolution: @@ -7075,8 +7113,8 @@ packages: } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 dev: true /git-log-parser@1.2.0: @@ -7090,7 +7128,7 @@ packages: split2: 1.0.0 stream-combiner2: 1.1.1 through2: 2.0.5 - traverse: 0.6.7 + traverse: 0.6.8 dev: true /git-raw-commits@2.0.11: @@ -7128,18 +7166,19 @@ packages: is-glob: 4.0.3 dev: true - /glob@7.1.6: + /glob@10.3.10: resolution: { - integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==, + integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, } + engines: { node: ">=16 || 14 >=14.17" } + hasBin: true dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 dev: true /glob@7.2.3: @@ -7222,10 +7261,10 @@ packages: engines: { node: ">=4" } dev: true - /globals@13.21.0: + /globals@13.24.0: resolution: { - integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==, + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, } engines: { node: ">=8" } dependencies: @@ -7239,7 +7278,7 @@ packages: } engines: { node: ">= 0.4" } dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 dev: true /globby@11.1.0: @@ -7257,20 +7296,6 @@ packages: slash: 3.0.0 dev: true - /globby@13.2.2: - resolution: - { - integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - /globby@14.0.0: resolution: { @@ -7280,7 +7305,7 @@ packages: dependencies: "@sindresorhus/merge-streams": 1.0.0 fast-glob: 3.3.2 - ignore: 5.2.4 + ignore: 5.3.0 path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 @@ -7299,8 +7324,7 @@ packages: integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, } dependencies: - get-intrinsic: 1.2.1 - dev: true + get-intrinsic: 1.2.2 /got@13.0.0: resolution: @@ -7312,11 +7336,11 @@ packages: "@sindresorhus/is": 5.6.0 "@szmarczak/http-timer": 5.0.1 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.13 + cacheable-request: 10.2.14 decompress-response: 6.0.0 form-data-encoder: 2.1.4 get-stream: 6.0.1 - http2-wrapper: 2.2.0 + http2-wrapper: 2.2.1 lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 @@ -7390,13 +7414,13 @@ packages: engines: { node: ">=8" } dev: true - /has-property-descriptors@1.0.0: + /has-property-descriptors@1.0.1: resolution: { - integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, + integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, } dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.2 /has-proto@1.0.1: resolution: @@ -7421,14 +7445,22 @@ packages: dependencies: has-symbols: 1.0.3 - /has@1.0.3: + /has@1.0.4: resolution: { - integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, + integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, } engines: { node: ">= 0.4.0" } + dev: false + + /hasown@2.0.0: + resolution: + { + integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, + } + engines: { node: ">= 0.4" } dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 /homedir-polyfill@1.0.3: resolution: @@ -7465,14 +7497,14 @@ packages: lru-cache: 6.0.0 dev: true - /hosted-git-info@7.0.0: + /hosted-git-info@7.0.1: resolution: { - integrity: sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA==, + integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, } engines: { node: ^16.14.0 || >=18.0.0 } dependencies: - lru-cache: 10.0.1 + lru-cache: 10.1.0 dev: true /hpagent@1.2.0: @@ -7511,10 +7543,10 @@ packages: - supports-color dev: true - /http2-wrapper@2.2.0: + /http2-wrapper@2.2.1: resolution: { - integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==, + integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==, } engines: { node: ">=10.19.0" } dependencies: @@ -7522,10 +7554,10 @@ packages: resolve-alpn: 1.2.1 dev: true - /https-proxy-agent@7.0.1: + /https-proxy-agent@7.0.2: resolution: { - integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==, + integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, } engines: { node: ">= 14" } dependencies: @@ -7594,14 +7626,6 @@ packages: } dev: true - /ignore@5.2.4: - resolution: - { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, - } - engines: { node: ">= 4" } - dev: true - /ignore@5.3.0: resolution: { @@ -7621,10 +7645,10 @@ packages: resolve-from: 4.0.0 dev: true - /import-from-esm@1.3.1: + /import-from-esm@1.3.3: resolution: { - integrity: sha512-YltaeDglQ6wDZOC8ZAY2I8vK1Ag4XVbs4GhlvNALWz0ee5V+CMkcBhAKbs1iuJZ3fmfgrKFCDRwliM3OxyQMLA==, + integrity: sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==, } engines: { node: ">=16.20" } dependencies: @@ -7742,15 +7766,15 @@ packages: wrap-ansi: 7.0.0 dev: true - /internal-slot@1.0.5: + /internal-slot@1.0.6: resolution: { - integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==, + integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==, } engines: { node: ">= 0.4" } dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 + get-intrinsic: 1.2.2 + hasown: 2.0.0 side-channel: 1.0.4 dev: true @@ -7780,7 +7804,7 @@ packages: } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: false @@ -7790,8 +7814,8 @@ packages: integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, } dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 dev: true @@ -7828,7 +7852,7 @@ packages: } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 dev: true @@ -7847,16 +7871,16 @@ packages: } hasBin: true dependencies: - ci-info: 3.8.0 + ci-info: 3.9.0 dev: true - /is-core-module@2.13.0: + /is-core-module@2.13.1: resolution: { - integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==, + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, } dependencies: - has: 1.0.3 + hasown: 2.0.0 /is-date-object@1.0.5: resolution: @@ -7999,7 +8023,7 @@ packages: } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-tostringtag: 1.0.0 /is-regexp@1.0.0: @@ -8016,7 +8040,7 @@ packages: integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-stream@2.0.1: @@ -8072,7 +8096,7 @@ packages: } engines: { node: ">= 0.4" } dependencies: - which-typed-array: 1.1.11 + which-typed-array: 1.1.13 dev: true /is-unicode-supported@0.1.0: @@ -8104,7 +8128,7 @@ packages: integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 dev: true /is-windows@1.0.2: @@ -8149,6 +8173,18 @@ packages: lodash.uniqby: 4.7.0 dev: true + /jackspeak@2.3.6: + resolution: + { + integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, + } + engines: { node: ">=14" } + dependencies: + "@isaacs/cliui": 8.0.2 + optionalDependencies: + "@pkgjs/parseargs": 0.11.0 + dev: true + /jake@10.8.7: resolution: { @@ -8157,7 +8193,7 @@ packages: engines: { node: ">=10" } hasBin: true dependencies: - async: 3.2.4 + async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -8178,15 +8214,15 @@ packages: } engines: { node: ">= 10.13.0" } dependencies: - "@types/node": 20.5.6 + "@types/node": 20.10.5 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true - /jiti@1.19.3: + /jiti@1.21.0: resolution: { - integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==, + integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, } hasBin: true dev: true @@ -8239,7 +8275,7 @@ packages: } engines: { node: ">=10" } dependencies: - "@babel/runtime": 7.22.11 + "@babel/runtime": 7.23.6 chalk: 4.1.2 pegjs: 0.10.0 dev: true @@ -8258,14 +8294,6 @@ packages: } dev: true - /json-parse-even-better-errors@3.0.0: - resolution: - { - integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true - /json-schema-traverse@0.4.1: resolution: { @@ -8316,7 +8344,7 @@ packages: integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, } dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 dev: true @@ -8337,10 +8365,10 @@ packages: engines: { node: ">=0.10.0" } dev: true - /keyv@4.5.3: + /keyv@4.5.4: resolution: { - integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, } dependencies: json-buffer: 3.0.1 @@ -8469,14 +8497,14 @@ packages: wrap-ansi: 9.0.0 dev: true - /lit-element@4.0.1: + /lit-element@4.0.2: resolution: { - integrity: sha512-OxRMJem4HKZt0320HplLkBPoi4KHiEHoPHKd8Lzf07ZQVAOKIjZ32yPLRKRDEolFU1RgrQBfSHQMoxKZ72V3Kw==, + integrity: sha512-/W6WQZUa5VEXwC7H9tbtDMdSs9aWil3Ou8hU6z2cOKWbsm/tXPAcsoaHVEtrDo0zcOIE5GF6QgU55tlGL2Nihg==, } dependencies: "@lit-labs/ssr-dom-shim": 1.1.2 - "@lit/reactive-element": 2.0.1 + "@lit/reactive-element": 2.0.2 lit-html: 3.1.0 dev: false @@ -8486,7 +8514,7 @@ packages: integrity: sha512-FwAjq3iNsaO6SOZXEIpeROlJLUlrbyMkn4iuv4f4u1H40Jw8wkeR/OUXZUHUoiYabGk8Y4Y0F/rgq+R4MrOLmA==, } dependencies: - "@types/trusted-types": 2.0.3 + "@types/trusted-types": 2.0.7 dev: false /lit@3.1.0: @@ -8495,8 +8523,8 @@ packages: integrity: sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==, } dependencies: - "@lit/reactive-element": 2.0.1 - lit-element: 4.0.1 + "@lit/reactive-element": 2.0.2 + lit-element: 4.0.2 lit-html: 3.1.0 dev: false @@ -8740,10 +8768,10 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /lru-cache@10.0.1: + /lru-cache@10.1.0: resolution: { - integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==, + integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==, } engines: { node: 14 || >=16.14 } dev: true @@ -8801,21 +8829,21 @@ packages: engines: { node: ">=8" } dev: true - /marked-terminal@6.1.0(marked@9.1.6): + /marked-terminal@6.2.0(marked@9.1.6): resolution: { - integrity: sha512-QaCSF6NV82oo6K0szEnmc65ooDeW0T/Adcyf0fcW+Hto2GT1VADFg8dn1zaeHqzj65fqDH1hMNChGNRaC/lbkA==, + integrity: sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==, } engines: { node: ">=16.0.0" } peerDependencies: - marked: ">=1 <11" + marked: ">=1 <12" dependencies: ansi-escapes: 6.2.0 cardinal: 2.1.1 chalk: 5.3.0 cli-table3: 0.6.3 marked: 9.1.6 - node-emoji: 2.1.0 + node-emoji: 2.1.3 supports-hyperlinks: 3.0.0 dev: true @@ -8866,6 +8894,14 @@ packages: engines: { node: ">=16.10" } dev: true + /meow@13.0.0: + resolution: + { + integrity: sha512-4Hu+75Vo7EOR+8C9RmkabfLijuwd9SrzQ8f0SyC4qZZwU6BlxeOt5ulF3PGCpcMJX4hI+ktpJhea0P6PN1RiWw==, + } + engines: { node: ">=18" } + dev: true + /meow@8.1.2: resolution: { @@ -8873,7 +8909,7 @@ packages: } engines: { node: ">=10" } dependencies: - "@types/minimist": 1.2.2 + "@types/minimist": 1.2.5 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -8928,12 +8964,12 @@ packages: picomatch: 2.3.1 dev: true - /mime@3.0.0: + /mime@4.0.1: resolution: { - integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==, } - engines: { node: ">=10.0.0" } + engines: { node: ">=16" } hasBin: true dev: true @@ -9004,6 +9040,16 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.3: + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options@4.1.0: resolution: { @@ -9029,6 +9075,14 @@ packages: integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, } + /minipass@7.0.4: + resolution: + { + integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, + } + engines: { node: ">=16 || 14 >=14.17" } + dev: true + /mitt@3.0.1: resolution: { @@ -9097,13 +9151,14 @@ packages: } dev: false - /node-emoji@2.1.0: + /node-emoji@2.1.3: resolution: { - integrity: sha512-tcsBm9C6FmPN5Wo7OjFi9lgMyJjvkAeirmjR/ax8Ttfqy4N8PoFic26uqFTIgayHPNI5FH4ltUvfh9kHzwcK9A==, + integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==, } + engines: { node: ">=18" } dependencies: - "@sindresorhus/is": 3.1.2 + "@sindresorhus/is": 4.6.0 char-regex: 1.0.2 emojilib: 2.4.0 skin-tone: 2.0.0 @@ -9124,10 +9179,10 @@ packages: whatwg-url: 5.0.0 dev: true - /node-releases@2.0.13: + /node-releases@2.0.14: resolution: { - integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, } dev: true @@ -9138,7 +9193,7 @@ packages: } dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.4 + resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -9151,7 +9206,7 @@ packages: engines: { node: ">=10" } dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.13.0 + is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -9163,8 +9218,8 @@ packages: } engines: { node: ^16.14.0 || >=18.0.0 } dependencies: - hosted-git-info: 7.0.0 - is-core-module: 2.13.0 + hosted-git-info: 7.0.1 + is-core-module: 2.13.1 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -9203,20 +9258,20 @@ packages: path-key: 3.1.1 dev: true - /npm-run-path@5.1.0: + /npm-run-path@5.2.0: resolution: { - integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, + integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==, } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dependencies: path-key: 4.0.0 dev: true - /npm@10.2.3: + /npm@10.2.5: resolution: { - integrity: sha512-GbUui/rHTl0mW8HhJSn4A0Xg89yCR3I9otgJT1i0z1QBPOVlgbh6rlcUTpHT8Gut9O1SJjWRUU0nEcAymhG2tQ==, + integrity: sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==, } engines: { node: ^18.17.0 || >=20.5.0 } hasBin: true @@ -9319,10 +9374,10 @@ packages: engines: { node: ">= 6" } dev: true - /object-inspect@1.12.3: + /object-inspect@1.13.1: resolution: { - integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==, + integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, } /object-is@1.1.5: @@ -9332,8 +9387,8 @@ packages: } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.5 + define-properties: 1.2.1 dev: false /object-keys@1.1.1: @@ -9343,15 +9398,15 @@ packages: } engines: { node: ">= 0.4" } - /object.assign@4.1.4: + /object.assign@4.1.5: resolution: { - integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==, + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + call-bind: 1.0.5 + define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true @@ -9425,7 +9480,7 @@ packages: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.0 + cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -9457,14 +9512,14 @@ packages: engines: { node: ">=12" } dev: true - /p-filter@3.0.0: + /p-filter@4.1.0: resolution: { - integrity: sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==, + integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==, } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + engines: { node: ">=18" } dependencies: - p-map: 5.5.0 + p-map: 7.0.1 dev: true /p-is-promise@3.0.0: @@ -9535,14 +9590,12 @@ packages: p-limit: 3.1.0 dev: true - /p-map@5.5.0: + /p-map@7.0.1: resolution: { - integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==, + integrity: sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==, } - engines: { node: ">=12" } - dependencies: - aggregate-error: 4.0.1 + engines: { node: ">=18" } dev: true /p-reduce@2.1.0: @@ -9612,23 +9665,22 @@ packages: } engines: { node: ">=8" } dependencies: - "@babel/code-frame": 7.22.10 + "@babel/code-frame": 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 dev: true - /parse-json@8.0.1: + /parse-json@8.1.0: resolution: { - integrity: sha512-soKUg/q/8bcfuF3+plsbYldE74cVEVEPSC1BUPIGTaX1byXdz6Fo+CVYBdH0jj/5xWsFrNRksl11QkBgHqPQeQ==, + integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==, } engines: { node: ">=18" } dependencies: - "@babel/code-frame": 7.22.13 + "@babel/code-frame": 7.23.5 index-to-position: 0.1.2 - json-parse-even-better-errors: 3.0.0 - type-fest: 4.7.1 + type-fest: 4.9.0 dev: true /parse-passwd@1.0.0: @@ -9703,6 +9755,17 @@ packages: integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, } + /path-scurry@1.10.1: + resolution: + { + integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: true + /path-type@4.0.0: resolution: { @@ -9719,15 +9782,15 @@ packages: engines: { node: ">=12" } dev: true - /pdfmake@0.2.7: + /pdfmake@0.2.8: resolution: { - integrity: sha512-ClLpgx30H5G3EDvRW1MrA1Xih6YxEaSgIVFrOyBMgAAt62V+hxsyWAi6JNP7u1Fc5JKYAbpb4RRVw8Rhvmz5cQ==, + integrity: sha512-lI+amfIaUL8CrPhndxFdhIgMj9JB49Sj4DARltKC1gLm/5NsPohZqfB+D+II8HymtPB6eugUFD5oBxmzO57qHA==, } engines: { node: ">=12" } dependencies: "@foliojs-fork/linebreak": 1.1.1 - "@foliojs-fork/pdfkit": 0.13.0 + "@foliojs-fork/pdfkit": 0.14.0 iconv-lite: 0.6.3 xmldoc: 1.3.0 dev: false @@ -9840,7 +9903,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-calc@9.0.1(postcss@8.4.32): @@ -9853,7 +9916,7 @@ packages: postcss: ^8.2.2 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 postcss-value-parser: 4.2.0 dev: true @@ -9870,24 +9933,26 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.2(postcss@8.4.32): + /postcss-color-functional-notation@6.0.3(postcss@8.4.32): resolution: { - integrity: sha512-FsjSmlSufuiFBsIqQ++VxFmvX7zKndZpBkHmfXr4wqhvzM92FTEkAh703iqWTl1U3faTgqioIqCbfqdWiFVwtw==, + integrity: sha512-2jBr3H0sk3qGh/3BkmLsOKcYyVfSlM1K2QQYVU7eW5mkg7ZOQ4aU/Rtbh7vJ9FxAfgf8iHRwXBsQkHqUxzTkXw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) + "@csstools/css-tokenizer": 2.2.2 + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 - postcss-value-parser: 4.2.0 dev: true - /postcss-color-hex-alpha@9.0.2(postcss@8.4.32): + /postcss-color-hex-alpha@9.0.3(postcss@8.4.32): resolution: { - integrity: sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==, + integrity: sha512-7sEHU4tAS6htlxun8AB9LDrCXoljxaC34tFVRlYKcvO+18r5fvGiXgv5bQzN40+4gXLCyWSMRK5FK31244WcCA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -9897,10 +9962,10 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.1(postcss@8.4.32): + /postcss-color-rebeccapurple@9.0.2(postcss@8.4.32): resolution: { - integrity: sha512-ds4cq5BjRieizVb2PnvbJ0omg9VCo2/KzluvoFZbxuGpsGJ5BQSD93CHBooinEtangCM5YqUOerGDl4xGmOb6Q==, + integrity: sha512-f+RDEAPW2m8UbJWkSpRfV+QxhSaQhDMihI75DVGJJh4oRIoegjheeRtINFJum9D8BqGJcvD4GLjggTvCwZ4zuA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -9919,7 +9984,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.32 @@ -9935,7 +10000,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true @@ -9949,24 +10014,24 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/cascade-layer-name-parser": 1.0.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) + "@csstools/media-query-list-parser": 2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) postcss: 8.4.32 dev: true - /postcss-custom-properties@13.3.2(postcss@8.4.32): + /postcss-custom-properties@13.3.3(postcss@8.4.32): resolution: { - integrity: sha512-2Coszybpo8lpLY24vy2CYv9AasiZ39/bs8Imv0pWMq55Gl8NWzfc24OAo3zIX7rc6uUJAqESnVOMZ6V6lpMjJA==, + integrity: sha512-xLmILb2R83aG4X++iVFg8TWadOlc45xiyFHRZD6Yhhu2igrTHXL6C75AEWqx6k9lxrr9sK5rcfUI9JvTCxBTvA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/cascade-layer-name-parser": 1.0.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 postcss: 8.4.32 postcss-value-parser: 4.2.0 @@ -9981,24 +10046,24 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/cascade-layer-name-parser": 1.0.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true - /postcss-dir-pseudo-class@8.0.0(postcss@8.4.32): + /postcss-dir-pseudo-class@8.0.1(postcss@8.4.32): resolution: { - integrity: sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==, + integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-discard-comments@6.0.1(postcss@8.4.32): @@ -10049,44 +10114,44 @@ packages: postcss: 8.4.32 dev: true - /postcss-double-position-gradients@5.0.2(postcss@8.4.32): + /postcss-double-position-gradients@5.0.3(postcss@8.4.32): resolution: { - integrity: sha512-KTbvdOOy8z8zb0BTkEg4/1vqlRlApdvjw8/pFoehgQl0WVO+fezDGlvo0B8xRA+XccA7ohkQCULKNsiNOx70Cw==, + integrity: sha512-QKYpwmaSm6HcdS0ndAuWSNNMv78R1oSySoh3mYBmctHWr2KWcwPJVakdOyU4lvFVW0GRu9wfIQwGeM4p3xU9ow==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true - /postcss-focus-visible@9.0.0(postcss@8.4.32): + /postcss-focus-visible@9.0.1(postcss@8.4.32): resolution: { - integrity: sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==, + integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true - /postcss-focus-within@8.0.0(postcss@8.4.32): + /postcss-focus-within@8.0.1(postcss@8.4.32): resolution: { - integrity: sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==, + integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-font-variant@5.0.0(postcss@8.4.32): @@ -10100,10 +10165,10 @@ packages: postcss: 8.4.32 dev: true - /postcss-gap-properties@5.0.0(postcss@8.4.32): + /postcss-gap-properties@5.0.1(postcss@8.4.32): resolution: { - integrity: sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==, + integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -10112,10 +10177,10 @@ packages: postcss: 8.4.32 dev: true - /postcss-image-set-function@6.0.1(postcss@8.4.32): + /postcss-image-set-function@6.0.2(postcss@8.4.32): resolution: { - integrity: sha512-VlZncC9hhZ5tg0JllY4g6Z28BeoPO8DIkelioEEkXL0AA0IORlqYpTi2L8TUnl4YQrlwvBgxVy+mdZJw5R/cIQ==, + integrity: sha512-/O1xwqpJiz/apxGQi7UUfv1xUcorvkHZfvCYHPpRxxZj2WvjD0rg0+/+c+u5/Do5CpUg3XvfYxMrhcnjW1ArDQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -10137,7 +10202,7 @@ packages: postcss: 8.4.32 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.4 + resolve: 1.22.8 dev: true /postcss-js@4.0.1(postcss@8.4.32): @@ -10153,26 +10218,26 @@ packages: postcss: 8.4.32 dev: true - /postcss-lab-function@6.0.7(postcss@8.4.32): + /postcss-lab-function@6.0.8(postcss@8.4.32): resolution: { - integrity: sha512-4d1lhDVPukHFqkMv4G5vVcK+tgY52vwb5uR1SWKOaO5389r2q8fMxBWuXSW+YtbCOEGP0/X9KERi9E9le2pJuw==, + integrity: sha512-agYs7R9Z5gnX837fCkH8TEQIHdhyDsMPPnpuuENt/dxoDVAykBaqbdxIN4DagOj+ZQo20iRNNJeY3MsFcdI6Sg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.4.0(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) postcss: 8.4.32 dev: true - /postcss-load-config@4.0.1(postcss@8.4.32): + /postcss-load-config@4.0.2(postcss@8.4.32): resolution: { - integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==, + integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, } engines: { node: ">= 14" } peerDependencies: @@ -10184,15 +10249,15 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.1.0 + lilconfig: 3.0.0 postcss: 8.4.32 yaml: 2.3.4 dev: true - /postcss-logical@7.0.0(postcss@8.4.32): + /postcss-logical@7.0.1(postcss@8.4.32): resolution: { - integrity: sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==, + integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -10225,11 +10290,11 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 cssnano-utils: 4.0.1(postcss@8.4.32) postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-minify-font-values@6.0.1(postcss@8.4.32): @@ -10269,7 +10334,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 cssnano-utils: 4.0.1(postcss@8.4.32) postcss: 8.4.32 postcss-value-parser: 4.2.0 @@ -10285,7 +10350,7 @@ packages: postcss: ^8.4.31 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-nested@5.0.6(postcss@8.4.32): @@ -10298,7 +10363,7 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: false /postcss-nested@6.0.1(postcss@8.4.32): @@ -10311,7 +10376,7 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-nesting@12.0.2(postcss@8.4.32): @@ -10323,9 +10388,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.13) + "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-normalize-charset@6.0.1(postcss@8.4.32): @@ -10414,7 +10479,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.32 postcss-value-parser: 4.2.0 dev: true @@ -10471,10 +10536,10 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-overflow-shorthand@5.0.0(postcss@8.4.32): + /postcss-overflow-shorthand@5.0.1(postcss@8.4.32): resolution: { - integrity: sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==, + integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -10495,10 +10560,10 @@ packages: postcss: 8.4.32 dev: true - /postcss-place@9.0.0(postcss@8.4.32): + /postcss-place@9.0.1(postcss@8.4.32): resolution: { - integrity: sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==, + integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -10517,80 +10582,80 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-cascade-layers": 4.0.1(postcss@8.4.32) - "@csstools/postcss-color-function": 3.0.7(postcss@8.4.32) - "@csstools/postcss-color-mix-function": 2.0.7(postcss@8.4.32) - "@csstools/postcss-exponential-functions": 1.0.1(postcss@8.4.32) - "@csstools/postcss-font-format-keywords": 3.0.0(postcss@8.4.32) - "@csstools/postcss-gamut-mapping": 1.0.0(postcss@8.4.32) - "@csstools/postcss-gradients-interpolation-method": 4.0.7(postcss@8.4.32) - "@csstools/postcss-hwb-function": 3.0.6(postcss@8.4.32) - "@csstools/postcss-ic-unit": 3.0.2(postcss@8.4.32) - "@csstools/postcss-initial": 1.0.0(postcss@8.4.32) - "@csstools/postcss-is-pseudo-class": 4.0.3(postcss@8.4.32) - "@csstools/postcss-logical-float-and-clear": 2.0.0(postcss@8.4.32) - "@csstools/postcss-logical-overflow": 1.0.0(postcss@8.4.32) - "@csstools/postcss-logical-overscroll-behavior": 1.0.0(postcss@8.4.32) - "@csstools/postcss-logical-resize": 2.0.0(postcss@8.4.32) - "@csstools/postcss-logical-viewport-units": 2.0.3(postcss@8.4.32) - "@csstools/postcss-media-minmax": 1.1.0(postcss@8.4.32) - "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.3(postcss@8.4.32) - "@csstools/postcss-nested-calc": 3.0.0(postcss@8.4.32) - "@csstools/postcss-normalize-display-values": 3.0.1(postcss@8.4.32) - "@csstools/postcss-oklab-function": 3.0.7(postcss@8.4.32) - "@csstools/postcss-progressive-custom-properties": 3.0.2(postcss@8.4.32) - "@csstools/postcss-relative-color-syntax": 2.0.7(postcss@8.4.32) - "@csstools/postcss-scope-pseudo-class": 3.0.0(postcss@8.4.32) - "@csstools/postcss-stepped-value-functions": 3.0.2(postcss@8.4.32) - "@csstools/postcss-text-decoration-shorthand": 3.0.3(postcss@8.4.32) - "@csstools/postcss-trigonometric-functions": 3.0.2(postcss@8.4.32) - "@csstools/postcss-unset-value": 3.0.0(postcss@8.4.32) + "@csstools/postcss-cascade-layers": 4.0.2(postcss@8.4.32) + "@csstools/postcss-color-function": 3.0.8(postcss@8.4.32) + "@csstools/postcss-color-mix-function": 2.0.8(postcss@8.4.32) + "@csstools/postcss-exponential-functions": 1.0.2(postcss@8.4.32) + "@csstools/postcss-font-format-keywords": 3.0.1(postcss@8.4.32) + "@csstools/postcss-gamut-mapping": 1.0.1(postcss@8.4.32) + "@csstools/postcss-gradients-interpolation-method": 4.0.8(postcss@8.4.32) + "@csstools/postcss-hwb-function": 3.0.7(postcss@8.4.32) + "@csstools/postcss-ic-unit": 3.0.3(postcss@8.4.32) + "@csstools/postcss-initial": 1.0.1(postcss@8.4.32) + "@csstools/postcss-is-pseudo-class": 4.0.4(postcss@8.4.32) + "@csstools/postcss-logical-float-and-clear": 2.0.1(postcss@8.4.32) + "@csstools/postcss-logical-overflow": 1.0.1(postcss@8.4.32) + "@csstools/postcss-logical-overscroll-behavior": 1.0.1(postcss@8.4.32) + "@csstools/postcss-logical-resize": 2.0.1(postcss@8.4.32) + "@csstools/postcss-logical-viewport-units": 2.0.4(postcss@8.4.32) + "@csstools/postcss-media-minmax": 1.1.1(postcss@8.4.32) + "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.4(postcss@8.4.32) + "@csstools/postcss-nested-calc": 3.0.1(postcss@8.4.32) + "@csstools/postcss-normalize-display-values": 3.0.2(postcss@8.4.32) + "@csstools/postcss-oklab-function": 3.0.8(postcss@8.4.32) + "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.32) + "@csstools/postcss-relative-color-syntax": 2.0.8(postcss@8.4.32) + "@csstools/postcss-scope-pseudo-class": 3.0.1(postcss@8.4.32) + "@csstools/postcss-stepped-value-functions": 3.0.3(postcss@8.4.32) + "@csstools/postcss-text-decoration-shorthand": 3.0.4(postcss@8.4.32) + "@csstools/postcss-trigonometric-functions": 3.0.3(postcss@8.4.32) + "@csstools/postcss-unset-value": 3.0.1(postcss@8.4.32) autoprefixer: 10.4.16(postcss@8.4.32) - browserslist: 4.22.1 - css-blank-pseudo: 6.0.0(postcss@8.4.32) - css-has-pseudo: 6.0.0(postcss@8.4.32) - css-prefers-color-scheme: 9.0.0(postcss@8.4.32) - cssdb: 7.9.0 + browserslist: 4.22.2 + css-blank-pseudo: 6.0.1(postcss@8.4.32) + css-has-pseudo: 6.0.1(postcss@8.4.32) + css-prefers-color-scheme: 9.0.1(postcss@8.4.32) + cssdb: 7.10.0 postcss: 8.4.32 postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.32) postcss-clamp: 4.1.0(postcss@8.4.32) - postcss-color-functional-notation: 6.0.2(postcss@8.4.32) - postcss-color-hex-alpha: 9.0.2(postcss@8.4.32) - postcss-color-rebeccapurple: 9.0.1(postcss@8.4.32) + postcss-color-functional-notation: 6.0.3(postcss@8.4.32) + postcss-color-hex-alpha: 9.0.3(postcss@8.4.32) + postcss-color-rebeccapurple: 9.0.2(postcss@8.4.32) postcss-custom-media: 10.0.2(postcss@8.4.32) - postcss-custom-properties: 13.3.2(postcss@8.4.32) + postcss-custom-properties: 13.3.3(postcss@8.4.32) postcss-custom-selectors: 7.1.6(postcss@8.4.32) - postcss-dir-pseudo-class: 8.0.0(postcss@8.4.32) - postcss-double-position-gradients: 5.0.2(postcss@8.4.32) - postcss-focus-visible: 9.0.0(postcss@8.4.32) - postcss-focus-within: 8.0.0(postcss@8.4.32) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.32) + postcss-double-position-gradients: 5.0.3(postcss@8.4.32) + postcss-focus-visible: 9.0.1(postcss@8.4.32) + postcss-focus-within: 8.0.1(postcss@8.4.32) postcss-font-variant: 5.0.0(postcss@8.4.32) - postcss-gap-properties: 5.0.0(postcss@8.4.32) - postcss-image-set-function: 6.0.1(postcss@8.4.32) - postcss-lab-function: 6.0.7(postcss@8.4.32) - postcss-logical: 7.0.0(postcss@8.4.32) + postcss-gap-properties: 5.0.1(postcss@8.4.32) + postcss-image-set-function: 6.0.2(postcss@8.4.32) + postcss-lab-function: 6.0.8(postcss@8.4.32) + postcss-logical: 7.0.1(postcss@8.4.32) postcss-nesting: 12.0.2(postcss@8.4.32) postcss-opacity-percentage: 2.0.0(postcss@8.4.32) - postcss-overflow-shorthand: 5.0.0(postcss@8.4.32) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.32) postcss-page-break: 3.0.4(postcss@8.4.32) - postcss-place: 9.0.0(postcss@8.4.32) - postcss-pseudo-class-any-link: 9.0.0(postcss@8.4.32) + postcss-place: 9.0.1(postcss@8.4.32) + postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.32) postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.32) postcss-selector-not: 7.0.1(postcss@8.4.32) postcss-value-parser: 4.2.0 dev: true - /postcss-pseudo-class-any-link@9.0.0(postcss@8.4.32): + /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.32): resolution: { - integrity: sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==, + integrity: sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-reduce-initial@6.0.1(postcss@8.4.32): @@ -10602,7 +10667,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 postcss: 8.4.32 dev: true @@ -10674,7 +10739,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-selector-parser@6.0.10: @@ -10688,10 +10753,10 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-selector-parser@6.0.13: + /postcss-selector-parser@6.0.14: resolution: { - integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==, + integrity: sha512-65xXYsT40i9GyWzlHQ5ShZoK7JZdySeOozi/tz2EezDo6c04q6+ckYMeoY7idaie1qp2dT5KoYQ2yky6JuoHnA==, } engines: { node: ">=4" } dependencies: @@ -10722,7 +10787,7 @@ packages: postcss: ^8.4.31 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true /postcss-value-parser@4.2.0: @@ -10834,10 +10899,10 @@ packages: } dev: true - /punycode@2.3.0: + /punycode@2.3.1: resolution: { - integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, } engines: { node: ">=6" } dev: true @@ -10926,8 +10991,8 @@ packages: deprecated: Renamed to read-package-up dependencies: find-up-simple: 1.0.0 - read-pkg: 9.0.0 - type-fest: 4.7.1 + read-pkg: 9.0.1 + type-fest: 4.9.0 dev: true /read-pkg-up@7.0.1: @@ -10955,17 +11020,18 @@ packages: type-fest: 0.6.0 dev: true - /read-pkg@9.0.0: + /read-pkg@9.0.1: resolution: { - integrity: sha512-SBoBio4xhJmlF4xs9IBliWZGSbDAnrOfQkLGL7xB+RYEUZNAN2LlNkzO45B7gc7c2dLMX987bhHAaJ/LG3efeQ==, + integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==, } engines: { node: ">=18" } dependencies: "@types/normalize-package-data": 2.4.4 normalize-package-data: 6.0.0 - parse-json: 8.0.1 - type-fest: 4.7.1 + parse-json: 8.1.0 + type-fest: 4.9.0 + unicorn-magic: 0.1.0 dev: true /readable-stream@2.3.8: @@ -11030,13 +11096,13 @@ packages: integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==, } dependencies: - "@babel/runtime": 7.22.11 + "@babel/runtime": 7.23.6 dev: false - /regenerate-unicode-properties@10.1.0: + /regenerate-unicode-properties@10.1.1: resolution: { - integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==, + integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==, } engines: { node: ">=4" } dependencies: @@ -11050,10 +11116,10 @@ packages: } dev: true - /regenerator-runtime@0.14.0: + /regenerator-runtime@0.14.1: resolution: { - integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==, + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, } /regenerator-transform@0.15.2: @@ -11062,19 +11128,19 @@ packages: integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, } dependencies: - "@babel/runtime": 7.22.11 + "@babel/runtime": 7.23.6 dev: true - /regexp.prototype.flags@1.5.0: + /regexp.prototype.flags@1.5.1: resolution: { - integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==, + integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==, } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 /regexpu-core@5.3.2: resolution: @@ -11085,7 +11151,7 @@ packages: dependencies: "@babel/regjsgen": 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 + regenerate-unicode-properties: 10.1.1 regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 @@ -11192,14 +11258,14 @@ packages: } dev: false - /resolve@1.22.4: + /resolve@1.22.8: resolution: { - integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==, + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, } hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -11268,6 +11334,17 @@ packages: glob: 7.2.3 dev: true + /rimraf@5.0.5: + resolution: + { + integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==, + } + engines: { node: ">=14" } + hasBin: true + dependencies: + glob: 10.3.10 + dev: true + /rollup-plugin-terser@7.0.2(rollup@2.79.1): resolution: { @@ -11277,11 +11354,11 @@ packages: peerDependencies: rollup: ^2.0.0 dependencies: - "@babel/code-frame": 7.22.10 + "@babel/code-frame": 7.23.5 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 - terser: 5.19.2 + terser: 5.26.0 dev: true /rollup@2.79.1: @@ -11295,26 +11372,27 @@ packages: fsevents: 2.3.3 dev: true - /rollup@4.4.1: + /rollup@4.9.1: resolution: { - integrity: sha512-idZzrUpWSblPJX66i+GzrpjKE3vbYrlWirUHteoAbjKReZwa0cohAErOYA5efoMmNCdvG9yrJS+w9Kl6csaH4w==, + integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==, } engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.4.1 - "@rollup/rollup-android-arm64": 4.4.1 - "@rollup/rollup-darwin-arm64": 4.4.1 - "@rollup/rollup-darwin-x64": 4.4.1 - "@rollup/rollup-linux-arm-gnueabihf": 4.4.1 - "@rollup/rollup-linux-arm64-gnu": 4.4.1 - "@rollup/rollup-linux-arm64-musl": 4.4.1 - "@rollup/rollup-linux-x64-gnu": 4.4.1 - "@rollup/rollup-linux-x64-musl": 4.4.1 - "@rollup/rollup-win32-arm64-msvc": 4.4.1 - "@rollup/rollup-win32-ia32-msvc": 4.4.1 - "@rollup/rollup-win32-x64-msvc": 4.4.1 + "@rollup/rollup-android-arm-eabi": 4.9.1 + "@rollup/rollup-android-arm64": 4.9.1 + "@rollup/rollup-darwin-arm64": 4.9.1 + "@rollup/rollup-darwin-x64": 4.9.1 + "@rollup/rollup-linux-arm-gnueabihf": 4.9.1 + "@rollup/rollup-linux-arm64-gnu": 4.9.1 + "@rollup/rollup-linux-arm64-musl": 4.9.1 + "@rollup/rollup-linux-riscv64-gnu": 4.9.1 + "@rollup/rollup-linux-x64-gnu": 4.9.1 + "@rollup/rollup-linux-x64-musl": 4.9.1 + "@rollup/rollup-win32-arm64-msvc": 4.9.1 + "@rollup/rollup-win32-ia32-msvc": 4.9.1 + "@rollup/rollup-win32-x64-msvc": 4.9.1 fsevents: 2.3.3 dev: true @@ -11354,15 +11432,15 @@ packages: tslib: 2.6.2 dev: true - /safe-array-concat@1.0.0: + /safe-array-concat@1.0.1: resolution: { - integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==, + integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==, } engines: { node: ">=0.4" } dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 dev: true @@ -11386,8 +11464,8 @@ packages: integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==, } dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-regex: 1.1.4 dev: true @@ -11397,10 +11475,10 @@ packages: integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, } - /sax@1.2.4: + /sax@1.3.0: resolution: { - integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, + integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==, } dev: false @@ -11429,8 +11507,8 @@ packages: dependencies: "@semantic-release/commit-analyzer": 11.1.0(semantic-release@22.0.12) "@semantic-release/error": 4.0.0 - "@semantic-release/github": 9.0.4(semantic-release@22.0.12) - "@semantic-release/npm": 11.0.1(semantic-release@22.0.12) + "@semantic-release/github": 9.2.6(semantic-release@22.0.12) + "@semantic-release/npm": 11.0.2(semantic-release@22.0.12) "@semantic-release/release-notes-generator": 12.1.0(semantic-release@22.0.12) aggregate-error: 5.0.0 cosmiconfig: 8.3.6(typescript@5.3.3) @@ -11442,11 +11520,11 @@ packages: get-stream: 6.0.1 git-log-parser: 1.2.0 hook-std: 3.0.0 - hosted-git-info: 7.0.0 - import-from-esm: 1.3.1 + hosted-git-info: 7.0.1 + import-from-esm: 1.3.3 lodash-es: 4.17.21 marked: 9.1.6 - marked-terminal: 6.1.0(marked@9.1.6) + marked-terminal: 6.2.0(marked@9.1.6) micromatch: 4.0.5 p-each-series: 3.0.0 p-reduce: 3.0.0 @@ -11522,6 +11600,29 @@ packages: } dev: true + /set-function-length@1.1.1: + resolution: + { + integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /set-function-name@2.0.1: + resolution: + { + integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==, + } + engines: { node: ">= 0.4" } + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + /shallow-copy@0.0.1: resolution: { @@ -11553,9 +11654,9 @@ packages: integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, } dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 dev: true /signal-exit@3.0.7: @@ -11603,14 +11704,6 @@ packages: engines: { node: ">=8" } dev: true - /slash@4.0.0: - resolution: - { - integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==, - } - engines: { node: ">=12" } - dev: true - /slash@5.1.0: resolution: { @@ -11728,7 +11821,7 @@ packages: } dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: true /spdx-exceptions@2.3.0: @@ -11745,13 +11838,13 @@ packages: } dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 + spdx-license-ids: 3.0.16 dev: true - /spdx-license-ids@3.0.13: + /spdx-license-ids@3.0.16: resolution: { - integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==, + integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==, } dev: true @@ -11809,10 +11902,10 @@ packages: convert-source-map: 1.9.0 duplexer2: 0.1.4 escodegen: 1.14.3 - has: 1.0.3 + has: 1.0.4 magic-string: 0.25.1 merge-source-map: 1.0.4 - object-inspect: 1.12.3 + object-inspect: 1.13.1 readable-stream: 2.3.8 scope-analyzer: 2.1.2 shallow-copy: 0.0.1 @@ -11857,6 +11950,18 @@ packages: strip-ansi: 6.0.1 dev: true + /string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string-width@7.0.0: resolution: { @@ -11869,54 +11974,55 @@ packages: strip-ansi: 7.1.0 dev: true - /string.prototype.matchall@4.0.8: + /string.prototype.matchall@4.0.10: resolution: { - integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==, + integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==, } dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 has-symbols: 1.0.3 - internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.0 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 side-channel: 1.0.4 dev: true - /string.prototype.trim@1.2.7: + /string.prototype.trim@1.2.8: resolution: { - integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==, + integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==, } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 dev: true - /string.prototype.trimend@1.0.6: + /string.prototype.trimend@1.0.7: resolution: { - integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==, + integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==, } dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 dev: true - /string.prototype.trimstart@1.0.6: + /string.prototype.trimstart@1.0.7: resolution: { - integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==, + integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==, } dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 dev: true /string_decoder@1.1.1: @@ -12050,12 +12156,12 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 dev: true - /stylelint-config-recommended@14.0.0(stylelint@16.0.2): + /stylelint-config-recommended@14.0.0(stylelint@16.1.0): resolution: { integrity: sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==, @@ -12064,34 +12170,34 @@ packages: peerDependencies: stylelint: ^16.0.0 dependencies: - stylelint: 16.0.2(typescript@5.3.3) + stylelint: 16.1.0(typescript@5.3.3) dev: true - /stylelint-config-standard@35.0.0(stylelint@16.0.2): + /stylelint-config-standard@36.0.0(stylelint@16.1.0): resolution: { - integrity: sha512-JyQrNZk2BZwVKFauGGxW2U6RuhIfQ4XoHHo+rBzMHcAkLnwI/knpszwXjzxiMgSfcxbZBckM7Vq4LHoANTR85g==, + integrity: sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==, } engines: { node: ">=18.12.0" } peerDependencies: - stylelint: ^16.0.0 + stylelint: ^16.1.0 dependencies: - stylelint: 16.0.2(typescript@5.3.3) - stylelint-config-recommended: 14.0.0(stylelint@16.0.2) + stylelint: 16.1.0(typescript@5.3.3) + stylelint-config-recommended: 14.0.0(stylelint@16.1.0) dev: true - /stylelint@16.0.2(typescript@5.3.3): + /stylelint@16.1.0(typescript@5.3.3): resolution: { - integrity: sha512-SxA/rg3VWxdoHZlW0nmVueWO1E7TAKW4W6mmA3iTxxEF9bIeQdFZu2oiBlQYyNe1pGnOamOqo2XYnI7cs5Bgow==, + integrity: sha512-Sh1rRV0lN1qxz/QsuuooLWsIZ/ona7NKw/fRZd6y6PyXYdD2W0EAzJ8yJcwSx4Iw/muz0CF09VZ+z4EiTAcKmg==, } engines: { node: ">=18.12.0" } hasBin: true dependencies: - "@csstools/css-parser-algorithms": 2.3.2(@csstools/css-tokenizer@2.2.2) + "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.2) "@csstools/css-tokenizer": 2.2.2 - "@csstools/media-query-list-parser": 2.1.5(@csstools/css-parser-algorithms@2.3.2)(@csstools/css-tokenizer@2.2.2) - "@csstools/selector-specificity": 3.0.0(postcss-selector-parser@6.0.13) + "@csstools/media-query-list-parser": 2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.2) + "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) balanced-match: 2.0.0 colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.3.3) @@ -12100,7 +12206,7 @@ packages: debug: 4.3.4 fast-glob: 3.3.2 fastest-levenshtein: 1.0.16 - file-entry-cache: 7.0.2 + file-entry-cache: 8.0.0 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -12110,14 +12216,14 @@ packages: is-plain-object: 5.0.0 known-css-properties: 0.29.0 mathml-tag-names: 2.1.3 - meow: 12.1.1 + meow: 13.0.0 micromatch: 4.0.5 normalize-path: 3.0.0 picocolors: 1.0.0 postcss: 8.4.32 postcss-resolve-nested-selector: 0.1.1 postcss-safe-parser: 7.0.0(postcss@8.4.32) - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.14 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 string-width: 4.2.3 @@ -12131,17 +12237,17 @@ packages: - typescript dev: true - /sucrase@3.34.0: + /sucrase@3.35.0: resolution: { - integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==, + integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, } - engines: { node: ">=8" } + engines: { node: ">=16 || 14 >=14.17" } hasBin: true dependencies: "@jridgewell/gen-mapping": 0.3.3 commander: 4.1.1 - glob: 7.1.6 + glob: 10.3.10 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -12240,7 +12346,7 @@ packages: fast-glob: 3.3.2 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.19.3 + jiti: 1.21.0 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -12249,11 +12355,11 @@ packages: postcss: 8.4.32 postcss-import: 15.1.0(postcss@8.4.32) postcss-js: 4.0.1(postcss@8.4.32) - postcss-load-config: 4.0.1(postcss@8.4.32) + postcss-load-config: 4.0.2(postcss@8.4.32) postcss-nested: 6.0.1(postcss@8.4.32) - postcss-selector-parser: 6.0.13 - resolve: 1.22.4 - sucrase: 3.34.0 + postcss-selector-parser: 6.0.14 + resolve: 1.22.8 + sucrase: 3.35.0 transitivePeerDependencies: - ts-node dev: true @@ -12300,16 +12406,16 @@ packages: unique-string: 3.0.0 dev: true - /terser@5.19.2: + /terser@5.26.0: resolution: { - integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==, + integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==, } engines: { node: ">=10" } hasBin: true dependencies: "@jridgewell/source-map": 0.3.5 - acorn: 8.10.0 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -12434,14 +12540,15 @@ packages: integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, } dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: true - /traverse@0.6.7: + /traverse@0.6.8: resolution: { - integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==, + integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==, } + engines: { node: ">= 0.4" } dev: true /trim-newlines@3.0.1: @@ -12452,10 +12559,10 @@ packages: engines: { node: ">=8" } dev: true - /ts-api-utils@1.0.2(typescript@5.3.3): + /ts-api-utils@1.0.3(typescript@5.3.3): resolution: { - integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==, + integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, } engines: { node: ">=16.13.0" } peerDependencies: @@ -12576,10 +12683,10 @@ packages: engines: { node: ">=14.16" } dev: true - /type-fest@4.7.1: + /type-fest@4.9.0: resolution: { - integrity: sha512-iWr8RUmzAJRfhZugX9O7nZE6pCxDU8CZ3QxsLuTnGcBLJpCaP2ll3s4eMTBoFnU/CeXY/5rfQSuAEsTGJO4y8A==, + integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==, } engines: { node: ">=16" } dev: true @@ -12605,8 +12712,8 @@ packages: } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 + call-bind: 1.0.5 + get-intrinsic: 1.2.2 is-typed-array: 1.1.12 dev: true @@ -12617,7 +12724,7 @@ packages: } engines: { node: ">= 0.4" } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -12631,7 +12738,7 @@ packages: engines: { node: ">= 0.4" } dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 @@ -12643,7 +12750,7 @@ packages: integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==, } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 dev: true @@ -12681,7 +12788,7 @@ packages: integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, } dependencies: - call-bind: 1.0.2 + call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -12786,17 +12893,17 @@ packages: crypto-random-string: 4.0.0 dev: true - /universal-user-agent@6.0.0: + /universal-user-agent@6.0.1: resolution: { - integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==, + integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, } dev: true - /universalify@2.0.0: + /universalify@2.0.1: resolution: { - integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, } engines: { node: ">= 10.0.0" } dev: true @@ -12809,7 +12916,7 @@ packages: engines: { node: ">=4" } dev: true - /update-browserslist-db@1.0.13(browserslist@4.22.1): + /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: { integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, @@ -12818,7 +12925,7 @@ packages: peerDependencies: browserslist: ">= 4.21.0" dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -12829,7 +12936,7 @@ packages: integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, } dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: true /url-join@4.0.1: @@ -12877,14 +12984,14 @@ packages: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.0.10(@types/node@18.18.9) + vite: 5.0.10(@types/node@18.19.3) workbox-build: 7.0.0 workbox-window: 7.0.0 transitivePeerDependencies: - supports-color dev: true - /vite@5.0.10(@types/node@18.18.9): + /vite@5.0.10(@types/node@18.19.3): resolution: { integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==, @@ -12915,10 +13022,10 @@ packages: terser: optional: true dependencies: - "@types/node": 18.18.9 - esbuild: 0.19.5 + "@types/node": 18.19.3 + esbuild: 0.19.10 postcss: 8.4.32 - rollup: 4.4.1 + rollup: 4.9.1 optionalDependencies: fsevents: 2.3.3 dev: true @@ -12930,10 +13037,10 @@ packages: } dev: false - /wavesurfer.js@7.5.3: + /wavesurfer.js@7.6.0: resolution: { - integrity: sha512-nYK6svXBJaQAuIOa9YQ69njwRs8OnD1FkGE0uVRVuci2STQGsaEVJg13NEr3X02lXAh1ggllwqbh3JLcpG9c9A==, + integrity: sha512-fRGgzdr7QfWuiELWHuaoiXO3WXhBTejBSX6ca41onLmbvEexFWbNRX89aeHDLF+72Gcd5NLqFjxt/0Pc808JBQ==, } dev: false @@ -13001,15 +13108,15 @@ packages: } dev: true - /which-typed-array@1.1.11: + /which-typed-array@1.1.13: resolution: { - integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==, + integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, } engines: { node: ">= 0.4" } dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 @@ -13077,10 +13184,10 @@ packages: engines: { node: ">=16.0.0" } dependencies: "@apideck/better-ajv-errors": 0.3.6(ajv@8.12.0) - "@babel/core": 7.22.11 - "@babel/preset-env": 7.22.10(@babel/core@7.22.11) - "@babel/runtime": 7.22.11 - "@rollup/plugin-babel": 5.3.1(@babel/core@7.22.11)(rollup@2.79.1) + "@babel/core": 7.23.6 + "@babel/preset-env": 7.23.6(@babel/core@7.23.6) + "@babel/runtime": 7.23.6 + "@rollup/plugin-babel": 5.3.1(@babel/core@7.23.6)(rollup@2.79.1) "@rollup/plugin-node-resolve": 11.2.1(rollup@2.79.1) "@rollup/plugin-replace": 2.4.2(rollup@2.79.1) "@surma/rollup-plugin-off-main-thread": 2.2.3 @@ -13240,7 +13347,7 @@ packages: integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==, } dependencies: - "@types/trusted-types": 2.0.3 + "@types/trusted-types": 2.0.7 workbox-core: 7.0.0 dev: true @@ -13268,6 +13375,18 @@ packages: strip-ansi: 6.0.1 dev: true + /wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrap-ansi@9.0.0: resolution: { @@ -13322,7 +13441,7 @@ packages: integrity: sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==, } dependencies: - sax: 1.2.4 + sax: 1.3.0 dev: false /xtend@4.0.2: diff --git a/spark b/spark index f2bf19f4..e8ca6d30 100644 --- a/spark +++ b/spark @@ -39,7 +39,7 @@ if (version_compare(PHP_VERSION, $minPhpVersion, '<')) { } // We want errors to be shown when using it from the CLI. -error_reporting(-1); +error_reporting(E_ALL); ini_set('display_errors', '1'); /** From 68a599fee08c71763b9336e14b1c0d9e28c4449b Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 8 Jan 2024 14:15:45 +0000 Subject: [PATCH 268/477] feat(persons): order persons by full_name ASC for easier list scanning closes #418 --- modules/Admin/Controllers/PersonController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/Admin/Controllers/PersonController.php b/modules/Admin/Controllers/PersonController.php index 278edd4a..5cb66b06 100644 --- a/modules/Admin/Controllers/PersonController.php +++ b/modules/Admin/Controllers/PersonController.php @@ -38,7 +38,8 @@ class PersonController extends BaseController public function index(): string { $data = [ - 'persons' => (new PersonModel())->findAll(), + 'persons' => (new PersonModel())->orderBy('full_name') + ->findAll(), ]; return view('person/list', $data); From 0bd7ddea58adf502121b83e5c09317e20912fb4e Mon Sep 17 00:00:00 2001 From: Ewen Korr Date: Mon, 8 Jan 2024 16:25:39 +0000 Subject: [PATCH 269/477] feat(admin): emphasize unprivileged items in sidebar with "prohibited" icon --- tailwind.config.cjs | 2 + themes/cp_admin/_partials/_nav_menu.php | 15 +++++++- themes/cp_admin/_sidebar.php | 50 +++++++++++++++++++------ themes/cp_admin/episode/_sidebar.php | 20 ++++++++-- themes/cp_admin/podcast/_sidebar.php | 46 ++++++++++++++++++++--- 5 files changed, 109 insertions(+), 24 deletions(-) diff --git a/tailwind.config.cjs b/tailwind.config.cjs index db8c0789..2d7690d8 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -15,6 +15,8 @@ module.exports = { content: { chevronRightIcon: "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 24 24'%3E%3Cpath d='M13.17 12 8.22 7.05l1.42-1.41L16 12l-6.36 6.36-1.42-1.41L13.17 12Z'/%3E%3C/svg%3E%0A\")", + prohibitedIcon: + "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 24 24'%3E%3Cpath d='M7.0943 5.68009L18.3199 16.9057C19.3736 15.5506 20 13.8491 20 12C20 7.58172 16.4183 4 12 4C10.1509 4 8.44939 4.62644 7.0943 5.68009ZM16.9057 18.3199L5.68009 7.0943C4.62644 8.44939 4 10.1509 4 12C4 16.4183 7.58172 20 12 20C13.8491 20 15.5506 19.3736 16.9057 18.3199ZM4.92893 4.92893C6.73748 3.12038 9.23885 2 12 2C17.5228 2 22 6.47715 22 12C22 14.7611 20.8796 17.2625 19.0711 19.0711C17.2625 20.8796 14.7611 22 12 22C6.47715 22 2 17.5228 2 12C2 9.23885 3.12038 6.73748 4.92893 4.92893Z'/%3E%3C/svg%3E%0A\")", }, fontFamily: { sans: ["Inter", ...defaultTheme.fontFamily.sans], diff --git a/themes/cp_admin/_partials/_nav_menu.php b/themes/cp_admin/_partials/_nav_menu.php index 507df80b..d6893b29 100644 --- a/themes/cp_admin/_partials/_nav_menu.php +++ b/themes/cp_admin/_partials/_nav_menu.php @@ -27,11 +27,22 @@
      user(), $podcastId, $data['items-permissions'][$item]); + } else { + $isAllowed = auth()->user()->can($data['items-permissions'][$item]); + } + } ?>
    • - " href="">" href="">
    • diff --git a/themes/cp_admin/_sidebar.php b/themes/cp_admin/_sidebar.php index 0eae7858..dd205758 100644 --- a/themes/cp_admin/_sidebar.php +++ b/themes/cp_admin/_sidebar.php @@ -11,39 +11,65 @@ $navigation = [ 'items' => ['admin'], ], 'podcasts' => [ - 'icon' => 'mic', - 'items' => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'], + 'icon' => 'mic', + 'items' => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'], + 'items-permissions' => [ + 'podcast-create' => 'podcasts.create', + 'all-podcast-imports' => 'podcasts.import', + 'podcast-imports-add' => 'podcasts.import', + ], 'add-cta' => 'podcast-create', 'count-route' => 'podcast-list', ], 'persons' => [ - 'icon' => 'folder-user', - 'items' => ['person-list', 'person-create'], + 'icon' => 'folder-user', + 'items' => ['person-list', 'person-create'], + 'items-permissions' => [ + 'person-list' => 'persons.manage', + 'person-create' => 'persons.manage', + ], 'add-cta' => 'person-create', 'count' => (new PersonModel())->countAllResults(), 'count-route' => 'person-list', ], 'fediverse' => [ - 'icon' => 'rocket-tilted', - 'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'], + 'icon' => 'rocket-tilted', + 'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'], + 'items-permissions' => [ + 'fediverse-blocked-actors' => 'fediverse.manage-blocks', + 'fediverse-blocked-domains' => 'fediverse.manage-blocks', + ], ], 'users' => [ - 'icon' => 'group', - 'items' => ['user-list', 'user-create'], + 'icon' => 'group', + 'items' => ['user-list', 'user-create'], + 'items-permissions' => [ + 'user-list' => 'users.manage', + 'user-create' => 'users.manage', + ], 'add-cta' => 'user-create', 'count' => (new UserModel())->countAllResults(), 'count-route' => 'user-list', ], 'pages' => [ - 'icon' => 'pages', - 'items' => ['page-list', 'page-create'], + 'icon' => 'pages', + 'items' => ['page-list', 'page-create'], + 'items-permissions' => [ + 'page-list' => 'pages.manage', + 'page-create' => 'pages.manage', + ], 'add-cta' => 'page-create', 'count' => (new PageModel())->countAllResults(), 'count-route' => 'page-list', ], 'settings' => [ - 'icon' => 'settings', - 'items' => ['settings-general', 'settings-theme', 'admin-about'], + 'icon' => 'settings', + 'items' => ['settings-general', 'settings-theme', 'admin-about'], + 'items-permissions' => [ + 'settings-general' => 'admin.settings', + 'settings-theme' => 'admin.settings', + 'admin-about' => 'admin.settings', + ], ], ]; diff --git a/themes/cp_admin/episode/_sidebar.php b/themes/cp_admin/episode/_sidebar.php index d5c7f83e..4dd8fe95 100644 --- a/themes/cp_admin/episode/_sidebar.php +++ b/themes/cp_admin/episode/_sidebar.php @@ -2,12 +2,24 @@ $episodeNavigation = [ 'dashboard' => [ - 'icon' => 'dashboard', - 'items' => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'], + 'icon' => 'dashboard', + 'items' => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'], + 'items-permissions' => [ + 'episode-view' => 'episodes.view', + 'episode-edit' => 'episodes.edit', + 'episode-persons-manage' => 'episodes.manage-persons', + 'embed-add' => 'episodes.edit', + ], ], 'clips' => [ - 'icon' => 'clapperboard', - 'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'], + 'icon' => 'clapperboard', + 'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'], + 'items-permissions' => [ + 'video-clips-list' => 'episodes.manage-clips', + 'video-clips-create' => 'episodes.manage-clips', + 'soundbites-list' => 'episodes.manage-clips', + 'soundbites-create' => 'episodes.manage-clips', + ], 'count' => $episode->getClipCount(), 'count-route' => 'video-clips-list', 'add-cta' => 'video-clips-create', diff --git a/themes/cp_admin/podcast/_sidebar.php b/themes/cp_admin/podcast/_sidebar.php index c2083f1e..9551fe9f 100644 --- a/themes/cp_admin/podcast/_sidebar.php +++ b/themes/cp_admin/podcast/_sidebar.php @@ -2,12 +2,23 @@ $podcastNavigation = [ 'dashboard' => [ - 'icon' => 'dashboard', - 'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports', 'podcast-imports-sync'], + 'icon' => 'dashboard', + 'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports', 'podcast-imports-sync'], + 'items-permissions' => [ + 'podcast-view' => 'view', + 'podcast-edit' => 'edit', + 'podcast-persons-manage' => 'manage-persons', + 'podcast-imports' => 'manage-import', + 'podcast-imports-sync' => 'manage-import', + ], ], 'episodes' => [ - 'icon' => 'play-circle', - 'items' => ['episode-list', 'episode-create'], + 'icon' => 'play-circle', + 'items' => ['episode-list', 'episode-create'], + 'items-permissions' => [ + 'episode-list' => 'episodes.view', + 'episode-create' => 'episodes.create', + ], 'add-cta' => 'episode-create', 'count' => $podcast->getEpisodesCount(), 'count-route' => 'episode-list', @@ -23,6 +34,15 @@ $podcastNavigation = [ 'podcast-analytics-time-periods', 'podcast-analytics-webpages', ], + 'items-permissions' => [ + 'podcast-analytics' => 'view', + 'podcast-analytics-unique-listeners' => 'view', + 'podcast-analytics-listening-time' => 'view', + 'podcast-analytics-players' => 'view', + 'podcast-analytics-locations' => 'view', + 'podcast-analytics-time-periods' => 'view', + 'podcast-analytics-webpages' => 'view', + ], ], 'broadcast' => [ 'icon' => 'broadcast', @@ -30,6 +50,10 @@ $podcastNavigation = [ 'platforms-podcasting', 'platforms-social', ], + 'items-permissions' => [ + 'platforms-podcasting' => 'manage-platforms', + 'platforms-social' => 'manage-platforms', + ], ], 'monetization' => [ 'icon' => 'money-dollar-circle', @@ -39,10 +63,20 @@ $podcastNavigation = [ 'platforms-funding', 'podcast-monetization-other', ], + 'items-permissions' => [ + 'subscription-list' => 'manage-subscriptions', + 'subscription-create' => 'manage-subscriptions', + 'platforms-funding' => 'manage-platforms', + 'podcast-monetization-other' => 'edit', + ], ], 'contributors' => [ - 'icon' => 'group', - 'items' => ['contributor-list', 'contributor-add'], + 'icon' => 'group', + 'items' => ['contributor-list', 'contributor-add'], + 'items-permissions' => [ + 'contributor-list' => 'manage-contributors', + 'contributor-add' => 'manage-contributors', + ], 'add-cta' => 'contributor-add', 'count' => count($podcast->contributors), 'count-route' => 'contributor-list', From f7f9bafc3e56621fab2569d9d76baafe0a2e940d Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 9 Jan 2024 16:12:15 +0000 Subject: [PATCH 270/477] feat(admin): add tooltip for not authorized routes --- modules/Admin/Language/en/Navigation.php | 1 + themes/cp_admin/_partials/_nav_menu.php | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/Admin/Language/en/Navigation.php b/modules/Admin/Language/en/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/en/Navigation.php +++ b/modules/Admin/Language/en/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/themes/cp_admin/_partials/_nav_menu.php b/themes/cp_admin/_partials/_nav_menu.php index d6893b29..58afaa08 100644 --- a/themes/cp_admin/_partials/_nav_menu.php +++ b/themes/cp_admin/_partials/_nav_menu.php @@ -38,13 +38,17 @@ } ?>
    • - " href="">" href=""> + + +
    From 19799f496d548ecc4a0e0bfa1120dc714feab226 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 11 Jan 2024 15:38:21 +0000 Subject: [PATCH 271/477] chore(all-contributors): add code contribution to ewen --- .all-contributorsrc | 27 ++++++++++++++------------- README.md | 6 +++--- docs/src/index.md | 6 +++--- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index b53c772e..d4411375 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -135,6 +135,20 @@ "ideas" ] }, + { + "login": "3wen", + "name": "Ewen", + "avatar_url": "https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg", + "profile": "https://mastodon.fedi.bzh/@ewen", + "contributions": [ + { + "type": "translation", + "url": "https://translate.castopod.org" + }, + "ideas", + "code" + ] + }, { "login": "Behel", "name": "Bastien Luneteau", @@ -330,19 +344,6 @@ } ] }, - { - "login": "3wen", - "name": "Ewen", - "avatar_url": "https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg", - "profile": "https://mastodon.fedi.bzh/@ewen", - "contributions": [ - { - "type": "translation", - "url": "https://translate.castopod.org" - }, - "ideas" - ] - }, { "login": "forght", "name": "forght", diff --git a/README.md b/README.md index 1fb04ed4..3c07d45f 100644 --- a/README.md +++ b/README.md @@ -61,30 +61,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 diff --git a/docs/src/index.md b/docs/src/index.md index 0597e933..c37e70de 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 From 2ed511f8a0005dc06eda5afd6b1d13beee1eb9dd Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 15 Jan 2024 14:32:32 +0000 Subject: [PATCH 272/477] fix(install): add created superadmin to most powerful group in instance, ie. superadmin --- modules/Install/Commands/CreateSuperadmin.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/Install/Commands/CreateSuperadmin.php b/modules/Install/Commands/CreateSuperadmin.php index 540c6cfc..f260ba3b 100644 --- a/modules/Install/Commands/CreateSuperadmin.php +++ b/modules/Install/Commands/CreateSuperadmin.php @@ -98,6 +98,11 @@ class CreateSuperadmin extends BaseCommand $user = new User($data); $userModel->save($user); + $user = $userModel->findById($userModel->getInsertID()); + + // set newly created user as most powerful instance group (superadmin) + $user->addGroup(setting('AuthGroups.mostPowerfulGroup')); + $this->write('Super admin "' . $username . '" created', 'green'); } From 2c3cb85a3516828fc1b6dab375669cbe7b958ec7 Mon Sep 17 00:00:00 2001 From: crowdin Date: Mon, 15 Jan 2024 14:59:13 +0000 Subject: [PATCH 273/477] chore(i18n): new Crowdin updates --- app/Language/br/Episode.php | 16 ++-- app/Language/br/Podcast.php | 6 +- app/Language/pt-BR/Episode.php | 16 ++-- app/Language/sk/Episode.php | 10 +-- docs/src/br/index.md | 2 +- docs/src/pt-BR/getting-started/auth.md | 13 ++-- modules/Admin/Language/ar/Podcast.php | 2 + modules/Admin/Language/br/Breadcrumb.php | 22 +++--- modules/Admin/Language/br/Charts.php | 2 +- modules/Admin/Language/br/Common.php | 4 +- modules/Admin/Language/br/Dashboard.php | 4 +- modules/Admin/Language/br/Episode.php | 34 ++++----- modules/Admin/Language/br/Fediverse.php | 2 +- modules/Admin/Language/br/Home.php | 2 +- modules/Admin/Language/br/Navigation.php | 6 +- modules/Admin/Language/br/Person.php | 2 +- modules/Admin/Language/br/Platforms.php | 16 ++-- modules/Admin/Language/br/Podcast.php | 62 +++++++-------- .../Admin/Language/br/PodcastNavigation.php | 18 ++--- modules/Admin/Language/br/Settings.php | 4 +- modules/Admin/Language/ca/Podcast.php | 2 + modules/Admin/Language/da/Podcast.php | 2 + modules/Admin/Language/de/Podcast.php | 2 + modules/Admin/Language/el/Podcast.php | 2 + modules/Admin/Language/es/Podcast.php | 2 + modules/Admin/Language/fa/Podcast.php | 2 + modules/Admin/Language/fr/Podcast.php | 2 + modules/Admin/Language/fr2/Podcast.php | 2 + modules/Admin/Language/fr_CA/Podcast.php | 2 + modules/Admin/Language/gd/Podcast.php | 2 + modules/Admin/Language/gl/Podcast.php | 2 + modules/Admin/Language/id/Podcast.php | 2 + modules/Admin/Language/it/Podcast.php | 2 + modules/Admin/Language/ja/Podcast.php | 2 + modules/Admin/Language/kk/Podcast.php | 2 + modules/Admin/Language/ko/Podcast.php | 2 + modules/Admin/Language/nl/Podcast.php | 2 + modules/Admin/Language/nn-NO/Podcast.php | 2 + modules/Admin/Language/oc/Podcast.php | 2 + modules/Admin/Language/pl/Podcast.php | 2 + modules/Admin/Language/pt-BR/Podcast.php | 2 + modules/Admin/Language/pt/Podcast.php | 2 + modules/Admin/Language/ro/Podcast.php | 2 + modules/Admin/Language/ru/Podcast.php | 2 + modules/Admin/Language/sk/Episode.php | 8 +- .../Admin/Language/sk/EpisodeNavigation.php | 2 +- modules/Admin/Language/sk/Fediverse.php | 4 +- modules/Admin/Language/sk/Navigation.php | 4 +- modules/Admin/Language/sk/Person.php | 2 +- modules/Admin/Language/sk/Platforms.php | 2 +- modules/Admin/Language/sk/Podcast.php | 30 ++++---- .../Admin/Language/sk/PodcastNavigation.php | 24 +++--- modules/Admin/Language/sk/Settings.php | 10 +-- modules/Admin/Language/sr_Latn/Podcast.php | 2 + modules/Admin/Language/sv/Podcast.php | 2 + modules/Admin/Language/uk/Podcast.php | 2 + modules/Admin/Language/zh-Hans/Podcast.php | 2 + modules/Auth/Language/br/User.php | 2 +- .../Language/br/PodcastImport.php | 4 +- .../Language/pt-BR/PodcastImport.php | 76 +++++++++---------- 60 files changed, 265 insertions(+), 202 deletions(-) diff --git a/app/Language/br/Episode.php b/app/Language/br/Episode.php index 0d2b685b..194da0ab 100644 --- a/app/Language/br/Episode.php +++ b/app/Language/br/Episode.php @@ -40,15 +40,15 @@ return [ 'all_podcast_episodes' => 'Holl rannoù ar podkast', 'back_to_podcast' => 'Mont d\'ar podkast en-dro', 'preview' => [ - 'title' => 'Preview', - 'not_published' => 'Not published', + 'title' => 'Rakwel', + 'not_published' => 'Diembann', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {N\'eo ket bet embannet ar rann-mañ c\'hoazh.} + scheduled {Raktreset eo an embann a-benn an/ar {publication_date}.} + with_podcast {Ar rann-mañ a vo embannet war un dro gant ar podkast.} + other {N\'eo ket bet embannet ar rann-mañ c\'hoazh.} }', - 'publish' => 'Publish', - 'publish_edit' => 'Edit publication', + 'publish' => 'Embann', + 'publish_edit' => 'Kemmañ an embannadur', ], ]; diff --git a/app/Language/br/Podcast.php b/app/Language/br/Podcast.php index b826b4d0..6355a8a2 100644 --- a/app/Language/br/Podcast.php +++ b/app/Language/br/Podcast.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'feed' => 'Lanv RSS ar podkast', + 'feed' => 'Gwazh RSS ar podkast', 'season' => 'Koulzad {seasonNumber}', 'list_of_episodes_year' => 'Rannoù {year} ({episodeCount})', 'list_of_episodes_season' => @@ -61,7 +61,7 @@ return [ 84 {# c\'hemennadenn} 89 {# c\'hemennadenn} }', - 'links' => 'Links', + 'links' => 'Liammoù', 'activity' => 'Oberiantiz', 'episodes' => 'Rannoù', 'episodes_title' => 'Rannoù {podcastTitle}', @@ -131,5 +131,5 @@ return [ 82 {# zen} }', 'persons_list' => 'Emellerien·ezed', - 'castopod_website' => 'Castopod (website)', + 'castopod_website' => 'Castopod (lec\'hienn)', ]; diff --git a/app/Language/pt-BR/Episode.php b/app/Language/pt-BR/Episode.php index a7fd80b3..278f6dac 100644 --- a/app/Language/pt-BR/Episode.php +++ b/app/Language/pt-BR/Episode.php @@ -31,15 +31,15 @@ return [ 'all_podcast_episodes' => 'Todos os episódios de podcast', 'back_to_podcast' => 'Voltar para o podcast', 'preview' => [ - 'title' => 'Preview', - 'not_published' => 'Not published', + 'title' => 'Pré-visualizar', + 'not_published' => 'Não publicado', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {Esse episódio ainda não foi publicado.} + scheduled {Esse episódio está agendado para publicação em {publication_date}.} + with_podcast {Esse episódio será publicado ao mesmo tempo que o podcast. .} + other {Esse episódio ainda não foi publicado.} }', - 'publish' => 'Publish', - 'publish_edit' => 'Edit publication', + 'publish' => 'Publicar', + 'publish_edit' => 'Editar Publicação', ], ]; diff --git a/app/Language/sk/Episode.php b/app/Language/sk/Episode.php index 3f441fd7..c1529fe3 100644 --- a/app/Language/sk/Episode.php +++ b/app/Language/sk/Episode.php @@ -38,12 +38,12 @@ return [ 'title' => 'Náhľad', 'not_published' => 'Nezverejnená', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {Táto epizóda ešte nieje zverejnená.} + scheduled {Táto epizóda je naplánovaná na zverejnenie {publication_date}.} + with_podcast {Táto epizóda bude zverejnená zarovno s podcastom.} + other {Táto epizóda ešte nieje zverejnená.} }', 'publish' => 'Zverejniť', - 'publish_edit' => 'Edit publication', + 'publish_edit' => 'Upraviť zverejnené', ], ]; diff --git a/docs/src/br/index.md b/docs/src/br/index.md index 42ec8ed0..3da841c1 100644 --- a/docs/src/br/index.md +++ b/docs/src/br/index.md @@ -38,7 +38,7 @@ small footprint. - 🎬  Generate ready-to-share Video clips from episodes - 🔉  Generate soundbites - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: +- 💸  Arc'hantaouiñ : - 🔗  Funding links - 📲  listen-to-click ads - 🤝  value4value / WebMonetization diff --git a/docs/src/pt-BR/getting-started/auth.md b/docs/src/pt-BR/getting-started/auth.md index ff5d59c0..ce98d873 100644 --- a/docs/src/pt-BR/getting-started/auth.md +++ b/docs/src/pt-BR/getting-started/auth.md @@ -3,15 +3,16 @@ title: Authentication & Authorization sidebarDepth: 3 --- -# Authentication & Authorization +# Autenticação & Autorização -Castopod handles authentication and authorization using `codeigniter/shield` -coupled with custom rules. Roles and permissions are defined at two levels: +Castopod lida com autenticação e autorização usando `codeigniter/shield` +juntamente com regras personalizadas. Papéis e permissões são definidos em dois +níveis: -1. [instance wide](#1-instance-wide-roles-and-permissions) -2. [per podcast](#2-per-podcast-roles-and-permissions) +1. [toda instância](#1-instance-wide-roles-and-permissions) +2. [por podcast](#2-per-podcast-roles-and-permissions) -## 1. Instance wide roles and permissions +## Papéis e permissões para toda a instância ### Instance roles diff --git a/modules/Admin/Language/ar/Podcast.php b/modules/Admin/Language/ar/Podcast.php index 230edb81..e939acb8 100644 --- a/modules/Admin/Language/ar/Podcast.php +++ b/modules/Admin/Language/ar/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php index f22aaef1..ac4cc5c2 100644 --- a/modules/Admin/Language/br/Breadcrumb.php +++ b/modules/Admin/Language/br/Breadcrumb.php @@ -16,34 +16,34 @@ return [ ->gateway => 'Degemer', 'podcasts' => 'podkastoù', 'episodes' => 'rannoù', - 'subscriptions' => 'subscriptions', + 'subscriptions' => 'koumanantoù', 'contributors' => 'perzhidi, perzhiadezed', 'pages' => 'pajennoù', 'settings' => 'arventennoù', 'theme' => 'neuz', - 'about' => 'about', + 'about' => 'a-zivout', 'add' => 'ouzhpennañ', 'new' => 'krouiñ', 'edit' => 'kemmañ', 'persons' => 'emellerien·ezed', 'publish' => 'embann', 'publish-edit' => 'kemmañ an embannadur', - 'publish-date-edit' => 'edit publication date', + 'publish-date-edit' => 'kemmañ deiziad an embannadur', 'unpublish' => 'diembannañ', 'delete' => 'dilemel', - 'remove' => 'remove', + 'remove' => 'lemel', 'fediverse' => 'kevrebed', - 'blocked-actors' => 'blocked actors', - 'blocked-domains' => 'blocked domains', + 'blocked-actors' => 'aktourien·ezed stanket', + 'blocked-domains' => 'domanioù stanket', 'users' => 'implijerien·ezed', 'my-account' => 'ma c\'hont', 'change-password' => 'kemmañ ar ger-tremen', - 'imports' => 'imports', - 'sync-feeds' => 'synchronize feeds', + 'imports' => 'enporzhiadennoù', + 'sync-feeds' => 'sinkronekaat ar gwazhoù', 'platforms' => 'savennoù', 'social' => 'rouedadoù sokial', 'funding' => 'arc\'hantaouiñ', - 'monetization-other' => 'other monetization', + 'monetization-other' => 'doare arc\'hantaouiñ all', 'analytics' => 'muzulioù heklev', 'locations' => 'lec\'hioù', 'webpages' => 'pajennoù web', @@ -54,6 +54,6 @@ return [ 'soundbites' => 'tennadoù son', 'video-clips' => 'tennadoù video', 'embed' => 'lenner enkorfet', - 'notifications' => 'notifications', - 'suspend' => 'suspend', + 'notifications' => 'kemennoù', + 'suspend' => 'astalañ', ]; diff --git a/modules/Admin/Language/br/Charts.php b/modules/Admin/Language/br/Charts.php index e7b7b9f9..687ea057 100644 --- a/modules/Admin/Language/br/Charts.php +++ b/modules/Admin/Language/br/Charts.php @@ -37,5 +37,5 @@ return [ 'podcast_by_bandwidth' => 'Lec\'hed bann implijet bemdez (e MB)', 'total_storage_by_month' => 'Kadaviñ bep miz (e MB)', 'total_bandwidth_by_month' => 'Lec\'hed bann implijet bep miz (e MB)', - 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', + 'total_bandwidth_by_month_limit' => 'Bevennet da {totalBandwidth} bep miz', ]; diff --git a/modules/Admin/Language/br/Common.php b/modules/Admin/Language/br/Common.php index 6c2792b7..40491496 100644 --- a/modules/Admin/Language/br/Common.php +++ b/modules/Admin/Language/br/Common.php @@ -14,7 +14,7 @@ return [ 'cancel' => 'Nullañ', 'optional' => 'Diret', 'more' => 'Muioc\'h', - 'no_data' => 'Roadenn ebet kavet!', + 'no_data' => 'Roadenn ebet kavet !', 'close' => 'Serriñ', 'edit' => 'Kemmañ', 'copy' => 'Eilañ', @@ -40,7 +40,7 @@ return [ ], 'upload_file' => 'Uskargit ur restr', 'remote_url' => 'URL a-bell', - 'save' => 'Save', + 'save' => 'Enrollañ', ], 'play_episode_button' => [ 'play' => 'Lenn', diff --git a/modules/Admin/Language/br/Dashboard.php b/modules/Admin/Language/br/Dashboard.php index 881073fd..6ce8645c 100644 --- a/modules/Admin/Language/br/Dashboard.php +++ b/modules/Admin/Language/br/Dashboard.php @@ -13,12 +13,12 @@ return [ 'welcome_message' => 'Welcome to the admin area!', 'podcasts' => [ 'title' => 'Podcasts', - 'not_found' => 'No published podcast', + 'not_found' => 'Podkast embannet ebet', 'last_published' => 'Last published on {lastPublicationDate}', ], 'episodes' => [ 'title' => 'Episodes', - 'not_found' => 'No published episode', + 'not_found' => 'Rann embannet ebet', 'last_published' => 'Last published on {lastPublicationDate}', ], 'storage' => [ diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php index ce731f01..ae3d724c 100644 --- a/modules/Admin/Language/br/Episode.php +++ b/modules/Admin/Language/br/Episode.php @@ -23,10 +23,10 @@ return [ 'all_podcast_episodes' => 'Holl rannoù ar podkast', 'back_to_podcast' => 'Mont d\'ar podkast en-dro', 'edit' => 'Kemmañ', - 'preview' => 'Preview', + 'preview' => 'Rakwel', 'publish' => 'Embann', 'publish_edit' => 'Kemmañ an embannadur', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Kemmañ deiziad an embannadur', 'unpublish' => 'Diembannañ', 'publish_error' => 'Embannet eo bet ar rann dija.', 'publish_edit_error' => 'Embannet eo bet ar rann dija.', @@ -58,7 +58,7 @@ return [ }', 'episode' => 'Rann', 'visibility' => 'Gwelusted', - 'downloads' => 'Downloads', + 'downloads' => 'Pellgargadennoù', 'comments' => 'Evezhiadennoù', 'actions' => 'Obererezhioù', ], @@ -66,8 +66,8 @@ return [ 'createSuccess' => 'Krouet eo bet ar rann gant berzh!', 'editSuccess' => 'Hizivaet eo bet ar rann gant berzh!', 'publishSuccess' => '{publication_status, select, - published {Embannet eo bet ar rann gant berzh!} - scheduled {Raktreset eo bet embannadur ar rann gant berzh!} + published {Embannet eo bet ar rann gant berzh !} + scheduled {Raktreset eo bet embannadur ar rann gant berzh !} with_podcast {Ar rann-mañ a vo embannet war un dro gant ar podkast.} other {N\'eo ket bet embannet ar rann-mañ.} }', @@ -167,7 +167,7 @@ return [ 'back_to_episode_dashboard' => 'Distreiñ da daolenn-stur ar rann', 'post' => 'Ho kemennadenn vrudañ', 'post_hint' => - "Skrivit ur gemennadenn evit brudañ embannadur ho rann. Skignet e vo ar gemennadenn-se d'an holl re a heuilh ac'hanoc'h war ar c'hevrebed (fediverse) ha lakaet e vo war well war pajenn ho podkast.", + "Skrivit ur gemennadenn evit brudañ embannadur ho rann. Skignet e vo ar gemennadenn-se d'an holl re a heuilh ac'hanoc'h war ar Fediverse ha lakaet e vo war well war pajenn ho podkast.", 'message_placeholder' => 'Skrivit ho kemennadenn…', 'publication_date' => 'Deiziad embannadur', 'publication_method' => [ @@ -180,20 +180,20 @@ return [ 'scheduled_publication_date_hint' => 'Gallout a rit steuñviñ embannadur ar rann en ur steuñviñ embannadur ar rann en dazont. Dleout a ra ar vaezienn bezañ er furmad YYYY-MM-DD HH:mm', 'submit' => 'Embann', - 'submit_edit' => 'Kemmañ an embannadur', + 'submit_edit' => 'Kemmañ an embann', 'cancel_publication' => 'Nullañ an embannadur', 'message_warning' => 'N\'ho peus ket skrivet ur gemennadenn evit brudañ ho rann!', 'message_warning_hint' => 'Ouzhpennañ ur gemennadenn a lakay muioc\'h a dud er jeu, ha diwar se e vo gwelet muioc\'h ho rann.', 'message_warning_submit' => 'Embann memestra', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', - 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'new_publication_date' => 'Deiziad embannadur nevez', + 'new_publication_date_hint' => 'An dra-se a rank bezañ un deiziad tremenet.', + 'submit' => 'Kemmañ deiziad an embann', ], 'unpublish_form' => [ 'disclaimer' => - "Diembann ar rann a zilamo an holl gemennadennoù liammet outi ha skarzhet e vo eus lanv RSS ar podkast.", + "Diembann ar rann a zilamo an holl gemennadennoù liammet outi ha skarzhet e vo eus gwazh RSS ar podkast.", 'understand' => 'Komprennet eo, diembann ar rann a fell din', 'submit' => 'Diembann', ], @@ -215,13 +215,13 @@ return [ 'light-transparent' => 'Sklaer treuzwelus', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', + 'draft_mode' => 'mod brouilhed', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {N\'eo ket bet embannet ar rann-mañ c\'hoazh.} + scheduled {Raktreset eo an embann a-benn an/ar {publication_date}.} + with_podcast {Ar rann-mañ a vo embannet war un dro gant ar podkast.} + other {N\'eo ket bet embannet ar rann-mañ c\'hoazh.} }', - 'preview' => 'Preview', + 'preview' => 'Rakwel', ], ]; diff --git a/modules/Admin/Language/br/Fediverse.php b/modules/Admin/Language/br/Fediverse.php index 9dd1559a..f8aeebf4 100644 --- a/modules/Admin/Language/br/Fediverse.php +++ b/modules/Admin/Language/br/Fediverse.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'messages' => [ - 'actorNotFound' => 'N\'eo ket bet kavet ar gont-se!', + 'actorNotFound' => 'N\'eo ket bet kavet ar gont-se !', 'blockActorSuccess' => 'Stanket eo bet {actor}!', 'unblockActorSuccess' => 'Distanket eo bet an implijer·ez!', 'blockDomainSuccess' => 'Stanket eo bet {domain}!', diff --git a/modules/Admin/Language/br/Home.php b/modules/Admin/Language/br/Home.php index 285392b4..6cbea879 100644 --- a/modules/Admin/Language/br/Home.php +++ b/modules/Admin/Language/br/Home.php @@ -10,5 +10,5 @@ declare(strict_types=1); return [ 'all_podcasts' => 'An holl bodkastoù', - 'no_podcast' => 'N\'eo bet kavet podkast ebet', + 'no_podcast' => 'N\'eus bet kavet podkast ebet', ]; diff --git a/modules/Admin/Language/br/Navigation.php b/modules/Admin/Language/br/Navigation.php index aebeac33..f96d2669 100644 --- a/modules/Admin/Language/br/Navigation.php +++ b/modules/Admin/Language/br/Navigation.php @@ -17,8 +17,8 @@ return [ 'podcasts' => 'Podkastoù', 'podcast-list' => 'An holl bodkastoù', 'podcast-create' => 'Krouiñ ur podkast', - 'all-podcast-imports' => 'All Podcast imports', - 'podcast-imports-add' => 'Import a podcast', + 'all-podcast-imports' => 'An holl bodkastoù enporzhet', + 'podcast-imports-add' => 'Enporzhiañ ur podkast', 'persons' => 'Emellerien·ezed', 'person-list' => 'An holl emellerien·ezed', 'person-create' => 'Krouiñ un emeller·ez', @@ -34,7 +34,7 @@ return [ 'settings' => 'Arventennoù', 'settings-general' => 'Hollek', 'settings-theme' => 'Neuz', - 'admin-about' => 'About', + 'admin-about' => 'A-zivout', 'account' => [ 'my-account' => 'Ma c\'hont', 'change-password' => 'Kemmañ ar ger-tremen', diff --git a/modules/Admin/Language/br/Person.php b/modules/Admin/Language/br/Person.php index 9a1d0f69..0dfc819c 100644 --- a/modules/Admin/Language/br/Person.php +++ b/modules/Admin/Language/br/Person.php @@ -11,7 +11,7 @@ declare(strict_types=1); return [ 'persons' => 'Emellerien·ezed', 'all_persons' => 'An holl emellerien·ezed', - 'no_person' => 'Emeller·ez ebet!', + 'no_person' => 'Emeller·ez ebet !', 'create' => 'Krouiñ un emeller·ez', 'view' => 'Gwelet an emeller·ez', 'edit' => 'Kemmañ an emeller·ez', diff --git a/modules/Admin/Language/br/Platforms.php b/modules/Admin/Language/br/Platforms.php index ccec98c5..96962b80 100644 --- a/modules/Admin/Language/br/Platforms.php +++ b/modules/Admin/Language/br/Platforms.php @@ -10,18 +10,18 @@ declare(strict_types=1); return [ 'title' => [ - 'podcasting' => 'Podcasting platforms', - 'social' => 'Social networks', - 'funding' => 'Funding links', + 'podcasting' => 'Savennoù podkastoù', + 'social' => 'Rouedadoù sokial', + 'funding' => 'Liammoù arc\'hantaouiñ', ], - 'website' => 'Website', + 'website' => 'Lec\'hienn', 'home_url' => 'Mont da lec\'hienn {platformName}', - 'register' => 'Register', + 'register' => 'Enskrivañ', 'submit_url' => 'Kasit ho podkast war {platformName}', - 'your_link' => 'Your link', + 'your_link' => 'Ho liamm', 'your_id' => [ - 'podcasting' => 'Your ID', - 'social' => 'Your ID', + 'podcasting' => 'Hoc’h anaout (ID)', + 'social' => 'Hoc’h anaout (ID)', 'funding' => 'Your CTA', ], 'your_cta' => 'Your call to action', diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php index 6933da22..93096c32 100644 --- a/modules/Admin/Language/br/Podcast.php +++ b/modules/Admin/Language/br/Podcast.php @@ -13,7 +13,7 @@ return [ 'no_podcast' => 'N\'eo bet kavet podkast ebet!', 'create' => 'Krouiñ ur podkast', 'import' => 'Enporzhiañ ur podkast', - 'all_imports' => 'Podcast imports', + 'all_imports' => 'Ar podkastoù enporzhet', 'new_episode' => 'Rann nevez', 'view' => 'Gwelet ar podkast', 'edit' => 'Kemmañ ar podkast', @@ -22,7 +22,7 @@ return [ 'delete' => 'Dilemel ar podkast', 'see_episodes' => 'Gwelet ar rannoù', 'see_contributors' => 'Gwelet ar berzhidi, ar perzhiadezed', - 'monetization_other' => 'Other monetization', + 'monetization_other' => 'Doare arc\'hantaouiñ all', 'go_to_page' => 'Gwelet ar bajenn', 'latest_episodes' => 'Rannoù diwezhañ', 'see_all_episodes' => 'Gwelet an holl rannoù', @@ -52,7 +52,7 @@ return [ many {# rann} other {# rann} } a zo bet ouzhpennet d\'ar podkast gant berzh!', - 'podcastFeedUpToDate' => 'Hizivaet eo bet ar podkast dija.', + 'podcastFeedUpToDate' => 'Nevesaet eo bet ar podkast dija.', 'publishError' => 'Ar podkast-mañ a zo bet embannet dija pe steuñvet eo e embannadur.', 'publishEditError' => 'N\'eo ket steuñvet embannadur ar podkast-mañ.', 'publishCancelSuccess' => 'Nullet eo bet embannadur ar podkast gant berzh!', @@ -61,7 +61,7 @@ return [ 'form' => [ 'identity_section_title' => 'Titouroù diwar-benn ar podkast', 'identity_section_subtitle' => 'Ar maeziennoù a laka ac\'hanoc\'h da vezañ remerket.', - 'fediverse_section_title' => 'Fediverse identity', + 'fediverse_section_title' => 'Identelezh er Fediverse', 'cover' => 'Golo ar podkast', 'cover_size_hint' => 'Ar golo a rankfe bezañ ur c\'harrez ha 1400px e vent da nebeutañ.', @@ -98,10 +98,12 @@ return [ 'author_section_subtitle' => 'Piv zo o verañ ar podkast?', 'owner_name' => 'Anv ar perc\'henn', 'owner_name_hint' => - 'Evit a sell ouzh ar mererezh. War al lanv RSS publik e vo.', + 'Evit a sell ouzh ar mererezh. War ar wazh RSS publik e vo.', 'owner_email' => 'Chomlec\'h postel ar perc\'henn', 'owner_email_hint' => - 'Implijet e vo gant an darn vrasañ eus ar savennoù evit gwiriañ perc\'hentiezh ar podkast. War al lanv RSS publik e vo.', + 'Implijet e vo gant an darn vrasañ eus ar savennoù evit gwiriañ perc\'hentiezh ar podkast. War ar wazh RSS publik e vo.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Embanner·ez', 'publisher_hint' => 'Ar strollad kiriek eus sevel ar podkast. Alies eo embregerezh pe rouedad ar podkast. A-wechoù e vez anvet ar vaezienn-mañ "Aozer·ez".', @@ -114,8 +116,8 @@ return [ 'monetization_section_subtitle' => 'Dastum arc\'hant a-drugarez d\'ho selaouerien·ezed.', 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'premium_by_default' => 'Ar rannoù a zo evit ar re bremium dre ziouer', + 'premium_by_default_hint' => 'Rannoù ar podkast a vo merket Premium dre ziouer. Gallout a rit lakaat rannoù zo evel publik.', 'op3' => 'Open Podcast Prefix Project (OP3)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', @@ -128,9 +130,9 @@ return [ 'M\'ho peus ezhomm eus balizennoù RSS ha n\'eus ket anezho e Castopod e c\'hellit o lakaat amañ.', 'custom_rss' => 'Balizennoù RSS personelaet evit ar podkast', 'custom_rss_hint' => 'An dra-se a vo ouzhpennet e-barzh ar valizenn ❬channel❭.', - 'new_feed_url' => 'URL nevez al lanv', - 'new_feed_url_hint' => 'Implijit ar vaezienn-mañ pa cheñchit anv domani pe savenn herberc\'hiañ ho podkast. M\'eo enporzhiet ar podkast e vez lakaet enni URL a-vremañ al lanv dre ziouer.', - 'old_feed_url' => 'URL kozh al lanv', + 'new_feed_url' => 'URL nevez ar wazh', + 'new_feed_url_hint' => 'Implijit ar vaezienn-mañ pa cheñchit anv domani pe savenn herberc\'hiañ ho podkast. M\'eo enporzhiet ar podkast e vez lakaet enni URL a-vremañ ar wazh dre ziouer.', + 'old_feed_url' => 'URL kozh ar wazh', 'partnership' => 'Kevelerezh', 'partner_id' => 'ID', 'partner_link_url' => 'Ere URL', @@ -144,7 +146,7 @@ return [ 'complete' => 'Ne vo mui rannoù nevez gant ar podkast', 'lock' => 'Mirout ar podkast ouzh bezañ eilet', 'lock_hint' => - 'Ar pal eo lavaret d\'ar savennoù all hag aotreet int da enporzhiañ al lanv-mañ pe get. "Ya" a dalv eo nac\'het an holl c\'houlennoù enporzhiañ.', + 'Ar pal eo lavaret d\'ar savennoù all hag aotreet int da enporzhiañ ar wazh-mañ pe get. "Ya" a dalv eo nac\'het an holl c\'houlennoù enporzhiañ.', 'submit_create' => 'Krouiñ ar podkast', 'submit_edit' => 'Enrollañ ar podkast', ], @@ -248,13 +250,13 @@ return [ 'golf' => 'Golf', 'hockey' => 'Hockey', 'rugby' => 'Rugbi', - 'running' => 'Running', - 'soccer' => 'Soccer', - 'swimming' => 'Swimming', + 'running' => 'Redek', + 'soccer' => 'Mell-droad', + 'swimming' => 'Neuierezh', 'tennis' => 'Tennis', 'volleyball' => 'Volleyball', - 'wilderness' => 'Wilderness', - 'wrestling' => 'Wrestling', + 'wilderness' => 'Natur', + 'wrestling' => 'Gouren', 'after_shows' => 'After Shows', 'film_history' => 'Film History', 'film_interviews' => 'Film Interviews', @@ -267,17 +269,17 @@ return [ 'post_hint' => "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", 'message_placeholder' => 'Write your message…', - 'submit' => 'Publish', - 'publication_date' => 'Publication date', + 'submit' => 'Embann', + 'publication_date' => 'Deiziad an embann', 'publication_method' => [ - 'now' => 'Now', + 'now' => 'Bremañ', 'schedule' => 'Schedule', ], 'scheduled_publication_date' => 'Scheduled publication date', 'scheduled_publication_date_hint' => 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', + 'cancel_publication' => 'Nullañ an embann', 'message_warning' => 'You did not write a message for your announcement post!', 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', 'message_warning_submit' => 'Publish anyway', @@ -291,15 +293,15 @@ return [ 'disclaimer' => "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", 'understand' => 'I understand, I want the podcast to be permanently deleted', - 'submit' => 'Delete', + 'submit' => 'Dilemel', ], - 'by' => 'By {publisher}', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'by' => 'Gant {publisher}', + 'season' => 'Koulzad {seasonNumber}', + 'list_of_episodes_year' => 'Rannoù {year} ({episodeCount})', 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', + 'Rannoù ar c\'houlzad {seasonNumber} ({episodeCount})', + 'no_episode' => 'N\'eus bet kavet rann ebet !', + 'follow' => 'Heuliañ', 'followers' => '{numberOfFollowers, plural, one {# follower} other {# followers} @@ -309,9 +311,9 @@ return [ other {# posts} }', 'activity' => 'Activity', - 'episodes' => 'Episodes', + 'episodes' => 'Rannoù', 'sponsor' => 'Sponsor', 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', + 'find_on' => 'Kavit {podcastTitle} war', 'listen_on' => 'Selaouit war', ]; diff --git a/modules/Admin/Language/br/PodcastNavigation.php b/modules/Admin/Language/br/PodcastNavigation.php index e21fe4cc..e3a6093a 100644 --- a/modules/Admin/Language/br/PodcastNavigation.php +++ b/modules/Admin/Language/br/PodcastNavigation.php @@ -10,26 +10,26 @@ declare(strict_types=1); return [ 'go_to_page' => 'Mont da pajenn ar podkast', - 'rss_feed' => 'RSS feed', + 'rss_feed' => 'Gwazh RSS', 'dashboard' => 'Taolenn-stur ar podkast', 'podcast-view' => 'Degemer', 'podcast-edit' => 'Kemmañ ar podkast', 'podcast-persons-manage' => 'Merañ an emellerien·ezed', - 'podcast-imports' => 'Podcast imports', - 'podcast-imports-sync' => 'Sync feeds', + 'podcast-imports' => 'Ar podkastoù enporzhet', + 'podcast-imports-sync' => 'Sinkronaat ar gwazhoù', 'episodes' => 'Rannoù', 'episode-list' => 'An holl rannoù', 'episode-create' => 'Rann nevez', 'analytics' => 'Muzulioù heklev', - 'podcast-analytics' => 'Audience overview', - 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics' => 'Gwel a-vras', + 'podcast-analytics-webpages' => 'Gweladennoù ar pajennoù web', 'podcast-analytics-locations' => 'Lec\'hioù', 'podcast-analytics-unique-listeners' => 'Selaouerien·ezed unel', 'podcast-analytics-players' => 'Lennerioù', 'podcast-analytics-listening-time' => 'Padelezh ar selaou', 'podcast-analytics-time-periods' => 'Mareoù ar selaou', - 'monetization' => 'Monetization', - 'subscription-list' => 'All subscriptions', + 'monetization' => 'Moneisaat', + 'subscription-list' => 'An holl goumanantoù', 'subscription-create' => 'Add subscription', 'contributors' => 'Perzhidi, perzhiadezed', 'contributor-list' => 'An holl berzhidi ha perzhiadezed', @@ -37,6 +37,6 @@ return [ 'broadcast' => 'Broadcast', 'platforms-podcasting' => 'Podcasting apps', 'platforms-social' => 'Rouedadoù sokial', - 'platforms-funding' => 'Funding links', - 'podcast-monetization-other' => 'Other', + 'platforms-funding' => 'Liammoù arc\'hantaouiñ', + 'podcast-monetization-other' => 'Un dra all', ]; diff --git a/modules/Admin/Language/br/Settings.php b/modules/Admin/Language/br/Settings.php index 4929034f..3c385919 100644 --- a/modules/Admin/Language/br/Settings.php +++ b/modules/Admin/Language/br/Settings.php @@ -25,11 +25,11 @@ return [ 'images' => [ 'title' => 'Skeudennoù', 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', - 'regenerate' => 'Regenerate images', + 'regenerate' => 'Azgenel ar skeudennoù', 'regenerationSuccess' => 'All images have been regenerated successfully!', ], 'housekeeping' => [ - 'title' => 'Housekeeping', + 'title' => 'Kempenn', 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', 'reset_counts' => 'Reset counts', 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', diff --git a/modules/Admin/Language/ca/Podcast.php b/modules/Admin/Language/ca/Podcast.php index a12efb3c..7dbb632d 100644 --- a/modules/Admin/Language/ca/Podcast.php +++ b/modules/Admin/Language/ca/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Correu electrònic del propietari', 'owner_email_hint' => 'La majoria de plataformes l\'utilitzaran per verificar la propietat del podcast. Visible al fil RSS públic.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Editor', 'publisher_hint' => 'El grup encarregat de crear el programa. Sovint es refereix a l\'empresa matriu o a la xarxa d\'un podcast. Aquest camp de vegades s\'etiqueta com a "Autor".', diff --git a/modules/Admin/Language/da/Podcast.php b/modules/Admin/Language/da/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/da/Podcast.php +++ b/modules/Admin/Language/da/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php index dc66c033..a63cf5bd 100644 --- a/modules/Admin/Language/de/Podcast.php +++ b/modules/Admin/Language/de/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'E-Mail des Eigentümers', 'owner_email_hint' => 'Wird von den meisten Plattformen verwendet werden, um den Podcast-Besitz zu überprüfen. Sichtbar im öffentlichen RSS-Feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Herausgeber', 'publisher_hint' => 'Die Gruppe, die für die Erstellung des Podcasts verantwortlich ist. Oft bezogen auf die Muttergesellschaft oder das Netzwerk eines Podcasts. Dieses Feld wird manchmal als \'Autor\' bezeichnet.', diff --git a/modules/Admin/Language/el/Podcast.php b/modules/Admin/Language/el/Podcast.php index 65fcc8c8..ce149e55 100644 --- a/modules/Admin/Language/el/Podcast.php +++ b/modules/Admin/Language/el/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Email ιδιοκτήτη', 'owner_email_hint' => 'Θα χρησιμοποιηθεί από τις περισσότερες πλατφόρμες για να επαληθεύσει την ιδιοκτησία του podcast. Ορατό στη δημόσια τροφοδοσία RSS.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Εκδότης', 'publisher_hint' => 'Η ομάδα που είναι υπεύθυνη για τη δημιουργία της παράστασης. Συχνά αναφέρεται στη μητρική εταιρεία ή στο δίκτυο ενός podcast. Αυτό το πεδίο μερικές φορές χαρακτηρίζεται ως \'Συγγραφέας\'.', diff --git a/modules/Admin/Language/es/Podcast.php b/modules/Admin/Language/es/Podcast.php index 8e9fe838..d867abd5 100644 --- a/modules/Admin/Language/es/Podcast.php +++ b/modules/Admin/Language/es/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Email del propietario', 'owner_email_hint' => 'Será utilizado por la mayoría de las plataformas para verificar la propiedad del podcast. Visible en el feed RSS público.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publicador', 'publisher_hint' => 'El grupo responsable de la creación del espectáculo. A menudo se refiere a la empresa matriz o red de un podcast. Este campo a veces se etiqueta como \'Autor\'.', diff --git a/modules/Admin/Language/fa/Podcast.php b/modules/Admin/Language/fa/Podcast.php index 5296151c..8660eac5 100644 --- a/modules/Admin/Language/fa/Podcast.php +++ b/modules/Admin/Language/fa/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php index 4d9979a9..ed221e7c 100644 --- a/modules/Admin/Language/fr/Podcast.php +++ b/modules/Admin/Language/fr/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'E-mail du/de la propriétaire', 'owner_email_hint' => 'Utilisé par la plupart des plateformes pour vérifier la propriété du podcast. Visible dans le flux RSS public.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Éditeur / Éditrice', 'publisher_hint' => 'Le groupe responsable de la création du podcast. Fait souvent référence à la société mère ou au réseau d’un podcast. Ce champ est parfois appelé « Auteur ».', diff --git a/modules/Admin/Language/fr2/Podcast.php b/modules/Admin/Language/fr2/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/fr2/Podcast.php +++ b/modules/Admin/Language/fr2/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/fr_CA/Podcast.php b/modules/Admin/Language/fr_CA/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/fr_CA/Podcast.php +++ b/modules/Admin/Language/fr_CA/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/gd/Podcast.php b/modules/Admin/Language/gd/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/gd/Podcast.php +++ b/modules/Admin/Language/gd/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php index a687f275..2b3237ba 100644 --- a/modules/Admin/Language/gl/Podcast.php +++ b/modules/Admin/Language/gl/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Correo da propietaria', 'owner_email_hint' => 'Será utilizado pola maioría das plataformas para verificar a propiedade do podcast. Visible na fonte RSS pública.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Editorial', 'publisher_hint' => 'O grupo responsable da creación do programa. Normalmente refírese á empresa nai ou rede do podcast. O campo a veces etiquétase como \'Autor\'.', diff --git a/modules/Admin/Language/id/Podcast.php b/modules/Admin/Language/id/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/id/Podcast.php +++ b/modules/Admin/Language/id/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/it/Podcast.php b/modules/Admin/Language/it/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/it/Podcast.php +++ b/modules/Admin/Language/it/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/ja/Podcast.php b/modules/Admin/Language/ja/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/ja/Podcast.php +++ b/modules/Admin/Language/ja/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/kk/Podcast.php b/modules/Admin/Language/kk/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/kk/Podcast.php +++ b/modules/Admin/Language/kk/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/ko/Podcast.php b/modules/Admin/Language/ko/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/ko/Podcast.php +++ b/modules/Admin/Language/ko/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/nl/Podcast.php b/modules/Admin/Language/nl/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/nl/Podcast.php +++ b/modules/Admin/Language/nl/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/nn-NO/Podcast.php b/modules/Admin/Language/nn-NO/Podcast.php index e54b193a..42778a7b 100644 --- a/modules/Admin/Language/nn-NO/Podcast.php +++ b/modules/Admin/Language/nn-NO/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Epost til eigaren', 'owner_email_hint' => 'Blir brukt av dei fleste plattformer til å stadfesta eigarskapen til podkasten. Synleg i den offentlege RSS-straumen.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Utgjevar', 'publisher_hint' => 'Gruppa som er ansvarleg for serien. Det er vanlegvis morselskapet eller nettverket til ein podkast. Dette feltet er stundom merka med «forfattar».', diff --git a/modules/Admin/Language/oc/Podcast.php b/modules/Admin/Language/oc/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/oc/Podcast.php +++ b/modules/Admin/Language/oc/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/pl/Podcast.php b/modules/Admin/Language/pl/Podcast.php index 7c9b48dd..c60f9b6e 100644 --- a/modules/Admin/Language/pl/Podcast.php +++ b/modules/Admin/Language/pl/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Email właściciela', 'owner_email_hint' => 'Będzie używany przez większość platform do weryfikacji własności podcastu. Widoczne w publicznym kanale RSS.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Wydawca', 'publisher_hint' => 'Grupa odpowiedzialna za stworzenie programu. Często odnosi się do firmy macierzystej lub sieci podcastów. To pole jest czasami oznaczone jako ’Autor’.', diff --git a/modules/Admin/Language/pt-BR/Podcast.php b/modules/Admin/Language/pt-BR/Podcast.php index c6716eb4..3f6012c3 100644 --- a/modules/Admin/Language/pt-BR/Podcast.php +++ b/modules/Admin/Language/pt-BR/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'E-mail do proprietário', 'owner_email_hint' => 'Será utilizado pela maioria das plataformas para verificar a propriedade do podcast. Visível no feed RSS público.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Editora', 'publisher_hint' => 'O grupo responsável pela criação do podcast. Muitas vezes se refere à empresa-mãe ou rede de um podcast. Este campo é por vezes rotulado como "Autor".', diff --git a/modules/Admin/Language/pt/Podcast.php b/modules/Admin/Language/pt/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/pt/Podcast.php +++ b/modules/Admin/Language/pt/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/ro/Podcast.php b/modules/Admin/Language/ro/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/ro/Podcast.php +++ b/modules/Admin/Language/ro/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/ru/Podcast.php b/modules/Admin/Language/ru/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/ru/Podcast.php +++ b/modules/Admin/Language/ru/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/sk/Episode.php b/modules/Admin/Language/sk/Episode.php index bc0e6ac8..47232c53 100644 --- a/modules/Admin/Language/sk/Episode.php +++ b/modules/Admin/Language/sk/Episode.php @@ -219,10 +219,10 @@ return [ 'publication_status_banner' => [ 'draft_mode' => 'konceptový režim', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {Táto epizóda ešte nieje zverejnená.} + scheduled {Táto epizóda je naplánovaná na zverejnenie {publication_date}.} + with_podcast {Táto epizóda bude zverejnená zarovno s podcastom.} + other {Táto epizóda ešte nieje zverejnená.} }', 'preview' => 'Náhľad', ], diff --git a/modules/Admin/Language/sk/EpisodeNavigation.php b/modules/Admin/Language/sk/EpisodeNavigation.php index 9d213d89..8414aebe 100644 --- a/modules/Admin/Language/sk/EpisodeNavigation.php +++ b/modules/Admin/Language/sk/EpisodeNavigation.php @@ -18,6 +18,6 @@ return [ 'clips' => 'Klipy', 'video-clips-list' => 'Video klipy', 'video-clips-create' => 'Nový video klip', - 'soundbites-list' => 'Soundbites', + 'soundbites-list' => 'Zvukové ukážky', 'soundbites-create' => 'Nová zvučka', ]; diff --git a/modules/Admin/Language/sk/Fediverse.php b/modules/Admin/Language/sk/Fediverse.php index 01b85327..69cf2fb5 100644 --- a/modules/Admin/Language/sk/Fediverse.php +++ b/modules/Admin/Language/sk/Fediverse.php @@ -13,8 +13,8 @@ return [ 'actorNotFound' => 'Účet nieje možné nájsť!', 'blockActorSuccess' => '{actor} bol/i zablokovaný!', 'unblockActorSuccess' => 'Aktér bol odblokovaný!', - 'blockDomainSuccess' => '{domain} has been blocked!', - 'unblockDomainSuccess' => '{domain} has been unblocked!', + 'blockDomainSuccess' => '{domain} bola zablokovaná!', + 'unblockDomainSuccess' => '{domain} bola odblokovaná!', ], 'blocked_actors' => 'Blokované účty', 'blocked_domains' => 'Zablokované domény', diff --git a/modules/Admin/Language/sk/Navigation.php b/modules/Admin/Language/sk/Navigation.php index 2f1976a1..e5b43fd3 100644 --- a/modules/Admin/Language/sk/Navigation.php +++ b/modules/Admin/Language/sk/Navigation.php @@ -17,7 +17,7 @@ return [ 'podcasts' => 'Podcasty', 'podcast-list' => 'Všetky podcasty', 'podcast-create' => 'Nový podcast', - 'all-podcast-imports' => 'All Podcast imports', + 'all-podcast-imports' => 'Všetky nahrané podcasty', 'podcast-imports-add' => 'Importovať podcast', 'persons' => 'Osobnosti', 'person-list' => 'Všetky osobnosti', @@ -34,7 +34,7 @@ return [ 'settings' => 'Nastavenia', 'settings-general' => 'Všeobecné', 'settings-theme' => 'Vzhľad', - 'admin-about' => 'O', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'Môj účet', 'change-password' => 'Zmeniť heslo', diff --git a/modules/Admin/Language/sk/Person.php b/modules/Admin/Language/sk/Person.php index 7e98b939..c205f704 100644 --- a/modules/Admin/Language/sk/Person.php +++ b/modules/Admin/Language/sk/Person.php @@ -24,7 +24,7 @@ return [ 'form' => [ 'avatar' => 'Avatar', 'avatar_size_hint' => - 'Avatar must be squared and at least 400px wide and tall.', + 'Obrázok musí byť štvorcový a minimálne 400px široký a vysoký.', 'full_name' => 'Celé meno', 'full_name_hint' => 'This is the full name or alias of the person.', 'unique_name' => 'Unikátne meno', diff --git a/modules/Admin/Language/sk/Platforms.php b/modules/Admin/Language/sk/Platforms.php index 71829629..cc0bd289 100644 --- a/modules/Admin/Language/sk/Platforms.php +++ b/modules/Admin/Language/sk/Platforms.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'title' => [ - 'podcasting' => 'Podcasting platforms', + 'podcasting' => 'Podcastové platformy', 'social' => 'Sociálne siete', 'funding' => 'Funding links', ], diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php index 4c33631e..e3b52450 100644 --- a/modules/Admin/Language/sk/Podcast.php +++ b/modules/Admin/Language/sk/Podcast.php @@ -56,12 +56,12 @@ return [ 'scheduleDateError' => 'Schedule date must be set!', ], 'form' => [ - 'identity_section_title' => 'Podcast identity', + 'identity_section_title' => 'Identita podcastu', 'identity_section_subtitle' => 'These fields allow you to get noticed.', - 'fediverse_section_title' => 'Fediverse identity', + 'fediverse_section_title' => 'Identita vo Fediverse', 'cover' => 'Obal podcastu', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'cover_size_hint' => 'Obrázok musí byť štvorcový a minimálne 1400px široký a vysoký.', 'banner' => 'Podcast banner', 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', 'banner_delete' => 'Delete podcast banner', @@ -99,13 +99,15 @@ return [ 'owner_email' => 'Email vlastníka', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Vydavateľ', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', - 'copyright' => 'Copyright', + 'copyright' => 'Autorské práva', 'location_section_title' => 'Umiestnenie', - 'location_section_subtitle' => 'What place is this podcast about?', - 'location_name' => 'Location name or address', + 'location_section_subtitle' => 'O akom mieste/oblasti je tento podcast?', + 'location_name' => 'Názov oblasti, alebo adresa', 'location_name_hint' => 'This can be a real place or fictional', 'monetization_section_title' => 'Monetization', 'monetization_section_subtitle' => @@ -164,12 +166,12 @@ return [ 'society_and_culture' => 'Spoločnosť a kultúra', 'sports' => 'Športy', 'technology' => 'Technológia', - 'true_crime' => 'True Crime', + 'true_crime' => 'Skutočné krimi', 'tv_and_film' => 'TV & Film', 'books' => 'Knihy', 'design' => 'Dizajn', 'fashion_and_beauty' => 'Fashion & Beauty', - 'food' => 'Food', + 'food' => 'Jedlo', 'performing_arts' => 'Divadelné umenie', 'visual_arts' => 'Vizuálni umelci', 'careers' => 'Kariéra', @@ -186,7 +188,7 @@ return [ 'language_learning' => 'Učenie jazykov', 'self_improvement' => 'Sebazdokonaľovanie', 'comedy_fiction' => 'Comedy Fiction', - 'drama' => 'Drama', + 'drama' => 'Dráma', 'science_fiction' => 'Vedecko-fantastické', 'alternative_health' => 'Alternative Health', 'fitness' => 'Fitness', @@ -231,17 +233,17 @@ return [ 'natural_sciences' => 'Natural Sciences', 'nature' => 'Príroda', 'physics' => 'Fyzika', - 'social_sciences' => 'Social Sciences', + 'social_sciences' => 'Sociálne vedy', 'documentary' => 'Dokumentárny', 'personal_journals' => 'Personal Journals', 'philosophy' => 'Filozofia', 'places_and_travel' => 'Places & Travel', 'relationships' => 'Vzťahy', - 'baseball' => 'Baseball', + 'baseball' => 'Bejzbal', 'basketball' => 'Basketball', 'cricket' => 'Cricket', 'fantasy_sports' => 'Fantasy Sports', - 'football' => 'Football', + 'football' => 'Futbal', 'golf' => 'Golf', 'hockey' => 'Hockey', 'rugby' => 'Rugby', @@ -260,7 +262,7 @@ return [ ], 'publish_form' => [ 'back_to_podcast_dashboard' => 'Späť na podcastovú nástenku', - 'post' => 'Your announcement post', + 'post' => 'Váš oznamovací príspevok', 'post_hint' => "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", 'message_placeholder' => 'Napíšte vašu správu…', @@ -296,7 +298,7 @@ return [ 'list_of_episodes_season' => 'Season {seasonNumber} episodes ({episodeCount})', 'no_episode' => 'Žiadna epizóda nenájdená!', - 'follow' => 'Follow', + 'follow' => 'Nasledovať', 'followers' => '{numberOfFollowers, plural, one {# follower} other {# followers} diff --git a/modules/Admin/Language/sk/PodcastNavigation.php b/modules/Admin/Language/sk/PodcastNavigation.php index b44491df..44930148 100644 --- a/modules/Admin/Language/sk/PodcastNavigation.php +++ b/modules/Admin/Language/sk/PodcastNavigation.php @@ -9,13 +9,13 @@ declare(strict_types=1); */ return [ - 'go_to_page' => 'Go to podcast page', + 'go_to_page' => 'Ísť na stránku podcastu', 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', - 'podcast-view' => 'Home', - 'podcast-edit' => 'Edit podcast', + 'podcast-view' => 'Úvod', + 'podcast-edit' => 'Upraviť podcast', 'podcast-persons-manage' => 'Manage persons', - 'podcast-imports' => 'Podcast imports', + 'podcast-imports' => 'Nahrané podcasty', 'podcast-imports-sync' => 'Sync feeds', 'episodes' => 'Časti', 'episode-list' => 'Všetky časti', @@ -26,17 +26,17 @@ return [ 'podcast-analytics-locations' => 'Locations', 'podcast-analytics-unique-listeners' => 'Unique listeners', 'podcast-analytics-players' => 'Players', - 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-listening-time' => 'Čas počúvania', 'podcast-analytics-time-periods' => 'Časové úseky', 'monetization' => 'Monetization', - 'subscription-list' => 'All subscriptions', - 'subscription-create' => 'Add subscription', - 'contributors' => 'Contributors', - 'contributor-list' => 'All contributors', - 'contributor-add' => 'Add contributor', + 'subscription-list' => 'Všetky odbery', + 'subscription-create' => 'Pridať odber', + 'contributors' => 'Prispievatelia', + 'contributor-list' => 'Všetci prispievatelia', + 'contributor-add' => 'Pridať prispievateľa', 'broadcast' => 'Broadcast', - 'platforms-podcasting' => 'Podcasting apps', - 'platforms-social' => 'Social networks', + 'platforms-podcasting' => 'Podcastové aplikácie', + 'platforms-social' => 'Sociálne siete', 'platforms-funding' => 'Funding links', 'podcast-monetization-other' => 'Other', ]; diff --git a/modules/Admin/Language/sk/Settings.php b/modules/Admin/Language/sk/Settings.php index 007a681d..63441b6a 100644 --- a/modules/Admin/Language/sk/Settings.php +++ b/modules/Admin/Language/sk/Settings.php @@ -16,14 +16,14 @@ return [ 'site_icon_delete' => 'Odstrániť ikonu stránky', 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', - 'site_name' => 'Site name', - 'site_description' => 'Site description', - 'submit' => 'Save', + 'site_name' => 'Názov stránky', + 'site_description' => 'Popis stránky', + 'submit' => 'Uložiť', 'editSuccess' => 'Instance has been updated successfully!', 'deleteIconSuccess' => 'Site icon has been remove successfully!', ], 'images' => [ - 'title' => 'Images', + 'title' => 'Obrázky', 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', 'regenerate' => 'Regenerate images', 'regenerationSuccess' => 'All images have been regenerated successfully!', @@ -47,7 +47,7 @@ return [ 'accent_section_title' => 'Accent color', 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', 'pine' => 'Pine', - 'crimson' => 'Crimson', + 'crimson' => 'Karmínová', 'amber' => 'Amber', 'lake' => 'Lake', 'jacaranda' => 'Jacaranda', diff --git a/modules/Admin/Language/sr_Latn/Podcast.php b/modules/Admin/Language/sr_Latn/Podcast.php index 33dbf24f..07058f1a 100644 --- a/modules/Admin/Language/sr_Latn/Podcast.php +++ b/modules/Admin/Language/sr_Latn/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Elektronska pošta vlasnika', 'owner_email_hint' => 'Koristiće se na većini platforma kako bi se utvrdilo vlasništvo nad podkastom. Vidljivo javno u RSS feed-u.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Izdavač', 'publisher_hint' => 'Grupa odgovorna za stvaranje ove emisije. Često se misli na vlasničku kompaniju ili mrežu kojoj pripada podkast. Ovo polje se nekada naziva i \'Autor".', diff --git a/modules/Admin/Language/sv/Podcast.php b/modules/Admin/Language/sv/Podcast.php index 9e1818df..5856853f 100644 --- a/modules/Admin/Language/sv/Podcast.php +++ b/modules/Admin/Language/sv/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Ägarens e-post', 'owner_email_hint' => 'Kommer att användas av de flesta plattformar för att verifiera podcast-ägandet. Synlig i det offentliga RSS-flödet.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Utgivare', 'publisher_hint' => 'Gruppen som ansvarar för att skapa showen. Ofta hänvisar man till moderbolaget eller nätverket av en podcast. Detta fält är ibland märkt som "Författare".', diff --git a/modules/Admin/Language/uk/Podcast.php b/modules/Admin/Language/uk/Podcast.php index d9359e9b..3f423f5a 100644 --- a/modules/Admin/Language/uk/Podcast.php +++ b/modules/Admin/Language/uk/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => 'Owner email', 'owner_email_hint' => 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => 'Publisher', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', diff --git a/modules/Admin/Language/zh-Hans/Podcast.php b/modules/Admin/Language/zh-Hans/Podcast.php index b685e54a..7b0964d3 100644 --- a/modules/Admin/Language/zh-Hans/Podcast.php +++ b/modules/Admin/Language/zh-Hans/Podcast.php @@ -99,6 +99,8 @@ return [ 'owner_email' => '所有者邮箱', 'owner_email_hint' => '大多数平台将使用它来验证播客的所有权。 在公开 RSS 摘要中可见。', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', 'publisher' => '发布者', 'publisher_hint' => '负责制作节目的小组。 通常指播客的母公司或网络。 有时会被标记为“作者”。', diff --git a/modules/Auth/Language/br/User.php b/modules/Auth/Language/br/User.php index d2c07933..b6edb318 100644 --- a/modules/Auth/Language/br/User.php +++ b/modules/Auth/Language/br/User.php @@ -48,7 +48,7 @@ return [ 'banSuccess' => '{username} has been banned.', 'unbanSuccess' => '{username} has been unbanned.', 'editOwnerError' => - '{username} is the instance owner, you cannot edit its roles.', + '{username} eo perc\'henn·erez an istañs. Ne c\'hallit ket kemmañ e rolloù…', 'banSuperAdminError' => '{username} is a superadmin, one does not simply ban a superadmin…', 'deleteOwnerError' => diff --git a/modules/PodcastImport/Language/br/PodcastImport.php b/modules/PodcastImport/Language/br/PodcastImport.php index 8bf494d3..127df81c 100644 --- a/modules/PodcastImport/Language/br/PodcastImport.php +++ b/modules/PodcastImport/Language/br/PodcastImport.php @@ -22,7 +22,7 @@ return [ 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', 'new_podcast_section_title' => 'The new podcast', 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', + 'Gwarezet eo ar wazh-mañ. Ne c\'hallit ket enporzhiañ anezhi. Ma\'z oc\'h ar perc\'henn·erez, dibrennit anezhi war ar savenn orin.', 'submit' => 'Add import to queue', 'queue' => [ 'status' => [ @@ -49,7 +49,7 @@ return [ ], ], 'syncForm' => [ - 'title' => 'Synchronize feeds', + 'title' => 'Sinkronekaat ar gwazhoù', 'feed_url' => 'Feed URL', 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', 'submit' => 'Add to queue', diff --git a/modules/PodcastImport/Language/pt-BR/PodcastImport.php b/modules/PodcastImport/Language/pt-BR/PodcastImport.php index 8bf494d3..ae81ff90 100644 --- a/modules/PodcastImport/Language/pt-BR/PodcastImport.php +++ b/modules/PodcastImport/Language/pt-BR/PodcastImport.php @@ -10,57 +10,57 @@ declare(strict_types=1); return [ 'banner' => [ - 'disclaimer' => 'Importing', - 'text' => '{podcastTitle} is currently being imported.', - 'cta' => 'See import status', + 'disclaimer' => 'Importando', + 'text' => '{podcastTitle} está sendo importado no momento.', + 'cta' => 'Ver status de importação', ], - 'old_podcast_section_title' => 'The podcast to import', - 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_section_title' => 'O podcast para importar', + 'old_podcast_legal_disclaimer_title' => 'Aviso legal', 'old_podcast_legal_disclaimer' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', + 'Certifique-se de possuir os direitos para esse podcast antes de importá-lo. Copiar e transmitir um podcast sem os direitos adequados é pirataria e corre-se o risco de processo legal.', + 'imported_feed_url' => 'URL do feed', + 'imported_feed_url_hint' => 'O feed deve estar no formato xml ou rss.', + 'new_podcast_section_title' => 'O novo podcast', 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', - 'submit' => 'Add import to queue', + 'Este feed está protegido. Você não pode importá-lo. Se é o dono, desbloqueie-o na plataforma de origem.', + 'submit' => 'Adicionar importação à fila', 'queue' => [ 'status' => [ 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Import task is awaiting to be processed.', - 'canceled' => 'canceled', - 'canceled_hint' => 'Import task was canceled.', - 'running' => 'running', - 'running_hint' => 'Import task is being processed.', - 'failed' => 'failed', - 'failed_hint' => 'Import task could not complete: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Import task was completed successfully!', + 'queued' => 'na fila', + 'queued_hint' => 'Tarefa de importação está aguardando para ser processada.', + 'canceled' => 'cancelado', + 'canceled_hint' => 'Tarefa de importação foi cancelada.', + 'running' => 'executando', + 'running_hint' => 'Tarefa de importação está sendo processada.', + 'failed' => 'falhou', + 'failed_hint' => 'Tarefa de importação não pôde ser concluída: falha no script.', + 'passed' => 'aprovado', + 'passed_hint' => 'Tarefa de importação foi concluída com sucesso!', ], 'feed' => 'Feed', - 'duration' => 'Import duration', - 'imported_episodes' => 'Imported episodes', - 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'duration' => 'Duração da importação', + 'imported_episodes' => 'Episódios importados', + 'imported_episodes_hint' => '{newlyImportedCount} recém importado, {alreadyImportedCount} já importado.', 'actions' => [ - 'cancel' => 'Cancel', - 'retry' => 'Retry', - 'delete' => 'Delete', + 'cancel' => 'Cancelar', + 'retry' => 'Tente novamente', + 'delete' => 'Excluir', ], ], 'syncForm' => [ - 'title' => 'Synchronize feeds', - 'feed_url' => 'Feed URL', - 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', - 'submit' => 'Add to queue', + 'title' => 'Sincronizar o feed', + 'feed_url' => 'URL do feed', + 'feed_url_hint' => 'A URL do feed que você deseja sincronizar com o podcast atual.', + 'submit' => 'Adicionar à fila', ], 'messages' => [ - 'canceled' => 'Import task has been successfully canceled!', - 'notRunning' => 'Cannot cancel Import Task as it is not running.', - 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', - 'retried' => 'Import task has been queued, it will be retried shortly!', - 'deleted' => 'Import task has been successfully deleted!', - 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + 'canceled' => 'Tarefa de importação foi cancelada com sucesso!', + 'notRunning' => 'Não é possível cancelar a tarefa de importação, pois ela não está em execução.', + 'alreadyRunning' => 'Tarefa de Importação já está em execução. Você pode cancelá-la antes de tentar novamente.', + 'retried' => 'Tarefa de importação foi enfileirada, ela será repetida em breve!', + 'deleted' => 'Tarefa de importação foi cancelada com sucesso!', + 'importTaskQueued' => 'Uma nova tarefa foi colocada na fila, a importação será iniciada em breve!', + 'syncTaskQueued' => 'Uma nova tarefa de importação foi colocada na fila, a sincronização começará em breve!', ], ]; From 9899870e28e7c5b74746d0ee095d4eb331d049fe Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 15 Jan 2024 16:31:11 +0000 Subject: [PATCH 274/477] chore(release): 1.8.0 [skip ci] # [1.8.0](https://code.castopod.org/adaures/castopod/compare/v1.7.4...v1.8.0) (1/15/2024) ### Bug Fixes * **episode-form:** add required validation rules for title and slug ([30a3473](https://code.castopod.org/adaures/castopod/commit/30a34738635bf4f4a4c6b2a7174f7e439f0dfc6e)), closes [#420](https://code.castopod.org/adaures/castopod/issues/420) * **import:** check for empty string when generating podcast guid for feeds not including one ([ac5336f](https://code.castopod.org/adaures/castopod/commit/ac5336fbc5fb8038de541dd06938a8beb2e8d733)) * **install:** add created superadmin to most powerful group in instance, ie. superadmin ([2ed511f](https://code.castopod.org/adaures/castopod/commit/2ed511f8a0005dc06eda5afd6b1d13beee1eb9dd)) * **persons:** delete person avatar when deleting a person ([c1ec98c](https://code.castopod.org/adaures/castopod/commit/c1ec98c95656844712011ff30b84c397b78da311)), closes [#419](https://code.castopod.org/adaures/castopod/issues/419) * **platforms:** add matrix.org as a social platform ([9178c3f](https://code.castopod.org/adaures/castopod/commit/9178c3f3afa16e104d25ae159728e90a3bbd57c3)), closes [#421](https://code.castopod.org/adaures/castopod/issues/421) ### Features * **admin:** add tooltip for not authorized routes ([f7f9baf](https://code.castopod.org/adaures/castopod/commit/f7f9bafc3e56621fab2569d9d76baafe0a2e940d)) * **admin:** emphasize unprivileged items in sidebar with "prohibited" icon ([0bd7dde](https://code.castopod.org/adaures/castopod/commit/0bd7ddea58adf502121b83e5c09317e20912fb4e)) * allow hiding owner's email in public RSS feed ([222e02a](https://code.castopod.org/adaures/castopod/commit/222e02a2af9ecb8b8768a63d3054f4c3ef54e991)) * **persons:** order persons by full_name ASC for easier list scanning ([68a599f](https://code.castopod.org/adaures/castopod/commit/68a599fee08c71763b9336e14b1c0d9e28c4449b)), closes [#418](https://code.castopod.org/adaures/castopod/issues/418) --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 774a3fe5..7f6279c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ +# [1.8.0](https://code.castopod.org/adaures/castopod/compare/v1.7.4...v1.8.0) (1/15/2024) + +### Bug Fixes + +- **episode-form:** add required validation rules for title and slug + ([30a3473](https://code.castopod.org/adaures/castopod/commit/30a34738635bf4f4a4c6b2a7174f7e439f0dfc6e)), + closes [#420](https://code.castopod.org/adaures/castopod/issues/420) +- **import:** check for empty string when generating podcast guid for feeds not + including one + ([ac5336f](https://code.castopod.org/adaures/castopod/commit/ac5336fbc5fb8038de541dd06938a8beb2e8d733)) +- **install:** add created superadmin to most powerful group in instance, ie. + superadmin + ([2ed511f](https://code.castopod.org/adaures/castopod/commit/2ed511f8a0005dc06eda5afd6b1d13beee1eb9dd)) +- **persons:** delete person avatar when deleting a person + ([c1ec98c](https://code.castopod.org/adaures/castopod/commit/c1ec98c95656844712011ff30b84c397b78da311)), + closes [#419](https://code.castopod.org/adaures/castopod/issues/419) +- **platforms:** add matrix.org as a social platform + ([9178c3f](https://code.castopod.org/adaures/castopod/commit/9178c3f3afa16e104d25ae159728e90a3bbd57c3)), + closes [#421](https://code.castopod.org/adaures/castopod/issues/421) + +### Features + +- **admin:** add tooltip for not authorized routes + ([f7f9baf](https://code.castopod.org/adaures/castopod/commit/f7f9bafc3e56621fab2569d9d76baafe0a2e940d)) +- **admin:** emphasize unprivileged items in sidebar with "prohibited" icon + ([0bd7dde](https://code.castopod.org/adaures/castopod/commit/0bd7ddea58adf502121b83e5c09317e20912fb4e)) +- allow hiding owner's email in public RSS feed + ([222e02a](https://code.castopod.org/adaures/castopod/commit/222e02a2af9ecb8b8768a63d3054f4c3ef54e991)) +- **persons:** order persons by full_name ASC for easier list scanning + ([68a599f](https://code.castopod.org/adaures/castopod/commit/68a599fee08c71763b9336e14b1c0d9e28c4449b)), + closes [#418](https://code.castopod.org/adaures/castopod/issues/418) + ## [1.7.4](https://code.castopod.org/adaures/castopod/compare/v1.7.3...v1.7.4) (1/3/2024) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index ebdb4807..6e6077c8 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.7.4'); +defined('CP_VERSION') || define('CP_VERSION', '1.8.0'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index e225dae7..2567094f 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.7.4", + "version": "1.8.0", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 7c5e29b2..1d25a409 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.7.4", + "version": "1.8.0", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 164f4d3be74ec8d371fb40d7fe730f7b2940ca05 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 16 Jan 2024 09:22:07 +0000 Subject: [PATCH 275/477] fix(models): set updatedField as empty string when not used --- app/Models/LikeModel.php | 2 +- modules/Admin/Controllers/EpisodeController.php | 1 - modules/Fediverse/Models/ActivityModel.php | 2 +- modules/Fediverse/Models/BlockedDomainModel.php | 2 +- modules/Fediverse/Models/FavouriteModel.php | 2 +- modules/Fediverse/Models/FollowModel.php | 2 +- modules/Fediverse/Models/PostModel.php | 2 +- 7 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/Models/LikeModel.php b/app/Models/LikeModel.php index b7929684..65a18b06 100644 --- a/app/Models/LikeModel.php +++ b/app/Models/LikeModel.php @@ -45,7 +45,7 @@ class LikeModel extends UuidModel */ protected $useTimestamps = true; - protected $updatedField; + protected $updatedField = ''; public function addLike(Actor $actor, EpisodeComment $comment, bool $registerActivity = true): void { diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index 33cdc865..fe48391c 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -244,7 +244,6 @@ class EpisodeController extends BaseController $episodeModel = new EpisodeModel(); if (! ($newEpisodeId = $episodeModel->insert($newEpisode, true))) { - dd($episodeModel->errors()); $db->transRollback(); return redirect() ->back() diff --git a/modules/Fediverse/Models/ActivityModel.php b/modules/Fediverse/Models/ActivityModel.php index efc4028b..ada9b40d 100644 --- a/modules/Fediverse/Models/ActivityModel.php +++ b/modules/Fediverse/Models/ActivityModel.php @@ -73,7 +73,7 @@ class ActivityModel extends UuidModel */ protected $useTimestamps = true; - protected $updatedField; + protected $updatedField = ''; public function getActivityById(string $activityId): ?Activity { diff --git a/modules/Fediverse/Models/BlockedDomainModel.php b/modules/Fediverse/Models/BlockedDomainModel.php index 16fbd6a6..e2052243 100644 --- a/modules/Fediverse/Models/BlockedDomainModel.php +++ b/modules/Fediverse/Models/BlockedDomainModel.php @@ -48,7 +48,7 @@ class BlockedDomainModel extends Model */ protected $useTimestamps = true; - protected $updatedField; + protected $updatedField = ''; /** * Retrieves instance or podcast domain blocks depending on whether or not $podcastId param is set. diff --git a/modules/Fediverse/Models/FavouriteModel.php b/modules/Fediverse/Models/FavouriteModel.php index ed5af480..bdb20fd8 100644 --- a/modules/Fediverse/Models/FavouriteModel.php +++ b/modules/Fediverse/Models/FavouriteModel.php @@ -45,7 +45,7 @@ class FavouriteModel extends UuidModel */ protected $useTimestamps = true; - protected $updatedField; + protected $updatedField = ''; public function addFavourite(Actor $actor, Post $post, bool $registerActivity = true): void { diff --git a/modules/Fediverse/Models/FollowModel.php b/modules/Fediverse/Models/FollowModel.php index e866ba69..15595d29 100644 --- a/modules/Fediverse/Models/FollowModel.php +++ b/modules/Fediverse/Models/FollowModel.php @@ -41,7 +41,7 @@ class FollowModel extends Model */ protected $useTimestamps = true; - protected $updatedField; + protected $updatedField = ''; /** * @param Actor $actor Actor that is following diff --git a/modules/Fediverse/Models/PostModel.php b/modules/Fediverse/Models/PostModel.php index b2eedd6d..08ab85d0 100644 --- a/modules/Fediverse/Models/PostModel.php +++ b/modules/Fediverse/Models/PostModel.php @@ -74,7 +74,7 @@ class PostModel extends UuidModel */ protected $useTimestamps = true; - protected $updatedField; + protected $updatedField = ''; /** * @var array From 28a31ca03b3cae78a43cc77261f45eea29e0a3bd Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 16 Jan 2024 10:07:25 +0000 Subject: [PATCH 276/477] chore(release): 1.8.1 [skip ci] ## [1.8.1](https://code.castopod.org/adaures/castopod/compare/v1.8.0...v1.8.1) (1/16/2024) ### Bug Fixes * **models:** set updatedField as empty string when not used ([164f4d3](https://code.castopod.org/adaures/castopod/commit/164f4d3be74ec8d371fb40d7fe730f7b2940ca05)) --- CHANGELOG.md | 7 +++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f6279c9..c839551d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.8.1](https://code.castopod.org/adaures/castopod/compare/v1.8.0...v1.8.1) (1/16/2024) + +### Bug Fixes + +- **models:** set updatedField as empty string when not used + ([164f4d3](https://code.castopod.org/adaures/castopod/commit/164f4d3be74ec8d371fb40d7fe730f7b2940ca05)) + # [1.8.0](https://code.castopod.org/adaures/castopod/compare/v1.7.4...v1.8.0) (1/15/2024) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 6e6077c8..032703b5 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.8.0'); +defined('CP_VERSION') || define('CP_VERSION', '1.8.1'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 2567094f..7233d8f6 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.8.0", + "version": "1.8.1", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 1d25a409..0ccc3d41 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.8.0", + "version": "1.8.1", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 6cbfec0d7d9bf85c8014d379026648857ea13373 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 17 Jan 2024 09:15:28 +0000 Subject: [PATCH 277/477] fix(transcript): add condition when concatenating sub text to prevent second line duplication --- modules/Media/TranscriptParser.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/Media/TranscriptParser.php b/modules/Media/TranscriptParser.php index 45e097e0..a8b61e4a 100644 --- a/modules/Media/TranscriptParser.php +++ b/modules/Media/TranscriptParser.php @@ -78,13 +78,10 @@ class TranscriptParser $sub->text = trim($subText); $subText = ''; $state = SRT_STATE_SUBNUMBER; - $subs[] = $sub; + } elseif ($subText !== '') { + $subText .= PHP_EOL . $line; } else { - if ($subText !== '') { - $subText .= PHP_EOL . $line; - } - $subText .= $line; } From 95d086165976cc3e849ba5b0bece47495448f6bf Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 17 Jan 2024 09:33:49 +0000 Subject: [PATCH 278/477] chore(video-clips): reduce the number of videoClipWorkers to 1 by default --- modules/Admin/Config/Admin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/Admin/Config/Admin.php b/modules/Admin/Config/Admin.php index 4c289d9c..56741428 100644 --- a/modules/Admin/Config/Admin.php +++ b/modules/Admin/Config/Admin.php @@ -20,5 +20,5 @@ class Admin extends BaseConfig * Number of maximum ffmpeg processes to spawn in parallel when generating video clips. Processes are instance wide, * meaning that they are shared across all podcasts and episodes. */ - public int $videoClipWorkers = 2; + public int $videoClipWorkers = 1; } From f303171fc59dd31200ba36da8d73415fd50f7098 Mon Sep 17 00:00:00 2001 From: crowdin Date: Wed, 17 Jan 2024 10:05:59 +0000 Subject: [PATCH 279/477] chore(i18n): new Crowdin updates --- modules/Install/Language/da/Install.php | 40 ++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/modules/Install/Language/da/Install.php b/modules/Install/Language/da/Install.php index 45d26085..16bbbd54 100644 --- a/modules/Install/Language/da/Install.php +++ b/modules/Install/Language/da/Install.php @@ -9,16 +9,16 @@ declare(strict_types=1); */ return [ - 'title' => 'Castopod installer', - 'manual_config' => 'Manual configuration', + 'title' => 'Castopod installationsprogram', + 'manual_config' => 'Manuel konfiguration', 'manual_config_subtitle' => - 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'Opret en `.env` fil med dine indstillinger og opdater siden for at fortsætte installationen.', 'form' => [ - 'instance_config' => 'Instance configuration', + 'instance_config' => 'Instanskonfiguration', 'hostname' => 'Hostname', - 'media_base_url' => 'Media base URL', + 'media_base_url' => 'Medie base URL', 'media_base_url_hint' => - 'If you use a CDN and/or an external analytics service, you may set them here.', + 'Hvis du bruger en CDN og/eller en ekstern analysetjeneste, kan du indstille dem her.', 'admin_gateway' => 'Admin gateway', 'admin_gateway_hint' => 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', @@ -27,12 +27,12 @@ return [ 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', 'database_config' => 'Database configuration', 'database_config_hint' => - 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', + 'Castopod skal oprette forbindelse til din MySQL (eller MariaDB) database. Hvis du ikke har disse nødvendige oplysninger, bedes du kontakte din serveradministrator.', + 'db_hostname' => 'Database host navn', + 'db_name' => 'Databasenavn', + 'db_username' => 'Database brugernavn', + 'db_password' => 'Database adgangskode', + 'db_prefix' => 'Database præfiks', 'db_prefix_hint' => "The prefix of the Castopod table names, leave as is if you don't know what it means.", 'cache_config' => 'Cache configuration', @@ -44,19 +44,19 @@ return [ 'redis' => 'Redis', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', - 'create_superadmin' => 'Create your Super Admin account', + 'next' => 'Næste', + 'submit' => 'Afslut installation', + 'create_superadmin' => 'Opret din Super Admin konto', 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', + 'username' => 'Brugernavn', + 'password' => 'Adgangskode', ], 'messages' => [ 'createSuperAdminSuccess' => - 'Your superadmin account has been created successfully. Login to start podcasting!', + 'Din superadmin konto er blevet oprettet. Log ind for at starte podcasting!', 'databaseConnectError' => - 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'Castopod kunne ikke oprette forbindelse til din database. Rediger din database konfiguration og prøv igen.', 'writeError' => - "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + "Kunne ikke oprette/skrive `.env` filen. Du skal oprette den manuelt ved at følge `.env.example` filskabelon i Castopod-pakken.", ], ]; From a12327da8e56f4ee08b1e6ab4f884f5c505d3fa7 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 17 Jan 2024 10:16:14 +0000 Subject: [PATCH 280/477] chore(release): 1.8.2 [skip ci] ## [1.8.2](https://code.castopod.org/adaures/castopod/compare/v1.8.1...v1.8.2) (1/17/2024) ### Bug Fixes * **transcript:** add condition when concatenating sub text to prevent second line duplication ([6cbfec0](https://code.castopod.org/adaures/castopod/commit/6cbfec0d7d9bf85c8014d379026648857ea13373)) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c839551d..87f1274f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.8.2](https://code.castopod.org/adaures/castopod/compare/v1.8.1...v1.8.2) (1/17/2024) + +### Bug Fixes + +- **transcript:** add condition when concatenating sub text to prevent second + line duplication + ([6cbfec0](https://code.castopod.org/adaures/castopod/commit/6cbfec0d7d9bf85c8014d379026648857ea13373)) + ## [1.8.1](https://code.castopod.org/adaures/castopod/compare/v1.8.0...v1.8.1) (1/16/2024) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 032703b5..58001e92 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.8.1'); +defined('CP_VERSION') || define('CP_VERSION', '1.8.2'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 7233d8f6..e7dd8ac2 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.8.1", + "version": "1.8.2", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 0ccc3d41..3b12cfd1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.8.1", + "version": "1.8.2", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 5f3752b4430f6f2d5f9e5f6a7a003bc4d2f9d487 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Tue, 23 Jan 2024 13:19:53 +0000 Subject: [PATCH 281/477] feat(admin): add podcast's OP3 analytics dashboard link --- app/Entities/Podcast.php | 12 +++++ modules/Admin/Language/en/Podcast.php | 1 + themes/cp_admin/podcast/_sidebar.php | 67 ++++++++++++++++----------- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index 649d1f1b..ce4226aa 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -78,6 +78,8 @@ use RuntimeException; * @property string|null $location_osm * @property string|null $payment_pointer * @property array|null $custom_rss + * @property bool $is_op3_enabled + * @property string $op3_url * @property string $custom_rss_string * @property bool $is_published_on_hubs * @property string|null $partner_id @@ -688,4 +690,14 @@ class Podcast extends Entity // podcast is premium if at least one of its episodes is set as premium return (new EpisodeModel())->doesPodcastHavePremiumEpisodes($this->id); } + + public function getIsOp3Enabled(): bool + { + return service('settings')->get('Analytics.enableOP3', 'podcast:' . $this->id); + } + + public function getOp3Url(): string + { + return 'https://op3.dev/show/' . $this->guid; + } } diff --git a/modules/Admin/Language/en/Podcast.php b/modules/Admin/Language/en/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/en/Podcast.php +++ b/modules/Admin/Language/en/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/themes/cp_admin/podcast/_sidebar.php b/themes/cp_admin/podcast/_sidebar.php index 9551fe9f..e9549707 100644 --- a/themes/cp_admin/podcast/_sidebar.php +++ b/themes/cp_admin/podcast/_sidebar.php @@ -85,35 +85,46 @@ $podcastNavigation = [ ?> -
    - is_premium): ?> - - - <?= esc($podcast->title) ?> -
    - title) ?> - @handle) ?> - - - - - +
    +
    + is_premium): ?> + + + <?= esc($podcast->title) ?> +
    +
    +
    + title) ?> + @handle) ?> + + +
    +
    + + + + is_op3_enabled): ?> + + + + +
    $podcastNavigation, - 'langKey' => 'PodcastNavigation', - 'podcastId' => $podcast->id, - ]) ?> + 'navigation' => $podcastNavigation, + 'langKey' => 'PodcastNavigation', + 'podcastId' => $podcast->id, + ]) ?> From 3cb5ffd25b9604a83cd12935e641dab7c88fba47 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 24 Jan 2024 16:48:23 +0000 Subject: [PATCH 282/477] fix(i18n): escape language strings in form fields to prevent them from disappearing fixes #412 --- themes/cp_admin/contributor/create.php | 4 +- themes/cp_admin/contributor/edit.php | 2 +- themes/cp_admin/episode/create.php | 42 ++++++------- themes/cp_admin/episode/edit.php | 42 ++++++------- themes/cp_admin/episode/persons.php | 8 +-- themes/cp_admin/episode/publish.php | 4 +- themes/cp_admin/episode/publish_date_edit.php | 4 +- themes/cp_admin/episode/publish_edit.php | 4 +- themes/cp_admin/episode/soundbites_new.php | 2 +- themes/cp_admin/episode/video_clips_new.php | 8 +-- themes/cp_admin/fediverse/blocked_actors.php | 6 +- themes/cp_admin/fediverse/blocked_domains.php | 5 +- themes/cp_admin/import/add_to_queue.php | 10 ++-- themes/cp_admin/import/podcast_sync.php | 4 +- .../cp_admin/my_account/change_password.php | 4 +- themes/cp_admin/page/create.php | 4 +- themes/cp_admin/page/edit.php | 4 +- themes/cp_admin/person/create.php | 16 ++--- themes/cp_admin/person/edit.php | 16 ++--- themes/cp_admin/podcast/create.php | 56 ++++++++--------- themes/cp_admin/podcast/edit.php | 60 +++++++++---------- .../cp_admin/podcast/monetization_other.php | 10 ++-- themes/cp_admin/podcast/persons.php | 8 +-- themes/cp_admin/podcast/platforms.php | 4 +- themes/cp_admin/podcast/publish.php | 4 +- themes/cp_admin/podcast/publish_edit.php | 4 +- themes/cp_admin/settings/general.php | 16 ++--- themes/cp_admin/subscription/create.php | 6 +- themes/cp_admin/subscription/edit.php | 4 +- themes/cp_admin/subscription/list.php | 4 +- themes/cp_admin/subscription/suspend.php | 2 +- themes/cp_admin/user/create.php | 6 +- themes/cp_admin/user/edit.php | 2 +- themes/cp_app/podcast/follow.php | 4 +- themes/cp_app/podcast/unlock.php | 2 +- themes/cp_app/post/remote_action.php | 4 +- themes/cp_auth/email_2fa_show.php | 4 +- themes/cp_auth/email_2fa_verify.php | 4 +- themes/cp_auth/email_activate_show.php | 2 +- themes/cp_auth/login.php | 4 +- themes/cp_auth/magic_link_form.php | 2 +- themes/cp_auth/magic_link_set_password.php | 2 +- themes/cp_auth/register.php | 8 +-- themes/cp_install/cache_config.php | 2 +- themes/cp_install/create_superadmin.php | 6 +- themes/cp_install/database_config.php | 12 ++-- themes/cp_install/instance_config.php | 14 ++--- 47 files changed, 226 insertions(+), 219 deletions(-) diff --git a/themes/cp_admin/contributor/create.php b/themes/cp_admin/contributor/create.php index 91b3a94a..f1af932c 100644 --- a/themes/cp_admin/contributor/create.php +++ b/themes/cp_admin/contributor/create.php @@ -17,7 +17,7 @@ @@ -25,7 +25,7 @@ @@ -55,14 +55,14 @@
    @@ -119,15 +119,15 @@ @@ -144,8 +144,8 @@ > + label="" + hint="" /> - + diff --git a/themes/cp_admin/episode/edit.php b/themes/cp_admin/episode/edit.php index 43042c89..e506617d 100644 --- a/themes/cp_admin/episode/edit.php +++ b/themes/cp_admin/episode/edit.php @@ -23,9 +23,9 @@ @@ -59,14 +59,14 @@ @@ -120,7 +120,7 @@ @@ -128,8 +128,8 @@ @@ -146,8 +146,8 @@ > @@ -269,12 +269,12 @@ - + diff --git a/themes/cp_admin/episode/persons.php b/themes/cp_admin/episode/persons.php index 16bfcde0..4f346d30 100644 --- a/themes/cp_admin/episode/persons.php +++ b/themes/cp_admin/episode/persons.php @@ -26,8 +26,8 @@ as="MultiSelect" id="persons" name="persons[]" - label="" - hint="" + label="" + hint="" options="" selected="" required="true" @@ -37,8 +37,8 @@ as="MultiSelect" id="roles" name="roles[]" - label="" - hint="" + label="" + hint="" options="" selected="" /> diff --git a/themes/cp_admin/episode/publish.php b/themes/cp_admin/episode/publish.php index 264e73bd..65f68dde 100644 --- a/themes/cp_admin/episode/publish.php +++ b/themes/cp_admin/episode/publish.php @@ -84,8 +84,8 @@
    diff --git a/themes/cp_admin/episode/publish_date_edit.php b/themes/cp_admin/episode/publish_date_edit.php index 7346e659..dc465d9d 100644 --- a/themes/cp_admin/episode/publish_date_edit.php +++ b/themes/cp_admin/episode/publish_date_edit.php @@ -25,8 +25,8 @@ diff --git a/themes/cp_admin/episode/publish_edit.php b/themes/cp_admin/episode/publish_edit.php index 797a131d..6b3ac1e9 100644 --- a/themes/cp_admin/episode/publish_edit.php +++ b/themes/cp_admin/episode/publish_edit.php @@ -88,8 +88,8 @@
    diff --git a/themes/cp_admin/episode/soundbites_new.php b/themes/cp_admin/episode/soundbites_new.php index 4cae03d3..23a99061 100644 --- a/themes/cp_admin/episode/soundbites_new.php +++ b/themes/cp_admin/episode/soundbites_new.php @@ -16,7 +16,7 @@ diff --git a/themes/cp_admin/episode/video_clips_new.php b/themes/cp_admin/episode/video_clips_new.php index e7cef5c1..f6915693 100644 --- a/themes/cp_admin/episode/video_clips_new.php +++ b/themes/cp_admin/episode/video_clips_new.php @@ -36,7 +36,7 @@ use Modules\MediaClipper\Config\MediaClipper;
    @@ -46,17 +46,17 @@ use Modules\MediaClipper\Config\MediaClipper; name="format" isChecked="true" required="true" - hint=""> + hint=""> + hint=""> + hint="">
    diff --git a/themes/cp_admin/fediverse/blocked_actors.php b/themes/cp_admin/fediverse/blocked_actors.php index 81b178aa..683ba5c7 100644 --- a/themes/cp_admin/fediverse/blocked_actors.php +++ b/themes/cp_admin/fediverse/blocked_actors.php @@ -14,7 +14,11 @@ - + diff --git a/themes/cp_admin/fediverse/blocked_domains.php b/themes/cp_admin/fediverse/blocked_domains.php index 02d174dc..ec26fda7 100644 --- a/themes/cp_admin/fediverse/blocked_domains.php +++ b/themes/cp_admin/fediverse/blocked_domains.php @@ -14,7 +14,10 @@
    - + diff --git a/themes/cp_admin/import/add_to_queue.php b/themes/cp_admin/import/add_to_queue.php index 377b2062..f746a616 100644 --- a/themes/cp_admin/import/add_to_queue.php +++ b/themes/cp_admin/import/add_to_queue.php @@ -18,8 +18,8 @@ @@ -30,7 +30,7 @@ title="" >
    - +
    @@ -40,7 +40,7 @@ @@ -48,7 +48,7 @@ diff --git a/themes/cp_admin/import/podcast_sync.php b/themes/cp_admin/import/podcast_sync.php index 21470707..d71ad77d 100644 --- a/themes/cp_admin/import/podcast_sync.php +++ b/themes/cp_admin/import/podcast_sync.php @@ -13,8 +13,8 @@ diff --git a/themes/cp_admin/my_account/change_password.php b/themes/cp_admin/my_account/change_password.php index cbafc732..f0731a9e 100644 --- a/themes/cp_admin/my_account/change_password.php +++ b/themes/cp_admin/my_account/change_password.php @@ -15,12 +15,12 @@ diff --git a/themes/cp_admin/page/create.php b/themes/cp_admin/page/create.php index 125196c5..f1e32d23 100644 --- a/themes/cp_admin/page/create.php +++ b/themes/cp_admin/page/create.php @@ -16,7 +16,7 @@ @@ -32,7 +32,7 @@ diff --git a/themes/cp_admin/page/edit.php b/themes/cp_admin/page/edit.php index 8047a1d0..95c5941e 100644 --- a/themes/cp_admin/page/edit.php +++ b/themes/cp_admin/page/edit.php @@ -16,7 +16,7 @@ diff --git a/themes/cp_admin/person/create.php b/themes/cp_admin/person/create.php index 09f15dc6..7316d100 100644 --- a/themes/cp_admin/person/create.php +++ b/themes/cp_admin/person/create.php @@ -16,28 +16,28 @@ + label="" + hint="" /> diff --git a/themes/cp_admin/person/edit.php b/themes/cp_admin/person/edit.php index b31504ed..1d6ff3b0 100644 --- a/themes/cp_admin/person/edit.php +++ b/themes/cp_admin/person/edit.php @@ -16,31 +16,31 @@ diff --git a/themes/cp_admin/podcast/create.php b/themes/cp_admin/podcast/create.php index c2a9ac65..54ab5287 100644 --- a/themes/cp_admin/podcast/create.php +++ b/themes/cp_admin/podcast/create.php @@ -23,21 +23,21 @@ @@ -47,12 +47,12 @@
    @@ -65,7 +65,7 @@ @@ -73,14 +73,14 @@ @@ -110,28 +110,28 @@ - + + label="" + hint="" /> + label="" />
    @@ -139,7 +139,7 @@ title="" >
    - +
    @@ -148,14 +148,14 @@ - + @@ -164,7 +164,7 @@ subtitle=""> op3.dev - + + label="" + hint="" /> @@ -184,13 +184,13 @@ + label="" + hint="" /> - + - + diff --git a/themes/cp_admin/podcast/edit.php b/themes/cp_admin/podcast/edit.php index f8ce356b..0e2d9493 100644 --- a/themes/cp_admin/podcast/edit.php +++ b/themes/cp_admin/podcast/edit.php @@ -44,21 +44,21 @@ @@ -69,12 +69,12 @@
    @@ -87,7 +87,7 @@ @@ -95,7 +95,7 @@ @@ -103,7 +103,7 @@ @@ -134,31 +134,31 @@ - + + hint="" /> @@ -167,7 +167,7 @@ title="" >
    - +
    @@ -176,15 +176,15 @@ - + @@ -194,7 +194,7 @@ op3.dev + ->get('Analytics.enableOP3', 'podcast:' . $podcast->id) ? 'true' : 'false' ?>" hint=""> + hint="" /> @@ -216,22 +216,22 @@ - + - + diff --git a/themes/cp_admin/podcast/monetization_other.php b/themes/cp_admin/podcast/monetization_other.php index a59bceca..68704a13 100644 --- a/themes/cp_admin/podcast/monetization_other.php +++ b/themes/cp_admin/podcast/monetization_other.php @@ -18,24 +18,24 @@ + hint="" />
    - +
    - +
    - +
    diff --git a/themes/cp_admin/podcast/persons.php b/themes/cp_admin/podcast/persons.php index 6d66001d..66fde64a 100644 --- a/themes/cp_admin/podcast/persons.php +++ b/themes/cp_admin/podcast/persons.php @@ -26,8 +26,8 @@ as="MultiSelect" id="persons" name="persons[]" - label="" - hint="" + label="" + hint="" options="" selected="" required="true" /> @@ -36,8 +36,8 @@ as="MultiSelect" id="roles" name="roles[]" - label="" - hint="" + label="" + hint="" options="" selected="" /> diff --git a/themes/cp_admin/podcast/platforms.php b/themes/cp_admin/podcast/platforms.php index 9de8d804..0e3eaee6 100644 --- a/themes/cp_admin/podcast/platforms.php +++ b/themes/cp_admin/podcast/platforms.php @@ -71,7 +71,7 @@
    type}") ?>" + label="type}")) ?>" class="w-full mt-2" id="slug) . '_account_id' ?>" name="slug) . '][account_id]' ?>" diff --git a/themes/cp_admin/podcast/publish.php b/themes/cp_admin/podcast/publish.php index a2427275..06addaf3 100644 --- a/themes/cp_admin/podcast/publish.php +++ b/themes/cp_admin/podcast/publish.php @@ -60,8 +60,8 @@
    diff --git a/themes/cp_admin/podcast/publish_edit.php b/themes/cp_admin/podcast/publish_edit.php index 1cca91b9..53919983 100644 --- a/themes/cp_admin/podcast/publish_edit.php +++ b/themes/cp_admin/podcast/publish_edit.php @@ -61,8 +61,8 @@
    diff --git a/themes/cp_admin/settings/general.php b/themes/cp_admin/settings/general.php index a7540a95..ee05954e 100644 --- a/themes/cp_admin/settings/general.php +++ b/themes/cp_admin/settings/general.php @@ -25,7 +25,7 @@ use Config\App; @@ -33,7 +33,7 @@ use Config\App; @@ -83,9 +83,9 @@ use Config\App; title="" subtitle="" > - - - + + + diff --git a/themes/cp_admin/subscription/create.php b/themes/cp_admin/subscription/create.php index 19fbd198..0cdff137 100644 --- a/themes/cp_admin/subscription/create.php +++ b/themes/cp_admin/subscription/create.php @@ -18,14 +18,14 @@ diff --git a/themes/cp_admin/subscription/edit.php b/themes/cp_admin/subscription/edit.php index 761ebc2c..11fa30fc 100644 --- a/themes/cp_admin/subscription/edit.php +++ b/themes/cp_admin/subscription/edit.php @@ -27,8 +27,8 @@ diff --git a/themes/cp_admin/subscription/list.php b/themes/cp_admin/subscription/list.php index fdd50a5d..794ad6e5 100644 --- a/themes/cp_admin/subscription/list.php +++ b/themes/cp_admin/subscription/list.php @@ -21,8 +21,8 @@ class="w-full" type="url" name="subscription_link" - label="" - hint="" + label="" + hint="" placeholder="https://…" value="get('Subscription.link', 'podcast:' . $podcast->id) ?>" /> diff --git a/themes/cp_admin/subscription/suspend.php b/themes/cp_admin/subscription/suspend.php index 046ad2af..2861c8b2 100644 --- a/themes/cp_admin/subscription/suspend.php +++ b/themes/cp_admin/subscription/suspend.php @@ -20,7 +20,7 @@ diff --git a/themes/cp_admin/user/edit.php b/themes/cp_admin/user/edit.php index de91027d..61b0c486 100644 --- a/themes/cp_admin/user/edit.php +++ b/themes/cp_admin/user/edit.php @@ -21,7 +21,7 @@ diff --git a/themes/cp_app/podcast/follow.php b/themes/cp_app/podcast/follow.php index ba904824..f67ae71e 100644 --- a/themes/cp_app/podcast/follow.php +++ b/themes/cp_app/podcast/follow.php @@ -56,8 +56,8 @@ diff --git a/themes/cp_app/podcast/unlock.php b/themes/cp_app/podcast/unlock.php index 9a5ec691..5c31c62e 100644 --- a/themes/cp_app/podcast/unlock.php +++ b/themes/cp_app/podcast/unlock.php @@ -50,7 +50,7 @@ class="self-stretch mt-4 text-left" name="token" type="password" - label="" + label="" hint=" esc($podcast->title), ]) ?>" diff --git a/themes/cp_app/post/remote_action.php b/themes/cp_app/post/remote_action.php index adb70991..af0ed7d2 100644 --- a/themes/cp_app/post/remote_action.php +++ b/themes/cp_app/post/remote_action.php @@ -48,8 +48,8 @@ diff --git a/themes/cp_auth/email_2fa_show.php b/themes/cp_auth/email_2fa_show.php index 706c47ec..5bbd581c 100644 --- a/themes/cp_auth/email_2fa_show.php +++ b/themes/cp_auth/email_2fa_show.php @@ -16,8 +16,8 @@ use Modules\Auth\Config\Auth; diff --git a/themes/cp_install/database_config.php b/themes/cp_install/database_config.php index 6fa5c2e2..9a526f24 100644 --- a/themes/cp_install/database_config.php +++ b/themes/cp_install/database_config.php @@ -25,27 +25,27 @@ use Config\Database; diff --git a/themes/cp_install/instance_config.php b/themes/cp_install/instance_config.php index f51a2859..e1f0a228 100644 --- a/themes/cp_install/instance_config.php +++ b/themes/cp_install/instance_config.php @@ -20,26 +20,26 @@ use Modules\Install\Config\Install; + label="" + hint="" /> From 2accb0f7652330b29c3adb85a2e1b0d5d83f1389 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 24 Jan 2024 17:33:58 +0000 Subject: [PATCH 283/477] fix(premium-subs): clear subscription list cache after insert fixes #430 --- modules/PremiumPodcasts/Models/SubscriptionModel.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/PremiumPodcasts/Models/SubscriptionModel.php b/modules/PremiumPodcasts/Models/SubscriptionModel.php index 8eac328e..c0953013 100644 --- a/modules/PremiumPodcasts/Models/SubscriptionModel.php +++ b/modules/PremiumPodcasts/Models/SubscriptionModel.php @@ -54,6 +54,11 @@ class SubscriptionModel extends Model */ protected $useTimestamps = true; + /** + * @var string[] + */ + protected $afterInsert = ['clearCache']; + /** * @var string[] */ From 67c037c9eb1e15c6945eaf74ec0ff30b33f4b704 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 25 Jan 2024 11:58:39 +0000 Subject: [PATCH 284/477] fix(podcast-about): update stats query to discard scheduled episodes from episodes number --- app/Models/EpisodeModel.php | 22 ++++++++++------------ app/Models/PodcastModel.php | 6 ++---- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php index 4af946e5..b5ef60d2 100644 --- a/app/Models/EpisodeModel.php +++ b/app/Models/EpisodeModel.php @@ -324,10 +324,8 @@ class EpisodeModel extends UuidModel { $result = $this->builder() ->selectMax('season_number', 'current_season_number') - ->where([ - 'podcast_id' => $podcastId, - 'published_at IS NOT' => null, - ]) + ->where('podcast_id', $podcastId) + ->where('`published_at` <= UTC_TIMESTAMP()', null, false) ->get() ->getResultArray(); @@ -339,10 +337,11 @@ class EpisodeModel extends UuidModel $result = $this->builder() ->selectMax('number', 'next_episode_number') ->where([ - 'podcast_id' => $podcastId, - 'season_number' => $seasonNumber, - 'published_at IS NOT' => null, - ])->get() + 'podcast_id' => $podcastId, + 'season_number' => $seasonNumber, + ]) + ->where('`published_at` <= UTC_TIMESTAMP()', null, false) + ->get() ->getResultArray(); return (int) $result[0]['next_episode_number'] + 1; @@ -357,10 +356,9 @@ class EpisodeModel extends UuidModel ->select( 'COUNT(DISTINCT season_number) as number_of_seasons, COUNT(*) as number_of_episodes, MIN(published_at) as first_published_at' ) - ->where([ - 'podcast_id' => $podcastId, - 'published_at IS NOT' => null, - ])->get() + ->where('podcast_id', $podcastId) + ->where('`published_at` <= UTC_TIMESTAMP()', null, false) + ->get() ->getResultArray(); $stats = [ diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index aa905ba2..9c228e1d 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -245,9 +245,8 @@ class PodcastModel extends Model ->builder() ->select('YEAR(published_at) as year, count(*) as number_of_episodes') ->where([ - 'podcast_id' => $podcastId, - 'season_number' => null, - 'published_at IS NOT' => null, + 'podcast_id' => $podcastId, + 'season_number' => null, ]) ->where('`published_at` <= UTC_TIMESTAMP()', null, false) ->groupBy('year') @@ -284,7 +283,6 @@ class PodcastModel extends Model ->where([ 'podcast_id' => $podcastId, 'season_number is not' => null, - 'published_at IS NOT' => null, ]) ->where('`published_at` <= UTC_TIMESTAMP()', null, false) ->groupBy('season_number') From 76e1251ece85ca85ec8e9f23f95150e6d7361cd2 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 25 Jan 2024 13:23:24 +0000 Subject: [PATCH 285/477] docs(all-contributors): add Guy Martin to list of contributors --- .all-contributorsrc | 10 ++++++++++ README.md | 1 + docs/src/index.md | 1 + 3 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d4411375..b070192f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -613,6 +613,16 @@ "contributions": [ "code" ] + }, + { + "login": "NeoluxConsulting", + "name": "Guy Martin", + "avatar_url": "https://secure.gravatar.com/avatar/6e745565356330c1e29a85d52bffdaa1?s=80&d=identicon", + "profile": "https://code.castopod.org/NeoluxConsulting", + "contributions": [ + "bug", + "code" + ] } ], "commitConvention": "none" diff --git a/README.md b/README.md index 3c07d45f..140ba069 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/index.md b/docs/src/index.md index c37e70de..054b856b 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 From de099ac64300b8edb86e387fde89c0a3e9472f46 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Tue, 30 Jan 2024 09:07:29 +0000 Subject: [PATCH 286/477] feat: add actor domain to handle in follow page --- themes/cp_app/podcast/follow.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/themes/cp_app/podcast/follow.php b/themes/cp_app/podcast/follow.php index f67ae71e..82865f5b 100644 --- a/themes/cp_app/podcast/follow.php +++ b/themes/cp_app/podcast/follow.php @@ -36,14 +36,15 @@

    -
    +
    <?= esc($actor->display_name) ?>

    display_name) ?>

    -

    @username) ?>

    +

    +@username) ?>@domain) ?>

    @@ -53,7 +54,6 @@
    - Date: Tue, 30 Jan 2024 15:26:22 +0000 Subject: [PATCH 287/477] fix(s3): remove proxy, set objects acl to public-read, and serve files using their public urls --- modules/Media/Config/Media.php | 1 - modules/Media/Config/Routes.php | 24 ----- modules/Media/Controllers/MediaController.php | 26 ----- modules/Media/FileManagers/FS.php | 6 -- .../FileManagers/FileManagerInterface.php | 3 - modules/Media/FileManagers/S3.php | 94 +------------------ 6 files changed, 3 insertions(+), 151 deletions(-) delete mode 100644 modules/Media/Config/Routes.php delete mode 100644 modules/Media/Controllers/MediaController.php diff --git a/modules/Media/Config/Media.php b/modules/Media/Config/Media.php index daa2f4b8..987847c4 100644 --- a/modules/Media/Config/Media.php +++ b/modules/Media/Config/Media.php @@ -33,7 +33,6 @@ class Media extends BaseConfig 'debug' => false, 'pathStyleEndpoint' => false, 'keyPrefix' => '', - 'serveWithRedirect' => false, ]; /** diff --git a/modules/Media/Config/Routes.php b/modules/Media/Config/Routes.php deleted file mode 100644 index a9984bfb..00000000 --- a/modules/Media/Config/Routes.php +++ /dev/null @@ -1,24 +0,0 @@ -head('static/(:any)', 'MediaController::serve/$1', [ - 'as' => 'media-serve', - 'namespace' => 'Modules\Media\Controllers', - 'filter' => 'allow-cors', -]); -$routes->get('static/(:any)', 'MediaController::serve/$1', [ - 'as' => 'media-serve', - 'namespace' => 'Modules\Media\Controllers', - 'filter' => 'allow-cors', -]); diff --git a/modules/Media/Controllers/MediaController.php b/modules/Media/Controllers/MediaController.php deleted file mode 100644 index 65a8f5db..00000000 --- a/modules/Media/Controllers/MediaController.php +++ /dev/null @@ -1,26 +0,0 @@ -serve(implode('/', $key)); - } -} diff --git a/modules/Media/FileManagers/FS.php b/modules/Media/FileManagers/FS.php index aa2d2066..081598ba 100644 --- a/modules/Media/FileManagers/FS.php +++ b/modules/Media/FileManagers/FS.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace Modules\Media\FileManagers; use CodeIgniter\Files\File; -use CodeIgniter\HTTP\Response; use Exception; use Modules\Media\Config\Media as MediaConfig; @@ -131,11 +130,6 @@ class FS implements FileManagerInterface return is_really_writable($this->media_path_absolute()); } - public function serve(string $key): Response - { - return redirect()->to($this->getUrl($key)); - } - /** * Prefixes the absolute storage directory to the media path of a given uri * diff --git a/modules/Media/FileManagers/FileManagerInterface.php b/modules/Media/FileManagers/FileManagerInterface.php index eb365429..d711230d 100644 --- a/modules/Media/FileManagers/FileManagerInterface.php +++ b/modules/Media/FileManagers/FileManagerInterface.php @@ -5,7 +5,6 @@ declare(strict_types=1); namespace Modules\Media\FileManagers; use CodeIgniter\Files\File; -use CodeIgniter\HTTP\Response; interface FileManagerInterface { @@ -28,6 +27,4 @@ interface FileManagerInterface public function deleteAll(string $prefix, string $pattern = '*'): bool; public function isHealthy(): bool; - - public function serve(string $key): Response; } diff --git a/modules/Media/FileManagers/S3.php b/modules/Media/FileManagers/S3.php index 4ce3cae1..d3cf7f92 100644 --- a/modules/Media/FileManagers/S3.php +++ b/modules/Media/FileManagers/S3.php @@ -6,11 +6,7 @@ namespace Modules\Media\FileManagers; use Aws\Credentials\Credentials; use Aws\S3\S3Client; -use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\Files\File; -use CodeIgniter\HTTP\IncomingRequest; -use CodeIgniter\HTTP\Response; -use DateTime; use Exception; use Modules\Media\Config\Media as MediaConfig; @@ -39,6 +35,7 @@ class S3 implements FileManagerInterface 'SourceFile' => $file, 'ContentType' => $file->getMimeType(), 'CacheControl' => 'max-age=' . YEAR, + 'ACL' => 'public-read', ]); // delete file after storage in s3 @@ -63,7 +60,7 @@ class S3 implements FileManagerInterface public function getUrl(string $key): string { - return media_url((string) route_to('media-serve', $key)); + return media_url($this->prefixKey($key)); } public function rename(string $oldKey, string $newKey): bool @@ -74,6 +71,7 @@ class S3 implements FileManagerInterface 'Bucket' => $this->config->s3['bucket'], 'CopySource' => $this->config->s3['bucket'] . '/' . $this->prefixKey($oldKey), 'Key' => $this->prefixKey($newKey), + 'ACL' => 'public-read', ]); } catch (Exception) { return false; @@ -182,92 +180,6 @@ class S3 implements FileManagerInterface return true; } - public function serve(string $key): Response - { - if ($this->config->s3['serveWithRedirect']) { - return $this->servePresignedRequest($key); - } - - return $this->serveProxy($key); - } - - private function serveProxy(string $key): Response - { - /** @var IncomingRequest $incomingRequest */ - $incomingRequest = service('request'); - - /** @var Response $response */ - $response = service('response'); - - $s3Request = [ - 'Bucket' => $this->config->s3['bucket'], - 'Key' => $this->prefixKey($key), - ]; - - foreach ($incomingRequest->headers() as $header) { - $s3Request[$header->getName()] = $header->getValue(); - } - - try { - $result = $this->s3->getObject($s3Request); - } catch (Exception) { - throw new PageNotFoundException(); - } - - // Remove Cache-Control header before redefining it - header_remove('Cache-Control'); - - $response->setStatusCode($result['@metadata']['statusCode']); - - // set same headers as response from s3 - foreach ($result['@metadata']['headers'] as $headerName => $headerValue) { - $response->setHeader($headerName, $headerValue); - } - - return $response->setBody((string) $result->get('Body')->getContents()); - } - - private function servePresignedRequest(string $key): Response - { - $cacheName = 'object_presigned_uri_' . str_replace('/', '-', $key) . '_' . $this->config->s3['bucket']; - if (! $found = cache($cacheName)) { - $cmd = $this->s3->getCommand('GetObject', [ - 'Bucket' => $this->config->s3['bucket'], - 'Key' => $this->prefixKey($key), - ]); - - $request = $this->s3->createPresignedRequest($cmd, '+1 day'); - - $found = (string) $request->getUri(); - - cache() - ->save($cacheName, $found, DAY); - } - - $cacheOptions = [ - 'max-age' => DAY, - 'etag' => md5($found), - 'public' => true, - ]; - - if (cache()->getMetaData($cacheName)) { - $lastModifiedTimestamp = cache() - ->getMetaData($cacheName)['mtime']; - $lastModified = new DateTime(); - $lastModified->setTimestamp($lastModifiedTimestamp); - $cacheOptions['last-modified'] = $lastModified->format(DATE_RFC7231); - } - - /** @var Response $response */ - $response = service('response'); - - // Remove Cache-Control header before redefining it - header_remove('Cache-Control'); - - return $response->setCache($cacheOptions) - ->redirect($found); - } - private function prefixKey(string $key): string { if ($this->config->s3['keyPrefix'] === '') { From bc4f93d2b7c62b8fe2518de8b614019cdfd47f1f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 31 Jan 2024 10:00:05 +0000 Subject: [PATCH 288/477] chore(release): 1.9.0 [skip ci] # [1.9.0](https://code.castopod.org/adaures/castopod/compare/v1.8.2...v1.9.0) (1/31/2024) ### Bug Fixes * **i18n:** escape language strings in form fields to prevent them from disappearing ([3cb5ffd](https://code.castopod.org/adaures/castopod/commit/3cb5ffd25b9604a83cd12935e641dab7c88fba47)), closes [#412](https://code.castopod.org/adaures/castopod/issues/412) * **podcast-about:** update stats query to discard scheduled episodes from episodes number ([67c037c](https://code.castopod.org/adaures/castopod/commit/67c037c9eb1e15c6945eaf74ec0ff30b33f4b704)) * **premium-subs:** clear subscription list cache after insert ([2accb0f](https://code.castopod.org/adaures/castopod/commit/2accb0f7652330b29c3adb85a2e1b0d5d83f1389)), closes [#430](https://code.castopod.org/adaures/castopod/issues/430) * **s3:** remove proxy, set objects acl to public-read, and serve files using their public urls ([6a77a9d](https://code.castopod.org/adaures/castopod/commit/6a77a9d2f29c849775a3d1bcbd819f73f21d9aa6)) ### Features * add actor domain to handle in follow page ([de099ac](https://code.castopod.org/adaures/castopod/commit/de099ac64300b8edb86e387fde89c0a3e9472f46)) * **admin:** add podcast's OP3 analytics dashboard link ([5f3752b](https://code.castopod.org/adaures/castopod/commit/5f3752b4430f6f2d5f9e5f6a7a003bc4d2f9d487)) --- CHANGELOG.md | 25 +++++++++++++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87f1274f..596f6af1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +# [1.9.0](https://code.castopod.org/adaures/castopod/compare/v1.8.2...v1.9.0) (1/31/2024) + +### Bug Fixes + +- **i18n:** escape language strings in form fields to prevent them from + disappearing + ([3cb5ffd](https://code.castopod.org/adaures/castopod/commit/3cb5ffd25b9604a83cd12935e641dab7c88fba47)), + closes [#412](https://code.castopod.org/adaures/castopod/issues/412) +- **podcast-about:** update stats query to discard scheduled episodes from + episodes number + ([67c037c](https://code.castopod.org/adaures/castopod/commit/67c037c9eb1e15c6945eaf74ec0ff30b33f4b704)) +- **premium-subs:** clear subscription list cache after insert + ([2accb0f](https://code.castopod.org/adaures/castopod/commit/2accb0f7652330b29c3adb85a2e1b0d5d83f1389)), + closes [#430](https://code.castopod.org/adaures/castopod/issues/430) +- **s3:** remove proxy, set objects acl to public-read, and serve files using + their public urls + ([6a77a9d](https://code.castopod.org/adaures/castopod/commit/6a77a9d2f29c849775a3d1bcbd819f73f21d9aa6)) + +### Features + +- add actor domain to handle in follow page + ([de099ac](https://code.castopod.org/adaures/castopod/commit/de099ac64300b8edb86e387fde89c0a3e9472f46)) +- **admin:** add podcast's OP3 analytics dashboard link + ([5f3752b](https://code.castopod.org/adaures/castopod/commit/5f3752b4430f6f2d5f9e5f6a7a003bc4d2f9d487)) + ## [1.8.2](https://code.castopod.org/adaures/castopod/compare/v1.8.1...v1.8.2) (1/17/2024) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 58001e92..38695bf6 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.8.2'); +defined('CP_VERSION') || define('CP_VERSION', '1.9.0'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index e7dd8ac2..d59a4443 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.8.2", + "version": "1.9.0", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 3b12cfd1..2121ad09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.8.2", + "version": "1.9.0", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 630e788f0e1ddfe5de229bd415a8e15361efa746 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Mon, 5 Feb 2024 16:51:04 +0000 Subject: [PATCH 289/477] feat: add support for podcasting 2.0 "medium" tag with podcast, music and audiobook closes #439 --- .../2024-02-05-160000_add_podcasts_medium.php | 36 +++++++++++++++++++ app/Entities/Podcast.php | 2 ++ app/Helpers/rss_helper.php | 2 ++ app/Models/PodcastModel.php | 1 + .../Admin/Controllers/PodcastController.php | 2 ++ modules/Admin/Language/en/Podcast.php | 12 ++++++- themes/cp_admin/podcast/create.php | 20 +++++++++++ themes/cp_admin/podcast/edit.php | 21 +++++++++++ 8 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 app/Database/Migrations/2024-02-05-160000_add_podcasts_medium.php diff --git a/app/Database/Migrations/2024-02-05-160000_add_podcasts_medium.php b/app/Database/Migrations/2024-02-05-160000_add_podcasts_medium.php new file mode 100644 index 00000000..1ea78d38 --- /dev/null +++ b/app/Database/Migrations/2024-02-05-160000_add_podcasts_medium.php @@ -0,0 +1,36 @@ + [ + 'type' => "ENUM('podcast','music','audiobook')", + 'null' => false, + 'default' => 'podcast', + 'after' => 'type', + ], + ]; + + $this->forge->addColumn('podcasts', $fields); + } + + public function down(): void + { + $fields = ['medium']; + $this->forge->dropColumn('podcasts', $fields); + } +} diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index ce4226aa..eff4364b 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -64,6 +64,7 @@ use RuntimeException; * @property string $owner_email * @property bool $is_owner_email_removed_from_feed * @property string $type + * @property string $medium * @property string|null $copyright * @property string|null $episode_description_footer_markdown * @property string|null $episode_description_footer_html @@ -196,6 +197,7 @@ class Podcast extends Entity 'owner_email' => 'string', 'is_owner_email_removed_from_feed' => 'boolean', 'type' => 'string', + 'medium' => 'string', 'copyright' => '?string', 'episode_description_footer_markdown' => '?string', 'episode_description_footer_html' => '?string', diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index ddcdf36c..bde1f11d 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -74,6 +74,8 @@ if (! function_exists('get_rss_feed')) { $channel->addChild('title', $podcast->title, null, false); $channel->addChildWithCDATA('description', $podcast->description_html); + $channel->addChild('medium', $podcast->medium, $podcastNamespace); + $itunesImage = $channel->addChild('image', null, $itunesNamespace); $itunesImage->addAttribute('href', $podcast->cover->feed_url); diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 9c228e1d..9dd3763a 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -51,6 +51,7 @@ class PodcastModel extends Model 'is_owner_email_removed_from_feed', 'publisher', 'type', + 'medium', 'copyright', 'imported_feed_url', 'new_feed_url', diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 4ac1157f..bc483235 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -219,6 +219,7 @@ class PodcastController extends BaseController 'is_owner_email_removed_from_feed' => $this->request->getPost('is_owner_email_removed_from_feed') === 'yes', 'publisher' => $this->request->getPost('publisher'), 'type' => $this->request->getPost('type'), + 'medium' => $this->request->getPost('medium'), 'copyright' => $this->request->getPost('copyright'), 'location' => $this->request->getPost('location_name') === '' ? null : new Location( $this->request->getPost('location_name') @@ -314,6 +315,7 @@ class PodcastController extends BaseController $this->podcast->owner_name = $this->request->getPost('owner_name'); $this->podcast->owner_email = $this->request->getPost('owner_email'); $this->podcast->type = $this->request->getPost('type'); + $this->podcast->medium = $this->request->getPost('medium'); $this->podcast->copyright = $this->request->getPost('copyright'); $this->podcast->location = $this->request->getPost('location_name') === '' ? null : new Location( $this->request->getPost('location_name') diff --git a/modules/Admin/Language/en/Podcast.php b/modules/Admin/Language/en/Podcast.php index 3a2edc64..d02b6cf4 100644 --- a/modules/Admin/Language/en/Podcast.php +++ b/modules/Admin/Language/en/Podcast.php @@ -74,7 +74,17 @@ return [ 'episodic' => 'Episodic', 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', 'serial' => 'Serial', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. Episodes will be presented in numeric order.', + ], + 'medium' => [ + 'label' => 'Medium', + 'hint' => 'Medium as represented by podcast:medium tag in RSS. Changing this may change how players present your feed.', + 'podcast' => 'Podcast', + 'podcast_hint' => 'Describes a feed for a podcast show.', + 'music' => 'Music', + 'music_hint' => 'A feed of music organized into an "album" with each item a song within the album.', + 'audiobook' => 'Audiobook', + 'audiobook_hint' => 'Specific types of audio with one item per feed, or where items represent chapters within the book.', ], 'description' => 'Description', 'classification_section_title' => 'Classification', diff --git a/themes/cp_admin/podcast/create.php b/themes/cp_admin/podcast/create.php index 54ab5287..7f09adf0 100644 --- a/themes/cp_admin/podcast/create.php +++ b/themes/cp_admin/podcast/create.php @@ -56,6 +56,26 @@ isChecked="false" >
    +
    + +
    + + + +
    +

    +
    + +
    + + + +
    +
    Date: Mon, 5 Feb 2024 17:03:36 +0000 Subject: [PATCH 290/477] chore(i18n): new Crowdin updates --- app/Language/it/Episode.php | 16 +- app/Language/it/Podcast.php | 4 +- app/Language/ja/Comment.php | 18 +- app/Language/ja/Common.php | 18 +- app/Language/ja/Episode.php | 18 +- app/Language/ja/Fediverse.php | 6 +- app/Language/ja/Home.php | 12 +- app/Language/ja/Post.php | 6 +- app/Language/nl/Episode.php | 16 +- app/Language/oc/Comment.php | 32 +-- app/Language/oc/Common.php | 30 +-- app/Language/oc/Episode.php | 44 +-- app/Language/oc/Fediverse.php | 34 +-- app/Language/oc/Home.php | 12 +- app/Language/oc/Page.php | 6 +- app/Language/oc/Podcast.php | 58 ++-- app/Language/oc/Post.php | 40 +-- docs/src/ar/index.md | 7 +- docs/src/br/index.md | 7 +- docs/src/ca/index.md | 7 +- docs/src/da/index.md | 7 +- docs/src/de/index.md | 7 +- docs/src/el/index.md | 7 +- docs/src/es/index.md | 7 +- docs/src/fa/index.md | 7 +- docs/src/fr/index.md | 7 +- docs/src/fr2/index.md | 7 +- docs/src/fr_CA/index.md | 7 +- docs/src/gd/index.md | 7 +- docs/src/gl/index.md | 7 +- docs/src/id/index.md | 7 +- docs/src/it/getting-started/auth.md | 60 ++--- docs/src/it/index.md | 7 +- docs/src/ja/index.md | 7 +- docs/src/kk/index.md | 7 +- docs/src/ko/index.md | 7 +- docs/src/nl/getting-started/auth.md | 20 +- docs/src/nl/getting-started/docker.md | 86 +++--- docs/src/nl/getting-started/install.md | 50 ++-- docs/src/nl/getting-started/security.md | 4 +- docs/src/nl/getting-started/update.md | 20 +- docs/src/nl/index.md | 45 ++-- docs/src/nn-NO/index.md | 7 +- docs/src/oc/index.md | 7 +- docs/src/pl/index.md | 7 +- docs/src/pt-BR/getting-started/auth.md | 96 +++---- docs/src/pt-BR/index.md | 7 +- docs/src/pt/index.md | 7 +- docs/src/ro/index.md | 7 +- docs/src/ru/index.md | 7 +- docs/src/sk/index.md | 7 +- docs/src/sr_Latn/index.md | 7 +- docs/src/sv/index.md | 9 +- docs/src/uk/index.md | 7 +- docs/src/zh-Hans/index.md | 7 +- modules/Admin/Language/ar/Podcast.php | 1 + modules/Admin/Language/br/Podcast.php | 1 + modules/Admin/Language/ca/Podcast.php | 1 + modules/Admin/Language/da/Podcast.php | 1 + modules/Admin/Language/de/Podcast.php | 1 + modules/Admin/Language/el/Podcast.php | 1 + modules/Admin/Language/es/Podcast.php | 1 + modules/Admin/Language/fa/Podcast.php | 1 + modules/Admin/Language/fr/Podcast.php | 1 + modules/Admin/Language/fr2/Podcast.php | 1 + modules/Admin/Language/fr_CA/Podcast.php | 1 + modules/Admin/Language/gd/Podcast.php | 1 + modules/Admin/Language/gl/Podcast.php | 1 + modules/Admin/Language/id/Podcast.php | 1 + modules/Admin/Language/it/Podcast.php | 1 + modules/Admin/Language/ja/Podcast.php | 1 + modules/Admin/Language/kk/Podcast.php | 1 + modules/Admin/Language/ko/Podcast.php | 1 + modules/Admin/Language/nl/Common.php | 2 +- modules/Admin/Language/nl/Countries.php | 26 +- modules/Admin/Language/nl/Dashboard.php | 14 +- modules/Admin/Language/nl/Episode.php | 90 +++---- .../Admin/Language/nl/EpisodeNavigation.php | 10 +- modules/Admin/Language/nl/Fediverse.php | 18 +- modules/Admin/Language/nl/Home.php | 4 +- modules/Admin/Language/nl/Install.php | 18 +- modules/Admin/Language/nl/Navigation.php | 49 ++-- modules/Admin/Language/nl/Notifications.php | 12 +- modules/Admin/Language/nl/Page.php | 26 +- modules/Admin/Language/nl/Pager.php | 14 +- modules/Admin/Language/nl/Person.php | 52 ++-- modules/Admin/Language/nl/Platforms.php | 18 +- modules/Admin/Language/nl/Podcast.php | 255 +++++++++--------- .../Admin/Language/nl/PodcastNavigation.php | 26 +- modules/Admin/Language/nl/Settings.php | 24 +- modules/Admin/Language/nl/Soundbite.php | 4 +- modules/Admin/Language/nl/Validation.php | 2 +- modules/Admin/Language/nl/VideoClip.php | 24 +- modules/Admin/Language/nn-NO/Podcast.php | 1 + modules/Admin/Language/oc/Home.php | 4 +- modules/Admin/Language/oc/Install.php | 8 +- modules/Admin/Language/oc/Podcast.php | 1 + modules/Admin/Language/pl/Podcast.php | 1 + modules/Admin/Language/pt-BR/Episode.php | 28 +- modules/Admin/Language/pt-BR/Platforms.php | 20 +- modules/Admin/Language/pt-BR/Podcast.php | 1 + modules/Admin/Language/pt/Podcast.php | 1 + modules/Admin/Language/ro/Podcast.php | 1 + modules/Admin/Language/ru/Podcast.php | 1 + modules/Admin/Language/sk/Podcast.php | 25 +- .../Admin/Language/sk/PodcastNavigation.php | 6 +- modules/Admin/Language/sr_Latn/Podcast.php | 1 + modules/Admin/Language/sv/Podcast.php | 1 + modules/Admin/Language/uk/Podcast.php | 1 + modules/Admin/Language/zh-Hans/Podcast.php | 1 + modules/Auth/Language/pt-BR/Auth.php | 96 +++---- .../Language/nl/PodcastImport.php | 34 +-- .../Language/nl/Subscription.php | 2 +- .../Language/pt-BR/PremiumPodcasts.php | 36 +-- .../Language/pt-BR/Subscription.php | 46 ++-- 115 files changed, 1024 insertions(+), 961 deletions(-) diff --git a/app/Language/it/Episode.php b/app/Language/it/Episode.php index d06d4b18..b9b77931 100644 --- a/app/Language/it/Episode.php +++ b/app/Language/it/Episode.php @@ -31,15 +31,15 @@ return [ 'all_podcast_episodes' => 'Tutti gli episodi del podcast', 'back_to_podcast' => 'Torna a podcast', 'preview' => [ - 'title' => 'Preview', - 'not_published' => 'Not published', + 'title' => 'Anteprima', + 'not_published' => 'Non pubblicato', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {Questo episodio non è ancora stato pubblicato.} + scheduled {Questo episodio sarà pubblicato il {publication_date}.} + with_podcast {Questo episodio sarà pubblicato in contemporanea al podcast.} + other {Questo episodio non è ancora stato pubblicato.} }', - 'publish' => 'Publish', - 'publish_edit' => 'Edit publication', + 'publish' => 'Pubblica', + 'publish_edit' => 'Modifica pubblicazione', ], ]; diff --git a/app/Language/it/Podcast.php b/app/Language/it/Podcast.php index 933eb3d2..3099cfea 100644 --- a/app/Language/it/Podcast.php +++ b/app/Language/it/Podcast.php @@ -25,7 +25,7 @@ return [ one {# post} other {# posts} }', - 'links' => 'Links', + 'links' => 'Link', 'activity' => 'Attività', 'episodes' => 'Episodi', 'episodes_title' => 'Episodi di {podcastTitle}', @@ -51,5 +51,5 @@ return [ other {# persons} }', 'persons_list' => 'Persone', - 'castopod_website' => 'Castopod (website)', + 'castopod_website' => 'Castopod (sito web)', ]; diff --git a/app/Language/ja/Comment.php b/app/Language/ja/Comment.php index 1dd8f5ea..48080eeb 100644 --- a/app/Language/ja/Comment.php +++ b/app/Language/ja/Comment.php @@ -9,13 +9,13 @@ declare(strict_types=1); */ return [ - 'title' => "{actorDisplayName}'s comment for {episodeTitle}", - 'back_to_comments' => 'Back to comments', + 'title' => "{actorDisplayName} の {episodeTitle} へのコメント", + 'back_to_comments' => 'コメントに戻る', 'form' => [ - 'episode_message_placeholder' => 'Write a comment…', - 'reply_to_placeholder' => 'Reply to @{actorUsername}', - 'submit' => 'Send', - 'submit_reply' => 'Reply', + 'episode_message_placeholder' => 'コメントを書く...', + 'reply_to_placeholder' => '@{actorUsername} に返信', + 'submit' => '送信', + 'submit_reply' => '返信する', ], 'likes' => '{numberOfLikes, plural, one {# like} @@ -25,10 +25,10 @@ return [ one {# reply} other {# replies} }', - 'like' => 'Like', - 'reply' => 'Reply', + 'like' => 'いいね', + 'reply' => '返信する', 'view_replies' => 'View replies ({numberOfReplies})', 'block_actor' => 'Block user @{actorUsername}', 'block_domain' => 'Block domain @{actorDomain}', - 'delete' => 'Delete comment', + 'delete' => 'コメントを削除する', ]; diff --git a/app/Language/ja/Common.php b/app/Language/ja/Common.php index 1258afcc..9e862c12 100644 --- a/app/Language/ja/Common.php +++ b/app/Language/ja/Common.php @@ -9,21 +9,21 @@ declare(strict_types=1); */ return [ - 'yes' => 'Yes', - 'no' => 'No', - 'cancel' => 'Cancel', + 'yes' => 'はい', + 'no' => 'いいえ', + 'cancel' => 'キャンセル', 'optional' => 'Optional', 'close' => 'Close', - 'home' => 'Home', + 'home' => 'ホーム', 'explicit' => 'Explicit', 'powered_by' => 'Powered by {castopod}', - 'go_back' => 'Go back', + 'go_back' => '戻る', 'play_episode_button' => [ - 'play' => 'Play', - 'playing' => 'Playing', + 'play' => '再生', + 'playing' => '再生中', ], - 'read_more' => 'Read more', - 'read_less' => 'Read less', + 'read_more' => '続きを読む', + 'read_less' => '閉じる', 'see_more' => 'See more', 'see_less' => 'See less', 'legal_notice' => 'Legal notice', diff --git a/app/Language/ja/Episode.php b/app/Language/ja/Episode.php index 44be8e38..6b01300d 100644 --- a/app/Language/ja/Episode.php +++ b/app/Language/ja/Episode.php @@ -9,29 +9,29 @@ declare(strict_types=1); */ return [ - 'season' => 'Season {seasonNumber}', + 'season' => 'シーズン {seasonNumber}', 'season_abbr' => 'S{seasonNumber}', - 'number' => 'Episode {episodeNumber}', + 'number' => 'エピソード {episodeNumber}', 'number_abbr' => 'Ep. {episodeNumber}', - 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode' => 'シーズン {seasonNumber} エピソード {episodeNumber}', 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', 'persons' => '{personsCount, plural, one {# person} other {# persons} }', 'persons_list' => 'Persons', - 'back_to_episodes' => 'Back to episodes of {podcast}', - 'comments' => 'Comments', - 'activity' => 'Activity', + 'back_to_episodes' => '{podcast} のエピソードに戻る', + 'comments' => 'コメント', + 'activity' => 'アクティビティ', 'description' => 'Episode description', 'number_of_comments' => '{numberOfComments, plural, one {# comment} other {# comments} }', 'all_podcast_episodes' => 'All podcast episodes', - 'back_to_podcast' => 'Go back to podcast', + 'back_to_podcast' => 'ポッドキャストへ戻る', 'preview' => [ - 'title' => 'Preview', + 'title' => 'プレビュー', 'not_published' => 'Not published', 'text' => '{publication_status, select, published {This episode is not yet published.} @@ -39,7 +39,7 @@ return [ with_podcast {This episode will be published at the same time as the podcast.} other {This episode is not yet published.} }', - 'publish' => 'Publish', + 'publish' => '公開する', 'publish_edit' => 'Edit publication', ], ]; diff --git a/app/Language/ja/Fediverse.php b/app/Language/ja/Fediverse.php index 32f54c07..c94e62f3 100644 --- a/app/Language/ja/Fediverse.php +++ b/app/Language/ja/Fediverse.php @@ -12,10 +12,10 @@ return [ 'your_handle' => 'Your handle', 'your_handle_hint' => 'Enter the @username@domain you want to act from.', 'follow' => [ - 'label' => 'Follow', - 'title' => 'Follow {actorDisplayName}', + 'label' => 'フォロー', + 'title' => '{actorDisplayName} をフォロー', 'subtitle' => 'You are going to follow:', - 'accountNotFound' => 'The account could not be found.', + 'accountNotFound' => 'アカウントが見つかりませんでした', 'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…', 'submit' => 'Proceed to follow', ], diff --git a/app/Language/ja/Home.php b/app/Language/ja/Home.php index 1518239b..f6364647 100644 --- a/app/Language/ja/Home.php +++ b/app/Language/ja/Home.php @@ -9,12 +9,12 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'sort_by' => 'Sort by', + 'all_podcasts' => 'すべてのポッドキャスト', + 'sort_by' => '並べ替え', 'sort_options' => [ - 'activity' => 'Recent activity', - 'created_desc' => 'Newest first', - 'created_asc' => 'Oldest first', + 'activity' => '最近のアクティビティ', + 'created_desc' => '新しい順', + 'created_asc' => '古い順', ], - 'no_podcast' => 'No podcast found', + 'no_podcast' => 'ポッドキャストが見つかりません', ]; diff --git a/app/Language/ja/Post.php b/app/Language/ja/Post.php index 58d1cf80..1ad1c14c 100644 --- a/app/Language/ja/Post.php +++ b/app/Language/ja/Post.php @@ -18,8 +18,8 @@ return [ 'episode_message_placeholder' => 'Write a message for the episode…', 'episode_url_placeholder' => 'Episode URL', 'reply_to_placeholder' => 'Reply to @{actorUsername}', - 'submit' => 'Send', - 'submit_reply' => 'Reply', + 'submit' => '送信', + 'submit_reply' => '返信する', ], 'favourites' => '{numberOfFavourites, plural, one {# favourite} @@ -36,5 +36,5 @@ return [ 'expand' => 'Expand post', 'block_actor' => 'Block user @{actorUsername}', 'block_domain' => 'Block domain @{actorDomain}', - 'delete' => 'Delete post', + 'delete' => '投稿を削除', ]; diff --git a/app/Language/nl/Episode.php b/app/Language/nl/Episode.php index 4ddc503c..204081ee 100644 --- a/app/Language/nl/Episode.php +++ b/app/Language/nl/Episode.php @@ -31,15 +31,15 @@ return [ 'all_podcast_episodes' => 'Alle podcast afleveringen', 'back_to_podcast' => 'Terug naar podcast', 'preview' => [ - 'title' => 'Preview', - 'not_published' => 'Not published', + 'title' => 'Voorbeeld', + 'not_published' => 'Niet gepubliceerd', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {Deze aflevering is nog niet gepubliceerd.} + scheduled {Deze aflevering is gepland voor publicatie op {publication_date}} + with_podcast {Deze aflevering zal op hetzelfde moment als de podcast worden gepubliceerd} + other {Deze aflevering is nog niet gepubliceerd.} }', - 'publish' => 'Publish', - 'publish_edit' => 'Edit publication', + 'publish' => 'Publiceer', + 'publish_edit' => 'Publicatie bewerken', ], ]; diff --git a/app/Language/oc/Comment.php b/app/Language/oc/Comment.php index 1dd8f5ea..137f027e 100644 --- a/app/Language/oc/Comment.php +++ b/app/Language/oc/Comment.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'title' => "{actorDisplayName}'s comment for {episodeTitle}", - 'back_to_comments' => 'Back to comments', + 'title' => "Lo comentari de {actorDisplayName} per {episodeTitle}", + 'back_to_comments' => 'Tornar als comentaris', 'form' => [ - 'episode_message_placeholder' => 'Write a comment…', - 'reply_to_placeholder' => 'Reply to @{actorUsername}', - 'submit' => 'Send', - 'submit_reply' => 'Reply', + 'episode_message_placeholder' => 'Escriure un comentari…', + 'reply_to_placeholder' => 'Respondre @{actorUsername}', + 'submit' => 'Enviar', + 'submit_reply' => 'Respondre', ], 'likes' => '{numberOfLikes, plural, - one {# like} - other {# likes} + one {# m\'agrada} + other {# m\'agrada} }', 'replies' => '{numberOfReplies, plural, - one {# reply} - other {# replies} + one {# responsa} + other {# responsas} }', - 'like' => 'Like', - 'reply' => 'Reply', - 'view_replies' => 'View replies ({numberOfReplies})', - 'block_actor' => 'Block user @{actorUsername}', - 'block_domain' => 'Block domain @{actorDomain}', - 'delete' => 'Delete comment', + 'like' => 'M\'agrada', + 'reply' => 'Respondre', + 'view_replies' => 'Veire las responsas ({numberOfReplies})', + 'block_actor' => 'Blocar l’utilizaire @{actorUsername}', + 'block_domain' => 'Blocar lo domeni @{actorDomain}', + 'delete' => 'Suprimir lo comentari', ]; diff --git a/app/Language/oc/Common.php b/app/Language/oc/Common.php index 1258afcc..fdb2bcde 100644 --- a/app/Language/oc/Common.php +++ b/app/Language/oc/Common.php @@ -9,22 +9,22 @@ declare(strict_types=1); */ return [ - 'yes' => 'Yes', - 'no' => 'No', - 'cancel' => 'Cancel', - 'optional' => 'Optional', - 'close' => 'Close', - 'home' => 'Home', + 'yes' => 'Òc', + 'no' => 'Non', + 'cancel' => 'Anullar', + 'optional' => 'Opcional', + 'close' => 'Tampar', + 'home' => 'Acuèlh', 'explicit' => 'Explicit', - 'powered_by' => 'Powered by {castopod}', - 'go_back' => 'Go back', + 'powered_by' => 'Propulsat per {castopod}', + 'go_back' => 'Tornar', 'play_episode_button' => [ - 'play' => 'Play', - 'playing' => 'Playing', + 'play' => 'Legir', + 'playing' => 'Lectura', ], - 'read_more' => 'Read more', - 'read_less' => 'Read less', - 'see_more' => 'See more', - 'see_less' => 'See less', - 'legal_notice' => 'Legal notice', + 'read_more' => 'Ne legir mai', + 'read_less' => 'Ne legir mens', + 'see_more' => 'Ne veire mai', + 'see_less' => 'Ne veire mens', + 'legal_notice' => 'Mencions legalas', ]; diff --git a/app/Language/oc/Episode.php b/app/Language/oc/Episode.php index 44be8e38..49caae7c 100644 --- a/app/Language/oc/Episode.php +++ b/app/Language/oc/Episode.php @@ -9,37 +9,37 @@ declare(strict_types=1); */ return [ - 'season' => 'Season {seasonNumber}', + 'season' => 'Sason {seasonNumber}', 'season_abbr' => 'S{seasonNumber}', - 'number' => 'Episode {episodeNumber}', + 'number' => 'Episòdi {episodeNumber}', 'number_abbr' => 'Ep. {episodeNumber}', - 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode' => 'Sason {seasonNumber} episòdi {episodeNumber}', 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', 'persons' => '{personsCount, plural, - one {# person} - other {# persons} + one {# persona} + other {# personas} }', - 'persons_list' => 'Persons', - 'back_to_episodes' => 'Back to episodes of {podcast}', - 'comments' => 'Comments', - 'activity' => 'Activity', - 'description' => 'Episode description', + 'persons_list' => 'Personas', + 'back_to_episodes' => 'Tornar als episòdis de {podcast}', + 'comments' => 'Comentaris', + 'activity' => 'Activitat', + 'description' => 'Descripcion de l’episòdi', 'number_of_comments' => '{numberOfComments, plural, - one {# comment} - other {# comments} + one {# comentari} + other {# comentaris} }', - 'all_podcast_episodes' => 'All podcast episodes', - 'back_to_podcast' => 'Go back to podcast', + 'all_podcast_episodes' => 'Totes los episòdis del podcast', + 'back_to_podcast' => 'Tornar al podcast', 'preview' => [ - 'title' => 'Preview', - 'not_published' => 'Not published', + 'title' => 'Apercebut', + 'not_published' => 'Non publicat', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {Aqueste episòdi es pas encara publicat.} + scheduled {Aqueste episòdi es planificat per publicacion lo {publication_date}.} + with_podcast {Aqueste episòdi serà publicat al moment de la publicacion del podcast.} + other {Aqueste episòdi es pas encara publicat.} }', - 'publish' => 'Publish', - 'publish_edit' => 'Edit publication', + 'publish' => 'Publicar', + 'publish_edit' => 'Modificar la publicacion', ], ]; diff --git a/app/Language/oc/Fediverse.php b/app/Language/oc/Fediverse.php index 32f54c07..aacff9d4 100644 --- a/app/Language/oc/Fediverse.php +++ b/app/Language/oc/Fediverse.php @@ -9,29 +9,29 @@ declare(strict_types=1); */ return [ - 'your_handle' => 'Your handle', - 'your_handle_hint' => 'Enter the @username@domain you want to act from.', + 'your_handle' => 'Vòstre escais-nom', + 'your_handle_hint' => 'Picatz lo @escais@domeni amb qui volètz interagir.', 'follow' => [ - 'label' => 'Follow', - 'title' => 'Follow {actorDisplayName}', - 'subtitle' => 'You are going to follow:', - 'accountNotFound' => 'The account could not be found.', - 'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…', - 'submit' => 'Proceed to follow', + 'label' => 'Seguir', + 'title' => 'Seguir {actorDisplayName}', + 'subtitle' => 'Sètz a mand de seguir :', + 'accountNotFound' => 'Impossible de trobar lo compte.', + 'remoteFollowNotAllowed' => 'Sembla que lo servidor del compte permet pas lo seguiment a distància…', + 'submit' => 'Contunhar', ], 'favourite' => [ - 'title' => "Favourite {actorDisplayName}'s post", - 'subtitle' => 'You are going to favourite:', - 'submit' => 'Proceed to favourite', + 'title' => "Metre en favorit la publicacion de {actorDisplayName}", + 'subtitle' => 'Sètz a mand de metre en favorit :', + 'submit' => 'Contunhar', ], 'reblog' => [ - 'title' => "Share {actorDisplayName}'s post", - 'subtitle' => 'You are going to share:', - 'submit' => 'Proceed to share', + 'title' => "Partejar la publicacion de {actorDisplayName}", + 'subtitle' => 'Sètz a mand de partejar :', + 'submit' => 'Contunhar', ], 'reply' => [ - 'title' => "Reply to {actorDisplayName}'s post", - 'subtitle' => 'You are going to reply to:', - 'submit' => 'Proceed to reply', + 'title' => "Respondre a la publicacion de {actorDisplayName}", + 'subtitle' => 'Sètz a mand de respondre a :', + 'submit' => 'Contunhar', ], ]; diff --git a/app/Language/oc/Home.php b/app/Language/oc/Home.php index 1518239b..c0844914 100644 --- a/app/Language/oc/Home.php +++ b/app/Language/oc/Home.php @@ -9,12 +9,12 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'sort_by' => 'Sort by', + 'all_podcasts' => 'Totes los podcasts', + 'sort_by' => 'Triar per', 'sort_options' => [ - 'activity' => 'Recent activity', - 'created_desc' => 'Newest first', - 'created_asc' => 'Oldest first', + 'activity' => 'Activitat recenta', + 'created_desc' => 'Lo mai recent d’en primièr', + 'created_asc' => 'Lo mai vièlh d’en primièr', ], - 'no_podcast' => 'No podcast found', + 'no_podcast' => 'Cap de podcast pas trobat', ]; diff --git a/app/Language/oc/Page.php b/app/Language/oc/Page.php index 7cd60669..39fff7c8 100644 --- a/app/Language/oc/Page.php +++ b/app/Language/oc/Page.php @@ -9,9 +9,9 @@ declare(strict_types=1); */ return [ - 'back_to_home' => 'Back to home', + 'back_to_home' => 'Tornar a l’acuèlh', 'map' => [ - 'title' => 'Map', - 'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.', + 'title' => 'Mapa', + 'description' => 'Descobrissètz d’episòdis de podcast plaçats sus una mapa amb {siteName} ! Viatjatz sus una mapa del monde e escotatz d’episòdis mencionant de lòcs especifics.', ], ]; diff --git a/app/Language/oc/Podcast.php b/app/Language/oc/Podcast.php index 2798fcdd..dfd9c26c 100644 --- a/app/Language/oc/Podcast.php +++ b/app/Language/oc/Podcast.php @@ -9,47 +9,47 @@ declare(strict_types=1); */ return [ - 'feed' => 'RSS Podcast feed', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'feed' => 'Flux RSS del podcast', + 'season' => 'Sason {seasonNumber}', + 'list_of_episodes_year' => '{year} episòdis ({episodeCount})', 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', - 'followTitle' => 'Follow {actorDisplayName} on the fediverse!', + 'Sason {seasonNumber} episòdis ({episodeCount})', + 'no_episode' => 'Cap d’episòdi pas trobat !', + 'follow' => 'Seguir', + 'followTitle' => 'Seguissètz {actorDisplayName} pell fedivèrs !', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# abonat} + other {# abonats} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# publicacion} + other {# publicacions} }', - 'links' => 'Links', - 'activity' => 'Activity', - 'episodes' => 'Episodes', - 'episodes_title' => 'Episodes of {podcastTitle}', - 'about' => 'About', + 'links' => 'Ligams', + 'activity' => 'Activitat', + 'episodes' => 'Episòdis', + 'episodes_title' => 'Episòdi de {podcastTitle}', + 'about' => 'A prepaus', 'stats' => [ - 'title' => 'Stats', + 'title' => 'Estatisticas', 'number_of_seasons' => '{0, plural, - one {# season} - other {# seasons} + one {# sason} + other {# sasons} }', 'number_of_episodes' => '{0, plural, - one {# episode} - other {# episodes} + one {# episòdi} + other {# episòdis} }', - 'first_published_at' => 'First episode published on {0, date, medium}', + 'first_published_at' => 'Primièr episòdi publicat lo {0, date, medium}', ], - 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', + 'sponsor' => 'Sosténer', + 'funding_links' => 'Ligams de finançament per {podcastTitle}', + 'find_on' => 'Trobatz {podcastTitle} sus', + 'listen_on' => 'Escotar sus', 'persons' => '{personsCount, plural, - one {# person} - other {# persons} + one {# persona} + other {# personas} }', - 'persons_list' => 'Persons', + 'persons_list' => 'Personas', 'castopod_website' => 'Castopod (website)', ]; diff --git a/app/Language/oc/Post.php b/app/Language/oc/Post.php index 58d1cf80..a3ab4ecb 100644 --- a/app/Language/oc/Post.php +++ b/app/Language/oc/Post.php @@ -9,32 +9,32 @@ declare(strict_types=1); */ return [ - 'title' => "{actorDisplayName}'s post", - 'back_to_actor_posts' => 'Back to {actor} posts', - 'actor_shared' => '{actor} shared', - 'reply_to' => 'Reply to @{actorUsername}', + 'title' => "Publicacion de {actorDisplayName}", + 'back_to_actor_posts' => 'Tornar a las publicacions de {actor}', + 'actor_shared' => '{actor} a partejat', + 'reply_to' => 'Respondre @{actorUsername}', 'form' => [ - 'message_placeholder' => 'Write a message…', - 'episode_message_placeholder' => 'Write a message for the episode…', - 'episode_url_placeholder' => 'Episode URL', - 'reply_to_placeholder' => 'Reply to @{actorUsername}', - 'submit' => 'Send', - 'submit_reply' => 'Reply', + 'message_placeholder' => 'Escriure un messatge…', + 'episode_message_placeholder' => 'Escriure un messatge per l’espisòdi…', + 'episode_url_placeholder' => 'URL de l’episòdi', + 'reply_to_placeholder' => 'Respondre @{actorUsername}', + 'submit' => 'Enviar', + 'submit_reply' => 'Respondre', ], 'favourites' => '{numberOfFavourites, plural, - one {# favourite} - other {# favourites} + one {# favorit} + other {# favorits} }', 'reblogs' => '{numberOfReblogs, plural, - one {# share} - other {# shares} + one {# partatge} + other {# partatges} }', 'replies' => '{numberOfReplies, plural, - one {# reply} - other {# replies} + one {# responsa} + other {# responsas} }', - 'expand' => 'Expand post', - 'block_actor' => 'Block user @{actorUsername}', - 'block_domain' => 'Block domain @{actorDomain}', - 'delete' => 'Delete post', + 'expand' => 'Espandir la publicacion', + 'block_actor' => 'Blocar l’utilizaire @{actorUsername}', + 'block_domain' => 'Blocar lo domeni @{actorDomain}', + 'delete' => 'Suprimir la publicacion', ]; diff --git a/docs/src/ar/index.md b/docs/src/ar/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/ar/index.md +++ b/docs/src/ar/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/br/index.md b/docs/src/br/index.md index 3da841c1..02738ead 100644 --- a/docs/src/br/index.md +++ b/docs/src/br/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/ca/index.md b/docs/src/ca/index.md index 9418ec77..93640310 100644 --- a/docs/src/ca/index.md +++ b/docs/src/ca/index.md @@ -185,30 +185,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -240,6 +240,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/da/index.md b/docs/src/da/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/da/index.md +++ b/docs/src/da/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/de/index.md b/docs/src/de/index.md index 8a611d95..b8f6140f 100644 --- a/docs/src/de/index.md +++ b/docs/src/de/index.md @@ -184,30 +184,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -239,6 +239,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/el/index.md b/docs/src/el/index.md index 799f81d6..c71137b8 100644 --- a/docs/src/el/index.md +++ b/docs/src/el/index.md @@ -184,30 +184,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -239,6 +239,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/es/index.md b/docs/src/es/index.md index c92df181..cf1c8e40 100644 --- a/docs/src/es/index.md +++ b/docs/src/es/index.md @@ -191,30 +191,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -246,6 +246,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/fa/index.md b/docs/src/fa/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/fa/index.md +++ b/docs/src/fa/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md index 9b00e21c..5a8d9bdf 100644 --- a/docs/src/fr/index.md +++ b/docs/src/fr/index.md @@ -187,30 +187,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -242,6 +242,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/fr2/index.md b/docs/src/fr2/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/fr2/index.md +++ b/docs/src/fr2/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/fr_CA/index.md b/docs/src/fr_CA/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/fr_CA/index.md +++ b/docs/src/fr_CA/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/gd/index.md +++ b/docs/src/gd/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/gl/index.md b/docs/src/gl/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/gl/index.md +++ b/docs/src/gl/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/id/index.md b/docs/src/id/index.md index a6888700..58415ff2 100644 --- a/docs/src/id/index.md +++ b/docs/src/id/index.md @@ -184,30 +184,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -239,6 +239,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/it/getting-started/auth.md b/docs/src/it/getting-started/auth.md index 8f3b5dc8..18fb8027 100644 --- a/docs/src/it/getting-started/auth.md +++ b/docs/src/it/getting-started/auth.md @@ -44,45 +44,45 @@ definiti a due livelli: -## 2. Per podcast roles and permissions +## 2. Per i ruoli e le autorizzazioni del podcast -### Per podcast roles +### Per i ruoli del podcast -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| ruolo | descrizione | autorizzazioni | +| ------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Ha il controllo completo del podcast #{id}. | \* | +| Editor | Gestisce contenuti e pubblicazioni del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autore | Gestisce i contenuti del podcast #{id}, ma non li può pubblicare. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Ospite | Collaboratore generale del podcast #{id}. | view, episodes.view | -### Per podcast permissions +### Autorizzazioni per podcast -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| autorizzazione | descrizione | +| ---------------------------- | ---------------------------------------------------------------------------------------------------- | +| view | Può visualizzare il pannello di controllo e le statistiche del podcast #{id}. | +| edit | Può modificare il podcast #{id}. | +| delete | Può eliminare il podcast #{id}. | +| manage-import | Può sincronizzare il podcast #{id} importato. | +| manage-persons | Può gestire le iscrizioni del podcast #{id}. | +| manage-subscriptions | Può gestire le iscrizioni del podcast #{id}. | +| manage-contributors | Può gestire i collaboratori del podcast #{id}. | +| manage-platforms | Può impostare/rimuovere i link della piattaforma del podcast #{id}. | +| manage-publications | Può pubblicare il podcast #{id}. | +| manage-notifications | Può visualizzare e contrassegnare le notifiche come lette per il podcast #{id}. | +| interact-as | Può interagire come il podcast #{id}, per salvare tra i preferiti, condividere o rispondere ai post. | +| episodes.view | Può visualizzare il pannello di controllo e le statistiche del podcast #{id}. | +| episodes.create | Può creare episodi per il podcast #{id}. | +| episodes.edit | Può modificare il podcast #{id}. | +| episodes.delete | Può eliminare il podcast #{id}. | +| episodes.manage-persons | Può gestire gli abbonamenti del podcast #{id}. | +| episodes.manage-clips | Può gestire le clip video o i suoni del podcast #{id}. | +| episodes.manage-publications | Può pubblicare il podcast #{id}. | +| episodes.manage-comments | Può creare/rimuovere i commenti dell'episodio del podcast #{id}. | diff --git a/docs/src/it/index.md b/docs/src/it/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/it/index.md +++ b/docs/src/it/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/ja/index.md b/docs/src/ja/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/ja/index.md +++ b/docs/src/ja/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/kk/index.md b/docs/src/kk/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/kk/index.md +++ b/docs/src/kk/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/ko/index.md b/docs/src/ko/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/ko/index.md +++ b/docs/src/ko/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/nl/getting-started/auth.md b/docs/src/nl/getting-started/auth.md index ebeccf1e..01b2a298 100644 --- a/docs/src/nl/getting-started/auth.md +++ b/docs/src/nl/getting-started/auth.md @@ -21,7 +21,7 @@ niveaus: | rol | omschrijving | rechten | | ----------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | | Super admin | Heeft de volledige controle over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Beheerder | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | | Podcaster | Algemene gebruikers van Castopod. | admin.access | @@ -50,12 +50,12 @@ niveaus: -| rol | omschrijving | rechten | -| ------ | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Heeft de volledige controle over podcast #{id}. | \* | -| Editor | Beheert inhoud en publicaties van podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Beheert de inhoud van podcast #{id} maar kan deze niet publiceren. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | Algemene bijdrager van podcast #{id}. | view, episodes.view | +| rol | omschrijving | rechten | +| --------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Beheerder | Heeft de volledige controle over podcast #{id}. | \* | +| Editor | Beheert inhoud en publicaties van podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Auteur | Beheert de inhoud van podcast #{id} maar kan deze niet publiceren. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gast | Algemene bijdrager van podcast #{id}. | view, episodes.view | @@ -65,9 +65,9 @@ niveaus: | recht | omschrijving | | ---------------------------- | -------------------------------------------------------------------------------------- | -| view | Kan dashboard en statistieken van podcast #{id} zien. | -| edit | Kan podcast #{id} wijzigen. | -| delete | Kan podcast #{id} verwijderen. | +| weergeven | Kan dashboard en statistieken van podcast #{id} zien. | +| bewerken | Kan podcast #{id} wijzigen. | +| verwijderen | Kan podcast #{id} verwijderen. | | manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. | | manage-persons | Kan personen van podcast #{id} beheren. | | manage-subscriptions | Kan abonnees van podcast #{id} beheren. | diff --git a/docs/src/nl/getting-started/docker.md b/docs/src/nl/getting-started/docker.md index 75158bd6..23cc9eb9 100644 --- a/docs/src/nl/getting-started/docker.md +++ b/docs/src/nl/getting-started/docker.md @@ -107,52 +107,52 @@ can be added as a cache handler. 5. You're all set, start podcasting! 🎙️🚀 -## Environment Variables +## Omgevingsvariabelen - **castopod/castopod** and **castopod/app** - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | - | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | - | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | - | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | - | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | - | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | - | **`CP_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | - | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | - | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | - | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | - | **`CP_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | + | De naam van de variabele | Type (`default`) | Standaard | + | ------------------------------------- | ----------------------- | ------------------ | + | **`CP_BASEURL`** | tekenreeks | `niet gedefineerd` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `niet gedefineerd` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `niet gedefineerd` | + | **`CP_EMAIL_FROM`** | ?string | `niet gedefineerd` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + | **`CP_ENABLE_2FA`** | ?boolean | `niet gedefineerd` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `niet gedefineerd` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `niet gedefineerd` | + | **`CP_MEDIA_S3_KEY`** | ?string | `niet gedefineerd` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `niet gedefineerd` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `niet gedefineerd` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `niet gedefineerd` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `niet gedefineerd` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | - **castopod/web-server** - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | + | De naam van de variabele | Soort | Standaard | + | ------------------------ | --------------------- | --------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/nl/getting-started/install.md b/docs/src/nl/getting-started/install.md index cdea18ec..ad399c31 100644 --- a/docs/src/nl/getting-started/install.md +++ b/docs/src/nl/getting-started/install.md @@ -1,9 +1,9 @@ --- -title: Installation +title: Installatie sidebarDepth: 3 --- -# How to install Castopod? +# Hoe installeer je Castopod? Castopod was thought-out to be easy to install. Whether using dedicated or shared hosting, you can install it on most PHP-MySQL compatible web servers. @@ -17,7 +17,7 @@ If you prefer using Docker, you may skip this and go straight to the ::: -## Requirements +## Vereisten - PHP v8.1 or higher - MySQL version 5.7 or higher or MariaDB version 10.2 or higher @@ -113,7 +113,7 @@ want to generate Video Clips. The following extensions must be installed: 1. Run the Castopod install script by going to the install wizard page (`https://your_domain_name.com/cp-install`) in your favorite web browser. 2. Follow the instructions on your screen. -3. Start podcasting! +3. Begin met podcasting! ::: info Note @@ -157,19 +157,19 @@ email.SMTPUser="your_smtp_user" email.SMTPPass="your_smtp_password" ``` -#### Email config options +#### E-mail configuratieopties -| Variable name | Type | Default | -| ---------------- | -------------------- | ------------ | -| **`fromEmail`** | string | `undefined` | -| **`fromName`** | string | `"Castopod"` | -| **`SMTPHost`** | string | `undefined` | -| **`SMTPUser`** | string | `undefined` | -| **`SMTPPass`** | string | `undefined` | -| **`SMTPPort`** | number | `25` | -| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | +| De naam van de variabele | Soort | Standaard | +| ------------------------ | -------------------- | ------------------ | +| **`fromEmail`** | string | `niet gedefineerd` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | tekenreeks | `niet gedefineerd` | +| **`SMTPUser`** | tekenreeks | `niet gedefineerd` | +| **`SMTPPass`** | tekenreeks | `niet gedefineerd` | +| **`SMTPPort`** | nummer | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | -### Media storage +### Mediaopslag By default, files are saved to the `public/media` folder using the file system. If you need to relocate the `media` folder to a different location, you can @@ -202,16 +202,16 @@ media.s3.region="your_s3_region" #### S3 config options -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | +| Variable name | Type | Default | +| ----------------------- | ---------- | ------------------ | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | tekenreeks | `niet gedefineerd` | +| **`region`** | tekenreeks | `niet gedefineerd` | +| **`bucket`** | tekenreeks | `castopod` | +| **`protocol`** | nummer | `niet gedefineerd` | +| **`pathStyleEndpoint`** | boolean | `onwaar` | +| **`keyPrefix`** | tekenreeks | `niet gedefineerd` | ## Community packages diff --git a/docs/src/nl/getting-started/security.md b/docs/src/nl/getting-started/security.md index e205698d..e99a3aea 100644 --- a/docs/src/nl/getting-started/security.md +++ b/docs/src/nl/getting-started/security.md @@ -1,8 +1,8 @@ --- -title: Security +title: Beveiliging --- -# Security concerns +# Veiligheidszorgen Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP framework that encourages diff --git a/docs/src/nl/getting-started/update.md b/docs/src/nl/getting-started/update.md index 98e019fb..f1490c38 100644 --- a/docs/src/nl/getting-started/update.md +++ b/docs/src/nl/getting-started/update.md @@ -1,5 +1,5 @@ --- -title: Update +title: Bijwerken sidebarDepth: 3 --- @@ -64,13 +64,13 @@ Releases may come with additional update instructions (see ::: -## Fully Automated updates +## Volledig geautomatiseerde updates -> Coming soon... 👀 +> Binnenkort beschikbaar... 👀 -## Frequently asked questions (FAQ) +## Veelgestelde vragen (FAQ) -### Where can I find my Castopod version? +### Waar kan ik mijn Castopod versie vinden? Go to your Castopod admin panel, the version is displayed on the bottom left corner. @@ -80,9 +80,9 @@ file. ### I haven't updated my instance in a long time… What should I do? -No problem! Just get the latest release as described above. Only, when going -through the release instructions (4), perform them sequentially, from the oldest -to the newest. +Geen probleem! Krijg gewoon de laatste versie zoals hierboven beschreven. Only, +when going through the release instructions (4), perform them sequentially, from +the oldest to the newest. > You may want to backup your instance depending on how long you haven't updated > Castopod. @@ -99,9 +99,9 @@ For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. -3. ✨ Enjoy your fresh instance, you're all done! +3. ✨ Geniet van je nieuwe instantie, je bent helemaal klaar! -### Should I make a backup before updating? +### Moet ik een back-up maken voordat ik update? We advise you do, so you don't lose everything if anything goes wrong! diff --git a/docs/src/nl/index.md b/docs/src/nl/index.md index 42ec8ed0..12ac44f3 100644 --- a/docs/src/nl/index.md +++ b/docs/src/nl/index.md @@ -2,7 +2,7 @@ sidebarDepth: 2 --- -# Welcome 👋 +# Welkom 👋 [![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] @@ -14,24 +14,24 @@ Castopod is easy to install and was built on top of small footprint. -## Features +## Functies -- 🌱  Free & open-source (AGPL v3 License) +- 🌱  Gratis & open-source (AGPL v3 Licentie) - 🔐  Focused on data sovereignty: your content, audience, and analytics belong to you, and you only - 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, chapters, location, persons, soundbites, … -- 💬  Built-in social network: +- 💬  Ingebouwd sociaal netwerk: - 🚀  Castopod is part of the Fediverse, a decentralized social network - ❤️  Create posts, share, favourite, and comment on episodes - 📈  Built-in analytics: - ⚖️  GDPR / CCPA / LGPD compliant - 🪙  Standard IABv2 audience measurement - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: +- 📢  Ingebouwde marketingtools: - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - 📱  PWA: install as a standalone app - 🎨  Customizable theme colors @@ -55,7 +55,7 @@ small footprint. Brazilian Portuguese & Spanish… with [more to come](https://translate.castopod.org)! -## Motivation +## Motivatie The podcasting ecosystem is decentralized by nature: you can create your podcast as an RSS file, publish it on the web and have it shared everywhere online. @@ -86,9 +86,9 @@ gauge whether Castopod is the right fit for you. ### Castopod vs Wordpress Castopod is often referred to as "the Wordpress for podcasts" because of the -similarities between the two. In some ways this is true. And actually, Castopod -was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption -from the community and the number of websites running it. +similarities between the two. In sommige opzichten is dat waar. And actually, +Castopod was greatly inspired by the Wordpress ecosystem, seeing the ease of +adoption from the community and the number of websites running it. Just like Wordpress, Castopod is free & open source, built using PHP with a MySQL database and is packaged in a way that you can easily install on most web @@ -145,12 +145,12 @@ That being said, there are two main differences with other podcasting solutions: social network with ActivityPub as well as many of the podcasting 2.0 features, hoping to bridge the gap between the two. -## Contributing +## Bijdragen -Love Castopod and would like to help? Take a look at the following documentation -to get you started. +Houdt u van Castopod en wilt u u helpen? Take a look at the following +documentation to get you started. -### Code of conduct +### Gedragscode Castopod has adopted a Code of Conduct that we expect project participants to adhere to. Please read the @@ -163,10 +163,10 @@ Read our [contributing guide](./contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. -## Contributors ✨ +## Bijdragers ✨ -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): +Bedankt aan deze geweldige mensen +([emoji sleutel](https://allcontributors.org/docs/en/emoji-key)): @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 @@ -249,7 +250,7 @@ Thanks goes to these wonderful people This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! +specification. Bijdragen van elke vorm zijn welkom! ## Contact @@ -268,7 +269,7 @@ Castopod: - [LinkedIn](https://linkedin.com/company/castopod) - [Facebook](https://www.facebook.com/castopod) -## Sponsors +## Sponsoren The ongoing development of Castopod is made possible with the support of its backers. If you'd like to help, please consider diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md index 51053794..dab9b77e 100644 --- a/docs/src/nn-NO/index.md +++ b/docs/src/nn-NO/index.md @@ -188,30 +188,30 @@ Mange takk til dei flotte folka på Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -243,6 +243,7 @@ Mange takk til dei flotte folka på KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/oc/index.md b/docs/src/oc/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/oc/index.md +++ b/docs/src/oc/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/pl/index.md b/docs/src/pl/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/pl/index.md +++ b/docs/src/pl/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/pt-BR/getting-started/auth.md b/docs/src/pt-BR/getting-started/auth.md index ce98d873..71ae5a8f 100644 --- a/docs/src/pt-BR/getting-started/auth.md +++ b/docs/src/pt-BR/getting-started/auth.md @@ -14,75 +14,75 @@ níveis: ## Papéis e permissões para toda a instância -### Instance roles +### Cargos de instância -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| cargos | descrição | permissões | +| ----------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Tem controle completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Gerentes | Gerencia o conteúdo de Castopod. | criar.podcasts, importar.podcasts, gerenciar.pessoas, gerenciar.páginas | +| Podcaster | Usuários gerais do Castopod. | admin.access | -### Instance permissions +### Permissões da instância -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permissões | descrição | +| ----------------------- | ---------------------------------------------------------------- | +| admin.access | Pode acessar a área de administração do Castopod. | +| admin.settings | Pode acessar as configurações de Castopod. | +| users.manage | Pode gerenciar usuários do Castopod. | +| persons.manage | Pode gerenciar pessoas. | +| pages.manage | Pode gerenciar páginas. | +| podcasts.view | Pode ver todos os podcasts. | +| podcasts.create | Pode criar novos podcasts. | +| podcasts.import | Pode importar podcasts. | +| fediverse.manage-blocks | Pode bloquear ator/domínios distintos de interagir com Castopod. | -## 2. Per podcast roles and permissions +## 2. Por funções de podcast e permissões -### Per podcast roles +### Por cargos de podcast -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| cargos | descrição | permissões | +| --------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Tem controle completo de podcast #{id}. | \* | +| Editor | Gerencia o conteúdo e as publicações do podcast #{id}. | visualizar, editar, gerenciar-importação, gerenciar-pessoas, gerenciar-plataformas, gerenciar-publicações, gerenciar-notificações, interagir-com, visualizar.episódios, criar.episódios,deletar.episódios, gerenciar-pessoas.episódios, gerenciar-clips.episódios, gerenciar-publicações.episódios, gerenciar-comentários.episódios | +| Autor | Gerencia o conteúdo do podcast #{id} mas não pode publicá-los. | visualizar, gerenciar-pessoas, visualizar.episódios, criar.episódios, editar.episódios, gerenciar-pessoas.episódios, gerenciar-clips.episódios | +| Convidado | Contribuidor geral do podcast #{id}. | visualizar, visualizar.episódios | -### Per podcast permissions +### Por permissões de podcast -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permissões | descrição | +| --------------------------------- | ------------------------------------------------------------------------------------------- | +| visualizar | Pode visualizar o painel de controle e análise de podcast #{id}. | +| editar | Pode editar podcast #{id}. | +| excluir | Pode excluir o podcast #{id}. | +| gerenciar-importações | Pode sincronizar o podcast importado #{id}. | +| gerenciar-pessoas | Pode gerenciar assinantes de podcast #{id}. | +| gerenciar-assinaturas | Pode gerenciar assinaturas de podcast #{id}. | +| gerente-contribuidores | Pode gerenciar contribuidores do podcast #{id}. | +| gerenciar-plataformas | Pode definir/remover links de plataforma do podcast #{id}. | +| gerencie-publicações | Pode publicar podcast #{id}. | +| gerenciar-notificações | Pode ver e marcar notificações como lidas para o podcast #{id}. | +| interagir-como | Pode interagir com o podcast #{id} para favorito, compartilhar ou responder às publicações. | +| visualizar.episódios | Pode visualizar o painel de controle e análise de podcast #{id}. | +| criar.episódio | Pode criar episódios para o podcast #{id}. | +| editar.episódios | Pode editar o podcast #{id}. | +| deletar.episódios | Pode deletar episódios do podcast #{id}. | +| gerenciar-pessoas.episódios | Pode gerenciar assinaturas de episódios do podcast #{id}. | +| gerenciar-clips.episódios | Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}. | +| gerenciar-publicações.episódios | Pode publicar episódios do podcast #{id}. | +| gerenteciar-comentários.episódios | Pode criar/remover comentários de episódio do podcast #{id}. | diff --git a/docs/src/pt-BR/index.md b/docs/src/pt-BR/index.md index 1067e4a9..84bbb788 100644 --- a/docs/src/pt-BR/index.md +++ b/docs/src/pt-BR/index.md @@ -184,30 +184,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -239,6 +239,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/pt/index.md b/docs/src/pt/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/pt/index.md +++ b/docs/src/pt/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/ro/index.md b/docs/src/ro/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/ro/index.md +++ b/docs/src/ro/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/ru/index.md b/docs/src/ru/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/ru/index.md +++ b/docs/src/ru/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/sk/index.md b/docs/src/sk/index.md index 53630d69..04bdf108 100644 --- a/docs/src/sk/index.md +++ b/docs/src/sk/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/sr_Latn/index.md b/docs/src/sr_Latn/index.md index 1bf9bfe0..9e8a4669 100644 --- a/docs/src/sr_Latn/index.md +++ b/docs/src/sr_Latn/index.md @@ -185,30 +185,30 @@ Veliko hvala ovim divnim ljudima Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -240,6 +240,7 @@ Veliko hvala ovim divnim ljudima KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/sv/index.md b/docs/src/sv/index.md index 1c3ede76..feeb7306 100644 --- a/docs/src/sv/index.md +++ b/docs/src/sv/index.md @@ -160,7 +160,7 @@ so that you can understand what actions will and will not be tolerated. ### Bidragande guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. @@ -184,30 +184,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -239,6 +239,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/uk/index.md b/docs/src/uk/index.md index 42ec8ed0..b63ff645 100644 --- a/docs/src/uk/index.md +++ b/docs/src/uk/index.md @@ -183,30 +183,30 @@ Thanks goes to these wonderful people Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -238,6 +238,7 @@ Thanks goes to these wonderful people KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md index 1effc2f8..6ea4b942 100644 --- a/docs/src/zh-Hans/index.md +++ b/docs/src/zh-Hans/index.md @@ -160,30 +160,30 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能 Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔 Sebastian Janik
    Sebastian Janik

    💻 Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻 - denis d
    denis d

    🐛 🤔 + denis d
    denis d

    🐛 🤔 Douglas Kastle
    Douglas Kastle

    🐛 🤔 cExplorer
    cExplorer

    🐛 🌍 ImaCrea
    ImaCrea

    🐛 🤔 Jonas S
    Jonas S

    💻 LEFEBVRE Yann
    LEFEBVRE Yann

    🐛 Sebastian Späth
    Sebastian Späth

    🐛 🤔 - rocky III
    rocky III

    🐛 + rocky III
    rocky III

    🐛 Hermann Josef Eckl
    Hermann Josef Eckl

    🐛 Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔 João Leandro
    João Leandro

    🌍 🤔 Angelos Chouvardas
    Angelos Chouvardas

    🌍 Eivind
    Eivind

    🌍 - Ewen
    Ewen

    🌍 🤔 forght
    forght

    🌍 @@ -215,6 +215,7 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能 KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/modules/Admin/Language/ar/Podcast.php b/modules/Admin/Language/ar/Podcast.php index e939acb8..5a39a0b1 100644 --- a/modules/Admin/Language/ar/Podcast.php +++ b/modules/Admin/Language/ar/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php index 93096c32..fd9a801a 100644 --- a/modules/Admin/Language/br/Podcast.php +++ b/modules/Admin/Language/br/Podcast.php @@ -119,6 +119,7 @@ return [ 'premium_by_default' => 'Ar rannoù a zo evit ar re bremium dre ziouer', 'premium_by_default_hint' => 'Rannoù ar podkast a vo merket Premium dre ziouer. Gallout a rit lakaat rannoù zo evel publik.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/ca/Podcast.php b/modules/Admin/Language/ca/Podcast.php index 7dbb632d..d4622b9c 100644 --- a/modules/Admin/Language/ca/Podcast.php +++ b/modules/Admin/Language/ca/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Els episodis s\'han d\'establir com a prèmium de manera predeterminada', 'premium_by_default_hint' => 'Els episodis de pòdcast es marcaran com a prèmium de manera predeterminada. Encara podreu escollir configurar alguns episodis, tràilers o bonificacions com a públics.', 'op3' => 'Projecte obert de prefix de pòdcast (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Valoreu les vostres dades estadístiques amb OP3, un servei d\'anàlisi de tercers de codi obert i de confiança. Compartiu, valideu i compareu les vostres dades d\'anàlisi amb l\'ecosistema de podcasting obert.', 'op3_enable' => 'Habilita el servei d\'estadístiques OP3', 'op3_enable_hint' => 'Per motius de seguretat, les dades d\'anàlisi dels episodis prèmium no es compartiran amb OP3.', diff --git a/modules/Admin/Language/da/Podcast.php b/modules/Admin/Language/da/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/da/Podcast.php +++ b/modules/Admin/Language/da/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php index a63cf5bd..a2ca8afa 100644 --- a/modules/Admin/Language/de/Podcast.php +++ b/modules/Admin/Language/de/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episoden müssen standardmäßig als Premium festgelegt werden', 'premium_by_default_hint' => 'Podcast-Episoden werden standardmäßig als Premium markiert. Sie können dennoch einzelne Episoden, Trailer oder Boni als öffentlich festlegen.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Werten Sie Ihre Analysedaten mit OP3 auf, einem quelloffenen und vertrauenswürdigen Analysedienst eines Drittanbieters. Teilen, validieren und vergleichen Sie Ihre Analysedaten in dem offenen Podcast-Ökosystem.', 'op3_enable' => 'OP3-Analysedienst aktivieren', 'op3_enable_hint' => 'Aus Sicherheitsgründen werden die Analysedaten von Premium-Episoden nicht mit OP3 geteilt.', diff --git a/modules/Admin/Language/el/Podcast.php b/modules/Admin/Language/el/Podcast.php index ce149e55..ee447113 100644 --- a/modules/Admin/Language/el/Podcast.php +++ b/modules/Admin/Language/el/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Τα επεισόδια πρέπει να ορίζονται ως premium από προεπιλογή', 'premium_by_default_hint' => 'Τα επεισόδια Podcast θα επισημανθούν ως premium από προεπιλογή. Μπορείτε ακόμα να επιλέξετε να ορίσετε κάποια επεισόδια, trailers ή μπόνους ως δημόσια.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/es/Podcast.php b/modules/Admin/Language/es/Podcast.php index d867abd5..9a241e8f 100644 --- a/modules/Admin/Language/es/Podcast.php +++ b/modules/Admin/Language/es/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Los episodios deben establecerse como premium por defecto', 'premium_by_default_hint' => 'Los episodios Podcast se marcarán como premium de forma predeterminada. Todavía puedes elegir establecer algunos episodios, trailers o bonificaciones como públicos.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Analiza tus datos de estadísticas con OP3, un servicio de analíticas fiable y de código abierto. Comparte, valida y compara tus estadísticas con el ecosistema de podcasting abierto.', 'op3_enable' => 'Activa el servicio de estadísticas OP3', 'op3_enable_hint' => 'Por motivos de seguridad, las estadísticas de los episodios premium no serán compartidas con OP3.', diff --git a/modules/Admin/Language/fa/Podcast.php b/modules/Admin/Language/fa/Podcast.php index 8660eac5..f9dd818f 100644 --- a/modules/Admin/Language/fa/Podcast.php +++ b/modules/Admin/Language/fa/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/fr/Podcast.php b/modules/Admin/Language/fr/Podcast.php index ed221e7c..c689f8cd 100644 --- a/modules/Admin/Language/fr/Podcast.php +++ b/modules/Admin/Language/fr/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Les épisodes doivent être définis comme premium par défaut', 'premium_by_default_hint' => 'Les épisodes de Podcast seront marqués comme premium par défaut. Vous pouvez toujours choisir de définir certains épisodes, bandes-annonces ou bonus comme publics.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Valorisez vos données d\'analyse avec OP3, un service d\'analyse tiers open source et de confiance. Partagez, validez et comparez vos données analytiques avec l\'écosystème de podcasting ouvert.', 'op3_enable' => 'Activer le service d\'analyse OP3', 'op3_enable_hint' => 'Pour des raisons de sécurité, les données d\'analyse des épisodes premium ne seront pas partagées avec OP3.', diff --git a/modules/Admin/Language/fr2/Podcast.php b/modules/Admin/Language/fr2/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/fr2/Podcast.php +++ b/modules/Admin/Language/fr2/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/fr_CA/Podcast.php b/modules/Admin/Language/fr_CA/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/fr_CA/Podcast.php +++ b/modules/Admin/Language/fr_CA/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/gd/Podcast.php b/modules/Admin/Language/gd/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/gd/Podcast.php +++ b/modules/Admin/Language/gd/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/gl/Podcast.php b/modules/Admin/Language/gl/Podcast.php index 2b3237ba..af958427 100644 --- a/modules/Admin/Language/gl/Podcast.php +++ b/modules/Admin/Language/gl/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Os episodios estableceranse por defecto como premium', 'premium_by_default_hint' => 'Os episodios vanse marcar por defecto como premium. Podes igualmente elexir algúns episodios, mostras ou extras como públicos.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/id/Podcast.php b/modules/Admin/Language/id/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/id/Podcast.php +++ b/modules/Admin/Language/id/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/it/Podcast.php b/modules/Admin/Language/it/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/it/Podcast.php +++ b/modules/Admin/Language/it/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/ja/Podcast.php b/modules/Admin/Language/ja/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/ja/Podcast.php +++ b/modules/Admin/Language/ja/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/kk/Podcast.php b/modules/Admin/Language/kk/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/kk/Podcast.php +++ b/modules/Admin/Language/kk/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/ko/Podcast.php b/modules/Admin/Language/ko/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/ko/Podcast.php +++ b/modules/Admin/Language/ko/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/nl/Common.php b/modules/Admin/Language/nl/Common.php index 4f1fd4f3..65bbbdfe 100644 --- a/modules/Admin/Language/nl/Common.php +++ b/modules/Admin/Language/nl/Common.php @@ -40,7 +40,7 @@ return [ ], 'upload_file' => 'Bestand uploaden', 'remote_url' => 'Externe URL', - 'save' => 'Save', + 'save' => 'Opslaan', ], 'play_episode_button' => [ 'play' => 'Afspelen', diff --git a/modules/Admin/Language/nl/Countries.php b/modules/Admin/Language/nl/Countries.php index 6534c0f0..fb40fe7c 100644 --- a/modules/Admin/Language/nl/Countries.php +++ b/modules/Admin/Language/nl/Countries.php @@ -161,36 +161,36 @@ return [ 'MO' => 'Macau', 'MP' => 'Noordelijke Mariana eilanden', 'MQ' => 'Martinique', - 'MR' => 'Mauritania', + 'MR' => 'Mauritanië', 'MS' => 'Montserrat', 'MT' => 'Malta', 'MU' => 'Mauritius', - 'MV' => 'Maldives', + 'MV' => 'Maldiven', 'MW' => 'Malawi', 'MX' => 'Mexico', - 'MY' => 'Malaysia', + 'MY' => 'Maleisië', 'MZ' => 'Mozambique', 'N/A' => 'Not Applicable (local IP…)', - 'NA' => 'Namibia', + 'NA' => 'Namibië', 'NC' => 'New Caledonia', 'NE' => 'Niger', 'NF' => 'Norfolk Island', 'NG' => 'Nigeria', 'NI' => 'Nicaragua', - 'NL' => 'Netherlands', - 'NO' => 'Norway', + 'NL' => 'Nederland', + 'NO' => 'Noorwegen', 'NP' => 'Nepal', 'NR' => 'Nauru', 'NU' => 'Niue', - 'NZ' => 'New Zealand', + 'NZ' => 'Nieuw-Zeeland', 'OM' => 'Oman', 'PA' => 'Panama', 'PE' => 'Peru', 'PF' => 'French Polynesia', 'PG' => 'Papua New Guinea', - 'PH' => 'Philippines', + 'PH' => 'Filipijnen', 'PK' => 'Pakistan', - 'PL' => 'Poland', + 'PL' => 'Polen', 'PM' => 'Saint Pierre and Miquelon', 'PN' => 'Pitcairn', 'PR' => 'Puerto Rico', @@ -246,19 +246,19 @@ return [ 'UM' => 'Kleine afgelegen eilanden van de Verenigde Staten', 'US' => 'Verenigde Staten', 'UY' => 'Uruguay', - 'UZ' => 'Uzbekistan', + 'UZ' => 'Oezbekistan', 'VA' => 'Holy See (Vatican City State)', 'VC' => 'Saint Vincent and the Grenadines', 'VE' => 'Venezuela, Bolivarian Republic of', 'VG' => 'Virgin Islands, British', 'VI' => 'Virgin Islands, U.S.', - 'VN' => 'Viet Nam', + 'VN' => 'Vietnam', 'VU' => 'Vanuatu', 'WF' => 'Wallis and Futuna', 'WS' => 'Samoa', - 'YE' => 'Yemen', + 'YE' => 'Jemen', 'YT' => 'Mayotte', - 'ZA' => 'South Africa', + 'ZA' => 'Zuid-Afrika', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe', ]; diff --git a/modules/Admin/Language/nl/Dashboard.php b/modules/Admin/Language/nl/Dashboard.php index 881073fd..a768a6ce 100644 --- a/modules/Admin/Language/nl/Dashboard.php +++ b/modules/Admin/Language/nl/Dashboard.php @@ -9,20 +9,20 @@ declare(strict_types=1); */ return [ - 'home' => 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', + 'home' => 'Beheerdersdashboard', + 'welcome_message' => 'Welkom bij de beheeromgeving!', 'podcasts' => [ 'title' => 'Podcasts', 'not_found' => 'No published podcast', - 'last_published' => 'Last published on {lastPublicationDate}', + 'last_published' => 'Laatst gepubliceerd op {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episodes', + 'title' => 'Afleveringen', 'not_found' => 'No published episode', - 'last_published' => 'Last published on {lastPublicationDate}', + 'last_published' => 'Laatst gepubliceerd op {lastPublicationDate}', ], 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', + 'title' => 'Opslagruimte', + 'subtitle' => '{totalUploaded} van {totalStorage}', ], ]; diff --git a/modules/Admin/Language/nl/Episode.php b/modules/Admin/Language/nl/Episode.php index 88eac050..887e484a 100644 --- a/modules/Admin/Language/nl/Episode.php +++ b/modules/Admin/Language/nl/Episode.php @@ -22,10 +22,10 @@ return [ 'all_podcast_episodes' => 'Alle podcast afleveringen', 'back_to_podcast' => 'Terug naar podcast', 'edit' => 'Bewerken', - 'preview' => 'Preview', + 'preview' => 'Voorbeeld', 'publish' => 'Publiceren', 'publish_edit' => 'Publicatie bewerken', - 'publish_date_edit' => 'Edit publication date', + 'publish_date_edit' => 'Publicatiedatum bewerken', 'unpublish' => 'Publicatie ongedaan maken', 'publish_error' => 'Aflevering is reeds gepubliceerd.', 'publish_edit_error' => 'Aflevering is reeds gepubliceerd.', @@ -39,20 +39,20 @@ return [ 'create' => 'Aflevering toevoegen', 'publication_status' => [ 'published' => 'Gepubliceerd', - 'with_podcast' => 'Published', + 'with_podcast' => 'Gepubliceerd', 'scheduled' => 'Gepland', 'not_published' => 'Niet gepubliceerd', ], - 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'with_podcast_hint' => 'Nog te publiceren op hetzelfde moment als de podcast', 'list' => [ 'search' => [ - 'placeholder' => 'Search for an episode', - 'clear' => 'Clear search', - 'submit' => 'Search', + 'placeholder' => 'Zoek naar een aflevering', + 'clear' => 'Wis zoekopdracht', + 'submit' => 'Zoeken', ], 'number_of_episodes' => '{numberOfEpisodes, plural, - one {# episode} - other {# episodes} + one {# aflevering} + other {# afleveringen} }', 'episode' => 'Aflevering', 'visibility' => 'Zichtbaarheid', @@ -116,41 +116,41 @@ return [ 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', ], 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium' => 'Aflevering mag alleen toegankelijk zijn voor premium abonnees', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does the episode contain explicit content?', - 'undefined' => 'undefined', + 'label' => 'Ouderlijk advies', + 'hint' => 'Bevat de aflevering de expliciete inhoud?', + 'undefined' => 'niet gedefineerd', 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'explicit' => 'Expliciet', ], - 'show_notes_section_title' => 'Show notes', + 'show_notes_section_title' => 'Toon notities', 'show_notes_section_subtitle' => 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', - 'description' => 'Description', + 'description' => 'Omschrijving', 'description_footer' => 'Description footer', 'description_footer_hint' => 'This text is added at the end of each episode description, it is a good place to input your social links for example.', - 'additional_files_section_title' => 'Additional files', + 'additional_files_section_title' => 'Extra bestanden', 'additional_files_section_subtitle' => 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', - 'location_section_title' => 'Location', + 'location_section_title' => 'Locatie', 'location_section_subtitle' => 'What place is this episode about?', 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real or fictional location', - 'transcript' => 'Transcript (subtitles / closed captions)', + 'location_name_hint' => 'Dit kan een echte of fictieve locatie zijn', + 'transcript' => 'Transcript (ondertiteling / gesloten ondertitels)', 'transcript_hint' => 'Only .srt are allowed.', - 'transcript_download' => 'Download transcript', + 'transcript_download' => 'Transcriptie downloaden', 'transcript_file' => 'Transcript file (.srt)', 'transcript_remote_url' => 'Remote url for transcript', 'transcript_file_delete' => 'Delete transcript file', - 'chapters' => 'Chapters', + 'chapters' => 'Hoofdstukken', 'chapters_hint' => 'File must be in JSON Chapters format.', - 'chapters_download' => 'Download chapters', + 'chapters_download' => 'Hoofdstukken downloaden', 'chapters_file' => 'Chapters file', 'chapters_remote_url' => 'Remote url for chapters file', 'chapters_file_delete' => 'Delete chapters file', - 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_title' => 'Geavanceerde parameters', 'advanced_section_subtitle' => 'If you need RSS tags that Castopod does not handle, set them here.', 'custom_rss' => 'Custom RSS tags for the episode', @@ -158,58 +158,58 @@ return [ 'block' => 'Episode should be hidden from public catalogues', 'block_hint' => 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', - 'submit_create' => 'Create episode', - 'submit_edit' => 'Save episode', + 'submit_create' => 'Aflevering aanmaken', + 'submit_edit' => 'Aflevering opslaan', ], 'publish_form' => [ 'back_to_episode_dashboard' => 'Back to episode dashboard', 'post' => 'Your announcement post', 'post_hint' => "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'publication_date' => 'Publication date', + 'message_placeholder' => 'Schrijf uw bericht…', + 'publication_date' => 'Publicatiedatum', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', - 'with_podcast' => 'Publish alongside podcast', + 'now' => 'Nu', + 'schedule' => 'Plannen', + 'with_podcast' => 'Publiceer samen met podcast', ], - 'scheduled_publication_date' => 'Scheduled publication date', - 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date' => 'Gepland publicatiedatum', + 'scheduled_publication_date_clear' => 'Publicatiedatum wissen', 'scheduled_publication_date_hint' => 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit' => 'Publish', - 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', + 'submit' => 'Publiceren', + 'submit_edit' => 'Publicatie bewerken', + 'cancel_publication' => 'Publicatie annuleren', 'message_warning' => 'You did not write a message for your announcement post!', 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', - 'message_warning_submit' => 'Publish anyways', + 'message_warning_submit' => 'Toch publiceren', ], 'publish_date_edit_form' => [ - 'new_publication_date' => 'New publication date', + 'new_publication_date' => 'Nieuwe publicatiedatum', 'new_publication_date_hint' => 'Must be set to a past date.', - 'submit' => 'Edit publication date', + 'submit' => 'Publicatiedatum bewerken', ], 'unpublish_form' => [ 'disclaimer' => "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", 'understand' => 'I understand, I want to unpublish the episode', - 'submit' => 'Unpublish', + 'submit' => 'Publicatie ongedaan maken', ], 'delete_form' => [ 'disclaimer' => "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", 'understand' => 'I understand, I want to delete the episode', - 'submit' => 'Delete', + 'submit' => 'Verwijderen', ], 'embed' => [ 'title' => 'Embeddable player', 'label' => 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', 'clipboard_iframe' => 'Copy embeddable player to clipboard', - 'clipboard_url' => 'Copy address to clipboard', - 'dark' => 'Dark', + 'clipboard_url' => 'Kopieer adres naar klembord', + 'dark' => 'Donker', 'dark-transparent' => 'Dark transparent', - 'light' => 'Light', + 'light' => 'Licht', 'light-transparent' => 'Light transparent', ], 'publication_status_banner' => [ @@ -220,6 +220,6 @@ return [ with_podcast {This episode will be published at the same time as the podcast.} other {This episode is not yet published.} }', - 'preview' => 'Preview', + 'preview' => 'Voorbeeld', ], ]; diff --git a/modules/Admin/Language/nl/EpisodeNavigation.php b/modules/Admin/Language/nl/EpisodeNavigation.php index 1406e301..34577f82 100644 --- a/modules/Admin/Language/nl/EpisodeNavigation.php +++ b/modules/Admin/Language/nl/EpisodeNavigation.php @@ -11,13 +11,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'View episode page', 'dashboard' => 'Episode dashboard', - 'episode-view' => 'Home', - 'episode-edit' => 'Edit episode', - 'episode-persons-manage' => 'Manage persons', + 'episode-view' => 'Hoofdpagina', + 'episode-edit' => 'Aflevering bewerken', + 'episode-persons-manage' => 'Personen beheren', 'embed-add' => 'Embeddable player', 'clips' => 'Clips', - 'video-clips-list' => 'Video clips', - 'video-clips-create' => 'New video clip', + 'video-clips-list' => 'Videoclips', + 'video-clips-create' => 'Nieuwe videoclip', 'soundbites-list' => 'Soundbites', 'soundbites-create' => 'New soundbite', ]; diff --git a/modules/Admin/Language/nl/Fediverse.php b/modules/Admin/Language/nl/Fediverse.php index 0e4ca66d..b05be18a 100644 --- a/modules/Admin/Language/nl/Fediverse.php +++ b/modules/Admin/Language/nl/Fediverse.php @@ -10,23 +10,23 @@ declare(strict_types=1); return [ 'messages' => [ - 'actorNotFound' => 'The account could not be found!', - 'blockActorSuccess' => '{actor} has been blocked!', + 'actorNotFound' => 'Het account werd niet gevonden!', + 'blockActorSuccess' => '{actor} is geblokkeerd!', 'unblockActorSuccess' => 'Actor has been unblocked!', - 'blockDomainSuccess' => '{domain} has been blocked!', - 'unblockDomainSuccess' => '{domain} has been unblocked!', + 'blockDomainSuccess' => '{domain} is geblokkeerd!', + 'unblockDomainSuccess' => '{domain} is gedeblokkeerd!', ], - 'blocked_actors' => 'Blocked accounts', - 'blocked_domains' => 'Blocked domains', + 'blocked_actors' => 'Geblokkeerde accounts', + 'blocked_domains' => 'Geblokkeerde domeinen', 'block_lists_form' => [ 'handle' => 'Account handle', 'handle_hint' => 'Input @username@domain account.', - 'domain' => 'Domain name', + 'domain' => 'Domeinnaam', 'submit' => 'Block!', ], 'list' => [ 'actor' => 'Account', - 'domain' => 'Domain name', - 'unblock' => 'Unblock', + 'domain' => 'Domeinnaam', + 'unblock' => 'Deblokkeren', ], ]; diff --git a/modules/Admin/Language/nl/Home.php b/modules/Admin/Language/nl/Home.php index 3ff4c04d..8620f125 100644 --- a/modules/Admin/Language/nl/Home.php +++ b/modules/Admin/Language/nl/Home.php @@ -9,6 +9,6 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found', + 'all_podcasts' => 'Alle podcasts', + 'no_podcast' => 'Geen podcast gevonden', ]; diff --git a/modules/Admin/Language/nl/Install.php b/modules/Admin/Language/nl/Install.php index 36e373a2..cfd92f3f 100644 --- a/modules/Admin/Language/nl/Install.php +++ b/modules/Admin/Language/nl/Install.php @@ -9,12 +9,12 @@ declare(strict_types=1); */ return [ - 'manual_config' => 'Manual configuration', + 'manual_config' => 'Handmatige configuratie', 'manual_config_subtitle' => 'Create a `.env` file with your settings and refresh the page to continue installation.', 'form' => [ 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', + 'hostname' => 'Hostnaam', 'media_base_url' => 'Media base URL', 'media_base_url_hint' => 'If you use a CDN and/or an external analytics service, you may set them here.', @@ -28,7 +28,7 @@ return [ 'database_config_hint' => 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', + 'db_name' => 'Databasenaam', 'db_username' => 'Database username', 'db_password' => 'Database password', 'db_prefix' => 'Database prefix', @@ -39,16 +39,16 @@ return [ 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', 'cache_handler' => 'Cache handler', 'cacheHandlerOptions' => [ - 'file' => 'File', + 'file' => 'Bestand', 'redis' => 'Redis', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', + 'next' => 'Volgende', + 'submit' => 'Installatie voltooien', 'create_superadmin' => 'Create your superadmin account', - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', + 'email' => 'E-mail', + 'username' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', ], 'messages' => [ 'createSuperAdminSuccess' => diff --git a/modules/Admin/Language/nl/Navigation.php b/modules/Admin/Language/nl/Navigation.php index 5d1b4583..37989fff 100644 --- a/modules/Admin/Language/nl/Navigation.php +++ b/modules/Admin/Language/nl/Navigation.php @@ -9,35 +9,36 @@ declare(strict_types=1); */ return [ - 'toggle_sidebar' => 'Toggle sidebar', - 'go_to_website' => 'Go to website', + 'toggle_sidebar' => 'Zijbalk tonen/verbergen', + 'go_to_website' => 'Ga naar website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', - 'admin' => 'Home', + 'admin' => 'Hoofdpagina', 'podcasts' => 'Podcasts', - 'podcast-list' => 'All podcasts', - 'podcast-create' => 'New podcast', + 'podcast-list' => 'Alle podcasts', + 'podcast-create' => 'Nieuwe podcast', 'all-podcast-imports' => 'All Podcast imports', - 'podcast-imports-add' => 'Import a podcast', - 'persons' => 'Persons', - 'person-list' => 'All persons', - 'person-create' => 'New person', + 'podcast-imports-add' => 'Importeer een podcast', + 'persons' => 'Personen', + 'person-list' => 'Alle personen', + 'person-create' => 'Nieuwe persoon', 'fediverse' => 'Fediverse', - 'fediverse-blocked-actors' => 'Blocked accounts', - 'fediverse-blocked-domains' => 'Blocked domains', - 'users' => 'Users', - 'user-list' => 'All users', - 'user-create' => 'New user', - 'pages' => 'Pages', - 'page-list' => 'All pages', - 'page-create' => 'New Page', - 'settings' => 'Settings', - 'settings-general' => 'General', - 'settings-theme' => 'Theme', - 'admin-about' => 'About', + 'fediverse-blocked-actors' => 'Geblokkeerde accounts', + 'fediverse-blocked-domains' => 'Geblokkeerde domeinen', + 'users' => 'Gebruikers', + 'user-list' => 'Alle gebruikers', + 'user-create' => 'Nieuwe gebruiker', + 'pages' => 'Pagina\'s', + 'page-list' => 'Alle pagina\'s', + 'page-create' => 'Nieuwe pagina', + 'settings' => 'Instellingen', + 'settings-general' => 'Algemeen', + 'settings-theme' => 'Thema', + 'admin-about' => 'Over', 'account' => [ - 'my-account' => 'My account', - 'change-password' => 'Change password', - 'logout' => 'Logout', + 'my-account' => 'Mijn account', + 'change-password' => 'Wachtwoord wijzigen', + 'logout' => 'Uitloggen', ], ]; diff --git a/modules/Admin/Language/nl/Notifications.php b/modules/Admin/Language/nl/Notifications.php index 2b139d51..41345c11 100644 --- a/modules/Admin/Language/nl/Notifications.php +++ b/modules/Admin/Language/nl/Notifications.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'Notifications', - 'reply' => '{actor_username} replied to your post', + 'title' => 'Meldingen', + 'reply' => '{actor_username} heeft op uw bericht gereageerd', 'favourite' => '{actor_username} favourited your post', - 'reblog' => '{actor_username} shared your post', - 'follow' => '{actor_username} started following you', - 'no_notifications' => 'No notifications', - 'mark_all_as_read' => 'Mark all as read', + 'reblog' => '{actor_username} heeft je bericht gedeeld', + 'follow' => '{actor_username} volgt je nu', + 'no_notifications' => 'Geen meldingen', + 'mark_all_as_read' => 'Alles als gelezen markeren', ]; diff --git a/modules/Admin/Language/nl/Page.php b/modules/Admin/Language/nl/Page.php index b6f49de5..566bbd92 100644 --- a/modules/Admin/Language/nl/Page.php +++ b/modules/Admin/Language/nl/Page.php @@ -9,22 +9,22 @@ declare(strict_types=1); */ return [ - 'back_to_home' => 'Back to home', - 'page' => 'Page', - 'all_pages' => 'All pages', - 'create' => 'New page', - 'go_to_page' => 'Go to page', - 'edit' => 'Edit page', - 'delete' => 'Delete page', + 'back_to_home' => 'Terug naar de hoofdpagina', + 'page' => 'Pagina', + 'all_pages' => 'Alle pagina\'s', + 'create' => 'Nieuwe pagina', + 'go_to_page' => 'Ga naar pagina', + 'edit' => 'Pagina bewerken', + 'delete' => 'Pagina verwijderen', 'form' => [ - 'title' => 'Title', + 'title' => 'Titel', 'permalink' => 'Permalink', - 'content' => 'Content', - 'submit_create' => 'Create page', - 'submit_edit' => 'Save', + 'content' => 'Inhoud', + 'submit_create' => 'Pagina aanmaken', + 'submit_edit' => 'Opslaan', ], 'messages' => [ - 'createSuccess' => 'The page “{pageTitle}” was created successfully!', - 'editSuccess' => 'The page was successfully updated!', + 'createSuccess' => 'De pagina "{pageTitle}" is succesvol aangemaakt!', + 'editSuccess' => 'De pagina is succesvol bijgewerkt!', ], ]; diff --git a/modules/Admin/Language/nl/Pager.php b/modules/Admin/Language/nl/Pager.php index e25ee638..210448d8 100644 --- a/modules/Admin/Language/nl/Pager.php +++ b/modules/Admin/Language/nl/Pager.php @@ -9,13 +9,13 @@ declare(strict_types=1); */ return [ - 'pageNavigation' => 'Page navigation', - 'first' => 'First', - 'previous' => 'Previous', - 'next' => 'Next', - 'last' => 'Last', - 'older' => 'Older', - 'newer' => 'Newer', + 'pageNavigation' => 'Paginanavigatie', + 'first' => 'Eerste', + 'previous' => 'Vorige', + 'next' => 'Volgende', + 'last' => 'Laatste', + 'older' => 'Ouder', + 'newer' => 'Nieuwer', 'invalidTemplate' => '{0} is not a valid Pager template.', 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', ]; diff --git a/modules/Admin/Language/nl/Person.php b/modules/Admin/Language/nl/Person.php index a652be9f..18c56722 100644 --- a/modules/Admin/Language/nl/Person.php +++ b/modules/Admin/Language/nl/Person.php @@ -9,57 +9,57 @@ declare(strict_types=1); */ return [ - 'persons' => 'Persons', - 'all_persons' => 'All persons', - 'no_person' => 'Nobody found!', - 'create' => 'Create a person', - 'view' => 'View person', - 'edit' => 'Edit person', - 'delete' => 'Delete person', + 'persons' => 'Personen', + 'all_persons' => 'Alle personen', + 'no_person' => 'Niemand gevonden!', + 'create' => 'Een persoon aanmaken', + 'view' => 'Persoon weergeven', + 'edit' => 'Persoon bewerken', + 'delete' => 'Persoon verwijderen', 'messages' => [ - 'createSuccess' => 'Person has been successfully created!', - 'editSuccess' => 'Person has been successfully updated!', - 'deleteSuccess' => 'Person has been removed!', + 'createSuccess' => 'Persoon is succesvol aangemaakt!', + 'editSuccess' => 'Persoon is succesvol bijgewerkt!', + 'deleteSuccess' => 'Persoon is verwijderd!', ], 'form' => [ 'avatar' => 'Avatar', 'avatar_size_hint' => 'Avatar must be squared and at least 400px wide and tall.', - 'full_name' => 'Full name', - 'full_name_hint' => 'This is the full name or alias of the person.', + 'full_name' => 'Volledige naam', + 'full_name_hint' => 'Dit is de volledige naam of alias van de persoon.', 'unique_name' => 'Unique name', 'unique_name_hint' => 'Used for URLs', 'information_url' => 'Information URL', 'information_url_hint' => 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', - 'submit_create' => 'Create person', - 'submit_edit' => 'Save person', + 'submit_create' => 'Persoon aanmaken', + 'submit_edit' => 'Persoon opslaan', ], 'podcast_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this podcast', - 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'title' => 'Personen beheren', + 'add_section_title' => 'Voeg personen toe aan deze podcast', + 'add_section_subtitle' => 'U kunt meerdere personen en rollen kiezen.', + 'persons' => 'Personen', 'persons_hint' => 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'roles' => 'Rollen', 'roles_hint' => 'You may select none, one or several roles for a person.', 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'remove' => 'Verwijderen', ], 'episode_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this episode', - 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', + 'title' => 'Personen beheren', + 'add_section_title' => 'Voeg personen toe aan deze aflevering', + 'add_section_subtitle' => 'U kunt meerdere personen en rollen kiezen.', + 'persons' => 'Personen', 'persons_hint' => 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', + 'roles' => 'Rollen', 'roles_hint' => 'You may select none, one or several roles for a person.', 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', + 'remove' => 'Verwijderen', ], 'credits' => 'Credits', ]; diff --git a/modules/Admin/Language/nl/Platforms.php b/modules/Admin/Language/nl/Platforms.php index e161181c..67f69651 100644 --- a/modules/Admin/Language/nl/Platforms.php +++ b/modules/Admin/Language/nl/Platforms.php @@ -11,24 +11,24 @@ declare(strict_types=1); return [ 'title' => [ 'podcasting' => 'Podcasting platforms', - 'social' => 'Social networks', + 'social' => 'Sociale netwerken', 'funding' => 'Funding links', ], 'website' => 'Website', - 'home_url' => 'Go to {platformName} website', - 'register' => 'Register', - 'submit_url' => 'Submit your podcast on {platformName}', - 'your_link' => 'Your link', + 'home_url' => 'Ga naar de {platformName} website', + 'register' => 'Registreren', + 'submit_url' => 'Dien jouw podcast in op {platformName}', + 'your_link' => 'Jouw link', 'your_id' => [ - 'podcasting' => 'Your ID', - 'social' => 'Your ID', + 'podcasting' => 'Jouw ID', + 'social' => 'Jouw ID', 'funding' => 'Your CTA', ], 'your_cta' => 'Your call to action', 'visible' => 'Display in podcast homepage?', 'on_embed' => 'Display on embeddable player?', - 'remove' => 'Remove {platformName}', - 'submit' => 'Save', + 'remove' => '{platformName} verwijderen', + 'submit' => 'Opslaan', 'messages' => [ 'updateSuccess' => 'Platform links have been successfully updated!', 'removeLinkSuccess' => 'The platform link has been removed.', diff --git a/modules/Admin/Language/nl/Podcast.php b/modules/Admin/Language/nl/Podcast.php index 3f423f5a..06013066 100644 --- a/modules/Admin/Language/nl/Podcast.php +++ b/modules/Admin/Language/nl/Podcast.php @@ -9,29 +9,29 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found!', - 'create' => 'Create podcast', - 'import' => 'Import podcast', + 'all_podcasts' => 'Alle podcasts', + 'no_podcast' => 'Geen podcast gevonden!', + 'create' => 'Podcast aanmaken', + 'import' => 'Podcast importeren', 'all_imports' => 'Podcast imports', - 'new_episode' => 'New Episode', - 'view' => 'View podcast', - 'edit' => 'Edit podcast', - 'publish' => 'Publish podcast', - 'publish_edit' => 'Edit publication', - 'delete' => 'Delete podcast', - 'see_episodes' => 'See episodes', - 'see_contributors' => 'See contributors', + 'new_episode' => 'Nieuwe aflevering', + 'view' => 'Podcast bekijken', + 'edit' => 'Podcast bewerken', + 'publish' => 'Podcast publiceren', + 'publish_edit' => 'Publicatie bewerken', + 'delete' => 'Podcast verwijderen', + 'see_episodes' => 'Afleveringen bekijken', + 'see_contributors' => 'Bekijk bijdragers', 'monetization_other' => 'Other monetization', - 'go_to_page' => 'Go to page', - 'latest_episodes' => 'Latest episodes', - 'see_all_episodes' => 'See all episodes', + 'go_to_page' => 'Ga naar pagina', + 'latest_episodes' => 'Laatste afleveringen', + 'see_all_episodes' => 'Toon alle afleveringen', 'draft' => 'Draft', 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', - 'editSuccess' => 'Podcast has been successfully updated!', - 'importSuccess' => 'Podcast has been successfully imported!', - 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'createSuccess' => 'Podcast succesvol aangemaakt!', + 'editSuccess' => 'Podcast is succesvol bijgewerkt!', + 'importSuccess' => 'Podcast is succesvol geïmporteerd!', + 'deleteSuccess' => 'Podcast @{podcast_handle} succesvol verwijderd!', 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, cover {cover} banner {banner} @@ -49,9 +49,9 @@ return [ one {# episode was} other {# episodes were} } added to the podcast!', - 'podcastFeedUpToDate' => 'Podcast is already up to date.', - 'publishError' => 'This podcast is either already published or scheduled for publication.', - 'publishEditError' => 'This podcast is not scheduled for publication.', + 'podcastFeedUpToDate' => 'Podcast is al up-to-date.', + 'publishError' => 'Deze podcast is al gepubliceerd of gepland voor publicatie.', + 'publishEditError' => 'Deze podcast is niet gepland voor publicatie.', 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', 'scheduleDateError' => 'Schedule date must be set!', ], @@ -65,35 +65,35 @@ return [ 'banner' => 'Podcast banner', 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', 'banner_delete' => 'Delete podcast banner', - 'title' => 'Title', + 'title' => 'Titel', 'handle' => 'Handle', 'handle_hint' => 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', 'type' => [ - 'label' => 'Type', + 'label' => 'Soort', 'episodic' => 'Episodic', 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', 'serial' => 'Serial', 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', ], - 'description' => 'Description', - 'classification_section_title' => 'Classification', + 'description' => 'Omschrijving', + 'classification_section_title' => 'Classificatie', 'classification_section_subtitle' => 'These fields will impact your audience and competition.', - 'language' => 'Language', - 'category' => 'Category', - 'category_placeholder' => 'Select a category…', - 'other_categories' => 'Other categories', + 'language' => 'Taal', + 'category' => 'Categorie', + 'category_placeholder' => 'Selecteer een categorie…', + 'other_categories' => 'Andere categorieën', 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does it contain explicit content?', - 'undefined' => 'undefined', + 'label' => 'Ouderlijk advies', + 'hint' => 'Bevat de aflevering de expliciete inhoud?', + 'undefined' => 'niet gedefineerd', 'clean' => 'Clean', - 'explicit' => 'Explicit', + 'explicit' => 'Expliciet', ], - 'author_section_title' => 'Author', - 'author_section_subtitle' => 'Who is managing the podcast?', - 'owner_name' => 'Owner name', + 'author_section_title' => 'Auteur', + 'author_section_subtitle' => 'Wie beheert de podcast?', + 'owner_name' => 'Naam eigenaar', 'owner_name_hint' => 'For administrative use only. Visible in the public RSS feed.', 'owner_email' => 'Owner email', @@ -101,21 +101,22 @@ return [ 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', - 'publisher' => 'Publisher', + 'publisher' => 'Uitgever', 'publisher_hint' => 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', - 'copyright' => 'Copyright', - 'location_section_title' => 'Location', + 'copyright' => 'Auteursrecht', + 'location_section_title' => 'Locatie', 'location_section_subtitle' => 'What place is this podcast about?', 'location_name' => 'Location name or address', 'location_name_hint' => 'This can be a real place or fictional', 'monetization_section_title' => 'Monetization', 'monetization_section_subtitle' => - 'Earn money thanks to your audience.', + 'Verdien geld dankzij uw publiek.', 'premium' => 'Premium', 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', @@ -130,7 +131,7 @@ return [ 'new_feed_url' => 'New feed URL', 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', 'old_feed_url' => 'Old feed URL', - 'partnership' => 'Partnership', + 'partnership' => 'Samenwerking', 'partner_id' => 'ID', 'partner_link_url' => 'Link URL', 'partner_image_url' => 'Image URL', @@ -144,42 +145,42 @@ return [ 'lock' => 'Prevent podcast from being copied', 'lock_hint' => 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', - 'submit_create' => 'Create podcast', - 'submit_edit' => 'Save podcast', + 'submit_create' => 'Podcast aanmaken', + 'submit_edit' => 'Podcast opslaan', ], 'category_options' => [ - 'uncategorized' => 'uncategorized', - 'arts' => 'Arts', - 'business' => 'Business', - 'comedy' => 'Comedy', - 'education' => 'Education', - 'fiction' => 'Fiction', + 'uncategorized' => 'niet gecategoriseerd', + 'arts' => 'Kunsten', + 'business' => 'Zakelijk', + 'comedy' => 'Komedie', + 'education' => 'Educatie', + 'fiction' => 'Fictie', 'government' => 'Government', - 'health_and_fitness' => 'Health & Fitness', - 'history' => 'History', - 'kids_and_family' => 'Kids & Family', - 'leisure' => 'Leisure', - 'music' => 'Music', - 'news' => 'News', - 'religion_and_spirituality' => 'Religion & Spirituality', - 'science' => 'Science', - 'society_and_culture' => 'Society & Culture', - 'sports' => 'Sports', - 'technology' => 'Technology', + 'health_and_fitness' => 'Gezondheid & Fitness', + 'history' => 'Geschiedenis', + 'kids_and_family' => 'Kinderen & Familie', + 'leisure' => 'Vrije tijd', + 'music' => 'Muziek', + 'news' => 'Nieuws', + 'religion_and_spirituality' => 'Geloof & Spiritualiteit', + 'science' => 'Wetenschap', + 'society_and_culture' => 'Maatschappij & Cultuur', + 'sports' => 'Sporten', + 'technology' => 'Technologie', 'true_crime' => 'True Crime', 'tv_and_film' => 'TV & Film', - 'books' => 'Books', - 'design' => 'Design', + 'books' => 'Boeken', + 'design' => 'Ontwerp', 'fashion_and_beauty' => 'Fashion & Beauty', - 'food' => 'Food', - 'performing_arts' => 'Performing Arts', - 'visual_arts' => 'Visual Arts', - 'careers' => 'Careers', - 'entrepreneurship' => 'Entrepreneurship', - 'investing' => 'Investing', - 'management' => 'Management', + 'food' => 'Voeding', + 'performing_arts' => 'Podiumkunsten', + 'visual_arts' => 'Beeldende kunsten', + 'careers' => 'Carrières', + 'entrepreneurship' => 'Ondernemerschap', + 'investing' => 'Investeren', + 'management' => 'Beheer', 'marketing' => 'Marketing', - 'non_profit' => 'Non-Profit', + 'non_profit' => 'Non-profit', 'comedy_interviews' => 'Comedy Interviews', 'improv' => 'Improv', 'stand_up' => 'Stand-Up', @@ -216,101 +217,101 @@ return [ 'entertainment_news' => 'Entertainment News', 'news_commentary' => 'News Commentary', 'politics' => 'Politics', - 'sports_news' => 'Sports News', + 'sports_news' => 'Sportnieuws', 'tech_news' => 'Tech News', - 'buddhism' => 'Buddhism', - 'christianity' => 'Christianity', - 'hinduism' => 'Hinduism', + 'buddhism' => 'Boeddhisme', + 'christianity' => 'Christendom', + 'hinduism' => 'Hindoeïsme', 'islam' => 'Islam', - 'judaism' => 'Judaism', - 'religion' => 'Religion', - 'spirituality' => 'Spirituality', - 'astronomy' => 'Astronomy', - 'chemistry' => 'Chemistry', - 'earth_sciences' => 'Earth Sciences', - 'life_sciences' => 'Life Sciences', - 'mathematics' => 'Mathematics', - 'natural_sciences' => 'Natural Sciences', - 'nature' => 'Nature', - 'physics' => 'Physics', - 'social_sciences' => 'Social Sciences', + 'judaism' => 'Jodendom', + 'religion' => 'Religie', + 'spirituality' => 'Spiritualiteit', + 'astronomy' => 'Astronomie', + 'chemistry' => 'Chemie', + 'earth_sciences' => 'Aardwetenschappen', + 'life_sciences' => 'Levenswetenschappen', + 'mathematics' => 'Wiskunde', + 'natural_sciences' => 'Natuurwetenschappen', + 'nature' => 'Natuur', + 'physics' => 'Fysica', + 'social_sciences' => 'Sociale wetenschappen', 'documentary' => 'Documentary', - 'personal_journals' => 'Personal Journals', - 'philosophy' => 'Philosophy', - 'places_and_travel' => 'Places & Travel', - 'relationships' => 'Relationships', - 'baseball' => 'Baseball', - 'basketball' => 'Basketball', + 'personal_journals' => 'Persoonlijke dagboeken', + 'philosophy' => 'Filosofie', + 'places_and_travel' => 'Plaatsen & Reizen', + 'relationships' => 'Relaties', + 'baseball' => 'Honkbal', + 'basketball' => 'Basketbal', 'cricket' => 'Cricket', 'fantasy_sports' => 'Fantasy Sports', - 'football' => 'Football', + 'football' => 'Voetbal', 'golf' => 'Golf', 'hockey' => 'Hockey', 'rugby' => 'Rugby', - 'running' => 'Running', - 'soccer' => 'Soccer', - 'swimming' => 'Swimming', + 'running' => 'Rennen', + 'soccer' => 'Voetbal', + 'swimming' => 'Zwemmen', 'tennis' => 'Tennis', - 'volleyball' => 'Volleyball', + 'volleyball' => 'Volleybal', 'wilderness' => 'Wilderness', - 'wrestling' => 'Wrestling', + 'wrestling' => 'Worstelen', 'after_shows' => 'After Shows', - 'film_history' => 'Film History', + 'film_history' => 'Filmgeschiedenis', 'film_interviews' => 'Film Interviews', 'film_reviews' => 'Film Reviews', - 'tv_reviews' => 'TV Reviews', + 'tv_reviews' => 'TV-beoordelingen', ], 'publish_form' => [ 'back_to_podcast_dashboard' => 'Back to podcast dashboard', 'post' => 'Your announcement post', 'post_hint' => "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'submit' => 'Publish', - 'publication_date' => 'Publication date', + 'message_placeholder' => 'Schrijf uw bericht…', + 'submit' => 'Publiceren', + 'publication_date' => 'Publicatiedatum', 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', + 'now' => 'Nu', + 'schedule' => 'Plannen', ], - 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date' => 'Gepland publicatiedatum', 'scheduled_publication_date_hint' => 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit_edit' => 'Edit publication', - 'cancel_publication' => 'Cancel publication', + 'submit_edit' => 'Publicatie bewerken', + 'cancel_publication' => 'Publicatie annuleren', 'message_warning' => 'You did not write a message for your announcement post!', 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', - 'message_warning_submit' => 'Publish anyway', + 'message_warning_submit' => 'Toch publiceren', ], 'publication_status_banner' => [ 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', - 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + 'not_published' => 'De podcast is nog niet gepubliceerd.', + 'scheduled' => 'Deze podcast is gepland voor publicatie op {publication_date}.', ], 'delete_form' => [ 'disclaimer' => "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", 'understand' => 'I understand, I want the podcast to be permanently deleted', - 'submit' => 'Delete', + 'submit' => 'Verwijderen', ], - 'by' => 'By {publisher}', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'by' => 'Door {publisher}', + 'season' => 'Seizoen {seasonNumber}', + 'list_of_episodes_year' => '{year} afleveringen ({episodeCount})', 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', + 'Seizoen {seasonNumber} afleveringen ({episodeCount})', + 'no_episode' => 'Er zijn geen afleveringen gevonden!', + 'follow' => 'Volgen', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# volger} + other {# volgers} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# bericht} + other {# berichten} }', - 'activity' => 'Activity', - 'episodes' => 'Episodes', + 'activity' => 'Activiteit', + 'episodes' => 'Afleveringen', 'sponsor' => 'Sponsor', 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', + 'find_on' => 'Vind {podcastTitle} op', + 'listen_on' => 'Beluister op', ]; diff --git a/modules/Admin/Language/nl/PodcastNavigation.php b/modules/Admin/Language/nl/PodcastNavigation.php index bb777707..f80c3e40 100644 --- a/modules/Admin/Language/nl/PodcastNavigation.php +++ b/modules/Admin/Language/nl/PodcastNavigation.php @@ -12,18 +12,18 @@ return [ 'go_to_page' => 'Go to podcast page', 'rss_feed' => 'RSS feed', 'dashboard' => 'Podcast dashboard', - 'podcast-view' => 'Home', - 'podcast-edit' => 'Edit podcast', - 'podcast-persons-manage' => 'Manage persons', - 'podcast-imports' => 'Podcast imports', + 'podcast-view' => 'Hoofdpagina', + 'podcast-edit' => 'Podcast bewerken', + 'podcast-persons-manage' => 'Personen beheren', + 'podcast-imports' => 'Podcast importeren', 'podcast-imports-sync' => 'Sync feeds', - 'episodes' => 'Episodes', - 'episode-list' => 'All episodes', - 'episode-create' => 'New episode', + 'episodes' => 'Afleveringen', + 'episode-list' => 'Alle afleveringen', + 'episode-create' => 'Nieuwe aflevering', 'analytics' => 'Analytics', 'podcast-analytics' => 'Audience overview', 'podcast-analytics-webpages' => 'Web pages visits', - 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-locations' => 'Locaties', 'podcast-analytics-unique-listeners' => 'Unique listeners', 'podcast-analytics-players' => 'Players', 'podcast-analytics-listening-time' => 'Listening time', @@ -31,12 +31,12 @@ return [ 'monetization' => 'Monetization', 'subscription-list' => 'All subscriptions', 'subscription-create' => 'Add subscription', - 'contributors' => 'Contributors', - 'contributor-list' => 'All contributors', - 'contributor-add' => 'Add contributor', + 'contributors' => 'Bijdragers', + 'contributor-list' => 'Alle bijdragers', + 'contributor-add' => 'Bijdragers toevoegen', 'broadcast' => 'Broadcast', 'platforms-podcasting' => 'Podcasting apps', - 'platforms-social' => 'Social networks', + 'platforms-social' => 'Sociale netwerken', 'platforms-funding' => 'Funding links', - 'podcast-monetization-other' => 'Other', + 'podcast-monetization-other' => 'Andere', ]; diff --git a/modules/Admin/Language/nl/Settings.php b/modules/Admin/Language/nl/Settings.php index 4a70dcba..5ce212db 100644 --- a/modules/Admin/Language/nl/Settings.php +++ b/modules/Admin/Language/nl/Settings.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'title' => 'General settings', + 'title' => 'Algemene instellingen', 'instance' => [ 'title' => 'Instance', 'site_icon' => 'Site icon', @@ -18,18 +18,18 @@ return [ 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', 'site_name' => 'Site name', 'site_description' => 'Site description', - 'submit' => 'Save', + 'submit' => 'Opslaan', 'editSuccess' => 'Instance has been updated successfully!', 'deleteIconSuccess' => 'Site icon has been remove successfully!', ], 'images' => [ - 'title' => 'Images', + 'title' => 'Afbeeldingen', 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', - 'regenerate' => 'Regenerate images', + 'regenerate' => 'Afbeeldingen regenereren', 'regenerationSuccess' => 'All images have been regenerated successfully!', ], 'housekeeping' => [ - 'title' => 'Housekeeping', + 'title' => 'Huishouden', 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', 'reset_counts' => 'Reset counts', 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', @@ -43,16 +43,16 @@ return [ 'runSuccess' => 'Housekeeping has been run successfully!', ], 'theme' => [ - 'title' => 'Theme', - 'accent_section_title' => 'Accent color', - 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', - 'pine' => 'Pine', + 'title' => 'Thema', + 'accent_section_title' => 'Accentkleur', + 'accent_section_subtitle' => 'Kies de kleur om het uiterlijk van alle openbare pagina\'s te bepalen.', + 'pine' => 'Den', 'crimson' => 'Crimson', 'amber' => 'Amber', - 'lake' => 'Lake', + 'lake' => 'Meer', 'jacaranda' => 'Jacaranda', 'onyx' => 'Onyx', - 'submit' => 'Save', - 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + 'submit' => 'Opslaan', + 'setInstanceThemeSuccess' => 'Thema is succesvol bijgewerkt!', ], ]; diff --git a/modules/Admin/Language/nl/Soundbite.php b/modules/Admin/Language/nl/Soundbite.php index a3f828fe..0f67581e 100644 --- a/modules/Admin/Language/nl/Soundbite.php +++ b/modules/Admin/Language/nl/Soundbite.php @@ -20,8 +20,8 @@ return [ 'form' => [ 'title' => 'New soundbite', 'soundbite_title' => 'Soundbite title', - 'start_time' => 'Start at', - 'duration' => 'Duration', + 'start_time' => 'Begintijd', + 'duration' => 'Duur', 'submit' => 'Create soundbite', ], 'play' => 'Play soundbite', diff --git a/modules/Admin/Language/nl/Validation.php b/modules/Admin/Language/nl/Validation.php index 3bc78cfe..ecf301a4 100644 --- a/modules/Admin/Language/nl/Validation.php +++ b/modules/Admin/Language/nl/Validation.php @@ -12,5 +12,5 @@ return [ 'min_dims' => '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => - '{field} is either not an image or not of the right ratio.', + '{field} is geen afbeelding of niet van de juiste verhouding.', ]; diff --git a/modules/Admin/Language/nl/VideoClip.php b/modules/Admin/Language/nl/VideoClip.php index 638de697..c277d850 100644 --- a/modules/Admin/Language/nl/VideoClip.php +++ b/modules/Admin/Language/nl/VideoClip.php @@ -10,16 +10,16 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Video clips', + 'title' => 'Videoclips', 'status' => [ 'label' => 'Status', - 'queued' => 'queued', + 'queued' => 'in wachtrij', 'queued_hint' => 'Clip is waiting to be processed.', - 'pending' => 'pending', + 'pending' => 'in behandeling', 'pending_hint' => 'Clip will be generated shortly.', - 'running' => 'running', + 'running' => 'actief', 'running_hint' => 'Clip is being generated.', - 'failed' => 'failed', + 'failed' => 'mislukt', 'failed_hint' => 'Clip could not be generated: script failure.', 'passed' => 'passed', 'passed_hint' => 'Clip was generated successfully!', @@ -40,23 +40,23 @@ return [ 'deleteSuccess' => 'Video clip has been successfully removed!', ], 'format' => [ - 'landscape' => 'Landscape', + 'landscape' => 'Liggend', 'portrait' => 'Portrait', - 'squared' => 'Squared', + 'squared' => 'Vierkant', ], 'form' => [ - 'title' => 'New video clip', + 'title' => 'Nieuwe videoclip', 'params_section_title' => 'Video clip parameters', 'clip_title' => 'Clip title', 'format' => [ - 'label' => 'Choose a format', + 'label' => 'Kies een formaat', 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', ], - 'theme' => 'Select a theme', - 'start_time' => 'Start at', - 'duration' => 'Duration', + 'theme' => 'Selecteer een thema', + 'start_time' => 'Begintijd', + 'duration' => 'Duur', 'trim_start' => 'Trim start', 'trim_end' => 'Trim end', 'submit' => 'Create video clip', diff --git a/modules/Admin/Language/nn-NO/Podcast.php b/modules/Admin/Language/nn-NO/Podcast.php index 42778a7b..782a04d6 100644 --- a/modules/Admin/Language/nn-NO/Podcast.php +++ b/modules/Admin/Language/nn-NO/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodane må ha premium som standardval', 'premium_by_default_hint' => 'Podkastepisodane vil få premium som standardmerking. Du kan likevel ha nokre episodar, trailerar eller bonusar som offentlege.', 'op3' => 'Open Podcast Prefix-prosjekt (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Verdiset analysedataa dine med OP3, som er ein tredjeparts analyseteneste med open kjeldekode. Del, stadfest og samanlikne analysedataa dine med det opne podkast-økosystemet.', 'op3_enable' => 'Bruk OP3-analysetenesta', 'op3_enable_hint' => 'Av tryggleiksgrunnar deler me ikkje analysedata for premium-episodar med OP3.', diff --git a/modules/Admin/Language/oc/Home.php b/modules/Admin/Language/oc/Home.php index 3ff4c04d..2f0f3570 100644 --- a/modules/Admin/Language/oc/Home.php +++ b/modules/Admin/Language/oc/Home.php @@ -9,6 +9,6 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', - 'no_podcast' => 'No podcast found', + 'all_podcasts' => 'Totes los podcasts', + 'no_podcast' => 'Cap de podcast pas trobat', ]; diff --git a/modules/Admin/Language/oc/Install.php b/modules/Admin/Language/oc/Install.php index 36e373a2..5a90a8ce 100644 --- a/modules/Admin/Language/oc/Install.php +++ b/modules/Admin/Language/oc/Install.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'manual_config' => 'Manual configuration', + 'manual_config' => 'Configuracion manuala', 'manual_config_subtitle' => 'Create a `.env` file with your settings and refresh the page to continue installation.', 'form' => [ @@ -39,12 +39,12 @@ return [ 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', 'cache_handler' => 'Cache handler', 'cacheHandlerOptions' => [ - 'file' => 'File', + 'file' => 'Fichièr', 'redis' => 'Redis', 'predis' => 'Predis', ], - 'next' => 'Next', - 'submit' => 'Finish install', + 'next' => 'Seguent', + 'submit' => 'Acabar l’installacion', 'create_superadmin' => 'Create your superadmin account', 'email' => 'Email', 'username' => 'Username', diff --git a/modules/Admin/Language/oc/Podcast.php b/modules/Admin/Language/oc/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/oc/Podcast.php +++ b/modules/Admin/Language/oc/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/pl/Podcast.php b/modules/Admin/Language/pl/Podcast.php index c60f9b6e..d450e376 100644 --- a/modules/Admin/Language/pl/Podcast.php +++ b/modules/Admin/Language/pl/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-BR/Episode.php index deb669aa..f62d56ed 100644 --- a/modules/Admin/Language/pt-BR/Episode.php +++ b/modules/Admin/Language/pt-BR/Episode.php @@ -22,7 +22,7 @@ return [ 'all_podcast_episodes' => 'Todos os episódios de podcast', 'back_to_podcast' => 'Voltar para o podcast', 'edit' => 'Editar', - 'preview' => 'Preview', + 'preview' => 'Pré-visualizar', 'publish' => 'Publicar', 'publish_edit' => 'Editar publicação', 'publish_date_edit' => 'Editar data de publicação', @@ -81,13 +81,13 @@ return [ audio {áudio} other {mídia} }.', - 'deleteFileError' => 'Failed to delete {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} - } file {file_key}. You may manually remove it from your disk.', + 'deleteFileError' => 'Falha ao excluir o arquivo de {type, select, + transcript {transcrição} + chapters {capítulos} + image {capa} + audio {áudio} + other {mídia} + }arquivo {file_key}. Você pode removê-lo manualmente do seu disco.', 'sameSlugError' => 'Um episódio com o slug escolhido já existe.', ], 'form' => [ @@ -213,13 +213,13 @@ return [ 'light-transparent' => 'Claro translúcido', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', + 'draft_mode' => 'modo rascunho', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {Esse episódio ainda não foi publicado.} + scheduled {Esse episódio está agendado para publicação em {publication_date}.} + with_podcast {Esse episódio será publicado ao mesmo tempo que o podcast. .} + other {Esse episódio ainda não foi publicado.} }', - 'preview' => 'Preview', + 'preview' => 'Pré-visualizar', ], ]; diff --git a/modules/Admin/Language/pt-BR/Platforms.php b/modules/Admin/Language/pt-BR/Platforms.php index 14f14b49..0388f65f 100644 --- a/modules/Admin/Language/pt-BR/Platforms.php +++ b/modules/Admin/Language/pt-BR/Platforms.php @@ -10,21 +10,21 @@ declare(strict_types=1); return [ 'title' => [ - 'podcasting' => 'Podcasting platforms', - 'social' => 'Social networks', - 'funding' => 'Funding links', + 'podcasting' => 'Plataformas de podcasting', + 'social' => 'Redes sociais', + 'funding' => 'Links de financiamento', ], - 'website' => 'Website', + 'website' => 'Site', 'home_url' => 'Ir para o site {platformName}', - 'register' => 'Register', + 'register' => 'Registrar', 'submit_url' => 'Enviar seu podcast para {platformName}', - 'your_link' => 'Your link', + 'your_link' => 'Seu link', 'your_id' => [ - 'podcasting' => 'Your ID', - 'social' => 'Your ID', - 'funding' => 'Your CTA', + 'podcasting' => 'Seu ID', + 'social' => 'Seu ID', + 'funding' => 'Seu CTA', ], - 'your_cta' => 'Your call to action', + 'your_cta' => 'Sua chamada para ação', 'visible' => 'Mostrar na página inicial do podcast?', 'on_embed' => 'Mostrar no player incorporável?', 'remove' => 'Remover {platformName}', diff --git a/modules/Admin/Language/pt-BR/Podcast.php b/modules/Admin/Language/pt-BR/Podcast.php index 3f6012c3..17d2289b 100644 --- a/modules/Admin/Language/pt-BR/Podcast.php +++ b/modules/Admin/Language/pt-BR/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episódios devem ser definidos como premium por padrão', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Ativar serviço de análise OP3', 'op3_enable_hint' => 'Por razões de segurança, os dados de análise dos episódios premium não serão compartilhados com o OP3.', diff --git a/modules/Admin/Language/pt/Podcast.php b/modules/Admin/Language/pt/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/pt/Podcast.php +++ b/modules/Admin/Language/pt/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/ro/Podcast.php b/modules/Admin/Language/ro/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/ro/Podcast.php +++ b/modules/Admin/Language/ro/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/ru/Podcast.php b/modules/Admin/Language/ru/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/ru/Podcast.php +++ b/modules/Admin/Language/ru/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/sk/Podcast.php b/modules/Admin/Language/sk/Podcast.php index e3b52450..a3e8fa84 100644 --- a/modules/Admin/Language/sk/Podcast.php +++ b/modules/Admin/Language/sk/Podcast.php @@ -88,7 +88,7 @@ return [ 'label' => 'Parental advisory', 'hint' => 'Obsahuje explicitný obsah?', 'undefined' => 'neuvedené', - 'clean' => 'Clean', + 'clean' => 'Čistá', 'explicit' => 'Chúlostivé', ], 'author_section_title' => 'Autor', @@ -112,10 +112,11 @@ return [ 'monetization_section_title' => 'Monetization', 'monetization_section_subtitle' => 'Earn money thanks to your audience.', - 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium' => 'Prémiový obsah', + 'premium_by_default' => 'Epizódy musia byť predvolene nastavené ako prémiové', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', @@ -130,7 +131,7 @@ return [ 'new_feed_url' => 'New feed URL', 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', 'old_feed_url' => 'Old feed URL', - 'partnership' => 'Partnership', + 'partnership' => 'Partnerstvo', 'partner_id' => 'ID', 'partner_link_url' => 'URL adresa odkazu', 'partner_image_url' => 'URL adresa obrázka', @@ -180,7 +181,7 @@ return [ 'management' => 'Manažment', 'marketing' => 'Marketing', 'non_profit' => 'Neziskový', - 'comedy_interviews' => 'Comedy Interviews', + 'comedy_interviews' => 'Komediálne rozhovory', 'improv' => 'Improv', 'stand_up' => 'Stand-Up', 'courses' => 'Kurzy', @@ -193,10 +194,10 @@ return [ 'alternative_health' => 'Alternative Health', 'fitness' => 'Fitness', 'medicine' => 'Medicínsky', - 'mental_health' => 'Mental Health', + 'mental_health' => 'Duševné zdravie', 'nutrition' => 'Nutrition', 'sexuality' => 'Sexualita', - 'education_for_kids' => 'Education for Kids', + 'education_for_kids' => 'Vzdelávanie pre deti', 'parenting' => 'Rodičovstvo', 'pets_and_animals' => 'Pets & Animals', 'stories_for_kids' => 'Príbehy pre deti', @@ -220,7 +221,7 @@ return [ 'tech_news' => 'Technologické novinky', 'buddhism' => 'Buddhism', 'christianity' => 'Kresťanstvo', - 'hinduism' => 'Hinduism', + 'hinduism' => 'Hinduizmus', 'islam' => 'Islam', 'judaism' => 'Judaism', 'religion' => 'Náboženstvo', @@ -248,10 +249,10 @@ return [ 'hockey' => 'Hockey', 'rugby' => 'Rugby', 'running' => 'Running', - 'soccer' => 'Soccer', + 'soccer' => 'Futbal', 'swimming' => 'Plávanie', 'tennis' => 'Tenis', - 'volleyball' => 'Volleyball', + 'volleyball' => 'Volejbal', 'wilderness' => 'Divočina', 'wrestling' => 'Zápasnícky', 'after_shows' => 'After Shows', @@ -282,8 +283,8 @@ return [ 'message_warning_submit' => 'Napriek tomu zverejniť', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', + 'draft_mode' => 'konceptový režim', + 'not_published' => 'Tento podcast ešte nieje zverejnený.', 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', ], 'delete_form' => [ diff --git a/modules/Admin/Language/sk/PodcastNavigation.php b/modules/Admin/Language/sk/PodcastNavigation.php index 44930148..f90c67a2 100644 --- a/modules/Admin/Language/sk/PodcastNavigation.php +++ b/modules/Admin/Language/sk/PodcastNavigation.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'go_to_page' => 'Ísť na stránku podcastu', - 'rss_feed' => 'RSS feed', + 'rss_feed' => 'RSS kanál', 'dashboard' => 'Podcast dashboard', 'podcast-view' => 'Úvod', 'podcast-edit' => 'Upraviť podcast', @@ -25,7 +25,7 @@ return [ 'podcast-analytics-webpages' => 'Web pages visits', 'podcast-analytics-locations' => 'Locations', 'podcast-analytics-unique-listeners' => 'Unique listeners', - 'podcast-analytics-players' => 'Players', + 'podcast-analytics-players' => 'Prehrávače', 'podcast-analytics-listening-time' => 'Čas počúvania', 'podcast-analytics-time-periods' => 'Časové úseky', 'monetization' => 'Monetization', @@ -34,7 +34,7 @@ return [ 'contributors' => 'Prispievatelia', 'contributor-list' => 'Všetci prispievatelia', 'contributor-add' => 'Pridať prispievateľa', - 'broadcast' => 'Broadcast', + 'broadcast' => 'Vysielanie', 'platforms-podcasting' => 'Podcastové aplikácie', 'platforms-social' => 'Sociálne siete', 'platforms-funding' => 'Funding links', diff --git a/modules/Admin/Language/sr_Latn/Podcast.php b/modules/Admin/Language/sr_Latn/Podcast.php index 07058f1a..a6514a50 100644 --- a/modules/Admin/Language/sr_Latn/Podcast.php +++ b/modules/Admin/Language/sr_Latn/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Epizode ​​se podrazumevano moraju podesiti kao premijum', 'premium_by_default_hint' => 'Epizode ​​podkasta će podrazumevano biti označene kao premijum. I dalje možete izabrati da neke epizode, trejlere ili bonuse postavite kao javne.', 'op3' => 'Otvoreni Podkast Prefiks Projekat (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Vrednujte svoje analitičke podatke pomoću OP3, otvorenog koda i pouzdane analitičke usluge treće strane. Delite, potvrdite i uporedite svoje analitičke podatke sa otvorenim podkast ekosistemom.', 'op3_enable' => 'Omogućite OP3 analitičku uslugu', 'op3_enable_hint' => 'Iz bezbednosnih razloga, analitika premijum epizoda se neće deliti sa OP3.', diff --git a/modules/Admin/Language/sv/Podcast.php b/modules/Admin/Language/sv/Podcast.php index 5856853f..265e8889 100644 --- a/modules/Admin/Language/sv/Podcast.php +++ b/modules/Admin/Language/sv/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Avsnitt måste anges som premium som standard', 'premium_by_default_hint' => 'Podcast avsnitt kommer att markeras som premium som standard. Du kan fortfarande välja att ställa in några avsnitt, trailers eller bonusar som offentliga.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/uk/Podcast.php b/modules/Admin/Language/uk/Podcast.php index 3f423f5a..3a2edc64 100644 --- a/modules/Admin/Language/uk/Podcast.php +++ b/modules/Admin/Language/uk/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => 'Episodes must be set as premium by default', 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', 'op3_enable' => 'Enable OP3 analytics service', 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', diff --git a/modules/Admin/Language/zh-Hans/Podcast.php b/modules/Admin/Language/zh-Hans/Podcast.php index 7b0964d3..6e0c79c5 100644 --- a/modules/Admin/Language/zh-Hans/Podcast.php +++ b/modules/Admin/Language/zh-Hans/Podcast.php @@ -116,6 +116,7 @@ return [ 'premium_by_default' => '剧集必须默认设置为付费会员订阅。', 'premium_by_default_hint' => '默认情况下,播客剧集将被标记为高级。 你仍然可以选择将某些剧集、预告片等设置为公开。', 'op3' => '打开播客前缀项目 (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', 'op3_hint' => '使用 OP3(一项开源且值得信赖的第三方分析服务)来评估您的分析数据。 与开源播客生态系统共享、验证和比较您的分析数据。', 'op3_enable' => '启用 OP3 分析服务', 'op3_enable_hint' => '出于安全原因,高级剧集的分析数据将不会与 OP3 共享。', diff --git a/modules/Auth/Language/pt-BR/Auth.php b/modules/Auth/Language/pt-BR/Auth.php index 725b760b..154870ca 100644 --- a/modules/Auth/Language/pt-BR/Auth.php +++ b/modules/Auth/Language/pt-BR/Auth.php @@ -11,83 +11,83 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', + 'title' => 'Instância proprietário', + 'description' => 'O proprietário do Castopod.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Super administrador', + 'description' => 'Tem controle completo sobre Castopod.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Gerente', + 'description' => 'Gerencia o conteúdo de Castopod.', ], 'podcaster' => [ 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', + 'description' => 'Usuários gerais do Castopod.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'admin.access' => 'Pode acessar a área de administração do Castopod.', + 'admin.settings' => 'Pode acessar as configurações de Castopod.', + 'users.manage' => 'Pode gerenciar usuários do Castopod.', + 'persons.manage' => 'Pode gerenciar pessoas.', + 'pages.manage' => 'Pode gerenciar páginas.', + 'podcasts.view' => 'Pode ver todos os podcasts.', + 'podcasts.create' => 'Pode criar novos podcasts.', + 'podcasts.import' => 'Pode importar podcasts.', + 'fediverse.manage-blocks' => 'Pode bloquear ator/domínios distintos de interagir com Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Dono do Podcast', + 'description' => 'O proprietário do podcast.', ], 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', + 'title' => 'Administrador', + 'description' => 'Tem controle completo do podcast #{id}.', ], 'editor' => [ 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', + 'description' => 'Gerencia o conteúdo e as publicações do podcast #{id}.', ], 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'title' => 'Autor', + 'description' => 'Gerencia o conteúdo do podcast #{id} mas não pode publicá-los.', ], 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', + 'title' => 'Convidado', + 'description' => 'Contribuidor geral do podcast #{id}.', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => 'Pode visualizar o painel de controle e análises do podcast #{id}.', + 'edit' => 'Pode editar o podcast #{id}.', + 'delete' => 'Pode deletar episódios do podcast #{id}.', + 'manage-import' => 'Pode sincronizar o podcast importado #{id}.', + 'manage-persons' => 'Pode gerenciar assinaturas do podcast #{id}.', + 'manage-subscriptions' => 'Pode gerenciar assinaturas do podcast #{id}.', + 'manage-contributors' => 'Pode gerenciar contribuidores do podcast #{id}.', + 'manage-platforms' => 'Pode definir/remover links de plataforma do podcast #{id}.', + 'manage-publications' => 'Pode publicar podcast #{id}.', + 'manage-notifications' => 'Pode ver e marcar notificações como lidas para o podcast #{id}.', + 'interact-as' => 'Pode interagir com o podcast #{id} para favorito, compartilhar ou responder às publicações.', + 'episodes.view' => 'Pode ver painéis e análises de episódios de podcast #{id}.', + 'episodes.create' => 'Pode criar episódios para o podcast #{id}.', + 'episodes.edit' => 'Pode editar episódios de podcast #{id}.', + 'episodes.delete' => 'Pode excluir episódios do podcast #{id}.', + 'episodes.manage-persons' => 'Pode gerenciar pessoas de episódios do podcast #{id}.', + 'episodes.manage-clips' => 'Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}.', + 'episodes.manage-publications' => 'Pode publicar/remover a publicação de episódios e postagens de podcast #{id}.', + 'episodes.manage-comments' => 'Pode criar/remover comentários de episódio do podcast #{id}.', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'Seu código de 6 dígitos', - 'set_password' => 'Set your password', + 'set_password' => 'Defina sua senha', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'welcomeSubject' => 'Você foi convidado(a) para o {siteName}', + 'emailWelcomeMailBody' => 'Uma conta foi criada para você no {domain}, clique no link de login abaixo para definir sua senha. O link é válido por {numberOfHours} horas após o envio deste e-mail.', ]; diff --git a/modules/PodcastImport/Language/nl/PodcastImport.php b/modules/PodcastImport/Language/nl/PodcastImport.php index 8bf494d3..367f9ec8 100644 --- a/modules/PodcastImport/Language/nl/PodcastImport.php +++ b/modules/PodcastImport/Language/nl/PodcastImport.php @@ -10,49 +10,49 @@ declare(strict_types=1); return [ 'banner' => [ - 'disclaimer' => 'Importing', - 'text' => '{podcastTitle} is currently being imported.', - 'cta' => 'See import status', + 'disclaimer' => 'Importeren', + 'text' => '{podcastTitle} wordt momenteel geïmporteerd.', + 'cta' => 'Bekijk importstatus', ], - 'old_podcast_section_title' => 'The podcast to import', - 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_section_title' => 'De te importeren podcast', + 'old_podcast_legal_disclaimer_title' => 'Wettelijke disclaimer', 'old_podcast_legal_disclaimer' => 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', 'imported_feed_url' => 'Feed URL', 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', + 'new_podcast_section_title' => 'De nieuwe podcast', 'lock_import' => 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', - 'submit' => 'Add import to queue', + 'submit' => 'Import toevoegen aan wachtrij', 'queue' => [ 'status' => [ 'label' => 'Status', - 'queued' => 'queued', + 'queued' => 'in wachtrij', 'queued_hint' => 'Import task is awaiting to be processed.', - 'canceled' => 'canceled', + 'canceled' => 'geannuleerd', 'canceled_hint' => 'Import task was canceled.', - 'running' => 'running', + 'running' => 'actief', 'running_hint' => 'Import task is being processed.', - 'failed' => 'failed', + 'failed' => 'mislukt', 'failed_hint' => 'Import task could not complete: script failure.', 'passed' => 'passed', 'passed_hint' => 'Import task was completed successfully!', ], 'feed' => 'Feed', - 'duration' => 'Import duration', - 'imported_episodes' => 'Imported episodes', + 'duration' => 'Duur van importeren', + 'imported_episodes' => 'Geïmporteerde afleveringen', 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', 'actions' => [ - 'cancel' => 'Cancel', - 'retry' => 'Retry', - 'delete' => 'Delete', + 'cancel' => 'Annuleer', + 'retry' => 'Opnieuw proberen', + 'delete' => 'Verwijderen', ], ], 'syncForm' => [ 'title' => 'Synchronize feeds', 'feed_url' => 'Feed URL', 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', - 'submit' => 'Add to queue', + 'submit' => 'Aan wachtrij toevoegen', ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', diff --git a/modules/PremiumPodcasts/Language/nl/Subscription.php b/modules/PremiumPodcasts/Language/nl/Subscription.php index f01244cb..36bc8976 100644 --- a/modules/PremiumPodcasts/Language/nl/Subscription.php +++ b/modules/PremiumPodcasts/Language/nl/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'E-mail', 'expiration_date' => 'Vervaldatum', 'expiration_date_hint' => 'De datum en tijd waarop het abonnement verloopt. Laat leeg voor een onbeperkt abonnement.', - 'submit_create' => 'Create subscription', + 'submit_create' => 'Abonnement aanmaken', 'submit_edit' => 'Bewerk abonnement', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php index 18c0dd4e..b85012d9 100644 --- a/modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'podcast_is_premium' => 'O Podcast contém episódios premium', + 'episode_is_premium' => 'Episódio é premium, somente disponível para assinantes premium', + 'unlock_episode' => 'Este episódio é apenas para assinantes premium. Clique para desbloqueá-lo!', + 'banner_unlock' => 'Este podcast contém episódios premium, somente disponível para assinantes premium.', + 'banner_lock' => 'O Podcast desbloqueado, aproveite os episódios premium!', + 'subscribe' => 'Inscrever-se', + 'lock' => 'Bloquear', + 'unlock' => 'Desbloquear', 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'title' => 'Conteúdo premium', + 'subtitle' => 'Este podcast contém episódios premium bloqueados! Você tem a chave para desbloqueá-los?', + 'token' => 'Digite sua chave', + 'token_hint' => 'Se você se inscreveu no {podcastTitle}, você pode copiar a chave que foi enviada por email e colá-la aqui.', + 'submit' => 'Desbloquear todos os episódios!', + 'call_to_action' => 'Desbloquear todos os episódios de {podcastTitle}:', + 'subscribe_cta' => 'Inscreva-se agora!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Podcast foi desbloqueado com sucesso! Aproveite os episódios premium!', + 'unlockBadAttempt' => 'Sua chave parece não estar funcionando…', + 'lockSuccess' => 'Podcast foi trancado com sucesso!', ], ]; diff --git a/modules/PremiumPodcasts/Language/pt-BR/Subscription.php b/modules/PremiumPodcasts/Language/pt-BR/Subscription.php index e83f0cb2..5e125494 100644 --- a/modules/PremiumPodcasts/Language/pt-BR/Subscription.php +++ b/modules/PremiumPodcasts/Language/pt-BR/Subscription.php @@ -9,38 +9,38 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Assinaturas de Podcast', + 'add' => 'Nova assinatura', + 'view' => 'Visualizar assinatura', + 'edit' => 'Editar assinatura', + 'regenerate_token' => 'Regerar token', + 'suspend' => 'Suspender assinatura', + 'resume' => 'Retomar assinatura', + 'delete' => 'Excluir assinatura', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Ativo', + 'suspended' => 'Suspenso', + 'expired' => 'Expirado', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', + 'number' => 'Número', + 'email' => 'E-mail', + 'expiration_date' => 'Data da expiração', + 'unlimited' => 'Sem limite', 'downloads' => 'Downloads', 'status' => 'Status', ], 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_create' => 'Create subscription', - 'submit_edit' => 'Edit subscription', + 'email' => 'E-mail', + 'expiration_date' => 'Data da expiração', + 'expiration_date_hint' => 'A data e hora em que a assinatura expirará. Deixe em branco para uma assinatura ilimitada.', + 'submit_create' => 'Criar assinatura', + 'submit_edit' => 'Editar assinatura', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'link' => 'Link da página de assinatura', + 'link_hint' => 'Isto irá adicionar uma chamada para a ação no site que convida ouvintes a se inscreverem no podcast.', + 'submit' => 'Salvar o link', ], 'suspend_form' => [ 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', From 7071b4b6f48cb9a2f766064f3a5c23f92b293718 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Fri, 9 Feb 2024 16:34:50 +0000 Subject: [PATCH 291/477] feat: support VTT transcript file format in addition to SRT closes #433 --- modules/Admin/Language/en/Episode.php | 4 +- modules/Media/Entities/Transcript.php | 17 +++- modules/Media/TranscriptParser.php | 107 +++++++++++++++++++++++++- themes/cp_admin/episode/create.php | 2 +- themes/cp_admin/episode/edit.php | 2 +- 5 files changed, 123 insertions(+), 9 deletions(-) diff --git a/modules/Admin/Language/en/Episode.php b/modules/Admin/Language/en/Episode.php index 1a5e57a4..4fa846e3 100644 --- a/modules/Admin/Language/en/Episode.php +++ b/modules/Admin/Language/en/Episode.php @@ -139,9 +139,9 @@ return [ 'location_name' => 'Location name or address', 'location_name_hint' => 'This can be a real or fictional location', 'transcript' => 'Transcript (subtitles / closed captions)', - 'transcript_hint' => 'Only .srt are allowed.', + 'transcript_hint' => 'Only .srt or .vtt are allowed.', 'transcript_download' => 'Download transcript', - 'transcript_file' => 'Transcript file (.srt)', + 'transcript_file' => 'Transcript file (.srt or .vtt)', 'transcript_remote_url' => 'Remote url for transcript', 'transcript_file_delete' => 'Delete transcript file', 'chapters' => 'Chapters', diff --git a/modules/Media/Entities/Transcript.php b/modules/Media/Entities/Transcript.php index 33e9ac4e..f0e9a351 100644 --- a/modules/Media/Entities/Transcript.php +++ b/modules/Media/Entities/Transcript.php @@ -76,16 +76,25 @@ class Transcript extends BaseMedia private function saveJsonTranscript(): void { - $srtContent = file_get_contents($this->file->getRealPath()); + $transcriptContent = file_get_contents($this->file->getRealPath()); $transcriptParser = new TranscriptParser(); - if ($srtContent === false) { + if ($transcriptContent === false) { throw new Exception('Could not read transcript file at ' . $this->file->getRealPath()); } - $transcriptJson = $transcriptParser->loadString($srtContent) - ->parseSrt(); + $transcript_format = $this->file->getExtension(); + switch ($transcript_format) { + case 'vtt': + $transcriptJson = $transcriptParser->loadString($transcriptContent) + ->parseVtt(); + break; + case 'srt': + default: + $transcriptJson = $transcriptParser->loadString($transcriptContent) + ->parseSrt(); + } $tempFilePath = WRITEPATH . 'uploads/' . $this->file->getRandomName(); file_put_contents($tempFilePath, $transcriptJson); diff --git a/modules/Media/TranscriptParser.php b/modules/Media/TranscriptParser.php index a8b61e4a..90167d0a 100644 --- a/modules/Media/TranscriptParser.php +++ b/modules/Media/TranscriptParser.php @@ -3,7 +3,7 @@ declare(strict_types=1); /** - * Generates and renders a breadcrumb based on the current url segments + * Converts a SRT or VTT file to JSON * * @copyright 2022 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -107,9 +107,114 @@ class TranscriptParser return $jsonString; } + public function parseVtt(): string + { + if (! defined('VTT_STATE_HEADER')) { + define('VTT_STATE_HEADER', 0); + } + + if (! defined('VTT_STATE_BLANK')) { + define('VTT_STATE_BLANK', 1); + } + + if (! defined('VTT_STATE_TIME')) { + define('VTT_STATE_TIME', 2); + } + + if (! defined('VTT_STATE_TEXT')) { + define('VTT_STATE_TEXT', 3); + } + + $subs = []; + $state = VTT_STATE_HEADER; + $subNum = 0; + $subText = ''; + $subTime = ''; + + $lines = explode(PHP_EOL, $this->transcriptContent); + // add a newline as last item, if it isn't already a newline + if ($lines[array_key_last($lines)] !== '') { + $lines[] = PHP_EOL; + } + + foreach ($lines as $line) { + switch ($state) { + case VTT_STATE_HEADER: + $state = VTT_STATE_BLANK; + break; + + case VTT_STATE_BLANK: + $state = VTT_STATE_TIME; + break; + + case VTT_STATE_TIME: + $subTime = trim($line); + $state = VTT_STATE_TEXT; + break; + + case VTT_STATE_TEXT: + if (trim($line) === '') { + $sub = new stdClass(); + $sub->number = $subNum; + [$startTime, $endTime] = explode(' --> ', $subTime); + $sub->startTime = $this->getSecondsFromVTTTimeString($startTime); + $sub->endTime = $this->getSecondsFromVTTTimeString($endTime); + $sub->text = trim($subText); + if ($subSpeaker !== '') { + $sub->speaker = trim((string) $subSpeaker); + } + + $subText = ''; + $state = VTT_STATE_TIME; + $subs[] = $sub; + ++$subNum; + } elseif ($subText !== '') { + $subText .= PHP_EOL . $line; + } else { + /** VTT includes a lot of information on the spoken line + * An example may look like this: + * So this is it + * We need to break this down into it's components, namely: + * 1. The actual words for the caption + * 2. Who is speaking + * 3. Any styling cues encoded in the VTT (which we dump) + * More information: https://www.w3.org/TR/webvtt1/ + */ + $vtt_speaker_pattern = '/^<.*>/'; + $removethese = ['<', '>']; + preg_match($vtt_speaker_pattern, $line, $matches); + if (isset($matches[0])) { + $subVoiceCue = explode(' ', str_replace($removethese, '', $matches[0])); + $subSpeaker = $subVoiceCue[1]; + } else { + $subSpeaker = ''; + } + + $subText .= preg_replace($vtt_speaker_pattern, '', $line); + } + + break; + } + } + + $jsonString = json_encode($subs, JSON_PRETTY_PRINT); + + if (! $jsonString) { + throw new Exception('Failed to parse VTT to JSON.'); + } + + return $jsonString; + } + private function getSecondsFromTimeString(string $timeString): float { $timeString = explode(',', $timeString); return (strtotime($timeString[0]) - strtotime('TODAY')) + (float) "0.{$timeString[1]}"; } + + private function getSecondsFromVTTTimeString(string $timeString): float + { + $timeString = explode('.', $timeString); + return (strtotime($timeString[0]) - strtotime('TODAY')) + (float) "0.{$timeString[1]}"; + } } diff --git a/themes/cp_admin/episode/create.php b/themes/cp_admin/episode/create.php index aabe2e3e..2f3f6196 100644 --- a/themes/cp_admin/episode/create.php +++ b/themes/cp_admin/episode/create.php @@ -167,7 +167,7 @@
    - +
    diff --git a/themes/cp_admin/episode/edit.php b/themes/cp_admin/episode/edit.php index e506617d..4ad4aed2 100644 --- a/themes/cp_admin/episode/edit.php +++ b/themes/cp_admin/episode/edit.php @@ -197,7 +197,7 @@
    - +
    From 94ceba60815f368c4e1df3bdf0b082977e1c2195 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 12 Feb 2024 13:23:30 +0000 Subject: [PATCH 292/477] chore(media): remove media Routes file from Routing config --- app/Config/Routing.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Config/Routing.php b/app/Config/Routing.php index c0ddd14d..636f7292 100644 --- a/app/Config/Routing.php +++ b/app/Config/Routing.php @@ -28,7 +28,6 @@ class Routing extends BaseRouting ROOTPATH . 'modules/Auth/Config/Routes.php', ROOTPATH . 'modules/Fediverse/Config/Routes.php', ROOTPATH . 'modules/Install/Config/Routes.php', - ROOTPATH . 'modules/Media/Config/Routes.php', ROOTPATH . 'modules/PodcastImport/Config/Routes.php', ROOTPATH . 'modules/PremiumPodcasts/Config/Routes.php', ]; From d5803692357952d82d54efd8d3aa71de3a1c9571 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 12 Feb 2024 16:55:09 +0000 Subject: [PATCH 293/477] fix(op3): move op3 prefix to enclosure url instead of audio proxy --- app/Controllers/EpisodeAudioController.php | 15 +++++++++++++- app/Entities/Episode.php | 23 +++++++++++++++++++++- modules/Analytics/Config/Analytics.php | 23 ---------------------- modules/Analytics/OP3.php | 9 ++++----- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php index fbf66d76..c1bdbcd8 100644 --- a/app/Controllers/EpisodeAudioController.php +++ b/app/Controllers/EpisodeAudioController.php @@ -20,6 +20,7 @@ use CodeIgniter\HTTP\IncomingRequest; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\HTTP\URI; use Config\Services; use Modules\Analytics\Config\Analytics; use Modules\PremiumPodcasts\Entities\Subscription; @@ -166,6 +167,18 @@ class EpisodeAudioController extends Controller $subscription instanceof Subscription ? $subscription->id : null ); - return redirect()->to($this->analyticsConfig->getAudioUrl($this->episode, $this->request->getGet())); + $audioFileURI = new URI(service('file_manager')->getUrl($this->episode->audio->file_key)); + + $queryParams = []; + foreach ($this->request->getGet() as $key => $value) { + // do not include token in query params + if ($key !== 'token') { + $queryParams[$key] = $value; + } + } + + $audioFileURI->setQueryArray($queryParams); + + return redirect()->to((string) $audioFileURI); } } diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 3fc08e5f..357b4748 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -21,6 +21,7 @@ use App\Models\PostModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; +use CodeIgniter\HTTP\URI; use CodeIgniter\I18n\Time; use Config\Images; use Exception; @@ -30,6 +31,7 @@ use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; use League\CommonMark\Extension\DisallowedRawHtml\DisallowedRawHtmlExtension; use League\CommonMark\Extension\SmartPunct\SmartPunctExtension; use League\CommonMark\MarkdownConverter; +use Modules\Analytics\OP3; use Modules\Media\Entities\Audio; use Modules\Media\Entities\Chapters; use Modules\Media\Entities\Image; @@ -344,7 +346,26 @@ class Episode extends Entity public function getAudioUrl(): string { - return url_to('episode-audio', $this->getPodcast()->handle, $this->slug, $this->getAudio()->file_extension); + $audioURL = url_to( + 'episode-audio', + $this->getPodcast() +->handle, + $this->slug, + $this->getAudio() +->file_extension + ); + + // Wrap episode url with OP3 if episode is public and OP3 is enabled on this podcast + if (! $this->is_premium && service('settings')->get( + 'Analytics.enableOP3', + 'podcast:' . $this->podcast_id + )) { + $op3 = new OP3(config('Analytics')->OP3); + + return $op3->wrap($audioURL, $this); + } + + return $audioURL; } public function getAudioWebUrl(): string diff --git a/modules/Analytics/Config/Analytics.php b/modules/Analytics/Config/Analytics.php index 85adf7ff..8eca95d3 100644 --- a/modules/Analytics/Config/Analytics.php +++ b/modules/Analytics/Config/Analytics.php @@ -4,10 +4,7 @@ declare(strict_types=1); namespace Modules\Analytics\Config; -use App\Entities\Episode; use CodeIgniter\Config\BaseConfig; -use CodeIgniter\HTTP\URI; -use Modules\Analytics\OP3; class Analytics extends BaseConfig { @@ -53,24 +50,4 @@ class Analytics extends BaseConfig ]; public bool $enableOP3 = false; - - /** - * get the full audio file url - */ - public function getAudioUrl(Episode $episode, array $params): string - { - $audioFileURI = new URI(service('file_manager')->getUrl($episode->audio->file_key)); - $audioFileURI->setQueryArray($params); - - // Wrap episode url with OP3 if episode is public and OP3 is enabled on this podcast - if (! $episode->is_premium && service('settings')->get( - 'Analytics.enableOP3', - 'podcast:' . $episode->podcast_id - )) { - $op3 = new OP3($this->OP3); - $audioFileURI = new URI($op3->wrap($audioFileURI, $episode)); - } - - return (string) $audioFileURI; - } } diff --git a/modules/Analytics/OP3.php b/modules/Analytics/OP3.php index e3082e2c..76eaa6e0 100644 --- a/modules/Analytics/OP3.php +++ b/modules/Analytics/OP3.php @@ -11,7 +11,6 @@ declare(strict_types=1); namespace Modules\Analytics; use App\Entities\Episode; -use CodeIgniter\HTTP\URI; class OP3 { @@ -25,11 +24,11 @@ class OP3 $this->host = rtrim($config['host'], '/'); } - public function wrap(URI $audioURI, Episode $episode): string + public function wrap(string $audioURL, Episode $episode): string { - // remove scheme from audioURI - $audioURI->setScheme(''); + // remove scheme from audioURI if https + $audioURIWithoutHTTPS = preg_replace('(^https://)', '', $audioURL); - return $this->host . '/e,pg=' . $episode->podcast->guid . '/' . $audioURI; + return $this->host . '/e,pg=' . $episode->podcast->guid . '/' . $audioURIWithoutHTTPS; } } From 98c6658840eedd55bd6d8042f8a69c342b87cd71 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Thu, 15 Feb 2024 11:36:09 +0000 Subject: [PATCH 294/477] feat: add podcast:season and podcast:episode tags to rss feed --- app/Helpers/rss_helper.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index bde1f11d..eabdcdba 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -338,6 +338,12 @@ if (! function_exists('get_rss_feed')) { $item->addChild('season', (string) $episode->season_number, $itunesNamespace); $item->addChild('episodeType', $episode->type, $itunesNamespace); + // add podcast namespace tags for season and episode + $episode->season_number && + $item->addChild('season', (string) $episode->season_number, $podcastNamespace); + $episode->number && + $item->addChild('episode', (string) $episode->number, $podcastNamespace); + // add link to episode comments as podcast-activity format $comments = $item->addChild('comments', null, $podcastNamespace); $comments->addAttribute('uri', url_to('episode-comments', $podcast->handle, $episode->slug)); From 87cc437e1ead5486ed46ca37e2055aaf5c9445c1 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Sat, 17 Feb 2024 12:02:38 +0000 Subject: [PATCH 295/477] feat: display chapters in episode's public page closes #423 --- app/Config/Routes.php | 7 ++- app/Controllers/EpisodeController.php | 62 +++++++++++++++++++ app/Controllers/EpisodePreviewController.php | 8 +++ app/Entities/Episode.php | 1 - app/Language/en/Episode.php | 2 + modules/Media/Entities/Chapters.php | 42 +++++++++++++ tailwind.config.cjs | 1 + themes/cp_app/episode/_partials/chapter.php | 11 ++++ .../cp_app/episode/_partials/navigation.php | 12 ++++ themes/cp_app/episode/chapters.php | 25 ++++++++ themes/cp_app/episode/preview-chapters.php | 25 ++++++++ 11 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 themes/cp_app/episode/_partials/chapter.php create mode 100644 themes/cp_app/episode/chapters.php create mode 100644 themes/cp_app/episode/preview-chapters.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index f9e06943..66644b83 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -125,6 +125,9 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { $routes->get('activity', 'EpisodeController::activity/$1/$2', [ 'as' => 'episode-activity', ]); + $routes->get('chapters', 'EpisodeController::chapters/$1/$2', [ + 'as' => 'episode-chapters', + ]); $routes->options('comments', 'ActivityPubController::preflight'); $routes->get('comments', 'EpisodeController::comments/$1/$2', [ 'as' => 'episode-comments', @@ -196,10 +199,12 @@ $routes->get('/audio/@(:podcastHandle)/(:slug).(:alphanum)', 'EpisodeAudioContro $routes->get('/p/(:uuid)', 'EpisodePreviewController::index/$1', [ 'as' => 'episode-preview', ]); - $routes->get('/p/(:uuid)/activity', 'EpisodePreviewController::activity/$1', [ 'as' => 'episode-preview-activity', ]); +$routes->get('/p/(:uuid)/chapters', 'EpisodePreviewController::chapters/$1', [ + 'as' => 'episode-preview-chapters', +]); // Other pages $routes->get('/credits', 'CreditsController', [ diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index cda684aa..9c99a01d 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -27,6 +27,7 @@ use Config\Services; use Modules\Analytics\AnalyticsTrait; use Modules\Fediverse\Objects\OrderedCollectionObject; use Modules\Fediverse\Objects\OrderedCollectionPage; +use Modules\Media\FileManagers\FileManagerInterface; use SimpleXMLElement; class EpisodeController extends BaseController @@ -166,6 +167,67 @@ class EpisodeController extends BaseController return $cachedView; } + public function chapters(): String + { + // Prevent analytics hit when authenticated + if (! auth()->loggedIn()) { + $this->registerPodcastWebpageHit($this->episode->podcast_id); + } + + $cacheName = implode( + '_', + array_filter([ + 'page', + "podcast#{$this->podcast->id}", + "episode#{$this->episode->id}", + 'chapters', + service('request') + ->getLocale(), + is_unlocked($this->podcast->handle) ? 'unlocked' : null, + auth() + ->loggedIn() ? 'authenticated' : null, + ]), + ); + + if (! ($cachedView = cache($cacheName))) { + // get chapters from json file + $data = [ + 'metatags' => get_episode_metatags($this->episode), + 'podcast' => $this->podcast, + 'episode' => $this->episode, + ]; + + if (isset($this->episode->chapters->file_key)) { + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); + $episodeChaptersJsonString = (string) $fileManager->getFileContents($this->episode->chapters->file_key); + + $chapters = json_decode($episodeChaptersJsonString, true); + $data['chapters'] = $chapters; + } + + $secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode( + $this->podcast->id, + ); + + if (auth()->loggedIn()) { + helper('form'); + + return view('episode/chapters', $data); + } + + // The page cache is set to a decade so it is deleted manually upon podcast update + return view('episode/chapters', $data, [ + 'cache' => $secondsToNextUnpublishedEpisode + ? $secondsToNextUnpublishedEpisode + : DECADE, + 'cache_name' => $cacheName, + ]); + } + + return $cachedView; + } + public function embed(string $theme = 'light-transparent'): string { header('Content-Security-Policy: frame-ancestors http://*:* https://*:*'); diff --git a/app/Controllers/EpisodePreviewController.php b/app/Controllers/EpisodePreviewController.php index 6c03eef2..f100653a 100644 --- a/app/Controllers/EpisodePreviewController.php +++ b/app/Controllers/EpisodePreviewController.php @@ -63,4 +63,12 @@ class EpisodePreviewController extends BaseController 'episode' => $this->episode, ]); } + + public function chapters(): RedirectResponse | string + { + return view('episode/preview-chapters', [ + 'podcast' => $this->episode->podcast, + 'episode' => $this->episode, + ]); + } } diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 357b4748..5b8ed613 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -21,7 +21,6 @@ use App\Models\PostModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; -use CodeIgniter\HTTP\URI; use CodeIgniter\I18n\Time; use Config\Images; use Exception; diff --git a/app/Language/en/Episode.php b/app/Language/en/Episode.php index 44be8e38..7536120d 100644 --- a/app/Language/en/Episode.php +++ b/app/Language/en/Episode.php @@ -23,6 +23,7 @@ return [ 'back_to_episodes' => 'Back to episodes of {podcast}', 'comments' => 'Comments', 'activity' => 'Activity', + 'chapters' => 'Chapters', 'description' => 'Episode description', 'number_of_comments' => '{numberOfComments, plural, one {# comment} @@ -42,4 +43,5 @@ return [ 'publish' => 'Publish', 'publish_edit' => 'Edit publication', ], + 'no_chapters' => 'No chapters are available for this episode.', ]; diff --git a/modules/Media/Entities/Chapters.php b/modules/Media/Entities/Chapters.php index fe66c59e..0d20ab67 100644 --- a/modules/Media/Entities/Chapters.php +++ b/modules/Media/Entities/Chapters.php @@ -10,7 +10,49 @@ declare(strict_types=1); namespace Modules\Media\Entities; +use CodeIgniter\Files\File; +use Exception; + class Chapters extends BaseMedia { protected string $type = 'chapters'; + + public function initFileProperties(): void + { + parent::initFileProperties(); + + if ($this->file_metadata !== null && array_key_exists('chapter_count', $this->file_metadata)) { + helper('media'); + + $this->chapter_count = $this->file_metadata['chapter_count']; + } + } + + public function setFile(File $file): self + { + parent::setFile($file); + + $metadata = lstat((string) $file) ?? []; + + helper('filesystem'); + + $metadata['chapter_count'] = $this->countChaptersInJson($file); + + $this->attributes['file_metadata'] = json_encode($metadata, JSON_INVALID_UTF8_IGNORE); + + $this->file = $file; + + return $this; + } + + private function countChaptersInJson(File $file): Int + { + $chapterContent = file_get_contents($file->getRealPath()); + + if ($chapterContent === false) { + throw new Exception('Could not read chapter file at ' . $this->file->getRealPath()); + } + + return substr_count($chapterContent, 'startTime'); + } } diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 2d7690d8..526574ad 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -41,6 +41,7 @@ module.exports = { backgroundColor: { base: "hsl(var(--color-background-base) / )", elevated: "hsl(var(--color-background-elevated) / )", + subtle: "hsl(var(--color-border-subtle) / )", navigation: "hsl(var(--color-background-navigation) / )", "navigation-active": "hsl(var(--color-background-navigation-active) / )", diff --git a/themes/cp_app/episode/_partials/chapter.php b/themes/cp_app/episode/_partials/chapter.php new file mode 100644 index 00000000..f362b6cd --- /dev/null +++ b/themes/cp_app/episode/_partials/chapter.php @@ -0,0 +1,11 @@ +
    + +
    +
    + +
    + + + +
    +
    diff --git a/themes/cp_app/episode/_partials/navigation.php b/themes/cp_app/episode/_partials/navigation.php index 73fdcf5b..cc9a313d 100644 --- a/themes/cp_app/episode/_partials/navigation.php +++ b/themes/cp_app/episode/_partials/navigation.php @@ -12,6 +12,11 @@ if ($episode->publication_status === 'published') { 'label' => lang('Episode.activity'), 'labelInfo' => $episode->posts_count, ], + [ + 'uri' => route_to('episode-chapters', esc($podcast->handle), esc($episode->slug)), + 'label' => lang('Episode.chapters'), + 'labelInfo' => $episode->chapters === null ? 0 : $episode->chapters->chapter_count, + ], ]; } else { $navigationItems = [ @@ -25,8 +30,15 @@ if ($episode->publication_status === 'published') { 'label' => lang('Episode.activity'), 'labelInfo' => $episode->posts_count, ], + [ + 'uri' => route_to('episode-preview-chapters', $episode->preview_id), + 'label' => lang('Episode.chapters'), + 'labelInfo' => $episode->chapters === null ? 0 : $episode->chapters->chapter_count, + ], ]; } + + ?>
    -## License +## Aotre [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) diff --git a/docs/src/ca/getting-started/auth.md b/docs/src/ca/getting-started/auth.md index 4a873da4..d0c8d512 100644 --- a/docs/src/ca/getting-started/auth.md +++ b/docs/src/ca/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| ------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------ | +| Super administrador | Té control complet sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Administrador | Administra el contingut de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Usos generals de Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | -------------------------------------------------------------------- | +| admin.access | Pot accedir a l'àrea d'administració de Castopod. | +| admin.settings | Pot accedir a la configuració de Castopod. | +| users.manage | Pot administrar els usuaris de Castopod. | +| persons.manage | Pot administrar persones. | +| pages.manage | Pot administrar pàgines. | +| podcasts.view | Pot veure els pòdcasts. | +| podcasts.create | Pot crear nous pòdcasts. | +| podcasts.import | Pot importar pòdcasts. | +| fediverse.manage-blocks | Pot evitar que actors/dominis del fedivers interactuen amb Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrador | Té control complet del pòdcast #{id}. | \* | +| Editor | Administra els continguts i la publicació del pòdcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Administra el contingut del podcast #{id} però no el pot publicar. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Convidat | Col·laborador general del podcast #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permission | description | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| view | Pot veure el tauler i les estadístiques del podcast #{id}. | +| edit | Pot editar el podcast #{id}. | +| delete | Pot suprimir el podcast #{id}. | +| manage-import | Pot sincronitzar el podcast importat #{id}. | +| manage-persons | Pot gestionar les subscripcions del podcast #{id}. | +| manage-subscriptions | Pot gestionar les subscripcions del podcast #{id}. | +| manage-contributors | Pot gestionar els col·laboradors del podcast #{id}. | +| manage-platforms | Pot establir/eliminar enllaços de plataforma del podcast #{id}. | +| manage-publications | Pot publicar el podcast #{id}. | +| manage-notifications | Pot veure i marcar les notificacions com a llegides per al podcast #{id}. | +| interact-as | Pot interactuar en nom del podcast #{id} per marcar les publicacions com a preferides, compartir-les o respondre-hi. | +| episodes.view | Pot veure el tauler i les estadístiques del podcast #{id}. | +| episodes.create | Pot crear episodis per al podcast #{id}. | +| episodes.edit | Pot editar el podcast #{id}. | +| episodes.delete | Pot suprimir el podcast #{id}. | +| episodes.manage-persons | Pot gestionar les subscripcions del podcast #{id}. | +| episodes.manage-clips | Pot gestionar clips de vídeo o fragments de so del pòdcast #{id}. | +| episodes.manage-publications | Pot publicar el podcast #{id}. | +| episodes.manage-comments | Pot crear/eliminar comentaris d'episodi del pòdcast #{id}. | diff --git a/docs/src/de/getting-started/auth.md b/docs/src/de/getting-started/auth.md index b163d222..2c471373 100644 --- a/docs/src/de/getting-started/auth.md +++ b/docs/src/de/getting-started/auth.md @@ -18,11 +18,11 @@ definiert: -| Rolle | Beschreibung | Berechtigungen | +| role | description | permissions | | ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------ | | Super-Administrator | Hat die vollständige Kontrolle über Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Verwaltet Castopods Inhalt. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Generelle Benutzer von Castopod. | admin.access | +| Manager | Verwaltet Castopods Inhalte. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Allgemeine Benutzer von Castopod. | admin.access | @@ -30,17 +30,17 @@ definiert: -| Berechtigung | Beschreibung | +| permission | description | | ----------------------- | ---------------------------------------------------------------------------- | -| admin.access | Kann auf den Castopod Adminbereich zugreifen. | -| admin.settings | Kann auf die Castopod Einstellungen zugreifen. | -| users.manage | Kann Castopod Benutzer verwalten. | -| persons.manage | Kann Personen verwalten. | +| admin.access | Kann auf den Admin-Bereich von Castopod zugreifen. | +| admin.settings | Kann auf die Einstellungen von Castopod zugreifen. | +| users.manage | Kann Castopod-Benutzer verwalten. | +| persons.manage | Kann Mitwirkende verwalten. | | pages.manage | Kann Seiten verwalten. | | podcasts.view | Kann alle Podcasts einsehen. | | podcasts.create | Kann neue Podcasts erstellen. | | podcasts.import | Kann Podcasts importieren. | -| fediverse.manage-blocks | Kann Fediverse Akteure/Domains davon abhalten, mit Castopod zu interagieren. | +| fediverse.manage-blocks | Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren. | @@ -50,9 +50,9 @@ definiert: -| Rolle | Beschreibung | Berechtigungen | +| role | description | permissions | | ------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrator | Hat vollständige Kontrolle über Podcast #{id}. | \* | +| Administrator | Hat die vollständige Kontrolle über Podcast #{id}. | \* | | Editor | Verwaltet Inhalte und Veröffentlichungen von Podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | | Autor | Verwaltet Inhalte von Podcast #{id}, kann diese aber nicht veröffentlichen. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | | Gast | Allgemeiner Mitwirkender des Podcasts #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ definiert: -| Berechtigung | Beschreibung | -| ---------------------------- | ------------------------------------------------------------------------------------------------ | -| view | Kann Dashboard und Analysen des Podcasts #{id} einsehen. | -| edit | Kann Podcast #{id} bearbeiten. | -| delete | Kann Podcast #{id} löschen. | -| manage-import | Kann importierten Podcast #{id} synchronisieren. | -| manage-persons | Kann Mitwirkende des Podcasts #{id} verwalten. | -| manage-subscriptions | Kann Abonnements des Podcast #{id} verwalten. | -| manage-contributors | Kann Mitwirkende des Podcasts #{id} verwalten. | -| manage-platforms | Kann Plattform-Links des Podcast #{id} setzen/entfernen. | -| manage-publications | Kann Podcast #{id} veröffentlichen. | -| manage-notifications | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. | -| interact-as | Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder zu beantworten. | -| episodes.view | Kann Dashboard und Analysen des Podcasts #{id} einsehen. | -| episodes.create | Kann Folgen für Podcast #{id} erstellen. | -| episodes.edit | Kann Podcast #{id} bearbeiten. | -| episodes.delete | Kann Podcast #{id} löschen. | -| episodes.manage-persons | Kann Abonnements des Podcast #{id} verwalten. | -| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #{id} verwalten. | -| episodes.manage-publications | Kann Podcast #{id} veröffentlichen. | -| episodes.manage-comments | Du kannst Episodenkommentare von Podcast #{id} erstellen/entfernen. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------ | +| view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. | +| edit | Kann Podcast #{id} bearbeiten. | +| delete | Kann Podcast #{id} löschen. | +| manage-import | Kann den importierten Podcast #{id} synchronisieren. | +| manage-persons | Kann Abonnements des Podcasts #{id} verwalten. | +| manage-subscriptions | Kann Abonnements des Podcasts #{id} verwalten. | +| manage-contributors | Kann Mitwirkende des Podcasts #{id} verwalten. | +| manage-platforms | Kann Plattform-Links des Podcasts #{id} verwalten. | +| manage-publications | Kann Podcast #{id} veröffentlichen. | +| manage-notifications | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. | +| interact-as | Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten. | +| episodes.view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. | +| episodes.create | Kann Folgen für Podcast #{id} erstellen. | +| episodes.edit | Kann Podcast #{id} bearbeiten. | +| episodes.delete | Kann Podcast #{id} löschen. | +| episodes.manage-persons | Kann Abonnements des Podcasts #{id} verwalten. | +| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #{id} verwalten. | +| episodes.manage-publications | Kann Podcast #{id} veröffentlichen. | +| episodes.manage-comments | Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen. | diff --git a/docs/src/el/getting-started/auth.md b/docs/src/el/getting-started/auth.md index e041016b..a9f7df64 100644 --- a/docs/src/el/getting-started/auth.md +++ b/docs/src/el/getting-started/auth.md @@ -18,7 +18,7 @@ sidebarDepth: 3 -| ρόλος | περιγραφή | δικαιώματα | +| role | description | permissions | | ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | | Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | @@ -30,17 +30,17 @@ sidebarDepth: 3 -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | -------------------------------------------------------------------------------------- | +| admin.access | Μπορεί να έχει πρόσβαση στην περιοχή διαχείρισης Castopod. | +| admin.settings | Μπορεί να έχει πρόσβαση στις ρυθμίσεις Castopod. | +| users.manage | Μπορεί να διαχειριστεί τους χρήστες Castopod. | +| persons.manage | Μπορεί να διαχειριστεί τα άτομα. | +| pages.manage | Μπορεί να διαχειριστεί τις σελίδες. | +| podcasts.view | Μπορεί να δει όλα τα podcasts. | +| podcasts.create | Μπορεί να δημιουργήσει νέα podcasts. | +| podcasts.import | Μπορεί να εισάγει podcasts. | +| fediverse.manage-blocks | Μπορεί να εμποδίσει τους ψευτογενείς ηθοποιούς/τομείς να αλληλεπιδρούν με το Castopod. | @@ -50,12 +50,12 @@ sidebarDepth: 3 -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------------ | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Διαχειριστής | Έχει πλήρη έλεγχο του podcast #{id}. | \* | +| Εκδότης | Διαχειρίζεται περιεχόμενο και δημοσιεύσεις του podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Συντάκτης | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Επισκέπτης | Γενικός συντελεστής του podcast #{id}. | view, episodes.view | diff --git a/docs/src/es/getting-started/auth.md b/docs/src/es/getting-started/auth.md index 9024c6c0..5a049c42 100644 --- a/docs/src/es/getting-started/auth.md +++ b/docs/src/es/getting-started/auth.md @@ -18,10 +18,10 @@ niveles: -| roles | descripción | permisos | +| role | description | permissions | | ------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------ | | Super administrador | Tiene control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Administrador | Gestiona el contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Administrador | Administrar contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | | Podcaster | Usuarios generales de Castopod. | admin.access | @@ -30,7 +30,7 @@ niveles: -| permisos | descripción | +| permission | description | | ----------------------- | ------------------------------------------------------------------------------ | | admin.access | Puedes acceder al área de administración de Castopod. | | admin.settings | Puede acceder a la configuración de Castopod. | @@ -50,7 +50,7 @@ niveles: -| roles | descripción | permisos | +| role | description | permissions | | ------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Administrador | Tiene el control completo del podcast #{id}. | \* | | Editor | Gestiona el contenido y las publicaciones del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | @@ -63,26 +63,26 @@ niveles: -| permisos | descripción | -| ---------------------------- | -------------------------------------------------------------------------------------------------- | -| view | Puede ver el panel de control y análisis del podcast #{id}. | -| edit | Puede editar podcast #{id}. | -| delete | Puede borrar el podcast #{id}. | -| manage-import | Puede sincronizar el podcast importado #{id}. | -| manage-persons | Puede administrar las suscripciones del podcast #{id}. | -| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. | -| manage-contributors | Puede administrar colaboradores del podcast #{id}. | -| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. | -| manage-publications | Puede publicar el podcast #{id}. | -| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. | -| interact-as | Puede interactuar como el podcast #{id} para favoritar, compartir o responder a las publicaciones. | -| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. | -| episodes.create | Puede crear episodios para el podcast #{id}. | -| episodes.edit | Puede editar episodios #{id}. | -| episodes.delete | Puede borrar el podcast #{id}. | -| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. | -| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. | -| episodes.manage-publications | Puede publicar el podcast #{id}. | -| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------- | +| view | Puede ver el panel de control y analíticas del episodio #{id}. | +| edit | Puede editar el podcast #{id}. | +| delete | Puede borrar el podcast #{id}. | +| manage-import | Puede sincronizar el podcast importado #{id}. | +| manage-persons | Puede administrar las suscripciones del podcast #{id}. | +| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. | +| manage-contributors | Puede administrar colaboradores del podcast #{id}. | +| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. | +| manage-publications | Puede publicar el podcast #{id}. | +| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. | +| interact-as | Puede interactuar como el podcast #{id} para marcar como favarito, compartir o responder a las publicaciones. | +| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. | +| episodes.create | Puede crear episodios para el podcast #{id}. | +| episodes.edit | Puede editar el podcast #{id}. | +| episodes.delete | Puede borrar el podcast #{id}. | +| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. | +| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. | +| episodes.manage-publications | Puede publicar el podcast #{id}. | +| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. | diff --git a/docs/src/fr/getting-started/auth.md b/docs/src/fr/getting-started/auth.md index db3e409c..ee460680 100644 --- a/docs/src/fr/getting-started/auth.md +++ b/docs/src/fr/getting-started/auth.md @@ -18,11 +18,11 @@ autorisations sont définis sur deux niveaux : -| rôle | description | permissions | -| ------------ | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Gestionnaire | Gère le contenu de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Utilisateurs généraux de Castopod. | admin.access | +| role | description | permissions | +| -------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administrat·rice·eur | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Gestionnaire | Gère le contenu de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcast·rice·eur | Utilisateurs généraux de Castopod. | admin.access | @@ -30,17 +30,17 @@ autorisations sont définis sur deux niveaux : -| autorisation | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Peut accéder à la zone d'administration Castopod. | -| admin.settings | Peut accéder aux paramètres de Castopod. | -| users.manage | Peut gérer les utilisateurs de Castopod. | -| persons.manage | Can manage persons. | -| pages.manage | Permet de gérer les pages. | -| podcasts.view | Peut voir tous les podcasts. | -| podcasts.create | Peut créer de nouveaux podcasts. | -| podcasts.import | Peut importer des podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | -------------------------------------------------------------------- | +| admin.access | Peut accéder à la zone d'administration Castopod. | +| admin.settings | Peut accéder aux paramètres de Castopod. | +| users.manage | Peut gérer les utilisateurs de Castopod. | +| persons.manage | Permet de gérer les personnes. | +| pages.manage | Permet de gérer les pages. | +| podcasts.view | Peut voir tous les podcasts. | +| podcasts.create | Peut créer de nouveaux podcasts. | +| podcasts.import | Peut importer des podcasts. | +| fediverse.manage-blocks | Peut empêcher des act·rice·eur·s/domaines d'interagir avec Castopod. | @@ -50,12 +50,12 @@ autorisations sont définis sur deux niveaux : -| rôle | description | permissions | -| ------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | A un contrôle total sur le podcast #{id}. | \* | -| Éditeur | Gère le contenu et les publications du podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Auteur | Gère le contenu du podcast #{id} , mais ne peut pas le publier. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Invité | Contributeur général du podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ---------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrateur | A un contrôle total sur le podcast #{id}. | \* | +| Éditeur | Gère le contenu et les publications du podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Auteur / Autrice | Gère le contenu du podcast #{id} , mais ne peut pas le publier. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Invité | Contributeur général du podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ autorisations sont définis sur deux niveaux : -| autorisation | description | -| ---------------------------- | ----------------------------------------------------------------------------------------- | -| voir | Visualisation du tableau de bord et de l'analyse du podcast #{id}. | -| éditer | Peut éditer le podcast #{id}. | -| supprimer | Peut supprimer le podcast #{id}. | -| gérer les importations | Peut synchroniser le podcast importé #{id}. | -| gérer les personnes | Permet de gérer les abonnements au podcast #{id}. | -| gérer les abonnements | Permet de gérer les abonnements au podcast #{id}. | -| gérer contributeurs | Permet de gérer les contributeurs du podcast #{id}. | -| gérer les plates-formes | Peut configurer/supprimer les liens de la plateforme du podcast #{id}. | -| gérer les publications | Peut publier le podcast #{id}. | -| gérer les notifications | Peut afficher et marquer les notifications comme lues pour le podcast #{id}. | -| interagir en tant que | Peut interagir en tant que podcast #{id} pour ajouter, partager ou répondre aux messages. | -| episodes.view | Peut voir le tableau de bord et les analyses du podcast #{id}. | -| créer des épisodes | Peut créer des épisodes pour le podcast #{id}. | -| éditer les épisodes | Peut éditer le podcast #{id}. | -| supprimer les épisodes | Peut supprimer le podcast #{id}. | -| episodes.manage-persons | Permet de gérer les abonnements au podcast #{id}. | -| episodes.manage-clips | Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}. | -| episodes.manage-publications | Peut publier le podcast #{id}. | -| episodes.manage-comments | Peut créer/supprimer les commentaires de l'épisode du podcast #{id}. | +| permission | description | +| ---------------------------- | -------------------------------------------------------------------------------------------------- | +| view | Peut voir le tableau de bord et les analyses du podcast #{id}. | +| edit | Peut éditer le podcast #{id}. | +| delete | Peut supprimer le podcast #{id}. | +| manage-import | Peut synchroniser le podcast importé #{id}. | +| manage-persons | Permet de gérer les abonnements au podcast #{id}. | +| manage-subscriptions | Permet de gérer les abonnements au podcast #{id}. | +| manage-contributors | Permet de gérer les contributeurs du podcast #{id}. | +| manage-platforms | Peut configurer/supprimer les liens de la plateforme du podcast #{id}. | +| manage-publications | Peut publier le podcast #{id}. | +| manage-notifications | Peut afficher et marquer les notifications comme lues pour le podcast #{id}. | +| interact-as | Peut interagir en tant que podcast #{id} pour mettre en favori, partager ou répondre aux messages. | +| episodes.view | Peut voir le tableau de bord et les analyses du podcast #{id}. | +| episodes.create | Peut créer des épisodes pour le podcast #{id}. | +| episodes.edit | Peut éditer le podcast #{id}. | +| episodes.delete | Peut supprimer le podcast #{id}. | +| episodes.manage-persons | Permet de gérer les abonnements au podcast #{id}. | +| episodes.manage-clips | Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}. | +| episodes.manage-publications | Peut publier le podcast #{id}. | +| episodes.manage-comments | Peut créer/supprimer les commentaires de l'épisode du podcast #{id}. | diff --git a/docs/src/gd/getting-started/auth.md b/docs/src/gd/getting-started/auth.md index ff5d59c0..d2dc39ab 100644 --- a/docs/src/gd/getting-started/auth.md +++ b/docs/src/gd/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | +| Sàr-rianaire | Smachd gu lèir air Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manaidsear | Stiùireadh susbaint Chastopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Pod-chraoladair | Luchd-cleachdaidh coitcheann Chastopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | --------------------------------------------------------------------------------------------- | +| admin.access | ’S urrainn dhaibh raon rianachd Chastopod inntrigeadh. | +| admin.settings | ’S urrainn dhaibh roghainnean Chastopod inntrigeadh. | +| users.manage | ’S urrainn dhaibh luchdc-leachdaidh Chastopod a stiùireadh. | +| persons.manage | ’S urrainn dhaibh daoine a stiùireadh. | +| pages.manage | ’S urrainn dhaibh duilleagan a stiùireadh. | +| podcasts.view | Chì iad a h-uile pod-chraoladh. | +| podcasts.create | ’S urrainn dhaibh pod-chraolaidhean ùra a chruthachadh. | +| podcasts.import | ’S urrainn dhaibh pod-chraolaidhean ion-phortadh. | +| fediverse.manage-blocks | ’S urrainn dhaibh actairean/àrainnean a cho-shaoghail a bhacadh o eadar-ghabhail le Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| --------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Rianaire | Smachd gu lèir air air a’ phod-chraoladh #{id}. | \* | +| Deasaiche | A’ stiùireadh susbaint is foillseachaidhean a’ phod-chraoladh #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Ùghdar | A’ stiùireadh susbaint a’ phod-chraolaidh #{id} ach gun chomas foillseachaidh. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Aoigh | Neach-cuideachaidh a’ phod-chraolaidh #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permission | description | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| view | Cead an deas-bhòrd agus anailiseachd a’ phod-chraolaidh #{id} a shealltainn. | +| edit | ’S urrainn dhaibh am pod-chraoladh #{id} a dheasachadh. | +| delete | ’S urrainn dhaibh am pod-chraoladh #{id} a sguabadh às. | +| manage-import | ’S urrainn dhaibh am pod-chraoladh #{id} air ion-phortadh a shioncronachadh. | +| manage-persons | ’S urrainn dhaibh na fo-sgrìobhaidhean air a’ phod-chraoladh #{id} a stiùireadh. | +| manage-subscriptions | ’S urrainn dhaibh na fo-sgrìobhaidhean air a’ phod-chraoladh #{id} a stiùireadh. | +| manage-contributors | ’S urrainn dhaibh an luchd-cuideachaidh aig a’ phod-chraoladh #{id} a stiùireadh. | +| manage-platforms | ’S urrainn dhaibh ceanglaichean-ùrlair a’ phod-chraolaidh #{id} a shuidheachadh/a thoirt air falbh. | +| manage-publications | ’S urrainn dhaibh am pod-chraoladh #{id} fhoillseachadh. | +| manage-notifications | Chì iad brathan a’ phod-chraolaidh #{id} agus ’s urrainn dhaibh comharra a chur gun deach an leughadh. | +| interact-as | ’S urrainn dhaibh eadar-ghabhail ’na phod-chraoladh #{id} airson annsachdan, co-roinneadh is freagairtean do phostaichean. | +| episodes.view | Cead an deas-bhòrd agus anailiseachd a’ phod-chraolaidh #{id} a shealltainn. | +| episodes.create | ’S urrainn dhaibh eapasodan a chruthachadh dhan phod-chraoladh #{id}. | +| episodes.edit | ’S urrainn dhaibh am pod-chraoladh #{id} a dheasachadh. | +| episodes.delete | ’S urrainn dhaibh am pod-chraoladh #{id} a sguabadh às. | +| episodes.manage-persons | ’S urrainn dhaibh na fo-sgrìobhaidhean air a’ phod-chraoladh #{id} a stiùireadh. | +| episodes.manage-clips | ’S urrainn dhaibh cliopaichean video no blasan-fuaime aig a’ phod-chraoladh #{id} a stiùireadh. | +| episodes.manage-publications | ’S urrainn dhaibh am pod-chraoladh #{id} fhoillseachadh. | +| episodes.manage-comments | ’S urrainn dhaibh beachdan air eapasod a’ phod-chraolaidh #{id} a chruthachadh/a thoirt air falbh. | diff --git a/docs/src/gl/getting-started/auth.md b/docs/src/gl/getting-started/auth.md index ff5d59c0..0faec1c6 100644 --- a/docs/src/gl/getting-started/auth.md +++ b/docs/src/gl/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| ----------- | ------------------------------------ | ------------------------------------------------------------------------------------------ | +| Super Admin | Ten control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Xestora | Quen xestiona o contido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Usuaria común de Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------------------ | +| admin.access | Pode acceder á área de administración. | +| admin.settings | Pode acceder aos axustes de Castopod. | +| users.manage | Pode xestionar as usuarias de Castopod. | +| persons.manage | Pode xestionar persoas. | +| pages.manage | Pode xestionar páxinas. | +| podcasts.view | Pode ver tódolos podcast. | +| podcasts.create | Pode crear novos podcast. | +| podcasts.import | Pode importar podcasts. | +| fediverse.manage-blocks | Pode bloquear actores/dominios do fediverso evitando interactuar con Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| --------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Ten control total sobre o podcast #{id}. | \* | +| Editora | Persoa que xestiona o contido e publicacións do podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autora | Persoa que xestiona o contido do podcast #{id} pero non pode publicalo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Convidada | Contribuínte básico ao podcast #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permission | description | +| ---------------------------- | --------------------------------------------------------------------------------------- | +| view | Pode ver o taboleiro e estatísticas do podcast #{id}. | +| edit | Pode editar o podcast #{id}. | +| delete | Pode eliminar o podcast #{id}. | +| manage-import | Pode sincronizar o podcast importado #{id}. | +| manage-persons | Pode xestionar as subscricións do podcast #{id}. | +| manage-subscriptions | Pode xestionar as subscricións do podcast #{id}. | +| manage-contributors | Pode xestionar as contribucións ao podcast #{id}. | +| manage-platforms | Pode establecer/eliminar ligazóns a plataformas do podcast #{id}. | +| manage-publications | Pode publicar o podcast #{id}. | +| manage-notifications | Pode ver e marcar as notificacións como lidas no podcast #{id}. | +| interact-as | Pode actuar como o podcast #{id} para compartir, favorecer ou responder a publicacións. | +| episodes.view | Pode ver o taboleiro e estatísticas do podcast #{id}. | +| episodes.create | Pode crear episodios para o podcast #{id}. | +| episodes.edit | Pode editar o podcast #{id}. | +| episodes.delete | Pode eliminar o podcast #{id}. | +| episodes.manage-persons | Pode xestionar as subscricións do podcast #{id}. | +| episodes.manage-clips | Pode xestionar os clips de vídeo e extractos de audio do podcast #{id}. | +| episodes.manage-publications | Pode publicar o podcast #{id}. | +| episodes.manage-comments | Pode crear/eliminar comentarios dos episodios do podcast #{id}. | diff --git a/docs/src/it/getting-started/auth.md b/docs/src/it/getting-started/auth.md index 18fb8027..4d2de508 100644 --- a/docs/src/it/getting-started/auth.md +++ b/docs/src/it/getting-started/auth.md @@ -18,11 +18,11 @@ definiti a due livelli: -| ruolo | descrizione | permessi | -| ----------- | ---------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Ha il pieno controllo su Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Gestisce il contenuto di Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Utenti generali di Castopod. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -30,17 +30,17 @@ definiti a due livelli: -| permesso | descrizione | -| ----------------------- | ------------------------------------------------------------------------- | -| admin.access | Può accedere alla zona di amministrazione di Castopod. | -| admin.settings | Può accedere alle impostazioni di Castopod. | -| users.manage | Può gestire gli utenti di Castopod. | -| persons.manage | Può gestire le persone. | -| pages.manage | Può gestire le pagine. | -| podcasts.view | Può visualizzare tutti i podcast. | -| podcasts.create | Può creare nuovi podcast. | -| podcasts.import | Può importare podcast. | -| fediverse.manage-blocks | Può impedire agli attori/domini del fediverso di interagire con Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -50,12 +50,12 @@ definiti a due livelli: -| ruolo | descrizione | autorizzazioni | -| ------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Ha il controllo completo del podcast #{id}. | \* | -| Editor | Gestisce contenuti e pubblicazioni del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autore | Gestisce i contenuti del podcast #{id}, ma non li può pubblicare. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Ospite | Collaboratore generale del podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ definiti a due livelli: -| autorizzazione | descrizione | -| ---------------------------- | ---------------------------------------------------------------------------------------------------- | -| view | Può visualizzare il pannello di controllo e le statistiche del podcast #{id}. | -| edit | Può modificare il podcast #{id}. | -| delete | Può eliminare il podcast #{id}. | -| manage-import | Può sincronizzare il podcast #{id} importato. | -| manage-persons | Può gestire le iscrizioni del podcast #{id}. | -| manage-subscriptions | Può gestire le iscrizioni del podcast #{id}. | -| manage-contributors | Può gestire i collaboratori del podcast #{id}. | -| manage-platforms | Può impostare/rimuovere i link della piattaforma del podcast #{id}. | -| manage-publications | Può pubblicare il podcast #{id}. | -| manage-notifications | Può visualizzare e contrassegnare le notifiche come lette per il podcast #{id}. | -| interact-as | Può interagire come il podcast #{id}, per salvare tra i preferiti, condividere o rispondere ai post. | -| episodes.view | Può visualizzare il pannello di controllo e le statistiche del podcast #{id}. | -| episodes.create | Può creare episodi per il podcast #{id}. | -| episodes.edit | Può modificare il podcast #{id}. | -| episodes.delete | Può eliminare il podcast #{id}. | -| episodes.manage-persons | Può gestire gli abbonamenti del podcast #{id}. | -| episodes.manage-clips | Può gestire le clip video o i suoni del podcast #{id}. | -| episodes.manage-publications | Può pubblicare il podcast #{id}. | -| episodes.manage-comments | Può creare/rimuovere i commenti dell'episodio del podcast #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/nl/getting-started/auth.md b/docs/src/nl/getting-started/auth.md index 01b2a298..1dfdc972 100644 --- a/docs/src/nl/getting-started/auth.md +++ b/docs/src/nl/getting-started/auth.md @@ -18,11 +18,11 @@ niveaus: -| rol | omschrijving | rechten | -| ----------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | -| Super admin | Heeft de volledige controle over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Beheerder | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Algemene gebruikers van Castopod. | admin.access | +| role | description | permissions | +| --------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | +| Super beheerder | Heeft de volledige controle over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Beheerder | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Algemene gebruikers van Castopod. | admin.access | @@ -30,7 +30,7 @@ niveaus: -| recht | omschrijving | +| permission | description | | ----------------------- | -------------------------------------------------------------------- | | admin.access | Kan toegang krijgen tot de beheeromgeving van Castopod. | | admin.settings | Kan toegang krijgen tot de instellingen van Castopod. | @@ -50,10 +50,10 @@ niveaus: -| rol | omschrijving | rechten | +| role | description | permissions | | --------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Beheerder | Heeft de volledige controle over podcast #{id}. | \* | -| Editor | Beheert inhoud en publicaties van podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Redacteur | Beheert inhoud en publicaties van podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | | Auteur | Beheert de inhoud van podcast #{id} maar kan deze niet publiceren. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | | Gast | Algemene bijdrager van podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ niveaus: -| recht | omschrijving | +| permission | description | | ---------------------------- | -------------------------------------------------------------------------------------- | -| weergeven | Kan dashboard en statistieken van podcast #{id} zien. | -| bewerken | Kan podcast #{id} wijzigen. | -| verwijderen | Kan podcast #{id} verwijderen. | +| view | Kan dashboard en analyses van podcast #{id} zien. | +| edit | Kan podcast #{id} wijzigen. | +| delete | Kan podcast #{id} verwijderen. | | manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. | -| manage-persons | Kan personen van podcast #{id} beheren. | -| manage-subscriptions | Kan abonnees van podcast #{id} beheren. | +| manage-persons | Kan abonnementen van podcast #{id} beheren. | +| manage-subscriptions | Kan abonnementen van podcast #{id} beheren. | | manage-contributors | Kan bijdragers van podcast #{id} beheren. | | manage-platforms | Kan platform links van podcast #{id} instellen of verwijderen. | | manage-publications | Kan podcast #{id} publiceren. | -| manage-notifications | Kan meldingen voor podcast #{id} bekijken en als gelezen markeren. | +| manage-notifications | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}. | | interact-as | Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten. | -| episodes.view | Kan dashboard en statistieken van podcast #{id} zien. | +| episodes.view | Kan dashboard en analyses van podcast #{id} zien. | | episodes.create | Kan afleveringen voor podcast #{id} aanmaken. | -| episodes.edit | Kan afleveringen van podcast #{id} wijzigen. | -| episodes.delete | Kan afleveringen van podcast #{id} verwijderen. | -| episodes.manage-persons | Kan personen in aflevering van podcast #{id} beheren. | +| episodes.edit | Kan podcast #{id} wijzigen. | +| episodes.delete | Kan podcast #{id} verwijderen. | +| episodes.manage-persons | Kan abonnementen van podcast #{id} beheren. | | episodes.manage-clips | Kan videoclips of soundbites van podcast #{id} beheren. | -| episodes.manage-publications | Kan afleveringen van podcast #{id} publiceren. | -| episodes.manage-comments | Kan reacties op afleveringen van podcast #{id} maken of verwijderen. | +| episodes.manage-publications | Kan podcast #{id} publiceren. | +| episodes.manage-comments | Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen. | diff --git a/docs/src/nn-NO/getting-started/auth.md b/docs/src/nn-NO/getting-started/auth.md index 7cd0073d..79c5653a 100644 --- a/docs/src/nn-NO/getting-started/auth.md +++ b/docs/src/nn-NO/getting-started/auth.md @@ -17,11 +17,11 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: -| rolle | skildring | løyve | +| role | description | permissions | | ----------- | -------------------------------- | ------------------------------------------------------------------------------------------ | | Superstyrar | Har full kontroll over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Leiar | Styrer innhaldet på Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podkastar | Vanlege Castopod-brukarar. | admin.tilgang | +| Podkastar | Vanlege Castopod-brukarar. | admin.access | @@ -29,7 +29,7 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: -| løyve | skildring | +| permission | description | | ----------------------- | ---------------------------------------------------------------------- | | admin.access | Kan bruka styringspanelet for Castopod. | | admin.settings | Kan få tilgang til innstillingane for Castopod. | @@ -49,7 +49,7 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: -| rolle | skildring | løyve | +| role | description | permissions | | ------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Administrator | Har full kontroll over podkasten #{id}. | \* | | Redaktør | Styrer innhald og publisering for podkasten #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | @@ -62,7 +62,7 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: -| løyve | description | +| permission | description | | ---------------------------- | ------------------------------------------------------------------ | | view | Kan sjå styringspanelet og analysedata for podkasten #{id}. | | edit | Kan redigera podkasten #{id}. | diff --git a/docs/src/pt-BR/getting-started/auth.md b/docs/src/pt-BR/getting-started/auth.md index 71ae5a8f..79acc264 100644 --- a/docs/src/pt-BR/getting-started/auth.md +++ b/docs/src/pt-BR/getting-started/auth.md @@ -18,11 +18,11 @@ níveis: -| cargos | descrição | permissões | -| ----------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Tem controle completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Gerentes | Gerencia o conteúdo de Castopod. | criar.podcasts, importar.podcasts, gerenciar.pessoas, gerenciar.páginas | -| Podcaster | Usuários gerais do Castopod. | admin.access | +| role | description | permissions | +| ------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administrador | Tem controle completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Gerente | Gerencia o conteúdo de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Usuários gerais do Castopod. | admin.access | @@ -30,7 +30,7 @@ níveis: -| permissões | descrição | +| permission | description | | ----------------------- | ---------------------------------------------------------------- | | admin.access | Pode acessar a área de administração do Castopod. | | admin.settings | Pode acessar as configurações de Castopod. | @@ -50,12 +50,12 @@ níveis: -| cargos | descrição | permissões | -| --------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Tem controle completo de podcast #{id}. | \* | -| Editor | Gerencia o conteúdo e as publicações do podcast #{id}. | visualizar, editar, gerenciar-importação, gerenciar-pessoas, gerenciar-plataformas, gerenciar-publicações, gerenciar-notificações, interagir-com, visualizar.episódios, criar.episódios,deletar.episódios, gerenciar-pessoas.episódios, gerenciar-clips.episódios, gerenciar-publicações.episódios, gerenciar-comentários.episódios | -| Autor | Gerencia o conteúdo do podcast #{id} mas não pode publicá-los. | visualizar, gerenciar-pessoas, visualizar.episódios, criar.episódios, editar.episódios, gerenciar-pessoas.episódios, gerenciar-clips.episódios | -| Convidado | Contribuidor geral do podcast #{id}. | visualizar, visualizar.episódios | +| role | description | permissions | +| ------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrador | Tem controle completo do podcast #{id}. | \* | +| Editor | Gerencia o conteúdo e as publicações do podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Gerencia o conteúdo do podcast #{id} mas não pode publicá-los. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Convidado | Contribuidor geral do podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ níveis: -| permissões | descrição | -| --------------------------------- | ------------------------------------------------------------------------------------------- | -| visualizar | Pode visualizar o painel de controle e análise de podcast #{id}. | -| editar | Pode editar podcast #{id}. | -| excluir | Pode excluir o podcast #{id}. | -| gerenciar-importações | Pode sincronizar o podcast importado #{id}. | -| gerenciar-pessoas | Pode gerenciar assinantes de podcast #{id}. | -| gerenciar-assinaturas | Pode gerenciar assinaturas de podcast #{id}. | -| gerente-contribuidores | Pode gerenciar contribuidores do podcast #{id}. | -| gerenciar-plataformas | Pode definir/remover links de plataforma do podcast #{id}. | -| gerencie-publicações | Pode publicar podcast #{id}. | -| gerenciar-notificações | Pode ver e marcar notificações como lidas para o podcast #{id}. | -| interagir-como | Pode interagir com o podcast #{id} para favorito, compartilhar ou responder às publicações. | -| visualizar.episódios | Pode visualizar o painel de controle e análise de podcast #{id}. | -| criar.episódio | Pode criar episódios para o podcast #{id}. | -| editar.episódios | Pode editar o podcast #{id}. | -| deletar.episódios | Pode deletar episódios do podcast #{id}. | -| gerenciar-pessoas.episódios | Pode gerenciar assinaturas de episódios do podcast #{id}. | -| gerenciar-clips.episódios | Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}. | -| gerenciar-publicações.episódios | Pode publicar episódios do podcast #{id}. | -| gerenteciar-comentários.episódios | Pode criar/remover comentários de episódio do podcast #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------------------------- | +| view | Pode visualizar o painel de controle e análises do podcast #{id}. | +| edit | Pode editar o podcast #{id}. | +| delete | Pode deletar episódios do podcast #{id}. | +| manage-import | Pode sincronizar o podcast importado #{id}. | +| manage-persons | Pode gerenciar assinaturas do podcast #{id}. | +| manage-subscriptions | Pode gerenciar assinaturas do podcast #{id}. | +| manage-contributors | Pode gerenciar contribuidores do podcast #{id}. | +| manage-platforms | Pode definir/remover links de plataforma do podcast #{id}. | +| manage-publications | Pode publicar podcast #{id}. | +| manage-notifications | Pode ver e marcar notificações como lidas para o podcast #{id}. | +| interact-as | Pode interagir com o podcast #{id} para favorito, compartilhar ou responder às publicações. | +| episodes.view | Pode visualizar o painel de controle e análises do podcast #{id}. | +| episodes.create | Pode criar episódios para o podcast #{id}. | +| episodes.edit | Pode editar o podcast #{id}. | +| episodes.delete | Pode deletar episódios do podcast #{id}. | +| episodes.manage-persons | Pode gerenciar assinaturas do podcast #{id}. | +| episodes.manage-clips | Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}. | +| episodes.manage-publications | Pode publicar podcast #{id}. | +| episodes.manage-comments | Pode criar/remover comentários de episódio do podcast #{id}. | diff --git a/docs/src/ro/getting-started/auth.md b/docs/src/ro/getting-started/auth.md index 4b279e34..093969f2 100644 --- a/docs/src/ro/getting-started/auth.md +++ b/docs/src/ro/getting-started/auth.md @@ -18,11 +18,11 @@ niveluri: -| rol | descriere | permisiuni | -| ----------- | ----------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Deține controlul complet asupra Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Gestionează conținutul Castopodului. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Utilizatorii generali ai Castopod. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -30,17 +30,17 @@ niveluri: -| permisiune | descriere | -| ----------------------- | -------------------------------------------------------------------------- | -| admin.access | Poate accesa zona de administrare Castopod. | -| admin.settings | Poate accesa setările Castopod. | -| users.manage | Poate gestiona utilizatorii Castopod. | -| persons.manage | Poate gestiona persoane. | -| pages.manage | Poate gestiona pagini. | -| podcasts.view | Poate vedea toate podcast-urile. | -| podcasts.create | Poate crea noi podcast-uri. | -| podcasts.import | Poate importa podcast-uri. | -| fediverse.manage-blocks | Poate bloca actorilor/domenii din fediverse să interacționeze cu Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -50,12 +50,12 @@ niveluri: -| rol | descriere | permisiuni | -| ------ | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Deține controlul complet asupra podcastului #{id}. | \* | -| Editor | Gestionează conținutul și publicațiile podcastului #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Gestionează conținutul podcastului #{id} dar nu poate publica. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | Contribuitor al podcastului #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ niveluri: -| permisiune | descriere | -| ---------------------------- | ------------------------------------------------------------------------------------------------------- | -| view | Poate vedea panoul de control și analiticele podcastului #{id}. | -| edit | Poate edita podcastul #{id}. | -| delete | Poate șterge podcastul #{id}. | -| manage-import | Poate sincroniza podcastul importat #{id}. | -| manage-persons | Poate administra abonamentele podcastului #{id}. | -| manage-subscriptions | Poate administra abonamentele podcastului #{id}. | -| manage-contributors | Poate administra colaboratorii podcastului #{id}. | -| manage-platforms | Poate seta/elimina link-urile podcastului #{id}. | -| manage-publications | Poate publica podcastul #{id}. | -| manage-notifications | Poate vizualiza și marca notificările ca fiind citite pentru podcastul #{id}. | -| interact-as | Poate interacționa ca podcastul #{id} pentru adăuga la favorite, a distribui sau a răspunde la postări. | -| episodes.view | Poate vizualiza panoul de control și analiticile podcastului #{id}. | -| episodes.create | Poate crea episoade pentru podcastul #{id}. | -| episodes.edit | Poate edita podcastul #{id}. | -| episodes.delete | Poate șterge podcastul #{id}. | -| episodes.manage-persons | Poate administra abonamentele podcastului #{id}. | -| episodes.manage-clips | Poate administra clipuri video sau biții de sunet ai podcastului #{id}. | -| episodes.manage-publications | Poate publica podcastul #{id}. | -| episodes.manage-comments | Poate crea/elimina comentariile episodului podcastului #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/sr_Latn/getting-started/auth.md b/docs/src/sr_Latn/getting-started/auth.md index 663557e1..e9993d34 100644 --- a/docs/src/sr_Latn/getting-started/auth.md +++ b/docs/src/sr_Latn/getting-started/auth.md @@ -17,11 +17,11 @@ paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: -| uloga | opis | dozvola | -| ------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super administrator | Ima kompletnu kontrolu nad Castopod nalogom. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Menadžer | Upravlja sadržajem na Castopod-u. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podkaster | Opšti korisnici Castopod-a. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -29,17 +29,17 @@ paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: -| dozvola | opis | -| ----------------------- | --------------------------------------------------------------- | -| admin.access | Može pristupiti administratorskom delu Castopod-a. | -| admin.settings | Može pristupiti podešavanjima Castopod-a. | -| users.manage | Može upravljati korisnicima Castopod-a. | -| persons.manage | Može upravljati osobama. | -| pages.manage | Može upravljati stranicama. | -| podcasts.view | Može videti sve podkaste. | -| podcasts.create | Može napraviti nove podkaste. | -| podcasts.import | Može uvesti nove podkaste. | -| fediverse.manage-blocks | Može blokirati interakciju Castopoda i fediverse naloga/domena. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -49,12 +49,12 @@ paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: -| uloga | opis | dozvola | -| ------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrator | Ima kompletnu kontrolu nad podkastom #{id}. | \* | -| Urednik | Upravlja sadržajem i objavama podkasta #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autor | Upravlja sadržajem podkasta #{id} ali ne može da ga objavi. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Gost | Saradnik na podkastu #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: -| dozvola | opis | -| ---------------------------- | -------------------------------------------------------------------------------------- | -| view | Može videti upravljačku tablu i analitiku podkasta #{id}. | -| edit | Može uređivati podkast #{id}. | -| delete | Može obrisati podkast #{id}. | -| manage-import | Može upravljati uvozom podkasta #{id}. | -| manage-persons | Može upravljati osobama na podkastu #{id}. | -| manage-subscriptions | Može upravljati pretplatama na podkast #{id}. | -| manage-contributors | Može upravljati saradnicima na podkastu #{id}. | -| manage-platforms | Može ubaciti/izbaciti veze ka platformama podkasta #{id}. | -| manage-publications | Može objaviti podkast #{id}. | -| manage-notifications | Može videti obaveštenja i označiti ih kao pročitana za podkast #{id}. | -| interact-as | Može da komunicira kao podkast #{id} i deli, odgovara na i stavlja u omiljene postove. | -| episodes.view | Može videti upravljačku tablu i analitiku podkasta #{id}. | -| episodes.create | Može napraviti epizodu podkasta #{id}. | -| episodes.edit | Može uređivati epizodu podkasta #{id}. | -| episodes.delete | Može obrisati epizodu podkasta #{id}. | -| episodes.manage-persons | Može upravljati pretplatama na podkast #{id}. | -| episodes.manage-clips | Može upravljati video klipovima i zvučnim isečcima podkasta #{id}. | -| episodes.manage-publications | Može objaviti podkast #{id}. | -| episodes.manage-comments | Može dodati/obrisati komentar na epizodi podkasta #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/sv/getting-started/auth.md b/docs/src/sv/getting-started/auth.md index ff5d59c0..d9b869ea 100644 --- a/docs/src/sv/getting-started/auth.md +++ b/docs/src/sv/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| ------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administratör | Har fullständig kontroll över Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Hanterare | Hanterar Castopods innehåll. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Generella användare av Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permission | description | +| ----------------------- | ----------------------------------------------------------------------------- | +| admin.access | Kan komma åt Castopod admin-området. | +| admin.settings | Kan komma åt Castopod-inställningarna. | +| users.manage | Kan hantera Castopod-användare. | +| persons.manage | Kan hantera personer. | +| pages.manage | Kan hantera sidor. | +| podcasts.view | Kan se alla podcasts. | +| podcasts.create | Kan skapa nya podcasts. | +| podcasts.import | Kan importera podcasts. | +| fediverse.manage-blocks | Kan blockera fediverse skådespelare/domäner från att interagera med Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ---------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Har fullständig kontroll över podcast #{id}. | \* | +| Redigerare | Hanterar innehåll och publikationer i podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Författare | Hanterar innehåll i podcast #{id} men kan inte publicera dem. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gäst | Generell bidragsgivare till podcasten #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permission | description | +| ---------------------------- | -------------------------------------------------------------------------------- | +| view | Kan visa instrumentpanelen och analysen av podcast #{id}. | +| edit | Kan redigera podcast #{id}. | +| delete | Kan ta bort podcast #{id}. | +| manage-import | Kan synkronisera importerad podcast #{id}. | +| manage-persons | Kan hantera prenumerationer på podcast #{id}. | +| manage-subscriptions | Kan hantera prenumerationer på podcast #{id}. | +| manage-contributors | Kan hantera bidragsgivare för podcast #{id}. | +| manage-platforms | Kan sätta/ta bort plattformslänkar för podcast #{id}. | +| manage-publications | Kan publicera podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Kan interagera som podcasten #{id} för att favorita, dela eller svara på inlägg. | +| episodes.view | Kan visa instrumentpanelen och analysen av podcast #{id}. | +| episodes.create | Kan skapa avsnitt för podcast #{id}. | +| episodes.edit | Kan redigera podcast #{id}. | +| episodes.delete | Kan ta bort podcast #{id}. | +| episodes.manage-persons | Kan hantera prenumerationer på podcast #{id}. | +| episodes.manage-clips | Kan hantera videoklipp eller ljudklipp från podcasten #{id}. | +| episodes.manage-publications | Kan publicera podcast #{id}. | +| episodes.manage-comments | Kan skapa/ta bort avsnitt kommentarer från podcasten #{id}. | diff --git a/docs/src/uk/getting-started/auth.md b/docs/src/uk/getting-started/auth.md index f2548d7e..0c330f06 100644 --- a/docs/src/uk/getting-started/auth.md +++ b/docs/src/uk/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ---------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Суперадмін | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Менеджер | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Підкастер | General users of Castopod. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -29,7 +29,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | Опис | +| permission | description | | ----------------------- | ------------------------------------------------------------------ | | admin.access | Can access the Castopod admin area. | | admin.settings | Can access the Castopod settings. | diff --git a/docs/src/zh-Hans/getting-started/auth.md b/docs/src/zh-Hans/getting-started/auth.md index c307588f..5c3109d0 100644 --- a/docs/src/zh-Hans/getting-started/auth.md +++ b/docs/src/zh-Hans/getting-started/auth.md @@ -17,7 +17,7 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| 角色 | 描述 | 权限 | +| role | description | permissions | | ---------- | ---------------------------- | ------------------------------------------------------------------------------------------ | | 超级管理员 | 拥有对 Castopod 的完全控制。 | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | 管理 | 管理 Castopod 的内容。 | podcasts.create, podcasts.import, persons.manage, pages.manage | @@ -29,7 +29,7 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| 权限 | 描述 | +| permission | description | | ----------------------- | ------------------------------------------- | | admin.access | 可以访问 Castopod 管理区域。 | | admin.settings | 可以访问 Castopod 设置。 | @@ -49,7 +49,7 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| 角色 | 描述 | 权限 | +| role | description | permissions | | ------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 管理员 | 完全控制播客 #{id}。 | \* | | 编辑 | 管理播客 #{id} 的内容和出版物。 | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | @@ -62,11 +62,11 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| 权限 | 描述 | +| permission | description | | ---------------------------- | --------------------------------------------------- | | view | 可以查看播客 #{id} 的仪表板和分析。 | | edit | 可以编辑播客 #{id}。 | -| 删除 | 可以删除播客 #{id}。 | +| delete | 可以删除播客 #{id}。 | | manage-import | 可以同步导入的播客 #{id}。 | | manage-persons | 可以管理播客 #{id} 的订阅。 | | manage-subscriptions | 可以管理播客 #{id} 的订阅。 | diff --git a/modules/Admin/Language/br/AboutCastopod.php b/modules/Admin/Language/br/AboutCastopod.php index 3fb62aff..d0f56d6b 100644 --- a/modules/Admin/Language/br/AboutCastopod.php +++ b/modules/Admin/Language/br/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'Diwar-benn Castopod', + 'host_name' => 'Anv an ostiz', + 'version' => 'Stumm Castopod', + 'php_version' => 'Stumm PHP', + 'os' => 'Sistem oberiañ', + 'languages' => 'Yezhoù', + 'update_database' => 'Nevesaat an diaz roadennoù', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'Nevesaet eo an diaz roadennoù!', ], ]; diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php index ac4cc5c2..cad5bfa0 100644 --- a/modules/Admin/Language/br/Breadcrumb.php +++ b/modules/Admin/Language/br/Breadcrumb.php @@ -52,8 +52,8 @@ return [ 'listening-time' => 'padelezh ar selaou', 'time-periods' => 'mareoù ar selaou', 'soundbites' => 'tennadoù son', - 'video-clips' => 'tennadoù video', + 'video-clips' => 'klipoù video', 'embed' => 'lenner enkorfet', 'notifications' => 'kemennoù', - 'suspend' => 'astalañ', + 'suspend' => 'ehanañ', ]; diff --git a/modules/Admin/Language/br/Dashboard.php b/modules/Admin/Language/br/Dashboard.php index 6ce8645c..255e0aca 100644 --- a/modules/Admin/Language/br/Dashboard.php +++ b/modules/Admin/Language/br/Dashboard.php @@ -9,20 +9,20 @@ declare(strict_types=1); */ return [ - 'home' => 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', + 'home' => 'Taolenn-stur', + 'welcome_message' => 'Degemer mat en daolenn-stur!', 'podcasts' => [ - 'title' => 'Podcasts', + 'title' => 'Podkastoù', 'not_found' => 'Podkast embannet ebet', - 'last_published' => 'Last published on {lastPublicationDate}', + 'last_published' => 'Embannet da ziwezhañ d\'an/ar {lastPublicationDate}', ], 'episodes' => [ - 'title' => 'Episodes', + 'title' => 'Rannoù', 'not_found' => 'Rann embannet ebet', - 'last_published' => 'Last published on {lastPublicationDate}', + 'last_published' => 'Embannet da ziwezhañ d\'an/ar {lastPublicationDate}', ], 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', + 'title' => 'Stokañ', + 'subtitle' => '{totalUploaded} war {totalStorage}', ], ]; diff --git a/modules/Admin/Language/br/Episode.php b/modules/Admin/Language/br/Episode.php index 02369bcf..7f73831b 100644 --- a/modules/Admin/Language/br/Episode.php +++ b/modules/Admin/Language/br/Episode.php @@ -31,9 +31,9 @@ return [ 'publish_error' => 'Embannet eo bet ar rann dija.', 'publish_edit_error' => 'Embannet eo bet ar rann dija.', 'publish_cancel_error' => 'Embannet eo bet ar rann dija.', - 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', - 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', - 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'publish_date_edit_error' => 'N\'eo ket bet embannet ar podkast c\'hoazh, ne c\'hallit ket kemmañ an deiziad an embann.', + 'publish_date_edit_future_error' => 'Rankout a ra deiziad embannadur ar rann bezañ en amzer dremenet! M\'ho peus c\'hoant da steuñviñ an embannadur en amzer da zont e rankit diembann ar rann da gentañ.', + 'publish_date_edit_success' => 'Cheñchet eo bet deiziad embannadur ar rann gant berzh!', 'unpublish_error' => 'N\'eo ket bet embannet ar rann.', 'delete' => 'Dilemel', 'go_to_page' => 'Gwelet ar bajenn', @@ -64,7 +64,7 @@ return [ ], 'messages' => [ 'createSuccess' => 'Krouet eo bet ar rann gant berzh!', - 'editSuccess' => 'Hizivaet eo bet ar rann gant berzh!', + 'editSuccess' => 'Nevesaet eo bet ar rann gant berzh!', 'publishSuccess' => '{publication_status, select, published {Embannet eo bet ar rann gant berzh !} scheduled {Raktreset eo bet embannadur ar rann gant berzh !} @@ -83,13 +83,13 @@ return [ audio {aodio} other {media} } ar rann.', - 'deleteFileError' => 'Failed to delete {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} - } file {file_key}. You may manually remove it from your disk.', + 'deleteFileError' => 'C\'hwitadenn war dilemel restr {type, select, + transcript {an treuzskrivadur} + chapters {ar chabistroù} + image {ar golo} + audio {an aodio} + other {ar media} + } {file_key}. Gallout a rit lemel kuit ar restr-mañ diouzh ar gantenn dre zorn.', 'sameSlugError' => 'Bez ez eus eus ur rann gant ar berradur-mañ (slug) dija.', ], 'form' => [ @@ -118,7 +118,7 @@ return [ 'bonus_hint' => 'Danvez ouzhpenn ar podkast (da skouer, titouroù diwar-benn kostezioù pe atersadennoù gant an aktourien·ezed), pe bruderezh kroaziet evit ur podkast all', ], 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', + 'premium' => 'Ne vo gwelet ar rann nemet gant koumananterien·ezed Premium', 'parental_advisory' => [ 'label' => 'Kemenn evit ar gerent', 'hint' => 'Hag ar rann-mañ a zo danvez ha ne zlefe ket gwelet gant bugale?', @@ -141,9 +141,9 @@ return [ 'location_name' => 'Anv pe chomlec\'h al lec\'h', 'location_name_hint' => 'Al lec\'h-mañ a c\'hell bezañ unan gwir pe unan faltaziet', 'transcript' => 'Treuzskrivadur (istitloù)', - 'transcript_hint' => 'Only .srt or .vtt are allowed.', + 'transcript_hint' => 'Aotreet e vez nemet .srt pe .vtt.', 'transcript_download' => 'Pellgargañ an treuzskrivadur', - 'transcript_file' => 'Transcript file (.srt or .vtt)', + 'transcript_file' => 'Restr an treuzskrivadur (.srt pe .vtt)', 'transcript_remote_url' => 'URL a-bell evit restr an treuzskrivadur', 'transcript_file_delete' => 'Dilemel restr an treuzskrivadur', 'chapters' => 'Chabistroù', @@ -199,7 +199,7 @@ return [ ], 'delete_form' => [ 'disclaimer' => - "Gant ar rann e vo dilamet an holl restroù media, evezhiadennoù, tennadoù video ha son liammet outi.", + "Gant ar rann e vo dilamet an holl restroù media, evezhiadennoù, klipoù video ha son liammet outi.", 'understand' => 'Komprennet eo, dilemel ar rann a fell din', 'submit' => 'Dilemel', ], diff --git a/modules/Admin/Language/br/EpisodeNavigation.php b/modules/Admin/Language/br/EpisodeNavigation.php index 214e2aca..7f4c0afc 100644 --- a/modules/Admin/Language/br/EpisodeNavigation.php +++ b/modules/Admin/Language/br/EpisodeNavigation.php @@ -15,9 +15,9 @@ return [ 'episode-edit' => 'Kemm ar rann', 'episode-persons-manage' => 'Merañ an emellerien·ezed', 'embed-add' => 'Lenner enkorfet', - 'clips' => 'Tennadoù', - 'video-clips-list' => 'Tennadoù video', - 'video-clips-create' => 'Tennad video nevez', + 'clips' => 'Klipoù', + 'video-clips-list' => 'Klipoù video', + 'video-clips-create' => 'Klip video nevez', 'soundbites-list' => 'Tennadoù son', 'soundbites-create' => 'Tennad son nevez', ]; diff --git a/modules/Admin/Language/br/Install.php b/modules/Admin/Language/br/Install.php index e73f08a3..2f86bafd 100644 --- a/modules/Admin/Language/br/Install.php +++ b/modules/Admin/Language/br/Install.php @@ -11,7 +11,7 @@ declare(strict_types=1); return [ 'manual_config' => 'Kefluniañ dre zorn', 'manual_config_subtitle' => - 'Krouit ur restr `.env` gant hoc’h arventennoù ha hizivait ar bajenn evit kenderc\'hel gant ar staliañ.', + 'Krouit ur restr `.env` gant hoc’h arventennoù ha nevesait ar bajenn evit kenderc\'hel gant ar staliañ.', 'form' => [ 'instance_config' => 'Arventennoù an istañs', 'hostname' => 'Anv an ostiz', diff --git a/modules/Admin/Language/br/Navigation.php b/modules/Admin/Language/br/Navigation.php index f96d2669..31d4dcd3 100644 --- a/modules/Admin/Language/br/Navigation.php +++ b/modules/Admin/Language/br/Navigation.php @@ -12,12 +12,13 @@ return [ 'toggle_sidebar' => 'Kuzhat/diskouez ar varrenn gostez', 'go_to_website' => 'Mont d\'al lec\'hienn', 'go_to_admin' => 'Mont d\'an daolenn-stur', + 'not-authorized' => 'Difennet', 'dashboard' => 'Taolenn-stur', 'admin' => 'Degemer', 'podcasts' => 'Podkastoù', 'podcast-list' => 'An holl bodkastoù', 'podcast-create' => 'Krouiñ ur podkast', - 'all-podcast-imports' => 'An holl bodkastoù enporzhet', + 'all-podcast-imports' => 'An holl bodkastoù enporzhiet', 'podcast-imports-add' => 'Enporzhiañ ur podkast', 'persons' => 'Emellerien·ezed', 'person-list' => 'An holl emellerien·ezed', diff --git a/modules/Admin/Language/br/Notifications.php b/modules/Admin/Language/br/Notifications.php index 2b139d51..3f2ed5f5 100644 --- a/modules/Admin/Language/br/Notifications.php +++ b/modules/Admin/Language/br/Notifications.php @@ -9,11 +9,11 @@ declare(strict_types=1); */ return [ - 'title' => 'Notifications', - 'reply' => '{actor_username} replied to your post', - 'favourite' => '{actor_username} favourited your post', - 'reblog' => '{actor_username} shared your post', - 'follow' => '{actor_username} started following you', - 'no_notifications' => 'No notifications', - 'mark_all_as_read' => 'Mark all as read', + 'title' => 'Kemennoù', + 'reply' => 'Respontet eo bet d\'ho kemennadenn gant {actor_username}', + 'favourite' => 'Ouzhpennet eo bet ho kemennadenn d\'h·e re garetañ gant {actor_username}', + 'reblog' => 'Rannet eo bet ho kemennadenn gant {actor_username}', + 'follow' => 'Krog eo {actor_username} da heuliañ ac\'hanoc\'h', + 'no_notifications' => 'Kemenn ebet', + 'mark_all_as_read' => 'Merkañ pep tra evel lennet', ]; diff --git a/modules/Admin/Language/br/Page.php b/modules/Admin/Language/br/Page.php index dccaa097..b99aa723 100644 --- a/modules/Admin/Language/br/Page.php +++ b/modules/Admin/Language/br/Page.php @@ -25,6 +25,6 @@ return [ ], 'messages' => [ 'createSuccess' => 'Krouet eo bet ar bajenn "{pageTitle}" gant berzh!', - 'editSuccess' => 'Hizivaet eo bet ar bajenn gant berzh!', + 'editSuccess' => 'Nevesaet eo bet ar bajenn gant berzh!', ], ]; diff --git a/modules/Admin/Language/br/Person.php b/modules/Admin/Language/br/Person.php index 0dfc819c..e91d9fcd 100644 --- a/modules/Admin/Language/br/Person.php +++ b/modules/Admin/Language/br/Person.php @@ -18,7 +18,7 @@ return [ 'delete' => 'Dilemel an emeller·ez', 'messages' => [ 'createSuccess' => 'Krouet eo bet an emeller·ez gant berzh!', - 'editSuccess' => 'Hizivaet eo bet an emeller·ez gant berzh!', + 'editSuccess' => 'Nevesaet eo bet an emeller·ez gant berzh!', 'deleteSuccess' => 'Tennet eo bet an emeller·ez!', ], 'form' => [ diff --git a/modules/Admin/Language/br/Platforms.php b/modules/Admin/Language/br/Platforms.php index 96962b80..959e9f60 100644 --- a/modules/Admin/Language/br/Platforms.php +++ b/modules/Admin/Language/br/Platforms.php @@ -22,15 +22,15 @@ return [ 'your_id' => [ 'podcasting' => 'Hoc’h anaout (ID)', 'social' => 'Hoc’h anaout (ID)', - 'funding' => 'Your CTA', + 'funding' => 'Ho CTA', ], - 'your_cta' => 'Your call to action', + 'your_cta' => 'Ho kalv da ober', 'visible' => 'Diskouez e pajenn ar podkast?', 'on_embed' => 'Diskouez el lenner enkorfet?', 'remove' => 'Dilemel {platformName}', 'submit' => 'Enrollañ', 'messages' => [ - 'updateSuccess' => 'Hizivaet eo bet ereoù ar savennoù gant berzh!', + 'updateSuccess' => 'Nevesaet eo bet ereoù ar savennoù gant berzh!', 'removeLinkSuccess' => 'Dilamet eo bet ere ar savenn.', 'removeLinkError' => 'N\'eo ket bet dilamet ere ar savenn. Klaskit en-dro.', diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php index 415a4a21..00841487 100644 --- a/modules/Admin/Language/br/Podcast.php +++ b/modules/Admin/Language/br/Podcast.php @@ -13,7 +13,7 @@ return [ 'no_podcast' => 'N\'eo bet kavet podkast ebet!', 'create' => 'Krouiñ ur podkast', 'import' => 'Enporzhiañ ur podkast', - 'all_imports' => 'Ar podkastoù enporzhet', + 'all_imports' => 'Ar podkastoù enporzhiet', 'new_episode' => 'Rann nevez', 'view' => 'Gwelet ar podkast', 'edit' => 'Kemmañ ar podkast', @@ -29,8 +29,8 @@ return [ 'draft' => 'Brouilhed', 'messages' => [ 'createSuccess' => 'Krouet eo bet ar podkast gant berzh!', - 'editSuccess' => 'Hizivaet eo bet ar podkast gant berzh!', - 'importSuccess' => 'Enporzhet eo bet ar podkast gant berzh!', + 'editSuccess' => 'Nevesaet eo bet ar podkast gant berzh!', + 'importSuccess' => 'Enporzhiet eo bet ar podkast gant berzh!', 'deleteSuccess' => 'Dilamet eo bet ar podkast @{podcast_handle} gant berzh!', 'deletePodcastMediaError' => 'C\'hwitadenn war dilemel {type, select, cover {golo} @@ -45,7 +45,7 @@ return [ other {media} } ar rann {episode_slug}.', 'deletePodcastMediaFolderError' => 'C\'hwitadenn war dilemel teuliad ar mediaioù {folder_path}. Gallout a rit lemel an teuliad-mañ diouzh ar gantenn dre zorn.', - 'podcastFeedUpdateSuccess' => 'Hizivadenn: {number_of_new_episodes, plural, + 'podcastFeedUpdateSuccess' => 'Nevesadenn: {number_of_new_episodes, plural, one {# rann} two {# rann} few {# rann} @@ -77,17 +77,17 @@ return [ 'episodic' => 'Bep ur mare', 'episodic_hint' => 'M\'eo ar rannoù da vezañ selaouet hep urzh resis. Ar rannoù nevesoc’h a vo kinniget da gentañ.', 'serial' => 'Heuliad', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. Episodes will be presented in numeric order.', + 'serial_hint' => 'M\'eo ar rannoù da vezañ selaouet gant un urzh resis. Ar rannoù a vo kinniget hervez urzh an niverennoù.', ], 'medium' => [ 'label' => 'Medium', - 'hint' => 'Medium as represented by podcast:medium tag in RSS. Changing this may change how players present your feed.', - 'podcast' => 'Podcast', - 'podcast_hint' => 'Describes a feed for a podcast show.', - 'music' => 'Music', - 'music_hint' => 'A feed of music organized into an "album" with each item a song within the album.', - 'audiobook' => 'Audiobook', - 'audiobook_hint' => 'Specific types of audio with one item per feed, or where items represent chapters within the book.', + 'hint' => 'Ar medium evel ma vez kinniget gant ar valizenn RSS podcast:medium. Cheñch an dra-se a c\'hell cheñch an doare ma vo kinniget ho kwazh gant al lennerien.', + 'podcast' => 'Podkast', + 'podcast_hint' => 'Evit deskrivañ gwazh ur podkast.', + 'music' => 'Sonerezh', + 'music_hint' => 'Ur wazh gant sonerezh aozet e-barzh un "album". Pep item zo un ton en album.', + 'audiobook' => 'Levr klevet', + 'audiobook_hint' => 'Ur seurt aodio dibar gant un item dre wazh, peotramant pa glot an itemoù gant chabistroù al levr.', ], 'description' => 'Deskrivadur', 'classification_section_title' => 'Rummatadur', @@ -112,8 +112,8 @@ return [ 'owner_email' => 'Chomlec\'h postel ar perc\'henn', 'owner_email_hint' => 'Implijet e vo gant an darn vrasañ eus ar savennoù evit gwiriañ perc\'hentiezh ar podkast. War ar wazh RSS publik e vo.', - 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', - 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', + 'is_owner_email_removed_from_feed' => 'Lemel chomlec\'h postel ar perc\'henn diouzh ar wazh RSS publik', + 'is_owner_email_removed_from_feed_hint' => 'Rankout a rafec\'h lakaat ar chomlec\'h war wel adarre, evit ur mare, evit ma vefe gouest ur meneger da wiriañ oc\'h ar perc\'henn.', 'publisher' => 'Embanner·ez', 'publisher_hint' => 'Ar strollad kiriek eus sevel ar podkast. Alies eo embregerezh pe rouedad ar podkast. A-wechoù e vez anvet ar vaezienn-mañ "Aozer·ez".', @@ -129,10 +129,10 @@ return [ 'premium_by_default' => 'Ar rannoù a zo evit ar re bremium dre ziouer', 'premium_by_default_hint' => 'Rannoù ar podkast a vo merket Premium dre ziouer. Gallout a rit lakaat rannoù zo evel publik.', 'op3' => 'Open Podcast Prefix Project (OP3)', - 'op3_link' => 'Visit your OP3 dashboard (external link)', + 'op3_link' => 'Mont da welet ho taolenn-stur OP3 (liamm diavaez)', 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', - 'op3_enable' => 'Enable OP3 analytics service', - 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'op3_enable' => 'Gweredekaat ar servij dielfennañ OP3', + 'op3_enable_hint' => 'Evit abegoù surentez ne vo ket rannet roadennoù ar rannoù Premium gant OP3.', 'payment_pointer' => 'Chomlec\'h paeañ (Payment Poienter) evit Web Monetization', 'payment_pointer_hint' => 'Ar chomlec\'h ma vo dastumet an arc\'hant ganeoc\'h a-drugarez da Web Monetization', @@ -268,42 +268,42 @@ return [ 'volleyball' => 'Volleyball', 'wilderness' => 'Natur', 'wrestling' => 'Gouren', - 'after_shows' => 'After Shows', - 'film_history' => 'Film History', - 'film_interviews' => 'Film Interviews', - 'film_reviews' => 'Film Reviews', - 'tv_reviews' => 'TV Reviews', + 'after_shows' => 'Goude abadenn', + 'film_history' => 'Istor ar sinema', + 'film_interviews' => 'Atersadennoù er sinema', + 'film_reviews' => 'Barnadennoù filmoù', + 'tv_reviews' => 'Barnadennoù tele', ], 'publish_form' => [ - 'back_to_podcast_dashboard' => 'Back to podcast dashboard', - 'post' => 'Your announcement post', + 'back_to_podcast_dashboard' => 'Distreiñ da daolenn-stur ar podkast', + 'post' => 'Ho kemennadenn vrudañ', 'post_hint' => - "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', + "Skrivit ur gemennadenn evit kemenn embannadur ho podkast. War bajenn degemer ho podkast e vo diskouezet ar gemennadenn.", + 'message_placeholder' => 'Skrivit ho kemennadenn…', 'submit' => 'Embann', 'publication_date' => 'Deiziad an embann', 'publication_method' => [ 'now' => 'Bremañ', - 'schedule' => 'Schedule', + 'schedule' => 'Steuñviñ', ], - 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date' => 'Deiziad embannadur steuñvet', 'scheduled_publication_date_hint' => - 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit_edit' => 'Edit publication', + 'Gallout a rit steuñviñ embannadur ar podkast en ur choaz un deiziad evit an embannadur. Dleout a ra ar vaezienn bezañ er furmad YYYY-MM-DD HH:mm', + 'submit_edit' => 'Kemmañ an embannadur', 'cancel_publication' => 'Nullañ an embann', - 'message_warning' => 'You did not write a message for your announcement post!', - 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', - 'message_warning_submit' => 'Publish anyway', + 'message_warning' => 'N\'ho peus ket skrivet ur gemennadenn evit brudañ ho rann !', + 'message_warning_hint' => 'Ouzhpennañ ur gemennadenn a lakay muioc\'h a dud er jeu, ha diwar se e vo gwelet muioc\'h ho podkast.', + 'message_warning_submit' => 'Embann memestra', ], 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', - 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + 'draft_mode' => 'mod brouilhed', + 'not_published' => 'N\'eo ket embannet ar podkast-mañ c\'hoazh.', + 'scheduled' => 'Ar podkast-mañ a vo embannet d\'an/d\'ar {publication_date}.', ], 'delete_form' => [ 'disclaimer' => - "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", - 'understand' => 'I understand, I want the podcast to be permanently deleted', + "Pa vo dilamet ar podkast e vo dilamet an holl rannoù, restroù media, kemennadennoù ha stadegoù liammet outañ. Ur wech dilamet, ne c'hell bezañ adtapet an traoù.", + 'understand' => 'Kompren a ran, c\'hoant am eus da zilemel ar podkast da vat', 'submit' => 'Dilemel', ], 'by' => 'Gant {publisher}', @@ -314,17 +314,18 @@ return [ 'no_episode' => 'N\'eus bet kavet rann ebet !', 'follow' => 'Heuliañ', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + one {# heulier·ez} + two {# heulier·ez} + other {# heulier·ez} }', 'posts' => '{numberOfPosts, plural, one {# post} other {# posts} }', - 'activity' => 'Activity', + 'activity' => 'Oberiantiz', 'episodes' => 'Rannoù', - 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', + 'sponsor' => 'Harpit ac\'hanomp', + 'funding_links' => 'Ereoù evit arc\'hantaouiñ {podcastTitle}', 'find_on' => 'Kavit {podcastTitle} war', 'listen_on' => 'Selaouit war', ]; diff --git a/modules/Admin/Language/br/PodcastNavigation.php b/modules/Admin/Language/br/PodcastNavigation.php index e3a6093a..132594e6 100644 --- a/modules/Admin/Language/br/PodcastNavigation.php +++ b/modules/Admin/Language/br/PodcastNavigation.php @@ -15,7 +15,7 @@ return [ 'podcast-view' => 'Degemer', 'podcast-edit' => 'Kemmañ ar podkast', 'podcast-persons-manage' => 'Merañ an emellerien·ezed', - 'podcast-imports' => 'Ar podkastoù enporzhet', + 'podcast-imports' => 'Ar podkastoù enporzhiet', 'podcast-imports-sync' => 'Sinkronaat ar gwazhoù', 'episodes' => 'Rannoù', 'episode-list' => 'An holl rannoù', @@ -30,12 +30,12 @@ return [ 'podcast-analytics-time-periods' => 'Mareoù ar selaou', 'monetization' => 'Moneisaat', 'subscription-list' => 'An holl goumanantoù', - 'subscription-create' => 'Add subscription', + 'subscription-create' => 'Ouzhpennañ ur c\'houmanant', 'contributors' => 'Perzhidi, perzhiadezed', 'contributor-list' => 'An holl berzhidi ha perzhiadezed', 'contributor-add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez', 'broadcast' => 'Broadcast', - 'platforms-podcasting' => 'Podcasting apps', + 'platforms-podcasting' => 'Arloadoù podkastoù', 'platforms-social' => 'Rouedadoù sokial', 'platforms-funding' => 'Liammoù arc\'hantaouiñ', 'podcast-monetization-other' => 'Un dra all', diff --git a/modules/Admin/Language/br/Settings.php b/modules/Admin/Language/br/Settings.php index 3c385919..b322dd56 100644 --- a/modules/Admin/Language/br/Settings.php +++ b/modules/Admin/Language/br/Settings.php @@ -37,19 +37,19 @@ return [ 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', 'rename_episodes_files' => 'Rename episode audio files', 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', - 'clear_cache' => 'Clear all cache', + 'clear_cache' => 'Lemel ar grubuilh', 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', - 'run' => 'Run housekeeping', - 'runSuccess' => 'Housekeeping has been run successfully!', + 'run' => 'Lañsañ ar c\'hempenn', + 'runSuccess' => 'Echu eo ar c\'hempenn gant berzh!', ], 'theme' => [ 'title' => 'Neuz', 'accent_section_title' => 'Liv kentañ', - 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', - 'pine' => 'Pine', - 'crimson' => 'Crimson', - 'amber' => 'Amber', - 'lake' => 'Lake', + 'accent_section_subtitle' => 'Choazit al liv a roio an neuz d\'an holl bajennoù publik.', + 'pine' => 'Pin', + 'crimson' => 'Ruz-mouk', + 'amber' => 'Goularz', + 'lake' => 'Lenn', 'jacaranda' => 'Jacaranda', 'onyx' => 'Onyx', 'submit' => 'Enrollañ', diff --git a/modules/Admin/Language/br/Validation.php b/modules/Admin/Language/br/Validation.php index 3bc78cfe..e06708bf 100644 --- a/modules/Admin/Language/br/Validation.php +++ b/modules/Admin/Language/br/Validation.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'min_dims' => - '{field} is either not an image, or it is not wide or tall enough.', + '{field} n\'eo ket ur skeudenn, peotrament n\'eo ket ledan a-walc\'h pe uhel a-walc\'h.', 'is_image_ratio' => - '{field} is either not an image or not of the right ratio.', + '{field} n\'eo ket ur skeudenn, peotrament n\'eo ket mat ar ratio.', ]; diff --git a/modules/Admin/Language/br/VideoClip.php b/modules/Admin/Language/br/VideoClip.php index fa2adf21..1ce237b3 100644 --- a/modules/Admin/Language/br/VideoClip.php +++ b/modules/Admin/Language/br/VideoClip.php @@ -10,60 +10,60 @@ declare(strict_types=1); return [ 'list' => [ - 'title' => 'Tennadoù video', + 'title' => 'Klipoù video', 'status' => [ 'label' => 'Statud', 'queued' => 'el lost', - 'queued_hint' => 'Emañ an tennad video el lost.', + 'queued_hint' => 'Emañ ar c\'hlip video el lost.', 'pending' => 'o c\'hortoz', - 'pending_hint' => 'Clip will be generated shortly.', - 'running' => 'running', - 'running_hint' => 'Clip is being generated.', + 'pending_hint' => 'Ganet e vo ar c\'hlip a-benn nebeut.', + 'running' => 'war ar stern', + 'running_hint' => 'Emañ ar c\'hlip o vezañ ganet.', 'failed' => 'c\'hwitet', - 'failed_hint' => 'Clip could not be generated: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Clip was generated successfully!', + 'failed_hint' => 'Ar c\'hlip n\'eo ket bet ganet: fazi skript.', + 'passed' => 'berzh', + 'passed_hint' => 'Ganet eo bet ar c\'hlip gant berzh!', ], - 'clip' => 'Tennad', - 'duration' => 'Job duration', + 'clip' => 'Klip', + 'duration' => 'Padelezh al labour', ], - 'title' => 'Video clip: {videoClipLabel}', - 'download_clip' => 'Pellgargañ an tennad', - 'create' => 'Tennad video nevez', - 'go_to_page' => 'Mont da pajenn an tennad', - 'retry' => 'Retry clip generation', - 'delete' => 'Dilemel an tennad', - 'logs' => 'Job logs', + 'title' => 'Klip video: {videoClipLabel}', + 'download_clip' => 'Pellgargañ ar c\'hlip', + 'create' => 'Klip video nevez', + 'go_to_page' => 'Mont da pajenn ar c\'hlip', + 'retry' => 'Klask genel ar c\'hlip en-dro', + 'delete' => 'Dilemel ar c\'hlip', + 'logs' => 'Roll istor al labourioù', 'messages' => [ - 'alreadyExistingError' => 'The video clip you are trying to create already exists!', - 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', - 'deleteSuccess' => 'Video clip has been successfully removed!', + 'alreadyExistingError' => 'Bez ez eus eus ur c\'hlip video heñvel-mik dija!', + 'addToQueueSuccess' => 'Ouzhpennet eo bet ar c\'hlip video d\'al lost, o c\'hortoz e vefe krouet!', + 'deleteSuccess' => 'Dilamet eo bet ar c\'hlip video gant berzh!', ], 'format' => [ - 'landscape' => 'Landscape', - 'portrait' => 'Portrait', - 'squared' => 'Squared', + 'landscape' => 'A-led', + 'portrait' => 'A-blom', + 'squared' => 'Karrezek', ], 'form' => [ - 'title' => 'New video clip', - 'params_section_title' => 'Video clip parameters', - 'clip_title' => 'Titl an tennad', + 'title' => 'Klip video nevez', + 'params_section_title' => 'Arventennoù ar c\'hlip video', + 'clip_title' => 'Titl ar c\'hlip', 'format' => [ - 'label' => 'Choose a format', - 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', - 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', - 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + 'label' => 'Choazit ur furmad', + 'landscape_hint' => 'Videoioù a-led gant ur ratio 16:9 a zo dispar evit PeerTube, Youtube ha Vimeo.', + 'portrait_hint' => 'Videoioù a-blom gant ur ratio 9:16 a zo dispar evit TikTok, Youtube shorts ha stories Instagram.', + 'squared_hint' => 'Videoioù karrezek gant ur ratio 1:1 a zo dispar evit Mastodon, Facebook, Twitter ha LinkedIn.', ], 'theme' => 'Dibab un neuz', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'trim_start' => 'Trim start', - 'trim_end' => 'Trim end', - 'submit' => 'Create video clip', + 'start_time' => 'Kregiñ da', + 'duration' => 'Padelezh', + 'trim_start' => 'Krennañ ar penn-kentañ', + 'trim_end' => 'Krennañ an dibenn', + 'submit' => 'Krouiñ ur c\'hlip video', ], 'requirements' => [ 'title' => 'Mankout a ra binvioù', - 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'missing' => 'Mankout a ra ostilhoù. Bezit sur eo bet ouzhpennet an holl vinvioù ez ezhomm anezho evit bezañ gouest da sevel ur video diwar ar rann-mañ!', 'ffmpeg' => 'FFmpeg', 'gd' => 'Graphics Draw (GD)', 'freetype' => 'Levraoueg Freetype evit GD', diff --git a/modules/Auth/Language/br/Auth.php b/modules/Auth/Language/br/Auth.php index 725b760b..da152f33 100644 --- a/modules/Auth/Language/br/Auth.php +++ b/modules/Auth/Language/br/Auth.php @@ -11,7 +11,7 @@ declare(strict_types=1); return [ 'instance_groups' => [ 'owner' => [ - 'title' => 'Instance Owner', + 'title' => 'Perc\'henn·ez an istañs', 'description' => 'The Castopod owner.', ], 'superadmin' => [ @@ -23,7 +23,7 @@ return [ 'description' => 'Manages Castopod\'s content.', ], 'podcaster' => [ - 'title' => 'Podcaster', + 'title' => 'Podkaster', 'description' => 'General users of Castopod.', ], ], @@ -35,7 +35,7 @@ return [ 'pages.manage' => 'Can manage pages.', 'podcasts.view' => 'Can view all podcasts.', 'podcasts.create' => 'Can create new podcasts.', - 'podcasts.import' => 'Can import podcasts.', + 'podcasts.import' => 'Gallout a ra enporzhiañ podkastoù.', 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', ], 'podcast_groups' => [ @@ -44,19 +44,19 @@ return [ 'description' => 'The podcast owner.', ], 'admin' => [ - 'title' => 'Admin', + 'title' => 'Merour·ez', 'description' => 'Has complete control of podcast #{id}.', ], 'editor' => [ - 'title' => 'Editor', + 'title' => 'Embanner', 'description' => 'Manages content and publications of podcast #{id}.', ], 'author' => [ - 'title' => 'Author', + 'title' => 'Aozer·ez', 'description' => 'Manages content of podcast #{id} but cannot publish them.', ], 'guest' => [ - 'title' => 'Guest', + 'title' => 'Kouviad·ez', 'description' => 'General contributor of the podcast #{id}.', ], ], diff --git a/modules/Auth/Language/br/Contributor.php b/modules/Auth/Language/br/Contributor.php index 60995c44..90976a46 100644 --- a/modules/Auth/Language/br/Contributor.php +++ b/modules/Auth/Language/br/Contributor.php @@ -13,7 +13,7 @@ return [ 'view' => "Perzh {username} e {podcastTitle}", 'add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez', 'add_contributor' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez da {0}', - 'edit_role' => 'Hizivaat roll {0}', + 'edit_role' => 'Nevesaat roll {0}', 'edit' => 'Kemmañ', 'remove' => 'Lemel', 'list' => [ @@ -26,14 +26,14 @@ return [ 'role' => 'Roll', 'role_placeholder' => 'Dibabit e·he roll…', 'submit_add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez', - 'submit_edit' => 'Hizivaat ar roll', + 'submit_edit' => 'Nevesaat ar roll', ], 'delete_form' => [ - 'title' => 'Remove {contributor}', + 'title' => 'Dilemel {contributor}', 'disclaimer' => 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', + 'submit' => 'Lemel', ], 'messages' => [ 'editSuccess' => 'Role successfully changed!', diff --git a/modules/Auth/Language/br/User.php b/modules/Auth/Language/br/User.php index b6edb318..5ca96939 100644 --- a/modules/Auth/Language/br/User.php +++ b/modules/Auth/Language/br/User.php @@ -10,15 +10,15 @@ declare(strict_types=1); return [ 'edit_role' => "Edit {username}'s role", - 'ban' => 'Ban', - 'unban' => 'Unban', + 'ban' => 'Stankañ', + 'unban' => 'Distankañ', 'delete' => 'Dilemel', 'create' => 'Krouiñ un implijer·ez', 'view' => "Titouroù diwar-benn {username}", 'all_users' => 'An holl implijerien·ezed', 'list' => [ 'user' => 'Implijer·ez', - 'role' => 'Role', + 'role' => 'Roll', 'banned' => 'Banned?', ], 'form' => [ @@ -26,7 +26,7 @@ return [ 'username' => 'Anv implijer·ez', 'password' => 'Ger-tremen', 'new_password' => 'Ger-tremen nevez', - 'role' => 'Role', + 'role' => 'Roll', 'roles' => 'Rolloù', 'permissions' => 'Aotreoù', 'submit_create' => 'Krouiñ an implijer·ez', @@ -38,7 +38,7 @@ return [ 'disclaimer' => "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', + 'submit' => 'Dilemel', ], 'messages' => [ 'createSuccess' => diff --git a/modules/Install/Language/br/Install.php b/modules/Install/Language/br/Install.php index 926c45f9..c29b77e2 100644 --- a/modules/Install/Language/br/Install.php +++ b/modules/Install/Language/br/Install.php @@ -9,10 +9,10 @@ declare(strict_types=1); */ return [ - 'title' => 'Castopod installer', + 'title' => 'Stalier Castopod', 'manual_config' => 'Kefluniañ dre zorn', 'manual_config_subtitle' => - 'Krouit ur restr `.env` gant hoc’h arventennoù ha hizivait ar bajenn evit kenderc\'hel gant ar staliañ.', + 'Krouit ur restr `.env` gant hoc’h arventennoù ha nevesait ar bajenn evit kenderc\'hel gant ar staliañ.', 'form' => [ 'instance_config' => 'Arventennoù an istañs', 'hostname' => 'Anv an ostiz', diff --git a/modules/PodcastImport/Language/br/PodcastImport.php b/modules/PodcastImport/Language/br/PodcastImport.php index 127df81c..e3e59cea 100644 --- a/modules/PodcastImport/Language/br/PodcastImport.php +++ b/modules/PodcastImport/Language/br/PodcastImport.php @@ -10,57 +10,57 @@ declare(strict_types=1); return [ 'banner' => [ - 'disclaimer' => 'Importing', - 'text' => '{podcastTitle} is currently being imported.', - 'cta' => 'See import status', + 'disclaimer' => 'Enporzhiañ', + 'text' => 'Emañ {podcastTitle} o vezañ enporzhiet.', + 'cta' => 'Gwelet stad an enporzh', ], - 'old_podcast_section_title' => 'The podcast to import', - 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_section_title' => 'Ar podkast da vezañ enporzhiet', + 'old_podcast_legal_disclaimer_title' => 'Menegoù lezennel', 'old_podcast_legal_disclaimer' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', + 'Bezit sur oc\'h aotreet da enporzhiañ ar podkast-mañ a-raok en ober. Eilañ ha skignañ ur podkast hep kaout an aotre a zo heñvel ouzh dambreziñ ha gallout a reer bezañ kaset d\'al lez-varn.', + 'imported_feed_url' => 'URL ar wazh', + 'imported_feed_url_hint' => 'Rankout a ra ar wazh bezañ er furmad xml pe rss.', + 'new_podcast_section_title' => 'Ar podkast nevez', 'lock_import' => 'Gwarezet eo ar wazh-mañ. Ne c\'hallit ket enporzhiañ anezhi. Ma\'z oc\'h ar perc\'henn·erez, dibrennit anezhi war ar savenn orin.', - 'submit' => 'Add import to queue', + 'submit' => 'Ouzhpennañ an enporzh d\'al lost', 'queue' => [ 'status' => [ - 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Import task is awaiting to be processed.', - 'canceled' => 'canceled', - 'canceled_hint' => 'Import task was canceled.', - 'running' => 'running', - 'running_hint' => 'Import task is being processed.', - 'failed' => 'failed', - 'failed_hint' => 'Import task could not complete: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Import task was completed successfully!', + 'label' => 'Statud', + 'queued' => 'el lost', + 'queued_hint' => 'Emañ an enporzh el lost.', + 'canceled' => 'nullet', + 'canceled_hint' => 'Nullet eo bet an enporzh.', + 'running' => 'war ar stern', + 'running_hint' => 'Emañ an enporzh war ar stern.', + 'failed' => 'c\'hwitet', + 'failed_hint' => 'An enporzh n\'eo ket bet graet: fazi skript.', + 'passed' => 'berzh', + 'passed_hint' => 'Enporzhiet eo bet gant berzh!', ], - 'feed' => 'Feed', - 'duration' => 'Import duration', - 'imported_episodes' => 'Imported episodes', - 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'feed' => 'Gwazh', + 'duration' => 'Padelezh an enporzh', + 'imported_episodes' => 'Rannoù enporzhiet', + 'imported_episodes_hint' => '{newlyImportedCount} enporzhiet nevez zo, {alreadyImportedCount} enporzhiet en holl.', 'actions' => [ - 'cancel' => 'Cancel', - 'retry' => 'Retry', - 'delete' => 'Delete', + 'cancel' => 'Nullañ', + 'retry' => 'Klask en-dro', + 'delete' => 'Dilemel', ], ], 'syncForm' => [ 'title' => 'Sinkronekaat ar gwazhoù', - 'feed_url' => 'Feed URL', - 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', - 'submit' => 'Add to queue', + 'feed_url' => 'URL ar wazh', + 'feed_url_hint' => 'URL ar wazh ho peus c\'hoant da sinkronekaat ouzh ar podkast-mañ.', + 'submit' => 'Ouzhpennañ d\'al lost', ], 'messages' => [ - 'canceled' => 'Import task has been successfully canceled!', - 'notRunning' => 'Cannot cancel Import Task as it is not running.', - 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', - 'retried' => 'Import task has been queued, it will be retried shortly!', - 'deleted' => 'Import task has been successfully deleted!', - 'importTaskQueued' => 'An new task has been queued, import will start shortly!', - 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + 'canceled' => 'An enporzh zo bet nullet gant berzh!', + 'notRunning' => 'Ne c\'haller ket nullañ an enporzh rak n\'eo ket krog al labour.', + 'alreadyRunning' => 'Emañ an enporzh war ar stern. Gallout a rit nullañ anezhañ a-raok klask en-dro.', + 'retried' => 'Ouzhpennet eo bet an enporzh d\'al lost, klasket e vo en-dro dindan berr!', + 'deleted' => 'An enporzh zo bet dilamet gant berzh!', + 'importTaskQueued' => 'Un enporzh nevez zo bet ouzhpennet d\'al lost, kroget e vo dindan berr!', + 'syncTaskQueued' => 'Un enporzh nevez zo bet ouzhpennet d\'al lost, kroget e vo ar sinkronekaat dindan berr!', ], ]; diff --git a/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php index 18c0dd4e..096fcf04 100644 --- a/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php @@ -14,17 +14,17 @@ return [ 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', + 'subscribe' => 'Koumanantiñ', + 'lock' => 'Prennañ', + 'unlock' => 'Dibrennañ', 'unlock_form' => [ - 'title' => 'Premium content', + 'title' => 'Endalc\'had Premium', 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', + 'token' => 'Lakait hoc’h alc\'hwez', 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', + 'submit' => 'Dibrennañ an holl rannoù!', 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', + 'subscribe_cta' => 'Koumanantit bremañ!', ], 'messages' => [ 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', diff --git a/modules/PremiumPodcasts/Language/br/Subscription.php b/modules/PremiumPodcasts/Language/br/Subscription.php index e83f0cb2..a956f60b 100644 --- a/modules/PremiumPodcasts/Language/br/Subscription.php +++ b/modules/PremiumPodcasts/Language/br/Subscription.php @@ -9,92 +9,92 @@ declare(strict_types=1); */ return [ - 'podcast_subscriptions' => 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', + 'podcast_subscriptions' => 'Koumanantoù ar podkast', + 'add' => 'Koumanant nevez', + 'view' => 'Gwelet ar c\'houmanant', + 'edit' => 'Kemmañ ar c\'houmanant', + 'regenerate_token' => 'Azgenel ar jedouer', + 'suspend' => 'Ehanañ ar c\'houmanant', + 'resume' => 'Adkregiñ gant ar c\'houmanant', + 'delete' => 'Dilemel ar c\'houmanant', 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', + 'active' => 'Bev', + 'suspended' => 'Ehanet', + 'expired' => 'Tremenet', ], 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', - 'status' => 'Status', + 'number' => 'Niverenn', + 'email' => 'Postel', + 'expiration_date' => 'Deiziad termen', + 'unlimited' => 'Didermen', + 'downloads' => 'Pellgargadennoù', + 'status' => 'Statud', ], 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_create' => 'Create subscription', - 'submit_edit' => 'Edit subscription', + 'email' => 'Postel', + 'expiration_date' => 'Deiziad termen', + 'expiration_date_hint' => 'An deiziad hag an eur ma vo tremenet ar c\'houmanant. Laoskit goullo evit ur c\'houmanant didermen.', + 'submit_create' => 'Krouiñ ur c\'houmanant', + 'submit_edit' => 'Kemmañ ar c\'houmanant', ], 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', + 'link' => 'Liamm etrezek pajenn ar c\'houmanant', + 'link_hint' => 'Gant an dra-se e vo ouzhpennet d\'al lec\'hienn ur galv da ober evit pediñ ar selaouerien·ezed da goumanantiñ ouzh ar podkast.', + 'submit' => 'Enrollañ al liamm', ], 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', + 'disclaimer' => 'Ehanañ ar c\'houmanant a viro ouzh ar goumananterien·ezed da welet an endalc\'had Premium. Gallout a reoc\'h skarzhañ an ehan war-lerc\'h.', + 'reason' => 'Abeg', + 'reason_placeholder' => 'Perak ho peus c\'hoant da ehanañ ar c\'houmanant?', + "submit" => 'Ehanañ ar c\'houmanant', ], 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', - 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', + 'disclaimer' => 'Dilemel koumanant {subscriber} a skarzho an holl stadegoù stag outañ.', + 'understand' => 'Kompren a ran, dilemel ar c\'houmanant da vat', + 'submit' => 'Dilemel ar c\'houmanant', ], 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', - 'editError' => 'Subscription could not be edited.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', - 'regenerateTokenError' => 'Token could not be regenerated.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + 'addSuccess' => 'Ur c\'houmanant nevez zo bet ouzhpennet! Ur postel evit degemer {subscriber} zo bet kaset.', + 'addError' => 'N\'eo ket bet ouzhpennet ar c\'houmanant.', + 'editSuccess' => 'Deiziad termen ar c\'houmanant zo bet nevesaet! Ur postel zo bet kaset da {subscriber}.', + 'editError' => 'N\'eo ket bet kemmet ar c\'houmanant.', + 'regenerateTokenSuccess' => 'Azganet eo bet ar jedouer! Kaset eo bet ar jedouer nevez da {subscriber} dre bostel.', + 'regenerateTokenError' => 'N\'eo ket bet gellet azgenel ar jedouer.', + 'deleteSuccess' => 'Dilamet eo bet ar c\'houmanant! Ur postel zo bet kaset da {subscriber}.', + 'deleteError' => 'N\'eo ket bet gellet dilemel ar c\'houmanant.', + 'suspendSuccess' => 'Ehanet eo bet ar c\'houmanant! Ur postel zo bet kaset da {subscriber}.', + 'suspendError' => 'N\'eo ket bet gellet ehanañ ar c\'houmanant.', + 'resumeSuccess' => 'Adkroget eo bet gant ar c\'houmanant! Ur postel zo bet kaset da {subscriber}.', + 'resumeError' => 'N\'eo ket bet gellet adkregiñ gant ar c\'houmanant.', + 'linkSaveSuccess' => 'Liamm ar c\'houmanant zo bet enrollet gant berzh! Diskouezet e vo war al lec\'hienn evel ur galv da ober!', + 'linkRemoveSuccess' => 'Dilamet eo bet liamm ar c\'houmanant gant berzh!', ], 'emails' => [ - 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', - 'welcome_subject' => 'Welcome to {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', - 'edited_subject' => 'Your subscription has been updated!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', - 'suspended_subject' => 'Your subscription has been suspended!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', - 'suspended_reason' => 'That is for the following reason: {0}', - 'resumed_subject' => 'Your subscription has been resumed!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', - 'deleted_subject' => 'Your subscription has been removed!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', - 'footer' => '{castopod} hosted on {host}', + 'greeting' => 'Ata,', + 'token' => 'Ho jedouer: {0}', + 'unique_feed_link' => 'Liamm ho kwazh deoc\'h-c\'hwi: {0}', + 'how_to_use' => 'Penaos ober gantañ?', + 'two_ways' => 'Daou zoare zo evit dibrennañ rannoù Premium:', + 'import_into_app' => 'Eilit liamm ho kwazh personelaet e-barzh hoc\'h arload podkast karetañ (enporzhiit anezhañ evel ur wazh prevez kuit da lakaat war wel ho titouroù).', + 'go_to_website' => 'Kit da lec\'hienn {podcastWebsite} ha dibrennit ar podkast gant ho jedouer.', + 'welcome_subject' => 'Degemer mat war {podcastTitle}', + 'welcome' => 'Koumanantet oc\'h ouzh {podcastTitle}, mersi bras deoc\'h ha degemer mat!', + 'welcome_token_title' => 'Setu an titouroù evit dibrennañ rannoù Premium ar podkast:', + 'welcome_expires' => 'Arventennet eo bet ho koumanant da echuiñ d\'an/ar {0}.', + 'welcome_never_expires' => 'Arventennet eo bet ho koumanant evit bezañ didermen.', + 'reset_subject' => 'Azganet eo bet ho jedouer!', + 'reset_token' => 'Adderaouekaet eo bet ho moned da {podcastTitle}!', + 'reset_token_title' => 'Titouroù nevez zo bet ganet evit ma tibrennfec’h rannoù Premium ar podkast:', + 'edited_subject' => 'Nevesaet eo bet ho koumanant!', + 'edited_expires' => 'Arventennet eo bet ho koumanant ouzh {podcastTitle} da echuiñ d\'an/ar {expiresAt}.', + 'edited_never_expires' => 'Arventennet eo bet ho koumanant ouzh {podcastTitle} da vezañ didermen!', + 'suspended_subject' => 'Ehanet eo bet ho koumanant!', + 'suspended' => 'Ehanet eo bet ho koumanant ouzh {podcastTitle}! Ne c\'hallit ket gwelet rannoù Premium ar podkast ken.', + 'suspended_reason' => 'Evit an abeg da-heul: {0}', + 'resumed_subject' => 'Adkrog eo ho koumanant!', + 'resumed' => 'Adkrog eo ho koumanant ouzh {podcastTitle}! Gallout a rit ket gwelet rannoù Premium ar podkast en-dro.', + 'deleted_subject' => 'Dilamet eo bet ho koumanant!', + 'deleted' => 'Dilamet eo bet ho koumanant ouzh {podcastTitle}! Ne c\'hallit ket gwelet rannoù Premium ar podkast ken.', + 'footer' => '{castopod} herberc\'hiet war {host}', ], ]; From 37f2d2d21a05aedc40be8eb8038715db55a42e50 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 26 Feb 2024 12:11:00 +0000 Subject: [PATCH 311/477] chore(release): 1.10.4 [skip ci] ## [1.10.4](https://code.castopod.org/adaures/castopod/compare/v1.10.3...v1.10.4) (2/26/2024) ### Bug Fixes * display chapters in episode preview page ([797516a](https://code.castopod.org/adaures/castopod/commit/797516a2ec7d88704412a5cca50421e8eef38eec)), closes [#445](https://code.castopod.org/adaures/castopod/issues/445) --- CHANGELOG.md | 8 ++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b1229a1..2eeb0b76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.10.4](https://code.castopod.org/adaures/castopod/compare/v1.10.3...v1.10.4) (2/26/2024) + +### Bug Fixes + +- display chapters in episode preview page + ([797516a](https://code.castopod.org/adaures/castopod/commit/797516a2ec7d88704412a5cca50421e8eef38eec)), + closes [#445](https://code.castopod.org/adaures/castopod/issues/445) + ## [1.10.3](https://code.castopod.org/adaures/castopod/compare/v1.10.2...v1.10.3) (2/21/2024) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 1aaf05f4..86b88e77 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.10.3'); +defined('CP_VERSION') || define('CP_VERSION', '1.10.4'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 5baed50a..8793c2c2 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.10.3", + "version": "1.10.4", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 910f4064..3cbc8534 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.10.3", + "version": "1.10.4", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 6289c42b1189f074c7e4e4cd9fbfd73bf26625c9 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 1 Mar 2024 11:32:26 +0000 Subject: [PATCH 312/477] fix(file-uploads): validate chapters json content + remove permit_empty rule to uploaded files refs #445 --- app/Config/App.php | 31 +- app/Config/Routing.php | 5 +- app/Models/EpisodeModel.php | 1 - app/Validation/FileRules.php | 39 + captainhook.json | 2 +- composer.json | 10 +- composer.lock | 145 +- .../Admin/Controllers/EpisodeController.php | 10 +- modules/Admin/Language/en/Validation.php | 1 + package.json | 26 +- pnpm-lock.yaml | 1511 ++++++++--------- tests/README.md | 36 +- 12 files changed, 859 insertions(+), 958 deletions(-) diff --git a/app/Config/App.php b/app/Config/App.php index 52613a86..a7c7b770 100644 --- a/app/Config/App.php +++ b/app/Config/App.php @@ -16,7 +16,7 @@ class App extends BaseConfig * URL to your CodeIgniter root. Typically, this will be your base URL, * WITH a trailing slash: * - * http://example.com/ + * E.g., http://example.com/ */ public string $baseURL = 'http://localhost:8080/'; @@ -24,10 +24,10 @@ class App extends BaseConfig * Allowed Hostnames in the Site URL other than the hostname in the baseURL. * If you want to accept multiple Hostnames, set this. * - * E.g. When your site URL ($baseURL) is 'http://example.com/', and your site - * also accepts 'http://media.example.com/' and - * 'http://accounts.example.com/': - * ['media.example.com', 'accounts.example.com'] + * E.g., + * When your site URL ($baseURL) is 'http://example.com/', and your site + * also accepts 'http://media.example.com/' and 'http://accounts.example.com/': + * ['media.example.com', 'accounts.example.com'] * * @var list */ @@ -38,9 +38,9 @@ class App extends BaseConfig * Index File * -------------------------------------------------------------------------- * - * Typically this will be your index.php file, unless you've renamed it to - * something else. If you are using mod_rewrite to remove the page set this - * variable so that it is blank. + * Typically, this will be your `index.php` file, unless you've renamed it to + * something else. If you have configured your web server to remove this file + * from your site URIs, set this variable to an empty string. */ public string $indexPage = ''; @@ -50,12 +50,12 @@ class App extends BaseConfig * -------------------------------------------------------------------------- * * This item determines which server global should be used to retrieve the - * URI string. The default setting of 'REQUEST_URI' works for most servers. + * URI string. The default setting of 'REQUEST_URI' works for most servers. * If your links do not seem to work, try one of the other delicious flavors: * - * 'REQUEST_URI' Uses $_SERVER['REQUEST_URI'] - * 'QUERY_STRING' Uses $_SERVER['QUERY_STRING'] - * 'PATH_INFO' Uses $_SERVER['PATH_INFO'] + * 'REQUEST_URI': Uses $_SERVER['REQUEST_URI'] + * 'QUERY_STRING': Uses $_SERVER['QUERY_STRING'] + * 'PATH_INFO': Uses $_SERVER['PATH_INFO'] * * WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded! */ @@ -96,7 +96,7 @@ class App extends BaseConfig * * IncomingRequest::setLocale() also uses this list. * - * @var string[] + * @var list */ public array $supportedLocales = ['en', 'fr', 'pl', 'de', 'pt-BR', 'nn-NO', 'es', 'zh-Hans', 'ca']; @@ -108,7 +108,8 @@ class App extends BaseConfig * The default timezone that will be used in your application to display * dates with the date helper, and can be retrieved through app_timezone() * - * @see https://www.php.net/manual/en/timezones.php for list of timezones supported by PHP. + * @see https://www.php.net/manual/en/timezones.php for list of timezones + * supported by PHP. */ public string $appTimezone = 'UTC'; @@ -132,7 +133,7 @@ class App extends BaseConfig * If true, this will force every request made to this application to be * made via a secure connection (HTTPS). If the incoming request is not * secure, the user will be redirected to a secure version of the page - * and the HTTP Strict Transport Security header will be set. + * and the HTTP Strict Transport Security (HSTS) header will be set. */ public bool $forceGlobalSecureRequests = true; diff --git a/app/Config/Routing.php b/app/Config/Routing.php index 636f7292..0ed4be40 100644 --- a/app/Config/Routing.php +++ b/app/Config/Routing.php @@ -66,13 +66,12 @@ class Routing extends BaseRouting /** * Sets the class/method that should be called if routing doesn't - * find a match. It can be either a closure or the controller/method - * name exactly like a route is defined: Users::index + * find a match. It can be the controller/method name like: Users::index * * This setting is passed to the Router class and handled there. * * If you want to use a closure, you will have to set it in the - * class constructor or the routes file by calling: + * routes file by calling: * * $routes->set404Override(function() { * // Do something here diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php index b5ef60d2..918bc6d1 100644 --- a/app/Models/EpisodeModel.php +++ b/app/Models/EpisodeModel.php @@ -218,7 +218,6 @@ class EpisodeModel extends UuidModel /** @var LazyUuidFromString $uuid */ $uuid = $this->uuid->{$this->uuidVersion}(); - // @phpstan-ignore-next-line if (! $this->update($episodeId, [ 'preview_id' => $uuid, ])) { diff --git a/app/Validation/FileRules.php b/app/Validation/FileRules.php index 49f5fb38..579ec3ca 100644 --- a/app/Validation/FileRules.php +++ b/app/Validation/FileRules.php @@ -95,4 +95,43 @@ class FileRules extends ValidationFileRules } //-------------------------------------------------------------------- + + /** + * Checks that an uploaded json file's content is valid + */ + public function is_json(string $blank = null, string $params = ''): bool + { + // Grab the file name off the top of the $params + // after we split it. + $params = explode(',', $params); + $name = array_shift($params); + + if (! ($files = $this->request->getFileMultiple($name))) { + $files = [$this->request->getFile($name)]; + } + + foreach ($files as $file) { + if ($file === null) { + return false; + } + + if ($file->getError() === UPLOAD_ERR_NO_FILE) { + return true; + } + + $content = file_get_contents($file->getTempName()); + + if ($content === false) { + return false; + } + + json_decode($content); + + if (json_last_error() !== JSON_ERROR_NONE) { + return false; + } + } + + return true; + } } diff --git a/captainhook.json b/captainhook.json index 0f0dbb9a..84a7fd69 100644 --- a/captainhook.json +++ b/captainhook.json @@ -18,7 +18,7 @@ "enabled": true, "actions": [ { - "action": "composer test -- --no-coverage", + "action": "composer test", "options": [], "conditions": [] }, diff --git a/composer.json b/composer.json index 8793c2c2..189bcbed 100644 --- a/composer.json +++ b/composer.json @@ -9,10 +9,10 @@ "php": "^8.1", "adaures/ipcat-php": "^v1.0.0", "adaures/podcast-persons-taxonomy": "^v1.0.1", - "aws/aws-sdk-php": "^3.299.1", + "aws/aws-sdk-php": "^3.300.8", "chrisjean/php-ico": "^1.0.4", "cocur/slugify": "^v4.5.1", - "codeigniter4/framework": "v4.4.5", + "codeigniter4/framework": "v4.4.6", "codeigniter4/settings": "v2.2.0", "codeigniter4/shield": "v1.0.1", "codeigniter4/tasks": "dev-develop", @@ -24,7 +24,7 @@ "michalsn/codeigniter4-uuid": "v1.0.2", "mpratt/embera": "^2.0.36", "opawg/user-agents-v2-php": "dev-main", - "phpseclib/phpseclib": "~2.0.46", + "phpseclib/phpseclib": "~2.0.47", "vlucas/phpdotenv": "v5.6.0", "whichbrowser/parser": "^v2.1.7", "yassinedoghri/podcast-feed": "dev-main" @@ -34,8 +34,8 @@ "codeigniter/phpstan-codeigniter": "v1.4.3", "mikey179/vfsstream": "^v1.6.11", "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.10.58", - "phpunit/phpunit": "^10.5.10", + "phpstan/phpstan": "^1.10.59", + "phpunit/phpunit": "^10.5.11", "rector/rector": "^1.0.1", "symplify/coding-standard": "^12.0.7", "symplify/easy-coding-standard": "^12.0.13" diff --git a/composer.lock b/composer.lock index ca8eb96e..24b2e80b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4773eb8843b3b60e4e4dbfd1926167d9", + "content-hash": "b5a3103c2712fc40845933bb0de767d3", "packages": [ { "name": "adaures/ipcat-php", @@ -120,16 +120,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.299.1", + "version": "3.300.8", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "a0f87b8e8bfb9afd0ffd702fcda556b465eee457" + "reference": "421be99f109a330acd4297abe2f41069eccbf447" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a0f87b8e8bfb9afd0ffd702fcda556b465eee457", - "reference": "a0f87b8e8bfb9afd0ffd702fcda556b465eee457", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/421be99f109a330acd4297abe2f41069eccbf447", + "reference": "421be99f109a330acd4297abe2f41069eccbf447", "shasum": "" }, "require": { @@ -205,9 +205,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.299.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.300.8" }, - "time": "2024-02-16T19:08:34+00:00" + "time": "2024-02-29T19:06:50+00:00" }, { "name": "brick/math", @@ -373,16 +373,16 @@ }, { "name": "codeigniter4/framework", - "version": "v4.4.5", + "version": "v4.4.6", "source": { "type": "git", "url": "https://github.com/codeigniter4/framework.git", - "reference": "f5844cb9790d87ff6043203953821740ba3aa592" + "reference": "7d393f85e8410f16654fa9b486694ff68c354c99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/f5844cb9790d87ff6043203953821740ba3aa592", - "reference": "f5844cb9790d87ff6043203953821740ba3aa592", + "url": "https://api.github.com/repos/codeigniter4/framework/zipball/7d393f85e8410f16654fa9b486694ff68c354c99", + "reference": "7d393f85e8410f16654fa9b486694ff68c354c99", "shasum": "" }, "require": { @@ -440,7 +440,7 @@ "slack": "https://codeigniterchat.slack.com", "source": "https://github.com/codeigniter4/CodeIgniter4" }, - "time": "2024-01-27T03:57:48+00:00" + "time": "2024-02-24T02:42:57+00:00" }, { "name": "codeigniter4/settings", @@ -564,12 +564,12 @@ "source": { "type": "git", "url": "https://github.com/codeigniter4/tasks.git", - "reference": "af45180ea8e04a162699bc55d7bed6b883199f38" + "reference": "dbdd8fc32d31d78fdfd559c77240c43faee7ff55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/af45180ea8e04a162699bc55d7bed6b883199f38", - "reference": "af45180ea8e04a162699bc55d7bed6b883199f38", + "url": "https://api.github.com/repos/codeigniter4/tasks/zipball/dbdd8fc32d31d78fdfd559c77240c43faee7ff55", + "reference": "dbdd8fc32d31d78fdfd559c77240c43faee7ff55", "shasum": "" }, "require": { @@ -580,7 +580,7 @@ "require-dev": { "codeigniter4/devkit": "^1.0", "codeigniter4/framework": "^4.1", - "rector/rector": "0.19.8" + "rector/rector": "1.0.1" }, "default-branch": true, "type": "library", @@ -638,20 +638,20 @@ "source": "https://github.com/codeigniter4/tasks/tree/develop", "issues": "https://github.com/codeigniter4/tasks/issues" }, - "time": "2024-02-05T11:21:42+00:00" + "time": "2024-02-23T11:59:21+00:00" }, { "name": "composer/ca-bundle", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "b66d11b7479109ab547f9405b97205640b17d385" + "reference": "3ce240142f6d59b808dd65c1f52f7a1c252e6cfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", - "reference": "b66d11b7479109ab547f9405b97205640b17d385", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3ce240142f6d59b808dd65c1f52f7a1c252e6cfd", + "reference": "3ce240142f6d59b808dd65c1f52f7a1c252e6cfd", "shasum": "" }, "require": { @@ -690,7 +690,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.4.0" + "source": "https://github.com/composer/ca-bundle/tree/1.4.1" }, "funding": [ { @@ -706,7 +706,7 @@ "type": "tidelift" } ], - "time": "2023-12-18T12:05:55+00:00" + "time": "2024-02-23T10:16:52+00:00" }, { "name": "dflydev/dot-access-data", @@ -2166,16 +2166,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.46", + "version": "2.0.47", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "498e67a0c82bd5791fda9b0dd0f4ec8e8aebb02d" + "reference": "b7d7d90ee7df7f33a664b4aea32d50a305d35adb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/498e67a0c82bd5791fda9b0dd0f4ec8e8aebb02d", - "reference": "498e67a0c82bd5791fda9b0dd0f4ec8e8aebb02d", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b7d7d90ee7df7f33a664b4aea32d50a305d35adb", + "reference": "b7d7d90ee7df7f33a664b4aea32d50a305d35adb", "shasum": "" }, "require": { @@ -2252,7 +2252,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.46" + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.47" }, "funding": [ { @@ -2268,7 +2268,7 @@ "type": "tidelift" } ], - "time": "2023-12-29T01:52:43+00:00" + "time": "2024-02-26T04:55:38+00:00" }, { "name": "psr/cache", @@ -3614,16 +3614,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.49.0", + "version": "v3.51.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "8742f7aa6f72a399688b65e4f58992c2d4681fc2" + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/8742f7aa6f72a399688b65e4f58992c2d4681fc2", - "reference": "8742f7aa6f72a399688b65e4f58992c2d4681fc2", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/127fa74f010da99053e3f5b62672615b72dd6efd", + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd", "shasum": "" }, "require": { @@ -3633,7 +3633,7 @@ "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", - "sebastian/diff": "^4.0 || ^5.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", "symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", @@ -3654,7 +3654,8 @@ "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", - "phpunit/phpunit": "^9.6 || ^10.5.5", + "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", "symfony/yaml": "^5.4 || ^6.0 || ^7.0" }, "suggest": { @@ -3689,7 +3690,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.49.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.51.0" }, "funding": [ { @@ -3697,7 +3698,7 @@ "type": "github" } ], - "time": "2024-02-02T00:41:40+00:00" + "time": "2024-02-28T19:50:06+00:00" }, { "name": "mikey179/vfsstream", @@ -3799,16 +3800,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.0.0", + "version": "v5.0.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc" + "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4a21235f7e56e713259a6f76bf4b5ea08502b9dc", - "reference": "4a21235f7e56e713259a6f76bf4b5ea08502b9dc", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2218c2252c874a4624ab2f613d86ac32d227bc69", + "reference": "2218c2252c874a4624ab2f613d86ac32d227bc69", "shasum": "" }, "require": { @@ -3844,9 +3845,9 @@ "keywords": ["parser", "php"], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.1" }, - "time": "2024-01-07T17:17:35+00:00" + "time": "2024-02-21T19:24:10+00:00" }, { "name": "phar-io/manifest", @@ -3995,16 +3996,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.58", + "version": "1.10.59", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2" + "reference": "e607609388d3a6d418a50a49f7940e8086798281" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", + "reference": "e607609388d3a6d418a50a49f7940e8086798281", "shasum": "" }, "require": { @@ -4043,7 +4044,7 @@ "type": "tidelift" } ], - "time": "2024-02-12T20:02:57+00:00" + "time": "2024-02-20T13:59:13+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4335,16 +4336,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.10", + "version": "10.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "50b8e314b6d0dd06521dc31d1abffa73f25f850c" + "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/50b8e314b6d0dd06521dc31d1abffa73f25f850c", - "reference": "50b8e314b6d0dd06521dc31d1abffa73f25f850c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", + "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", "shasum": "" }, "require": { @@ -4404,7 +4405,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.11" }, "funding": [ { @@ -4420,7 +4421,7 @@ "type": "tidelift" } ], - "time": "2024-02-04T09:07:51+00:00" + "time": "2024-02-25T14:05:00+00:00" }, { "name": "psr/container", @@ -5520,16 +5521,16 @@ }, { "name": "symfony/console", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e" + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", - "reference": "2aaf83b4de5b9d43b93e4aec6f2f8b676f7c567e", + "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", "shasum": "" }, "require": { @@ -5585,7 +5586,7 @@ "homepage": "https://symfony.com", "keywords": ["cli", "command-line", "console", "terminal"], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.3" + "source": "https://github.com/symfony/console/tree/v6.4.4" }, "funding": [ { @@ -5601,7 +5602,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/event-dispatcher", @@ -6147,16 +6148,16 @@ }, { "name": "symfony/process", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "31642b0818bfcff85930344ef93193f8c607e0a3" + "reference": "710e27879e9be3395de2b98da3f52a946039f297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/31642b0818bfcff85930344ef93193f8c607e0a3", - "reference": "31642b0818bfcff85930344ef93193f8c607e0a3", + "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", + "reference": "710e27879e9be3395de2b98da3f52a946039f297", "shasum": "" }, "require": { @@ -6184,7 +6185,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.3" + "source": "https://github.com/symfony/process/tree/v6.4.4" }, "funding": [ { @@ -6200,7 +6201,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-20T12:31:00+00:00" }, { "name": "symfony/service-contracts", @@ -6340,16 +6341,16 @@ }, { "name": "symfony/string", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "7a14736fb179876575464e4658fce0c304e8c15b" + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7a14736fb179876575464e4658fce0c304e8c15b", - "reference": "7a14736fb179876575464e4658fce0c304e8c15b", + "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", "shasum": "" }, "require": { @@ -6393,7 +6394,7 @@ "homepage": "https://symfony.com", "keywords": ["grapheme", "i18n", "string", "unicode", "utf-8", "utf8"], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.3" + "source": "https://github.com/symfony/string/tree/v6.4.4" }, "funding": [ { @@ -6409,7 +6410,7 @@ "type": "tidelift" } ], - "time": "2024-01-25T09:26:29+00:00" + "time": "2024-02-01T13:16:41+00:00" }, { "name": "symplify/coding-standard", diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index fe48391c..6f9ae615 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -161,8 +161,8 @@ class EpisodeController extends BaseController 'slug' => 'required|max_length[128]', 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]', 'cover' => 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', - 'transcript_file' => 'ext_in[transcript,srt]|permit_empty', - 'chapters_file' => 'ext_in[chapters,json]|permit_empty', + 'transcript_file' => 'ext_in[transcript_file,srt,vtt]', + 'chapters_file' => 'ext_in[chapters_file,json]|is_json[chapters_file]', ]; if ($this->podcast->type === 'serial' && $this->request->getPost('type') === 'full') { @@ -297,10 +297,10 @@ class EpisodeController extends BaseController $rules = [ 'title' => 'required', 'slug' => 'required|max_length[128]', - 'audio_file' => 'uploaded[audio_file]|ext_in[audio_file,mp3,m4a]|permit_empty', + 'audio_file' => 'ext_in[audio_file,mp3,m4a]', 'cover' => 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', - 'transcript_file' => 'ext_in[transcript_file,txt,html,srt,json]|permit_empty', - 'chapters_file' => 'ext_in[chapters_file,json]|permit_empty', + 'transcript_file' => 'ext_in[transcript_file,srt,vtt]', + 'chapters_file' => 'ext_in[chapters_file,json]|is_json[chapters_file]', ]; if ($this->podcast->type === 'serial' && $this->request->getPost('type') === 'full') { diff --git a/modules/Admin/Language/en/Validation.php b/modules/Admin/Language/en/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/en/Validation.php +++ b/modules/Admin/Language/en/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/package.json b/package.json index 3cbc8534..87e86edc 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ "@codemirror/commands": "^6.3.3", "@codemirror/lang-xml": "^6.0.2", "@codemirror/language": "^6.10.1", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.24.0", + "@codemirror/state": "^6.4.1", + "@codemirror/view": "^6.24.1", "@floating-ui/dom": "^1.6.3", "@github/clipboard-copy-element": "^1.3.0", "@github/hotkey": "^3.1.0", @@ -48,29 +48,29 @@ "leaflet": "^1.9.4", "leaflet.markercluster": "^1.5.3", "lit": "^3.1.2", - "marked": "^11.2.0", + "marked": "^12.0.0", "wavesurfer.js": "^7.7.3", "xml-formatter": "^3.6.2" }, "devDependencies": { - "@commitlint/cli": "^18.6.1", - "@commitlint/config-conventional": "^18.6.2", + "@commitlint/cli": "^19.0.3", + "@commitlint/config-conventional": "^19.0.3", "@csstools/css-tokenizer": "^2.2.3", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", - "@semantic-release/gitlab": "^13.0.2", + "@semantic-release/gitlab": "^13.0.3", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.10", "@types/leaflet": "^1.9.8", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "@typescript-eslint/parser": "^6.21.0", + "@typescript-eslint/eslint-plugin": "^7.1.0", + "@typescript-eslint/parser": "^7.1.0", "all-contributors-cli": "^6.26.1", "commitizen": "^4.3.0", "cross-env": "^7.0.3", "cssnano": "^6.0.3", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.56.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "husky": "^9.0.11", @@ -78,8 +78,8 @@ "lint-staged": "^15.2.2", "postcss": "^8.4.35", "postcss-import": "^16.0.1", - "postcss-nesting": "^12.0.2", - "postcss-preset-env": "^9.3.0", + "postcss-nesting": "^12.0.4", + "postcss-preset-env": "^9.4.0", "postcss-reporter": "^7.1.0", "prettier": "3.2.5", "prettier-plugin-organize-imports": "^3.2.4", @@ -89,8 +89,8 @@ "svgo": "^3.2.0", "tailwindcss": "^3.4.1", "typescript": "^5.3.3", - "vite": "^5.1.3", - "vite-plugin-pwa": "^0.17.5", + "vite": "^5.1.4", + "vite-plugin-pwa": "^0.19.2", "workbox-build": "^7.0.0", "workbox-core": "^7.0.0", "workbox-routing": "^7.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8709afa9..2c66247b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,16 +16,16 @@ dependencies: version: 6.3.3 "@codemirror/lang-xml": specifier: ^6.0.2 - version: 6.0.2(@codemirror/view@6.24.0) + version: 6.0.2(@codemirror/view@6.24.1) "@codemirror/language": specifier: ^6.10.1 version: 6.10.1 "@codemirror/state": - specifier: ^6.4.0 - version: 6.4.0 + specifier: ^6.4.1 + version: 6.4.1 "@codemirror/view": - specifier: ^6.24.0 - version: 6.24.0 + specifier: ^6.24.1 + version: 6.24.1 "@floating-ui/dom": specifier: ^1.6.3 version: 1.6.3 @@ -66,8 +66,8 @@ dependencies: specifier: ^3.1.2 version: 3.1.2 marked: - specifier: ^11.2.0 - version: 11.2.0 + specifier: ^12.0.0 + version: 12.0.0 wavesurfer.js: specifier: ^7.7.3 version: 7.7.3 @@ -77,11 +77,11 @@ dependencies: devDependencies: "@commitlint/cli": - specifier: ^18.6.1 - version: 18.6.1(@types/node@20.10.5)(typescript@5.3.3) + specifier: ^19.0.3 + version: 19.0.3(@types/node@20.10.5)(typescript@5.3.3) "@commitlint/config-conventional": - specifier: ^18.6.2 - version: 18.6.2 + specifier: ^19.0.3 + version: 19.0.3 "@csstools/css-tokenizer": specifier: ^2.2.3 version: 2.2.3 @@ -95,8 +95,8 @@ devDependencies: specifier: ^10.0.1 version: 10.0.1(semantic-release@23.0.2) "@semantic-release/gitlab": - specifier: ^13.0.2 - version: 13.0.2(semantic-release@23.0.2) + specifier: ^13.0.3 + version: 13.0.3(semantic-release@23.0.2) "@tailwindcss/forms": specifier: ^0.5.7 version: 0.5.7(tailwindcss@3.4.1) @@ -107,17 +107,17 @@ devDependencies: specifier: ^1.9.8 version: 1.9.8 "@typescript-eslint/eslint-plugin": - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.1.0 + version: 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) "@typescript-eslint/parser": - specifier: ^6.21.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.1.0 + version: 7.1.0(eslint@8.57.0)(typescript@5.3.3) all-contributors-cli: specifier: ^6.26.1 version: 6.26.1 commitizen: specifier: ^4.3.0 - version: 4.3.0(typescript@5.3.3) + version: 4.3.0(@types/node@20.10.5)(typescript@5.3.3) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -126,16 +126,16 @@ devDependencies: version: 6.0.3(postcss@8.4.35) cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(typescript@5.3.3) + version: 3.3.0(@types/node@20.10.5)(typescript@5.3.3) eslint: - specifier: ^8.56.0 - version: 8.56.0 + specifier: ^8.57.0 + version: 8.57.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.56.0) + version: 9.1.0(eslint@8.57.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5) + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) husky: specifier: ^9.0.11 version: 9.0.11 @@ -152,11 +152,11 @@ devDependencies: specifier: ^16.0.1 version: 16.0.1(postcss@8.4.35) postcss-nesting: - specifier: ^12.0.2 - version: 12.0.2(postcss@8.4.35) + specifier: ^12.0.4 + version: 12.0.4(postcss@8.4.35) postcss-preset-env: - specifier: ^9.3.0 - version: 9.3.0(postcss@8.4.35) + specifier: ^9.4.0 + version: 9.4.0(postcss@8.4.35) postcss-reporter: specifier: ^7.1.0 version: 7.1.0(postcss@8.4.35) @@ -185,11 +185,11 @@ devDependencies: specifier: ^5.3.3 version: 5.3.3 vite: - specifier: ^5.1.3 - version: 5.1.3(@types/node@20.10.5) + specifier: ^5.1.4 + version: 5.1.4(@types/node@20.10.5) vite-plugin-pwa: - specifier: ^0.17.5 - version: 0.17.5(vite@5.1.3)(workbox-build@7.0.0)(workbox-window@7.0.0) + specifier: ^0.19.2 + version: 0.19.2(vite@5.1.4)(workbox-build@7.0.0)(workbox-window@7.0.0) workbox-build: specifier: ^7.0.0 version: 7.0.0 @@ -1761,7 +1761,7 @@ packages: to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.0): + /@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.24.1)(@lezer/common@1.2.0): resolution: { integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==, @@ -1773,8 +1773,8 @@ packages: "@lezer/common": ^1.0.0 dependencies: "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.24.1 "@lezer/common": 1.2.0 dev: false @@ -1785,20 +1785,20 @@ packages: } dependencies: "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.24.1 "@lezer/common": 1.2.0 dev: false - /@codemirror/lang-xml@6.0.2(@codemirror/view@6.24.0): + /@codemirror/lang-xml@6.0.2(@codemirror/view@6.24.1): resolution: { integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, } dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.0) + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.24.1)(@lezer/common@1.2.0) "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 + "@codemirror/state": 6.4.1 "@lezer/common": 1.2.0 "@lezer/xml": 1.0.4 transitivePeerDependencies: @@ -1811,8 +1811,8 @@ packages: integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==, } dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.24.1 "@lezer/common": 1.2.0 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 @@ -1825,8 +1825,8 @@ packages: integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, } dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.24.1 crelt: 1.0.6 dev: false @@ -1836,25 +1836,25 @@ packages: integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, } dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.24.1 crelt: 1.0.6 dev: false - /@codemirror/state@6.4.0: + /@codemirror/state@6.4.1: resolution: { - integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==, + integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==, } dev: false - /@codemirror/view@6.24.0: + /@codemirror/view@6.24.1: resolution: { - integrity: sha512-zK6m5pNkdhdJl8idPP1gA4N8JKTiSsOz8U/Iw+C1ChMwyLG7+MLiNXnH/wFuAk6KeGEe33/adOiAh5jMqee03w==, + integrity: sha512-sBfP4rniPBRQzNakwuQEqjEuiJDWJyF2kqLLqij4WXRoVwPPJfjx966Eq3F7+OPQxDtMt/Q9MWLoZLWjeveBlg==, } dependencies: - "@codemirror/state": 6.4.0 + "@codemirror/state": 6.4.1 style-mod: 4.1.0 w3c-keyname: 2.2.8 dev: false @@ -1869,72 +1869,69 @@ packages: dev: true optional: true - /@commitlint/cli@18.6.1(@types/node@20.10.5)(typescript@5.3.3): + /@commitlint/cli@19.0.3(@types/node@20.10.5)(typescript@5.3.3): resolution: { - integrity: sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==, + integrity: sha512-mGhh/aYPib4Vy4h+AGRloMY+CqkmtdeKPV9poMcZeImF5e3knQ5VYaSeAM0mEzps1dbKsHvABwaDpafLUuM96g==, } engines: { node: ">=v18" } hasBin: true dependencies: - "@commitlint/format": 18.6.1 - "@commitlint/lint": 18.6.1 - "@commitlint/load": 18.6.1(@types/node@20.10.5)(typescript@5.3.3) - "@commitlint/read": 18.6.1 - "@commitlint/types": 18.6.1 - execa: 5.1.1 - lodash.isfunction: 3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 + "@commitlint/format": 19.0.3 + "@commitlint/lint": 19.0.3 + "@commitlint/load": 19.0.3(@types/node@20.10.5)(typescript@5.3.3) + "@commitlint/read": 19.0.3 + "@commitlint/types": 19.0.3 + execa: 8.0.1 yargs: 17.7.2 transitivePeerDependencies: - "@types/node" - typescript dev: true - /@commitlint/config-conventional@18.6.2: + /@commitlint/config-conventional@19.0.3: resolution: { - integrity: sha512-PcgSYg1AKGQIwDQKbaHtJsfqYy4uJTC7crLVZ83lfjcPaec4Pry2vLeaWej7ao2KsT20l9dWoMPpEGg8LWdUuA==, + integrity: sha512-vh0L8XeLaEzTe8VCxSd0gAFvfTK0RFolrzw4o431bIuWJfi/yRCHJlsDwus7wW2eJaFFDR0VFXJyjGyDQhi4vA==, } engines: { node: ">=v18" } dependencies: - "@commitlint/types": 18.6.1 + "@commitlint/types": 19.0.3 conventional-changelog-conventionalcommits: 7.0.2 dev: true - /@commitlint/config-validator@18.4.3: - resolution: - { - integrity: sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==, - } - engines: { node: ">=v18" } - requiresBuild: true - dependencies: - "@commitlint/types": 18.4.3 - ajv: 8.12.0 - dev: true - optional: true - /@commitlint/config-validator@18.6.1: resolution: { integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/types": 18.6.1 ajv: 8.12.0 dev: true + optional: true - /@commitlint/ensure@18.6.1: + /@commitlint/config-validator@19.0.3: resolution: { - integrity: sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==, + integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==, } engines: { node: ">=v18" } dependencies: - "@commitlint/types": 18.6.1 + "@commitlint/types": 19.0.3 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure@19.0.3: + resolution: + { + integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==, + } + engines: { node: ">=v18" } + dependencies: + "@commitlint/types": 19.0.3 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -1942,90 +1939,66 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule@18.4.3: - resolution: - { - integrity: sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==, - } - engines: { node: ">=v18" } - requiresBuild: true - dev: true - optional: true - /@commitlint/execute-rule@18.6.1: resolution: { integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==, } engines: { node: ">=v18" } + requiresBuild: true dev: true + optional: true - /@commitlint/format@18.6.1: + /@commitlint/execute-rule@19.0.0: resolution: { - integrity: sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==, + integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==, + } + engines: { node: ">=v18" } + dev: true + + /@commitlint/format@19.0.3: + resolution: + { + integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==, } engines: { node: ">=v18" } dependencies: - "@commitlint/types": 18.6.1 - chalk: 4.1.2 + "@commitlint/types": 19.0.3 + chalk: 5.3.0 dev: true - /@commitlint/is-ignored@18.6.1: + /@commitlint/is-ignored@19.0.3: resolution: { - integrity: sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==, + integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==, } engines: { node: ">=v18" } dependencies: - "@commitlint/types": 18.6.1 + "@commitlint/types": 19.0.3 semver: 7.6.0 dev: true - /@commitlint/lint@18.6.1: + /@commitlint/lint@19.0.3: resolution: { - integrity: sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==, + integrity: sha512-uHPyRqIn57iIplYa5xBr6oNu5aPXKGC4WLeuHfqQHclwIqbJ33g3yA5fIA+/NYnp5ZM2EFiujqHFaVUYj6HlKA==, } engines: { node: ">=v18" } dependencies: - "@commitlint/is-ignored": 18.6.1 - "@commitlint/parse": 18.6.1 - "@commitlint/rules": 18.6.1 - "@commitlint/types": 18.6.1 + "@commitlint/is-ignored": 19.0.3 + "@commitlint/parse": 19.0.3 + "@commitlint/rules": 19.0.3 + "@commitlint/types": 19.0.3 dev: true - /@commitlint/load@18.4.3(typescript@5.3.3): - resolution: - { - integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==, - } - engines: { node: ">=v18" } - requiresBuild: true - dependencies: - "@commitlint/config-validator": 18.4.3 - "@commitlint/execute-rule": 18.4.3 - "@commitlint/resolve-extends": 18.4.3 - "@commitlint/types": 18.4.3 - "@types/node": 18.19.3 - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.3.3) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - transitivePeerDependencies: - - typescript - dev: true - optional: true - /@commitlint/load@18.6.1(@types/node@20.10.5)(typescript@5.3.3): resolution: { integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/config-validator": 18.6.1 "@commitlint/execute-rule": 18.6.1 @@ -2042,63 +2015,70 @@ packages: - "@types/node" - typescript dev: true + optional: true - /@commitlint/message@18.6.1: + /@commitlint/load@19.0.3(@types/node@20.10.5)(typescript@5.3.3): resolution: { - integrity: sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==, + integrity: sha512-18Tk/ZcDFRKIoKfEcl7kC+bYkEQ055iyKmGsYDoYWpKf6FUvBrP9bIWapuy/MB+kYiltmP9ITiUx6UXtqC9IRw==, + } + engines: { node: ">=v18" } + dependencies: + "@commitlint/config-validator": 19.0.3 + "@commitlint/execute-rule": 19.0.0 + "@commitlint/resolve-extends": 19.0.3 + "@commitlint/types": 19.0.3 + chalk: 5.3.0 + cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.10.5)(cosmiconfig@8.3.6)(typescript@5.3.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - "@types/node" + - typescript + dev: true + + /@commitlint/message@19.0.0: + resolution: + { + integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==, } engines: { node: ">=v18" } dev: true - /@commitlint/parse@18.6.1: + /@commitlint/parse@19.0.3: resolution: { - integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==, + integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==, } engines: { node: ">=v18" } dependencies: - "@commitlint/types": 18.6.1 + "@commitlint/types": 19.0.3 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 dev: true - /@commitlint/read@18.6.1: + /@commitlint/read@19.0.3: resolution: { - integrity: sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==, + integrity: sha512-b5AflTyAXkUx5qKw4TkjjcOccXZHql3JqMi522knTQktq2AubKXFz60Sws+K4FsefwPws6fGz9mqiI/NvsvxFA==, } engines: { node: ">=v18" } dependencies: - "@commitlint/top-level": 18.6.1 - "@commitlint/types": 18.6.1 - git-raw-commits: 2.0.11 + "@commitlint/top-level": 19.0.0 + "@commitlint/types": 19.0.3 + git-raw-commits: 4.0.0 minimist: 1.2.8 dev: true - /@commitlint/resolve-extends@18.4.3: - resolution: - { - integrity: sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==, - } - engines: { node: ">=v18" } - requiresBuild: true - dependencies: - "@commitlint/config-validator": 18.4.3 - "@commitlint/types": 18.4.3 - import-fresh: 3.3.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - optional: true - /@commitlint/resolve-extends@18.6.1: resolution: { integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==, } engines: { node: ">=v18" } + requiresBuild: true dependencies: "@commitlint/config-validator": 18.6.1 "@commitlint/types": 18.6.1 @@ -2107,43 +2087,59 @@ packages: resolve-from: 5.0.0 resolve-global: 1.0.0 dev: true + optional: true - /@commitlint/rules@18.6.1: + /@commitlint/resolve-extends@19.0.3: resolution: { - integrity: sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==, + integrity: sha512-18BKmta8OC8+Ub+Q3QGM9l27VjQaXobloVXOrMvu8CpEwJYv62vC/t7Ka5kJnsW0tU9q1eMqJFZ/nN9T/cOaIA==, } engines: { node: ">=v18" } dependencies: - "@commitlint/ensure": 18.6.1 - "@commitlint/message": 18.6.1 - "@commitlint/to-lines": 18.6.1 - "@commitlint/types": 18.6.1 - execa: 5.1.1 + "@commitlint/config-validator": 19.0.3 + "@commitlint/types": 19.0.3 + global-directory: 4.0.1 + import-meta-resolve: 4.0.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 dev: true - /@commitlint/to-lines@18.6.1: + /@commitlint/rules@19.0.3: resolution: { - integrity: sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==, - } - engines: { node: ">=v18" } - dev: true - - /@commitlint/top-level@18.6.1: - resolution: - { - integrity: sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==, + integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==, } engines: { node: ">=v18" } dependencies: - find-up: 5.0.0 + "@commitlint/ensure": 19.0.3 + "@commitlint/message": 19.0.0 + "@commitlint/to-lines": 19.0.0 + "@commitlint/types": 19.0.3 + execa: 8.0.1 dev: true - /@commitlint/types@18.4.3: + /@commitlint/to-lines@19.0.0: resolution: { - integrity: sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==, + integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==, + } + engines: { node: ">=v18" } + dev: true + + /@commitlint/top-level@19.0.0: + resolution: + { + integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==, + } + engines: { node: ">=v18" } + dependencies: + find-up: 7.0.0 + dev: true + + /@commitlint/types@18.6.1: + resolution: + { + integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==, } engines: { node: ">=v18" } requiresBuild: true @@ -2152,27 +2148,28 @@ packages: dev: true optional: true - /@commitlint/types@18.6.1: + /@commitlint/types@19.0.3: resolution: { - integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==, + integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==, } engines: { node: ">=v18" } dependencies: - chalk: 4.1.2 + "@types/conventional-commits-parser": 5.0.0 + chalk: 5.3.0 dev: true - /@csstools/cascade-layer-name-parser@1.0.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3): + /@csstools/cascade-layer-name-parser@1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): resolution: { - integrity: sha512-HkxRNs6ZIV0VjLFw6k5G8K35vd9r+O8B1Vr+QVD8M5Y44eQxyHtc42BdF74FQatXACPnitOR1+sRx2oWdnKTQw==, + integrity: sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - "@csstools/css-parser-algorithms": ^2.4.0 - "@csstools/css-tokenizer": ^2.2.2 + "@csstools/css-parser-algorithms": ^2.6.0 + "@csstools/css-tokenizer": ^2.2.3 dependencies: - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 dev: true @@ -2184,45 +2181,33 @@ packages: engines: { node: ^14 || ^16 || >=18 } dev: true - /@csstools/css-calc@1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3): + /@csstools/css-calc@1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): resolution: { - integrity: sha512-UhI5oSRAUtTHY3MyGahqn0ZzQOHVoPpfvUcOmYipAZ1rILAvCBoyiLSsa/clv1Xxct0SMKIq93KO5Bfl1cb6tQ==, + integrity: sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - "@csstools/css-parser-algorithms": ^2.4.0 - "@csstools/css-tokenizer": ^2.2.2 + "@csstools/css-parser-algorithms": ^2.6.0 + "@csstools/css-tokenizer": ^2.2.3 dependencies: - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 dev: true - /@csstools/css-color-parser@1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3): + /@csstools/css-color-parser@1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): resolution: { - integrity: sha512-PUhSg1MgU2sjYhA6moOmxYesqVqYTJwcVw12boTNbDX7Af+VK02MkgvmBBY2Z2qU6UN5HOQ+wrF0qQJGsTFY7w==, + integrity: sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - "@csstools/css-parser-algorithms": ^2.4.0 - "@csstools/css-tokenizer": ^2.2.2 + "@csstools/css-parser-algorithms": ^2.6.0 + "@csstools/css-tokenizer": ^2.2.3 dependencies: "@csstools/color-helpers": 4.0.0 - "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) - "@csstools/css-tokenizer": 2.2.3 - dev: true - - /@csstools/css-parser-algorithms@2.4.0(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-/PPLr2g5PAUCKAPEbfyk6/baZA+WJHQtUhPkoCQMpyRE8I0lXrG1QFRN8e5s3ZYxM8d/g5BZc6lH3s8Op7/VEg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-tokenizer": ^2.2.2 - dependencies: + "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 dev: true @@ -2238,6 +2223,18 @@ packages: "@csstools/css-tokenizer": 2.2.3 dev: true + /@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3): + resolution: + { + integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-tokenizer": ^2.2.3 + dependencies: + "@csstools/css-tokenizer": 2.2.3 + dev: true + /@csstools/css-tokenizer@2.2.3: resolution: { @@ -2246,20 +2243,6 @@ packages: engines: { node: ^14 || ^16 || >=18 } dev: true - /@csstools/media-query-list-parser@2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-R6AKl9vaU0It7D7TR2lQn0pre5aQfdeqHRePlaRCY8rHL3l9eVlNRpsEVDKFi/zAjzv68CxH2M5kqbhPFPKjvw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-parser-algorithms": ^2.4.0 - "@csstools/css-tokenizer": ^2.2.2 - dependencies: - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) - "@csstools/css-tokenizer": 2.2.3 - dev: true - /@csstools/media-query-list-parser@2.1.7(@csstools/css-parser-algorithms@2.5.0)(@csstools/css-tokenizer@2.2.3): resolution: { @@ -2274,136 +2257,157 @@ packages: "@csstools/css-tokenizer": 2.2.3 dev: true - /@csstools/postcss-cascade-layers@4.0.2(postcss@8.4.35): + /@csstools/media-query-list-parser@2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): resolution: { - integrity: sha512-PqM+jvg5T2tB4FHX+akrMGNWAygLupD4FNUjcv4PSvtVuWZ6ISxuo37m4jFGU7Jg3rCfloGzKd0+xfr5Ec3vZQ==, + integrity: sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: - postcss: ^8.4 + "@csstools/css-parser-algorithms": ^2.6.0 + "@csstools/css-tokenizer": ^2.2.3 dependencies: - "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) - postcss: 8.4.35 - postcss-selector-parser: 6.0.14 - dev: true - - /@csstools/postcss-color-function@3.0.8(postcss@8.4.35): - resolution: - { - integrity: sha512-jvbF7eCRbIcxWqby0kk2Mt85QtGzRRpFFYdlJCJ80Tuiv43PY+auS/nBl8pDQQ4Ndm4vsm4IC/wCZDcJUmpJmg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 - dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) - postcss: 8.4.35 dev: true - /@csstools/postcss-color-mix-function@2.0.8(postcss@8.4.35): + /@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.35): resolution: { - integrity: sha512-sGhk+TdZ2TeXspc6LSYSYC8WgzLlxoknUaObKgB0mk+dNjRQgSSIeCU+qrCwvHmwM+uTNKtiS8mntDzyQLHTTA==, + integrity: sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/selector-specificity": 3.0.2(postcss-selector-parser@6.0.15) + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/postcss-color-function@3.0.10(postcss@8.4.35): + resolution: + { + integrity: sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-exponential-functions@1.0.2(postcss@8.4.35): + /@csstools/postcss-color-mix-function@2.0.10(postcss@8.4.35): resolution: { - integrity: sha512-VRIYrwNCkZRqzsGB4jGT+XcNXsoiwyqy0Vf7C3I/5OPcf7WcWK3G1sBYFqqgWLGtpwc7m1m8TcorGY1xdh5abg==, + integrity: sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-tokenizer": 2.2.3 + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true + + /@csstools/postcss-exponential-functions@1.0.4(postcss@8.4.35): + resolution: + { + integrity: sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 dev: true - /@csstools/postcss-font-format-keywords@3.0.1(postcss@8.4.35): + /@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.35): resolution: { - integrity: sha512-D1lcG2sfotTq6yBEOMV3myFxJLT10F3DLYZJMbiny5YToqzHWodZen8WId3UTimm0mEHitXqAUNL5jdd6RzVdA==, + integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-gamut-mapping@1.0.1(postcss@8.4.35): + /@csstools/postcss-gamut-mapping@1.0.3(postcss@8.4.35): resolution: { - integrity: sha512-GDVzfNbnc7x3GusFklvt0mYXIWVzxEtEtTFEW664NgZh/5V7Z89hZKBMl9piOAHXuxijfHtE+kul/ShfeLUvcA==, + integrity: sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.8(postcss@8.4.35): + /@csstools/postcss-gradients-interpolation-method@4.0.11(postcss@8.4.35): resolution: { - integrity: sha512-bmvCNzuUvWPPdgASh0T14ffTay/FdzXsXfp0wXT1pYoUPmkH9M6yyxwPEkHq5djjzSb2jiLl4Ta3XM1uOREQ2w==, + integrity: sha512-LFom5jCVUfzF+iuiOZvhvX7RRN8vc+tKpcKo9s4keEBAU2mPwV5/Fgz5iylEfXP/DZbEdq2C0At20urMi/lupw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-hwb-function@3.0.7(postcss@8.4.35): + /@csstools/postcss-hwb-function@3.0.9(postcss@8.4.35): resolution: { - integrity: sha512-iXs1gxKtev8YNP5bOF26TAsnMfcxnCRLpKItQ067RphYECKEK/xWm4Z0r4ChmV1U1eq+lbdH5ZIb2cju4o5akA==, + integrity: sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-ic-unit@3.0.3(postcss@8.4.35): + /@csstools/postcss-ic-unit@3.0.4(postcss@8.4.35): resolution: { - integrity: sha512-MpcmIL0/uMm/cFWh5V/9nbKKJ7jRr2qTYW5Q6zoE6HZ6uzOBJr2KRERv5/x8xzEBQ1MthDT7iP1EBp9luSQy7g==, + integrity: sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -2420,18 +2424,34 @@ packages: postcss: 8.4.35 dev: true - /@csstools/postcss-is-pseudo-class@4.0.4(postcss@8.4.35): + /@csstools/postcss-is-pseudo-class@4.0.5(postcss@8.4.35): resolution: { - integrity: sha512-vTVO/uZixpTVAOQt3qZRUFJ/K1L03OfNkeJ8sFNDVNdVy/zW0h1L5WT7HIPMDUkvSrxQkFaCCybTZkUP7UESlQ==, + integrity: sha512-qG3MI7IN3KY9UwdaE9E7G7sFydscVW7nAj5OGwaBP9tQPEEVdxXTGI+l1ZW5EUpZFSj+u3q/22fH5+8HI72+Bg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) + "@csstools/selector-specificity": 3.0.2(postcss-selector-parser@6.0.15) + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/postcss-light-dark-function@1.0.0(postcss@8.4.35): + resolution: + { + integrity: sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-tokenizer": 2.2.3 + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - postcss-selector-parser: 6.0.14 dev: true /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.35): @@ -2483,59 +2503,61 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-logical-viewport-units@2.0.4(postcss@8.4.35): + /@csstools/postcss-logical-viewport-units@2.0.6(postcss@8.4.35): resolution: { - integrity: sha512-jetp/ArGAniWbjWBh5UQ07ztawfSbqCFd0QelX4R4pVIxrXahUEhz5VZHebMPVCg02J8GsQn0br6fdRpY6t7lw==, + integrity: sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: "@csstools/css-tokenizer": 2.2.3 + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-media-minmax@1.1.1(postcss@8.4.35): + /@csstools/postcss-media-minmax@1.1.3(postcss@8.4.35): resolution: { - integrity: sha512-mBY46/Hr+A8cDjoX0OoPRBOVrkANym9540dSB9rN3dllPZdM1E112i/tVxWsrR1s1yE9gfF0pk+7lf9l+qSeHA==, + integrity: sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/media-query-list-parser": 2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/media-query-list-parser": 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.4(postcss@8.4.35): + /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.6(postcss@8.4.35): resolution: { - integrity: sha512-IaIZZhH0Qy9UDn7u+N3cuwwPG0Po3ZKOdDh+ClR7xvisSqniG+PuVrOEWYJrFKOt2//UHLhd7KHDqr2u9LKS9Q==, + integrity: sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/media-query-list-parser": 2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/media-query-list-parser": 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 dev: true - /@csstools/postcss-nested-calc@3.0.1(postcss@8.4.35): + /@csstools/postcss-nested-calc@3.0.2(postcss@8.4.35): resolution: { - integrity: sha512-bwwababZpWRm0ByHaWBxTsDGTMhZKmtUNl3Wt0Eom8AY7ORgXx5qF9SSk1vEFrCi+HOfJT6M6W5KPgzXuQNRwQ==, + integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -2553,26 +2575,27 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-oklab-function@3.0.8(postcss@8.4.35): + /@csstools/postcss-oklab-function@3.0.10(postcss@8.4.35): resolution: { - integrity: sha512-L4xrwbgg+k08v+a88LDxJeIM6+kqaBJlYb/QgmEMfQpUbrfXTp87DuRc7utcRdDvY+qWK5vqz3h1xUtceB5LJQ==, + integrity: sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /@csstools/postcss-progressive-custom-properties@3.0.3(postcss@8.4.35): + /@csstools/postcss-progressive-custom-properties@3.1.0(postcss@8.4.35): resolution: { - integrity: sha512-WipTVh6JTMQfeIrzDV4wEPsV9NTzMK2jwXxyH6CGBktuWdivHnkioP/smp1x/0QDPQyx7NTS14RB+GV3zZZYEw==, + integrity: sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: @@ -2582,19 +2605,20 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-relative-color-syntax@2.0.8(postcss@8.4.35): + /@csstools/postcss-relative-color-syntax@2.0.10(postcss@8.4.35): resolution: { - integrity: sha512-wu/Oh7QKINpRXnmLMUbObVNlqwr843PSF4a3x3fMC0I+vUeoGqMfZuSPFtT+NnYYxfzUjEZ091GURPxee22VLQ==, + integrity: sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true @@ -2608,20 +2632,20 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true - /@csstools/postcss-stepped-value-functions@3.0.3(postcss@8.4.35): + /@csstools/postcss-stepped-value-functions@3.0.5(postcss@8.4.35): resolution: { - integrity: sha512-hzo9Wr3u7JJiM65/EyHgE/gJpBzhDwBSGOobFs2YQ0ZNTywUliYQoYJud1KKlByMRuhqvDLh9V95eIkLf/fZTQ==, + integrity: sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 dev: true @@ -2640,17 +2664,17 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/postcss-trigonometric-functions@3.0.3(postcss@8.4.35): + /@csstools/postcss-trigonometric-functions@3.0.5(postcss@8.4.35): resolution: { - integrity: sha512-T/npTbDuMZ3vktEMuA05p1oeVd12Sy47qZP1vFhzNMUOdXGCK9vlm0tUSIlV5DdlbTJqKqq9FhGitZH9VTKrfQ==, + integrity: sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-calc": 1.1.5(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 dev: true @@ -2667,18 +2691,6 @@ packages: postcss: 8.4.35 dev: true - /@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.14): - resolution: - { - integrity: sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss-selector-parser: ^6.0.13 - dependencies: - postcss-selector-parser: 6.0.14 - dev: true - /@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.15): resolution: { @@ -2691,6 +2703,30 @@ packages: postcss-selector-parser: 6.0.15 dev: true + /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15): + resolution: + { + integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss-selector-parser: ^6.0.13 + dependencies: + postcss-selector-parser: 6.0.15 + dev: true + + /@csstools/utilities@1.0.0(postcss@8.4.35): + resolution: + { + integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + dependencies: + postcss: 8.4.35 + dev: true + /@esbuild/aix-ppc64@0.19.10: resolution: { @@ -2967,7 +3003,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -2976,7 +3012,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.56.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 dev: true @@ -3008,10 +3044,10 @@ packages: - supports-color dev: true - /@eslint/js@8.56.0: + /@eslint/js@8.57.0: resolution: { - integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, + integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true @@ -3125,14 +3161,14 @@ packages: } dev: false - /@humanwhocodes/config-array@0.11.13: + /@humanwhocodes/config-array@0.11.14: resolution: { - integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, + integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, } engines: { node: ">=10.10.0" } dependencies: - "@humanwhocodes/object-schema": 2.0.1 + "@humanwhocodes/object-schema": 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -3147,10 +3183,10 @@ packages: engines: { node: ">=12.22" } dev: true - /@humanwhocodes/object-schema@2.0.1: + /@humanwhocodes/object-schema@2.0.2: resolution: { - integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, + integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, } dev: true @@ -3818,10 +3854,10 @@ packages: - supports-color dev: true - /@semantic-release/gitlab@13.0.2(semantic-release@23.0.2): + /@semantic-release/gitlab@13.0.3(semantic-release@23.0.2): resolution: { - integrity: sha512-od5lvSUysZxIHgUC1Wnq85tiPPv7xiOEVsZHSaYdtF+OwJ13S97BL+0DTElSwzJkgzNdrbwjcr399b62XNrvXg==, + integrity: sha512-tup9XW+c3TAQ01l7snBroEXVBaSmXydmLVTmsSeCZ+AN+D60AuA4aSqAF8YdMLQLiYLXrGNZkq+vdBxR/rQm6A==, } engines: { node: ">=20.8.1" } peerDependencies: @@ -3866,7 +3902,7 @@ packages: read-pkg: 9.0.1 registry-auth-token: 5.0.2 semantic-release: 23.0.2(typescript@5.3.3) - semver: 7.5.4 + semver: 7.6.0 tempy: 3.1.0 dev: true @@ -3996,6 +4032,15 @@ packages: engines: { node: ">=10.13.0" } dev: true + /@types/conventional-commits-parser@5.0.0: + resolution: + { + integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==, + } + dependencies: + "@types/node": 20.10.5 + dev: true + /@types/estree@0.0.39: resolution: { @@ -4040,24 +4085,6 @@ packages: "@types/geojson": 7946.0.13 dev: true - /@types/minimist@1.2.5: - resolution: - { - integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==, - } - dev: true - - /@types/node@18.19.3: - resolution: - { - integrity: sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==, - } - requiresBuild: true - dependencies: - undici-types: 5.26.5 - dev: true - optional: true - /@types/node@20.10.5: resolution: { @@ -4103,108 +4130,108 @@ packages: integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, } - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3): resolution: { - integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==, + integrity: sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^7.0.0 + eslint: ^8.56.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.21.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/type-utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/parser": 7.1.0(eslint@8.57.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 7.1.0 + "@typescript-eslint/type-utils": 7.1.0(eslint@8.57.0)(typescript@5.3.3) + "@typescript-eslint/utils": 7.1.0(eslint@8.57.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 7.1.0 debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.0 natural-compare: 1.4.0 - semver: 7.5.4 + semver: 7.6.0 ts-api-utils: 1.0.3(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3): resolution: { - integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==, + integrity: sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/scope-manager": 7.1.0 + "@typescript-eslint/types": 7.1.0 + "@typescript-eslint/typescript-estree": 7.1.0(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 7.1.0 debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.21.0: + /@typescript-eslint/scope-manager@7.1.0: resolution: { - integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==, + integrity: sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/types": 7.1.0 + "@typescript-eslint/visitor-keys": 7.1.0 dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): resolution: { - integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==, + integrity: sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) - "@typescript-eslint/utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/typescript-estree": 7.1.0(typescript@5.3.3) + "@typescript-eslint/utils": 7.1.0(eslint@8.57.0)(typescript@5.3.3) debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 ts-api-utils: 1.0.3(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.21.0: + /@typescript-eslint/types@7.1.0: resolution: { - integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==, + integrity: sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: true - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@7.1.0(typescript@5.3.3): resolution: { - integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==, + integrity: sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -4213,49 +4240,49 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/types": 7.1.0 + "@typescript-eslint/visitor-keys": 7.1.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.5.4 + semver: 7.6.0 ts-api-utils: 1.0.3(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): resolution: { - integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==, + integrity: sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) "@types/json-schema": 7.0.15 "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) - eslint: 8.56.0 - semver: 7.5.4 + "@typescript-eslint/scope-manager": 7.1.0 + "@typescript-eslint/types": 7.1.0 + "@typescript-eslint/typescript-estree": 7.1.0(typescript@5.3.3) + eslint: 8.57.0 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.21.0: + /@typescript-eslint/visitor-keys@7.1.0: resolution: { - integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==, + integrity: sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/types": 7.1.0 eslint-visitor-keys: 3.4.3 dev: true @@ -4581,14 +4608,6 @@ packages: is-shared-array-buffer: 1.0.2 dev: true - /arrify@1.0.1: - resolution: - { - integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, - } - engines: { node: ">=0.10.0" } - dev: true - /ast-transform@0.0.0: resolution: { @@ -4631,18 +4650,18 @@ packages: engines: { node: ">= 4.0.0" } dev: true - /autoprefixer@10.4.16(postcss@8.4.35): + /autoprefixer@10.4.17(postcss@8.4.35): resolution: { - integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==, + integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==, } engines: { node: ^10 || ^12 || >=14 } hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.22.2 - caniuse-lite: 1.0.30001572 + browserslist: 4.23.0 + caniuse-lite: 1.0.30001591 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -4855,6 +4874,20 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: true + /browserslist@4.23.0: + resolution: + { + integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001591 + electron-to-chromium: 1.4.689 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + /buffer-equal@0.0.1: resolution: { @@ -4945,18 +4978,6 @@ packages: engines: { node: ">= 6" } dev: true - /camelcase-keys@6.2.2: - resolution: - { - integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, - } - engines: { node: ">=8" } - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - /camelcase@5.3.1: resolution: { @@ -4984,6 +5005,13 @@ packages: } dev: true + /caniuse-lite@1.0.30001591: + resolution: + { + integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==, + } + dev: true + /chalk@2.4.2: resolution: { @@ -5207,13 +5235,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.0) + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.24.1)(@lezer/common@1.2.0) "@codemirror/commands": 6.3.3 "@codemirror/language": 6.10.1 "@codemirror/lint": 6.4.2 "@codemirror/search": 6.5.5 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.24.1 transitivePeerDependencies: - "@lezer/common" dev: false @@ -5295,7 +5323,7 @@ packages: } engines: { node: ">= 10" } - /commitizen@4.3.0(typescript@5.3.3): + /commitizen@4.3.0(@types/node@20.10.5)(typescript@5.3.3): resolution: { integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==, @@ -5304,7 +5332,7 @@ packages: hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(typescript@5.3.3) + cz-conventional-changelog: 3.3.0(@types/node@20.10.5)(typescript@5.3.3) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -5318,6 +5346,7 @@ packages: strip-bom: 4.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: + - "@types/node" - typescript dev: true @@ -5401,7 +5430,7 @@ packages: handlebars: 4.7.8 json-stringify-safe: 5.0.1 meow: 12.1.1 - semver: 7.5.4 + semver: 7.6.0 split2: 4.2.0 dev: true @@ -5471,25 +5500,6 @@ packages: integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, } - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.3.3): - resolution: - { - integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==, - } - engines: { node: ">=v16" } - requiresBuild: true - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=8.2" - typescript: ">=4" - dependencies: - "@types/node": 18.19.3 - cosmiconfig: 8.3.6(typescript@5.3.3) - jiti: 1.21.0 - typescript: 5.3.3 - dev: true - optional: true - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.5)(cosmiconfig@8.3.6)(typescript@5.3.3): resolution: { @@ -5611,7 +5621,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /css-declaration-sorter@7.1.1(postcss@8.4.35): @@ -5634,18 +5644,18 @@ packages: engines: { node: ">=12 || >=16" } dev: true - /css-has-pseudo@6.0.1(postcss@8.4.35): + /css-has-pseudo@6.0.2(postcss@8.4.35): resolution: { - integrity: sha512-WwoVKqNxApfEI7dWFyaHoeFCcUPD+lPyjL6lNpRUNX7IyIUuVpawOTwwA5D0ZR6V2xQZonNPVj8kEcxzEaAQfQ==, + integrity: sha512-Z2Qm5yyOvJRTy6THdUlnGIX6PW/1wOc4FHWlfkcBkfkpZ3oz6lPdG+h+J7t1HZHT4uSSVR8XatXiMpqMUADXow==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) + "@csstools/selector-specificity": 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 dev: true @@ -5704,10 +5714,10 @@ packages: engines: { node: ">= 6" } dev: true - /cssdb@7.10.0: + /cssdb@7.11.1: resolution: { - integrity: sha512-yGZ5tmA57gWh/uvdQBHs45wwFY0IBh3ypABk5sEubPBPSzXzkNgsWReqx7gdx6uhC+QoFBe+V8JwBB9/hQ6cIA==, + integrity: sha512-F0nEoX/Rv8ENTHsjMPGHd9opdjGfXkgRBafSUGnQKPzGZFB7Lm0BbT10x21TMOCrKLbVsJ0NoCDMk6AfKqw8/A==, } dev: true @@ -5796,7 +5806,7 @@ packages: css-tree: 2.2.1 dev: true - /cz-conventional-changelog@3.3.0(typescript@5.3.3): + /cz-conventional-changelog@3.3.0(@types/node@20.10.5)(typescript@5.3.3): resolution: { integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, @@ -5804,14 +5814,15 @@ packages: engines: { node: ">= 10" } dependencies: chalk: 2.4.2 - commitizen: 4.3.0(typescript@5.3.3) + commitizen: 4.3.0(@types/node@20.10.5)(typescript@5.3.3) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - "@commitlint/load": 18.4.3(typescript@5.3.3) + "@commitlint/load": 18.6.1(@types/node@20.10.5)(typescript@5.3.3) transitivePeerDependencies: + - "@types/node" - typescript dev: true @@ -5945,12 +5956,12 @@ packages: type: 1.2.0 dev: false - /dargs@7.0.0: + /dargs@8.1.0: resolution: { - integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, + integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==, } - engines: { node: ">=8" } + engines: { node: ">=12" } dev: true /dash-ast@2.0.1: @@ -5975,17 +5986,6 @@ packages: ms: 2.1.2 dev: true - /decamelize-keys@1.1.1: - resolution: - { - integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, - } - engines: { node: ">=0.10.0" } - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: resolution: { @@ -6232,6 +6232,13 @@ packages: } dev: true + /electron-to-chromium@1.4.689: + resolution: + { + integrity: sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ==, + } + dev: true + /emoji-regex@10.3.0: resolution: { @@ -6528,7 +6535,7 @@ packages: source-map: 0.1.43 dev: false - /eslint-config-prettier@9.1.0(eslint@8.56.0): + /eslint-config-prettier@9.1.0(eslint@8.57.0): resolution: { integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, @@ -6537,10 +6544,10 @@ packages: peerDependencies: eslint: ">=7.0.0" dependencies: - eslint: 8.56.0 + eslint: 8.57.0 dev: true - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5): + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): resolution: { integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==, @@ -6557,8 +6564,8 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.56.0 - eslint-config-prettier: 9.1.0(eslint@8.56.0) + eslint: 8.57.0 + eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.2.5 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 @@ -6583,19 +6590,19 @@ packages: engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dev: true - /eslint@8.56.0: + /eslint@8.57.0: resolution: { - integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, + integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) "@eslint-community/regexpp": 4.10.0 "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.56.0 - "@humanwhocodes/config-array": 0.11.13 + "@eslint/js": 8.57.0 + "@humanwhocodes/config-array": 0.11.14 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 "@ungap/structured-clone": 1.2.0 @@ -7004,6 +7011,18 @@ packages: path-exists: 4.0.0 dev: true + /find-up@7.0.0: + resolution: + { + integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==, + } + engines: { node: ">=18" } + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + dev: true + /find-versions@5.1.0: resolution: { @@ -7299,19 +7318,17 @@ packages: traverse: 0.6.8 dev: true - /git-raw-commits@2.0.11: + /git-raw-commits@4.0.0: resolution: { - integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, + integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==, } - engines: { node: ">=10" } + engines: { node: ">=16" } hasBin: true dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 dev: true /glob-parent@5.1.2: @@ -7363,15 +7380,27 @@ packages: path-is-absolute: 1.0.1 dev: true + /global-directory@4.0.1: + resolution: + { + integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==, + } + engines: { node: ">=18" } + dependencies: + ini: 4.1.1 + dev: true + /global-dirs@0.1.1: resolution: { integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, } engines: { node: ">=4" } + requiresBuild: true dependencies: ini: 1.3.8 dev: true + optional: true /global-modules@1.0.0: resolution: @@ -7551,14 +7580,6 @@ packages: uglify-js: 3.17.4 dev: true - /hard-rejection@2.1.0: - resolution: - { - integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, - } - engines: { node: ">=6" } - dev: true - /has-bigints@1.0.2: resolution: { @@ -7655,23 +7676,6 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /hosted-git-info@2.8.9: - resolution: - { - integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, - } - dev: true - - /hosted-git-info@4.1.0: - resolution: - { - integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, - } - engines: { node: ">=10" } - dependencies: - lru-cache: 6.0.0 - dev: true - /hosted-git-info@7.0.1: resolution: { @@ -7895,6 +7899,14 @@ packages: } dev: true + /ini@4.1.1: + resolution: + { + integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + dev: true + /inquirer@7.3.3: resolution: { @@ -8175,14 +8187,6 @@ packages: engines: { node: ">=8" } dev: true - /is-plain-obj@1.1.0: - resolution: - { - integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, - } - engines: { node: ">=0.10.0" } - dev: true - /is-plain-object@5.0.0: resolution: { @@ -8747,6 +8751,16 @@ packages: p-locate: 5.0.0 dev: true + /locate-path@7.2.0: + resolution: + { + integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + p-locate: 6.0.0 + dev: true + /lodash-es@4.17.21: resolution: { @@ -8789,13 +8803,6 @@ packages: } dev: true - /lodash.isfunction@3.0.9: - resolution: - { - integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==, - } - dev: true - /lodash.isplainobject@4.0.6: resolution: { @@ -8988,22 +8995,6 @@ packages: sourcemap-codec: 1.4.8 dev: true - /map-obj@1.0.1: - resolution: - { - integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, - } - engines: { node: ">=0.10.0" } - dev: true - - /map-obj@4.3.0: - resolution: - { - integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, - } - engines: { node: ">=8" } - dev: true - /marked-terminal@7.0.0(marked@12.0.0): resolution: { @@ -9022,15 +9013,6 @@ packages: supports-hyperlinks: 3.0.0 dev: true - /marked@11.2.0: - resolution: - { - integrity: sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==, - } - engines: { node: ">= 18" } - hasBin: true - dev: false - /marked@12.0.0: resolution: { @@ -9038,7 +9020,6 @@ packages: } engines: { node: ">= 18" } hasBin: true - dev: true /mathml-tag-names@2.1.3: resolution: @@ -9077,26 +9058,6 @@ packages: engines: { node: ">=18" } dev: true - /meow@8.1.2: - resolution: - { - integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, - } - engines: { node: ">=10" } - dependencies: - "@types/minimist": 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - /merge-source-map@1.0.4: resolution: { @@ -9180,14 +9141,6 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /min-indent@1.0.1: - resolution: - { - integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, - } - engines: { node: ">=4" } - dev: true - /mini-svg-data-uri@1.4.4: resolution: { @@ -9225,18 +9178,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimist-options@4.1.0: - resolution: - { - integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, - } - engines: { node: ">= 6" } - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - /minimist@1.2.7: resolution: { @@ -9361,31 +9302,6 @@ packages: } dev: true - /normalize-package-data@2.5.0: - resolution: - { - integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, - } - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data@3.0.3: - resolution: - { - integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, - } - engines: { node: ">=10" } - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.13.1 - semver: 7.5.4 - validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@6.0.0: resolution: { @@ -9395,7 +9311,7 @@ packages: dependencies: hosted-git-info: 7.0.1 is-core-module: 2.13.1 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: true @@ -9735,6 +9651,16 @@ packages: yocto-queue: 0.1.0 dev: true + /p-limit@4.0.0: + resolution: + { + integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@2.0.0: resolution: { @@ -9765,6 +9691,16 @@ packages: p-limit: 3.1.0 dev: true + /p-locate@6.0.0: + resolution: + { + integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + p-limit: 4.0.0 + dev: true + /p-map@7.0.1: resolution: { @@ -9925,6 +9861,14 @@ packages: engines: { node: ">=8" } dev: true + /path-exists@5.0.0: + resolution: + { + integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + /path-is-absolute@1.0.1: resolution: { @@ -10093,17 +10037,17 @@ packages: tinyqueue: 2.0.3 dev: false - /postcss-attribute-case-insensitive@6.0.2(postcss@8.4.35): + /postcss-attribute-case-insensitive@6.0.3(postcss@8.4.35): resolution: { - integrity: sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==, + integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /postcss-calc@9.0.1(postcss@8.4.35): @@ -10133,44 +10077,47 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-color-functional-notation@6.0.3(postcss@8.4.35): + /postcss-color-functional-notation@6.0.5(postcss@8.4.35): resolution: { - integrity: sha512-2jBr3H0sk3qGh/3BkmLsOKcYyVfSlM1K2QQYVU7eW5mkg7ZOQ4aU/Rtbh7vJ9FxAfgf8iHRwXBsQkHqUxzTkXw==, + integrity: sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true - /postcss-color-hex-alpha@9.0.3(postcss@8.4.35): + /postcss-color-hex-alpha@9.0.4(postcss@8.4.35): resolution: { - integrity: sha512-7sEHU4tAS6htlxun8AB9LDrCXoljxaC34tFVRlYKcvO+18r5fvGiXgv5bQzN40+4gXLCyWSMRK5FK31244WcCA==, + integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-color-rebeccapurple@9.0.2(postcss@8.4.35): + /postcss-color-rebeccapurple@9.0.3(postcss@8.4.35): resolution: { - integrity: sha512-f+RDEAPW2m8UbJWkSpRfV+QxhSaQhDMihI75DVGJJh4oRIoegjheeRtINFJum9D8BqGJcvD4GLjggTvCwZ4zuA==, + integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -10205,52 +10152,53 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media@10.0.2(postcss@8.4.35): + /postcss-custom-media@10.0.3(postcss@8.4.35): resolution: { - integrity: sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==, + integrity: sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/cascade-layer-name-parser": 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/media-query-list-parser": 2.1.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/media-query-list-parser": 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 dev: true - /postcss-custom-properties@13.3.3(postcss@8.4.35): + /postcss-custom-properties@13.3.5(postcss@8.4.35): resolution: { - integrity: sha512-xLmILb2R83aG4X++iVFg8TWadOlc45xiyFHRZD6Yhhu2igrTHXL6C75AEWqx6k9lxrr9sK5rcfUI9JvTCxBTvA==, + integrity: sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/cascade-layer-name-parser": 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-selectors@7.1.6(postcss@8.4.35): + /postcss-custom-selectors@7.1.7(postcss@8.4.35): resolution: { - integrity: sha512-svsjWRaxqL3vAzv71dV0/65P24/FB8TbPX+lWyyf9SZ7aZm4S4NhCn7N3Bg+Z5sZunG3FS8xQ80LrCU9hb37cw==, + integrity: sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/cascade-layer-name-parser": 1.0.6(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/cascade-layer-name-parser": 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /postcss-dir-pseudo-class@8.0.1(postcss@8.4.35): @@ -10263,7 +10211,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /postcss-discard-comments@6.0.1(postcss@8.4.35): @@ -10314,16 +10262,17 @@ packages: postcss: 8.4.35 dev: true - /postcss-double-position-gradients@5.0.3(postcss@8.4.35): + /postcss-double-position-gradients@5.0.4(postcss@8.4.35): resolution: { - integrity: sha512-QKYpwmaSm6HcdS0ndAuWSNNMv78R1oSySoh3mYBmctHWr2KWcwPJVakdOyU4lvFVW0GRu9wfIQwGeM4p3xU9ow==, + integrity: sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -10338,7 +10287,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /postcss-focus-within@8.0.1(postcss@8.4.35): @@ -10351,7 +10300,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /postcss-font-variant@5.0.0(postcss@8.4.35): @@ -10377,15 +10326,16 @@ packages: postcss: 8.4.35 dev: true - /postcss-image-set-function@6.0.2(postcss@8.4.35): + /postcss-image-set-function@6.0.3(postcss@8.4.35): resolution: { - integrity: sha512-/O1xwqpJiz/apxGQi7UUfv1xUcorvkHZfvCYHPpRxxZj2WvjD0rg0+/+c+u5/Do5CpUg3XvfYxMrhcnjW1ArDQ==, + integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 dev: true @@ -10433,19 +10383,20 @@ packages: postcss: 8.4.35 dev: true - /postcss-lab-function@6.0.8(postcss@8.4.35): + /postcss-lab-function@6.0.10(postcss@8.4.35): resolution: { - integrity: sha512-agYs7R9Z5gnX837fCkH8TEQIHdhyDsMPPnpuuENt/dxoDVAykBaqbdxIN4DagOj+ZQo20iRNNJeY3MsFcdI6Sg==, + integrity: sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/css-color-parser": 1.5.0(@csstools/css-parser-algorithms@2.4.0)(@csstools/css-tokenizer@2.2.3) - "@csstools/css-parser-algorithms": 2.4.0(@csstools/css-tokenizer@2.2.3) + "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) + "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 dev: true @@ -10594,18 +10545,18 @@ packages: postcss-selector-parser: 6.0.14 dev: true - /postcss-nesting@12.0.2(postcss@8.4.35): + /postcss-nesting@12.0.4(postcss@8.4.35): resolution: { - integrity: sha512-63PpJHSeNs93S3ZUIyi+7kKx4JqOIEJ6QYtG3x+0qA4J03+4n0iwsyA1GAHyWxsHYljQS4/4ZK1o2sMi70b5wQ==, + integrity: sha512-WuCe0KnP4vKjLZK8VNoUWKL8ZLOv/5jiM94mHcI3VszLropHwmjotdUyP/ObzqZpXuQKP2Jf9R12vIHKFSStKw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/selector-specificity": 3.0.1(postcss-selector-parser@6.0.14) + "@csstools/selector-specificity": 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /postcss-normalize-charset@6.0.1(postcss@8.4.35): @@ -10788,76 +10739,76 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-preset-env@9.3.0(postcss@8.4.35): + /postcss-preset-env@9.4.0(postcss@8.4.35): resolution: { - integrity: sha512-ycw6doPrqV6QxDCtgiyGDef61bEfiSc59HGM4gOw/wxQxmKnhuEery61oOC/5ViENz/ycpRsuhTexs1kUBTvVw==, + integrity: sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: - "@csstools/postcss-cascade-layers": 4.0.2(postcss@8.4.35) - "@csstools/postcss-color-function": 3.0.8(postcss@8.4.35) - "@csstools/postcss-color-mix-function": 2.0.8(postcss@8.4.35) - "@csstools/postcss-exponential-functions": 1.0.2(postcss@8.4.35) - "@csstools/postcss-font-format-keywords": 3.0.1(postcss@8.4.35) - "@csstools/postcss-gamut-mapping": 1.0.1(postcss@8.4.35) - "@csstools/postcss-gradients-interpolation-method": 4.0.8(postcss@8.4.35) - "@csstools/postcss-hwb-function": 3.0.7(postcss@8.4.35) - "@csstools/postcss-ic-unit": 3.0.3(postcss@8.4.35) + "@csstools/postcss-cascade-layers": 4.0.3(postcss@8.4.35) + "@csstools/postcss-color-function": 3.0.10(postcss@8.4.35) + "@csstools/postcss-color-mix-function": 2.0.10(postcss@8.4.35) + "@csstools/postcss-exponential-functions": 1.0.4(postcss@8.4.35) + "@csstools/postcss-font-format-keywords": 3.0.2(postcss@8.4.35) + "@csstools/postcss-gamut-mapping": 1.0.3(postcss@8.4.35) + "@csstools/postcss-gradients-interpolation-method": 4.0.11(postcss@8.4.35) + "@csstools/postcss-hwb-function": 3.0.9(postcss@8.4.35) + "@csstools/postcss-ic-unit": 3.0.4(postcss@8.4.35) "@csstools/postcss-initial": 1.0.1(postcss@8.4.35) - "@csstools/postcss-is-pseudo-class": 4.0.4(postcss@8.4.35) + "@csstools/postcss-is-pseudo-class": 4.0.5(postcss@8.4.35) + "@csstools/postcss-light-dark-function": 1.0.0(postcss@8.4.35) "@csstools/postcss-logical-float-and-clear": 2.0.1(postcss@8.4.35) "@csstools/postcss-logical-overflow": 1.0.1(postcss@8.4.35) "@csstools/postcss-logical-overscroll-behavior": 1.0.1(postcss@8.4.35) "@csstools/postcss-logical-resize": 2.0.1(postcss@8.4.35) - "@csstools/postcss-logical-viewport-units": 2.0.4(postcss@8.4.35) - "@csstools/postcss-media-minmax": 1.1.1(postcss@8.4.35) - "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.4(postcss@8.4.35) - "@csstools/postcss-nested-calc": 3.0.1(postcss@8.4.35) + "@csstools/postcss-logical-viewport-units": 2.0.6(postcss@8.4.35) + "@csstools/postcss-media-minmax": 1.1.3(postcss@8.4.35) + "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.6(postcss@8.4.35) + "@csstools/postcss-nested-calc": 3.0.2(postcss@8.4.35) "@csstools/postcss-normalize-display-values": 3.0.2(postcss@8.4.35) - "@csstools/postcss-oklab-function": 3.0.8(postcss@8.4.35) - "@csstools/postcss-progressive-custom-properties": 3.0.3(postcss@8.4.35) - "@csstools/postcss-relative-color-syntax": 2.0.8(postcss@8.4.35) + "@csstools/postcss-oklab-function": 3.0.10(postcss@8.4.35) + "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) + "@csstools/postcss-relative-color-syntax": 2.0.10(postcss@8.4.35) "@csstools/postcss-scope-pseudo-class": 3.0.1(postcss@8.4.35) - "@csstools/postcss-stepped-value-functions": 3.0.3(postcss@8.4.35) + "@csstools/postcss-stepped-value-functions": 3.0.5(postcss@8.4.35) "@csstools/postcss-text-decoration-shorthand": 3.0.4(postcss@8.4.35) - "@csstools/postcss-trigonometric-functions": 3.0.3(postcss@8.4.35) + "@csstools/postcss-trigonometric-functions": 3.0.5(postcss@8.4.35) "@csstools/postcss-unset-value": 3.0.1(postcss@8.4.35) - autoprefixer: 10.4.16(postcss@8.4.35) - browserslist: 4.22.2 + autoprefixer: 10.4.17(postcss@8.4.35) + browserslist: 4.23.0 css-blank-pseudo: 6.0.1(postcss@8.4.35) - css-has-pseudo: 6.0.1(postcss@8.4.35) + css-has-pseudo: 6.0.2(postcss@8.4.35) css-prefers-color-scheme: 9.0.1(postcss@8.4.35) - cssdb: 7.10.0 + cssdb: 7.11.1 postcss: 8.4.35 - postcss-attribute-case-insensitive: 6.0.2(postcss@8.4.35) + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.35) postcss-clamp: 4.1.0(postcss@8.4.35) - postcss-color-functional-notation: 6.0.3(postcss@8.4.35) - postcss-color-hex-alpha: 9.0.3(postcss@8.4.35) - postcss-color-rebeccapurple: 9.0.2(postcss@8.4.35) - postcss-custom-media: 10.0.2(postcss@8.4.35) - postcss-custom-properties: 13.3.3(postcss@8.4.35) - postcss-custom-selectors: 7.1.6(postcss@8.4.35) + postcss-color-functional-notation: 6.0.5(postcss@8.4.35) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.35) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.35) + postcss-custom-media: 10.0.3(postcss@8.4.35) + postcss-custom-properties: 13.3.5(postcss@8.4.35) + postcss-custom-selectors: 7.1.7(postcss@8.4.35) postcss-dir-pseudo-class: 8.0.1(postcss@8.4.35) - postcss-double-position-gradients: 5.0.3(postcss@8.4.35) + postcss-double-position-gradients: 5.0.4(postcss@8.4.35) postcss-focus-visible: 9.0.1(postcss@8.4.35) postcss-focus-within: 8.0.1(postcss@8.4.35) postcss-font-variant: 5.0.0(postcss@8.4.35) postcss-gap-properties: 5.0.1(postcss@8.4.35) - postcss-image-set-function: 6.0.2(postcss@8.4.35) - postcss-lab-function: 6.0.8(postcss@8.4.35) + postcss-image-set-function: 6.0.3(postcss@8.4.35) + postcss-lab-function: 6.0.10(postcss@8.4.35) postcss-logical: 7.0.1(postcss@8.4.35) - postcss-nesting: 12.0.2(postcss@8.4.35) + postcss-nesting: 12.0.4(postcss@8.4.35) postcss-opacity-percentage: 2.0.0(postcss@8.4.35) postcss-overflow-shorthand: 5.0.1(postcss@8.4.35) postcss-page-break: 3.0.4(postcss@8.4.35) postcss-place: 9.0.1(postcss@8.4.35) postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.35) postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.35) - postcss-selector-not: 7.0.1(postcss@8.4.35) - postcss-value-parser: 4.2.0 + postcss-selector-not: 7.0.2(postcss@8.4.35) dev: true /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.35): @@ -10870,7 +10821,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /postcss-reduce-initial@6.0.2(postcss@8.4.35): @@ -10944,17 +10895,17 @@ packages: postcss: 8.4.35 dev: true - /postcss-selector-not@7.0.1(postcss@8.4.35): + /postcss-selector-not@7.0.2(postcss@8.4.35): resolution: { - integrity: sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==, + integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==, } engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss: ^8.4 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.14 + postcss-selector-parser: 6.0.15 dev: true /postcss-selector-parser@6.0.10: @@ -11151,14 +11102,6 @@ packages: } dev: true - /quick-lru@4.0.1: - resolution: - { - integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, - } - engines: { node: ">=8" } - dev: true - /quick-lru@5.1.1: resolution: { @@ -11232,31 +11175,6 @@ packages: type-fest: 4.9.0 dev: true - /read-pkg-up@7.0.1: - resolution: - { - integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, - } - engines: { node: ">=8" } - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@5.2.0: - resolution: - { - integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, - } - engines: { node: ">=8" } - dependencies: - "@types/normalize-package-data": 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - /read-pkg@9.0.1: resolution: { @@ -11307,17 +11225,6 @@ packages: picomatch: 2.3.1 dev: true - /redent@3.0.0: - resolution: - { - integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, - } - engines: { node: ">=8" } - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - /redux@4.2.1: resolution: { @@ -11475,9 +11382,11 @@ packages: integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, } engines: { node: ">=8" } + requiresBuild: true dependencies: global-dirs: 0.1.1 dev: true + optional: true /resolve@1.1.7: resolution: @@ -11774,7 +11683,7 @@ packages: } engines: { node: ">=12" } dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /semver-regex@4.0.5: @@ -11785,14 +11694,6 @@ packages: engines: { node: ">=12" } dev: true - /semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } - hasBin: true - dev: true - /semver@6.3.1: resolution: { @@ -12096,15 +11997,6 @@ packages: through2: 2.0.5 dev: true - /split2@3.2.2: - resolution: - { - integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, - } - dependencies: - readable-stream: 3.6.2 - dev: true - /split2@4.2.0: resolution: { @@ -12353,16 +12245,6 @@ packages: engines: { node: ">=12" } dev: true - /strip-indent@3.0.0: - resolution: - { - integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, - } - engines: { node: ">=8" } - dependencies: - min-indent: 1.0.1 - dev: true - /strip-json-comments@2.0.1: resolution: { @@ -12720,15 +12602,6 @@ packages: readable-stream: 2.3.8 xtend: 4.0.2 - /through2@4.0.2: - resolution: - { - integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, - } - dependencies: - readable-stream: 3.6.2 - dev: true - /through@2.3.8: resolution: { @@ -12801,14 +12674,6 @@ packages: engines: { node: ">= 0.4" } dev: true - /trim-newlines@3.0.1: - resolution: - { - integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, - } - engines: { node: ">=8" } - dev: true - /ts-api-utils@1.0.3(typescript@5.3.3): resolution: { @@ -12869,14 +12734,6 @@ packages: engines: { node: ">=10" } dev: true - /type-fest@0.18.1: - resolution: - { - integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, - } - engines: { node: ">=10" } - dev: true - /type-fest@0.20.2: resolution: { @@ -12893,22 +12750,6 @@ packages: engines: { node: ">=10" } dev: true - /type-fest@0.6.0: - resolution: - { - integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, - } - engines: { node: ">=8" } - dev: true - - /type-fest@0.8.1: - resolution: - { - integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, - } - engines: { node: ">=8" } - dev: true - /type-fest@1.4.0: resolution: { @@ -13180,6 +13021,20 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: + { + integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: { @@ -13220,31 +13075,35 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-plugin-pwa@0.17.5(vite@5.1.3)(workbox-build@7.0.0)(workbox-window@7.0.0): + /vite-plugin-pwa@0.19.2(vite@5.1.4)(workbox-build@7.0.0)(workbox-window@7.0.0): resolution: { - integrity: sha512-UxRNPiJBzh4tqU/vc8G2TxmrUTzT6BqvSzhszLk62uKsf+npXdvLxGDz9C675f4BJi6MbD2tPnJhi5txlMzxbQ==, + integrity: sha512-LSQJFPxCAQYbRuSyc9EbRLRqLpaBA9onIZuQFomfUYjWSgHuQLonahetDlPSC9zsxmkSEhQH8dXZN8yL978h3w==, } engines: { node: ">=16.0.0" } peerDependencies: + "@vite-pwa/assets-generator": ^0.2.4 vite: ^3.1.0 || ^4.0.0 || ^5.0.0 workbox-build: ^7.0.0 workbox-window: ^7.0.0 + peerDependenciesMeta: + "@vite-pwa/assets-generator": + optional: true dependencies: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.1.3(@types/node@20.10.5) + vite: 5.1.4(@types/node@20.10.5) workbox-build: 7.0.0 workbox-window: 7.0.0 transitivePeerDependencies: - supports-color dev: true - /vite@5.1.3(@types/node@20.10.5): + /vite@5.1.4(@types/node@20.10.5): resolution: { - integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==, + integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==, } engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true @@ -13824,3 +13683,11 @@ packages: } engines: { node: ">=10" } dev: true + + /yocto-queue@1.0.0: + resolution: + { + integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, + } + engines: { node: ">=12.20" } + dev: true diff --git a/tests/README.md b/tests/README.md index c9ab19cb..d4224da6 100644 --- a/tests/README.md +++ b/tests/README.md @@ -7,14 +7,14 @@ test your application. Those details can be found in the documentation. ## Resources -- [CodeIgniter 4 User Guide on Testing](https://codeigniter4.github.io/userguide/testing/index.html) +- [CodeIgniter 4 User Guide on Testing](https://codeigniter.com/user_guide/testing/index.html) - [PHPUnit docs](https://phpunit.de/documentation.html) - [Any tutorials on Unit testing in CI4?](https://forum.codeigniter.com/showthread.php?tid=81830) ## Requirements It is recommended to use the latest version of PHPUnit. At the time of this -writing we are running version 9.x. Support for this has been built into the +writing, we are running version 9.x. Support for this has been built into the **composer.json** file that ships with CodeIgniter and can easily be installed via [Composer](https://getcomposer.org/) if you don't already have it installed globally. @@ -38,9 +38,9 @@ add `xdebug.mode=coverage` in the **php.ini** file to enable code coverage. A number of the tests use a running database. In order to set up the database edit the details for the `tests` group in **app/Config/Database.php** or -**phpunit.xml**. Make sure that you provide a database engine that is currently -running on your machine. More details on a test database setup are in the -[Testing Your Database](https://codeigniter4.github.io/userguide/testing/database.html) +**.env**. Make sure that you provide a database engine that is currently running +on your machine. More details on a test database setup are in the +[Testing Your Database](https://codeigniter.com/user_guide/testing/database.html) section of the documentation. ## Running the tests @@ -96,14 +96,12 @@ to exclude database tests, or automatically generate HTML code coverage reports. ## Test Cases Every test needs a _test case_, or class that your tests extend. CodeIgniter 4 -provides a few that you may use directly: +provides one class that you may use directly: -- `CodeIgniter\Test\CIUnitTestCase` - for basic tests with no other service - needs -- `CodeIgniter\Test\DatabaseTestTrait` - for tests that need database access +- `CodeIgniter\Test\CIUnitTestCase` -Most of the time you will want to write your own test cases to hold functions -and services common to your test suites. +Most of the time you will want to write your own test cases that extend +`CIUnitTestCase` to hold functions and services common to your test suites. ## Creating Tests @@ -118,13 +116,9 @@ how. Review the links above and always pay attention to your code coverage. ### Database Tests -Tests can include migrating, seeding, and testing against a mock or -live1 database. Be sure to modify the test case (or create your own) -to point to your seed and migrations and include any additional steps to be run -before tests in the `setUp()` method. - -1 Note: If you are using database tests that require a live database -connection you will need to rename **phpunit.xml.dist** to **phpunit.xml**, -uncomment the database configuration lines and add your connection details. -Prevent **phpunit.xml** from being tracked in your repo by adding it to -**.gitignore**. +Tests can include migrating, seeding, and testing against a mock or live +database. Be sure to modify the test case (or create your own) to point to your +seed and migrations and include any additional steps to be run before tests in +the `setUp()` method. See +[Testing Your Database](https://codeigniter.com/user_guide/testing/database.html) +for details. From cdeb8bf26e7a34fc2225149e198199ed9a8a6bd4 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 6 Mar 2024 12:41:50 +0000 Subject: [PATCH 313/477] build(devcontainer): add migration and DevSeed command to run post devcontainer creation update dev setup docs + build and deploy docs everytime --- .devcontainer/devcontainer.json | 2 +- .gitlab-ci.yml | 3 - app/Database/Seeds/DevSeeder.php | 26 ++ app/Database/Seeds/DevSuperadminSeeder.php | 48 ++ .../Seeds/FakeSinglePodcastApiSeeder.php | 2 +- app/Database/Seeds/TestSeeder.php | 49 -- docs/src/ar/contributing/_category_.json | 4 - docs/src/ar/contributing/guidelines.md | 154 ------- docs/src/ar/contributing/setup-development.md | 423 ----------------- docs/src/ar/index.md | 2 +- docs/src/br/contributing/_category_.json | 4 - docs/src/br/contributing/guidelines.md | 154 ------- docs/src/br/contributing/setup-development.md | 423 ----------------- docs/src/br/index.md | 2 +- docs/src/contributing/setup-development.md | 61 +-- docs/src/da/index.md | 2 +- docs/src/de/contributing/_category_.json | 4 - docs/src/de/contributing/guidelines.md | 154 ------- docs/src/de/contributing/setup-development.md | 423 ----------------- docs/src/de/index.md | 2 +- docs/src/el/contributing/_category_.json | 4 - docs/src/el/contributing/guidelines.md | 154 ------- docs/src/el/contributing/setup-development.md | 423 ----------------- docs/src/el/index.md | 2 +- docs/src/es/contributing/_category_.json | 4 - docs/src/es/contributing/guidelines.md | 154 ------- docs/src/es/contributing/setup-development.md | 423 ----------------- docs/src/es/index.md | 2 +- docs/src/fa/index.md | 2 +- docs/src/fr/contributing/_category_.json | 4 - docs/src/fr/contributing/guidelines.md | 154 ------- docs/src/fr/contributing/setup-development.md | 423 ----------------- docs/src/fr/index.md | 2 +- docs/src/fr2/index.md | 2 +- docs/src/fr_CA/index.md | 2 +- docs/src/gd/index.md | 2 +- docs/src/gl/index.md | 2 +- docs/src/id/contributing/_category_.json | 4 - docs/src/id/contributing/guidelines.md | 154 ------- docs/src/id/contributing/setup-development.md | 423 ----------------- docs/src/id/index.md | 2 +- docs/src/it/contributing/_category_.json | 4 - docs/src/it/contributing/guidelines.md | 154 ------- docs/src/it/contributing/setup-development.md | 423 ----------------- docs/src/it/index.md | 2 +- docs/src/ja/index.md | 2 +- docs/src/kk/index.md | 2 +- docs/src/ko/index.md | 2 +- docs/src/nl/contributing/_category_.json | 4 - docs/src/nl/contributing/guidelines.md | 154 ------- docs/src/nl/contributing/setup-development.md | 423 ----------------- docs/src/nl/index.md | 2 +- docs/src/nn-NO/contributing/_category_.json | 4 - docs/src/nn-NO/contributing/guidelines.md | 154 ------- .../nn-NO/contributing/setup-development.md | 423 ----------------- docs/src/nn-NO/index.md | 2 +- docs/src/oc/contributing/_category_.json | 4 - docs/src/oc/contributing/guidelines.md | 154 ------- docs/src/oc/contributing/setup-development.md | 423 ----------------- docs/src/oc/index.md | 2 +- docs/src/pl/contributing/_category_.json | 4 - docs/src/pl/contributing/guidelines.md | 154 ------- docs/src/pl/contributing/setup-development.md | 423 ----------------- docs/src/pl/index.md | 2 +- docs/src/pt-BR/contributing/_category_.json | 4 - docs/src/pt-BR/contributing/guidelines.md | 154 ------- .../pt-BR/contributing/setup-development.md | 423 ----------------- docs/src/pt-BR/index.md | 2 +- docs/src/pt/contributing/_category_.json | 4 - docs/src/pt/contributing/guidelines.md | 154 ------- docs/src/pt/contributing/setup-development.md | 423 ----------------- docs/src/pt/index.md | 2 +- docs/src/ro/index.md | 2 +- docs/src/ru/contributing/_category_.json | 4 - docs/src/ru/contributing/guidelines.md | 154 ------- docs/src/ru/contributing/setup-development.md | 423 ----------------- docs/src/ru/index.md | 2 +- docs/src/sv/contributing/_category_.json | 4 - docs/src/sv/contributing/guidelines.md | 154 ------- docs/src/sv/contributing/setup-development.md | 424 ------------------ docs/src/uk/index.md | 2 +- 81 files changed, 126 insertions(+), 9414 deletions(-) create mode 100644 app/Database/Seeds/DevSeeder.php create mode 100644 app/Database/Seeds/DevSuperadminSeeder.php delete mode 100644 app/Database/Seeds/TestSeeder.php delete mode 100644 docs/src/ar/contributing/_category_.json delete mode 100644 docs/src/ar/contributing/guidelines.md delete mode 100644 docs/src/ar/contributing/setup-development.md delete mode 100644 docs/src/br/contributing/_category_.json delete mode 100644 docs/src/br/contributing/guidelines.md delete mode 100644 docs/src/br/contributing/setup-development.md delete mode 100644 docs/src/de/contributing/_category_.json delete mode 100644 docs/src/de/contributing/guidelines.md delete mode 100644 docs/src/de/contributing/setup-development.md delete mode 100644 docs/src/el/contributing/_category_.json delete mode 100644 docs/src/el/contributing/guidelines.md delete mode 100644 docs/src/el/contributing/setup-development.md delete mode 100644 docs/src/es/contributing/_category_.json delete mode 100644 docs/src/es/contributing/guidelines.md delete mode 100644 docs/src/es/contributing/setup-development.md delete mode 100644 docs/src/fr/contributing/_category_.json delete mode 100644 docs/src/fr/contributing/guidelines.md delete mode 100644 docs/src/fr/contributing/setup-development.md delete mode 100644 docs/src/id/contributing/_category_.json delete mode 100644 docs/src/id/contributing/guidelines.md delete mode 100644 docs/src/id/contributing/setup-development.md delete mode 100644 docs/src/it/contributing/_category_.json delete mode 100644 docs/src/it/contributing/guidelines.md delete mode 100644 docs/src/it/contributing/setup-development.md delete mode 100644 docs/src/nl/contributing/_category_.json delete mode 100644 docs/src/nl/contributing/guidelines.md delete mode 100644 docs/src/nl/contributing/setup-development.md delete mode 100644 docs/src/nn-NO/contributing/_category_.json delete mode 100644 docs/src/nn-NO/contributing/guidelines.md delete mode 100644 docs/src/nn-NO/contributing/setup-development.md delete mode 100644 docs/src/oc/contributing/_category_.json delete mode 100644 docs/src/oc/contributing/guidelines.md delete mode 100644 docs/src/oc/contributing/setup-development.md delete mode 100644 docs/src/pl/contributing/_category_.json delete mode 100644 docs/src/pl/contributing/guidelines.md delete mode 100644 docs/src/pl/contributing/setup-development.md delete mode 100644 docs/src/pt-BR/contributing/_category_.json delete mode 100644 docs/src/pt-BR/contributing/guidelines.md delete mode 100644 docs/src/pt-BR/contributing/setup-development.md delete mode 100644 docs/src/pt/contributing/_category_.json delete mode 100644 docs/src/pt/contributing/guidelines.md delete mode 100644 docs/src/pt/contributing/setup-development.md delete mode 100644 docs/src/ru/contributing/_category_.json delete mode 100644 docs/src/ru/contributing/guidelines.md delete mode 100644 docs/src/ru/contributing/setup-development.md delete mode 100644 docs/src/sv/contributing/_category_.json delete mode 100644 docs/src/sv/contributing/guidelines.md delete mode 100644 docs/src/sv/contributing/setup-development.md diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0d4c4d97..a48dc081 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,7 +5,7 @@ "dockerComposeFile": ["../docker-compose.yml", "./docker-compose.yml"], "service": "app", "workspaceFolder": "/castopod", - "postCreateCommand": "composer install && pnpm install && pnpm run build:static", + "postCreateCommand": "composer install && pnpm install && pnpm run build:static && php spark migrate --all && php spark db:seed DevSeeder", "postStartCommand": "crontab ./crontab && cron && php spark serve --host 0.0.0.0", "postAttachCommand": "crontab ./crontab && service cron reload", "shutdownAction": "stopCompose", diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c53056af..ee3acd7e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -162,9 +162,6 @@ documentation: trigger: include: docs/.gitlab-ci.yml strategy: depend - only: - changes: - - docs/**/* docker: stage: build diff --git a/app/Database/Seeds/DevSeeder.php b/app/Database/Seeds/DevSeeder.php new file mode 100644 index 00000000..68feba40 --- /dev/null +++ b/app/Database/Seeds/DevSeeder.php @@ -0,0 +1,26 @@ +call('CategorySeeder'); + $this->call('LanguageSeeder'); + $this->call('PlatformSeeder'); + $this->call('DevSuperadminSeeder'); + } +} diff --git a/app/Database/Seeds/DevSuperadminSeeder.php b/app/Database/Seeds/DevSuperadminSeeder.php new file mode 100644 index 00000000..c852d9d1 --- /dev/null +++ b/app/Database/Seeds/DevSuperadminSeeder.php @@ -0,0 +1,48 @@ +where('is_owner', true)->first() instanceof User) { + return; + } + + /** + * Inserts an owner with the following credentials: admin: `admin@example.com` password: `castopod` + */ + + // Get the User Provider (UserModel by default) + $users = auth() + ->getProvider(); + + $user = new User([ + 'username' => 'admin', + 'email' => 'admin@castopod.local', + 'password' => 'castopod', + 'is_owner' => true, + ]); + $users->save($user); + + // To get the complete user object with ID, we need to get from the database + $user = $users->findById($users->getInsertID()); + + $user->addGroup(setting('AuthGroups.mostPowerfulGroup')); + } +} diff --git a/app/Database/Seeds/FakeSinglePodcastApiSeeder.php b/app/Database/Seeds/FakeSinglePodcastApiSeeder.php index 7c31e606..e07bf66b 100644 --- a/app/Database/Seeds/FakeSinglePodcastApiSeeder.php +++ b/app/Database/Seeds/FakeSinglePodcastApiSeeder.php @@ -189,7 +189,7 @@ class FakeSinglePodcastApiSeeder extends Seeder public function run(): void { $this->call(AppSeeder::class); - $this->call(TestSeeder::class); + $this->call(DevSeeder::class); $this->db->table('media') ->insert(self::cover()); $this->db->table('media') diff --git a/app/Database/Seeds/TestSeeder.php b/app/Database/Seeds/TestSeeder.php deleted file mode 100644 index 7bd2b2a4..00000000 --- a/app/Database/Seeds/TestSeeder.php +++ /dev/null @@ -1,49 +0,0 @@ -db->table('users') - ->insert([ - 'id' => 1, - 'username' => 'admin', - 'is_owner' => 1, - ]); - - $this->db->table('auth_identities') - ->insert([ - 'id' => 1, - 'user_id' => 1, - 'type' => 'email_password', - 'secret' => 'admin@example.com', - 'secret2' => '$2y$10$TXJEHX/djW8jtzgpDVf7dOOCGo5rv1uqtAYWdwwwkttQcDkAeB2.6', - ]); - - $this->db - ->table('auth_groups_users') - ->insert([ - 'user_id' => 1, - 'group' => setting('AuthGroups.mostPowerfulGroup'), - ]); - } -} diff --git a/docs/src/ar/contributing/_category_.json b/docs/src/ar/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/ar/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/ar/contributing/guidelines.md b/docs/src/ar/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/ar/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/ar/contributing/setup-development.md b/docs/src/ar/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/ar/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/ar/index.md b/docs/src/ar/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/ar/index.md +++ b/docs/src/ar/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/br/contributing/_category_.json b/docs/src/br/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/br/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/br/contributing/guidelines.md b/docs/src/br/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/br/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/br/contributing/setup-development.md b/docs/src/br/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/br/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/br/index.md b/docs/src/br/index.md index d47a43ff..96100dbf 100644 --- a/docs/src/br/index.md +++ b/docs/src/br/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/contributing/setup-development.md b/docs/src/contributing/setup-development.md index 82e4a8fd..b996bac7 100644 --- a/docs/src/contributing/setup-development.md +++ b/docs/src/contributing/setup-development.md @@ -34,7 +34,7 @@ to help you kickstart your contribution. ```ini CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server + # If set to development, you must run `pnpm run dev` to start the static assets server vite.environment="development" # By default, this is set to true in the app config. @@ -106,7 +106,7 @@ required services will be loaded automagically! 🪄 ```bash # run Vite dev server - npm run dev + pnpm run dev ``` If there is any issue with the php server not running, you can restart them @@ -129,8 +129,8 @@ required services will be loaded automagically! 🪄 # Composer is installed composer -V - # npm is installed - npm -v + # pnpm is installed + pnpm -v # git is installed git version @@ -148,7 +148,12 @@ more insights. To see your changes, go to: -- `http://localhost:8080/` for the Castopod app +- `http://localhost:8080/` for the Castopod website +- `http://localhost:8080/cp-admin` for the Castopod admin: + + - email: **admin@castopod.local** + - password: **castopod** + - `http://localhost:8888/` for the phpmyadmin interface: - username: **castopod** @@ -197,8 +202,8 @@ You do not wish to use the VSCode devcontainer? No problem! # use Composer docker-compose run --rm app composer -V - # use npm - docker-compose run --rm app npm -v + # use pnpm + docker-compose run --rm app pnpm -v # use git docker-compose run --rm app git version @@ -226,18 +231,18 @@ You do not wish to use the VSCode devcontainer? No problem! ::: -2. Install javascript dependencies with [npm](https://www.npmjs.com/) +2. Install javascript dependencies with [pnpm](https://pnpm.io/) ```bash - npm install + pnpm install ``` ::: info Note - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). + The javascript dependencies aren't included in the repository. Pnpm will + check the `package.json` and `pnpm-lock.yaml` files to download the packages + with the right versions. The dependencies will live under the `node_module` + folder. For more info, check out the [PNPM documentation](https://pnpm.io/). ::: @@ -245,11 +250,11 @@ You do not wish to use the VSCode devcontainer? No problem! ```bash # build all static assets at once - npm run build:static + pnpm run build:static # build specific assets - npm run build:icons - npm run build:svg + pnpm run build:icons + pnpm run build:svg ``` ::: info Note @@ -286,7 +291,7 @@ You may skip this section if you go through the install wizard (go to ```bash # Populates all required data - php spark db:seed AppSeeder + php spark db:seed DevSeeder ``` You may choose to add data separately: @@ -301,18 +306,12 @@ You may skip this section if you go through the install wizard (go to # Populates all podcasts platforms php spark db:seed PlatformSeeder - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder + # Adds a superadmin with [admin@castopod.local / castopod] credentials + php spark db:seed PlatformSeeder ``` 3. (optionnal) Populate the database with test data: - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - Populate with fake podcast analytics: ```bash @@ -325,11 +324,6 @@ You may skip this section if you go through the install wizard (go to php spark db:seed FakeWebsiteAnalyticsSeeder ``` - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - ### Useful docker / docker-compose commands - Monitor the app container: @@ -386,13 +380,6 @@ more insights. ## Known issues -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - ### (Linux) Files created inside container are attributed to root locally You may use Linux user namespaces to fix this on your machine: diff --git a/docs/src/da/index.md b/docs/src/da/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/da/index.md +++ b/docs/src/da/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/de/contributing/_category_.json b/docs/src/de/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/de/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/de/contributing/guidelines.md b/docs/src/de/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/de/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/de/contributing/setup-development.md b/docs/src/de/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/de/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/de/index.md b/docs/src/de/index.md index b8f6140f..92062c7a 100644 --- a/docs/src/de/index.md +++ b/docs/src/de/index.md @@ -160,7 +160,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/el/contributing/_category_.json b/docs/src/el/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/el/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/el/contributing/guidelines.md b/docs/src/el/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/el/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/el/contributing/setup-development.md b/docs/src/el/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/el/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/el/index.md b/docs/src/el/index.md index c71137b8..bc25620f 100644 --- a/docs/src/el/index.md +++ b/docs/src/el/index.md @@ -160,7 +160,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/es/contributing/_category_.json b/docs/src/es/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/es/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/es/contributing/guidelines.md b/docs/src/es/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/es/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/es/contributing/setup-development.md b/docs/src/es/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/es/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/es/index.md b/docs/src/es/index.md index cf1c8e40..d948f885 100644 --- a/docs/src/es/index.md +++ b/docs/src/es/index.md @@ -167,7 +167,7 @@ so that you can understand what actions will and will not be tolerated. ### Guía para colaborar -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/fa/index.md b/docs/src/fa/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/fa/index.md +++ b/docs/src/fa/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/fr/contributing/_category_.json b/docs/src/fr/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/fr/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/fr/contributing/guidelines.md b/docs/src/fr/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/fr/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/fr/contributing/setup-development.md b/docs/src/fr/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/fr/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md index 5a8d9bdf..c84a8387 100644 --- a/docs/src/fr/index.md +++ b/docs/src/fr/index.md @@ -163,7 +163,7 @@ so that you can understand what actions will and will not be tolerated. ### Guide de contribution -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/fr2/index.md b/docs/src/fr2/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/fr2/index.md +++ b/docs/src/fr2/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/fr_CA/index.md b/docs/src/fr_CA/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/fr_CA/index.md +++ b/docs/src/fr_CA/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/gd/index.md +++ b/docs/src/gd/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/gl/index.md b/docs/src/gl/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/gl/index.md +++ b/docs/src/gl/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/id/contributing/_category_.json b/docs/src/id/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/id/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/id/contributing/guidelines.md b/docs/src/id/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/id/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/id/contributing/setup-development.md b/docs/src/id/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/id/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/id/index.md b/docs/src/id/index.md index 58415ff2..70dbeb5e 100644 --- a/docs/src/id/index.md +++ b/docs/src/id/index.md @@ -160,7 +160,7 @@ so that you can understand what actions will and will not be tolerated. ### Panduan berkontribusi -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/it/contributing/_category_.json b/docs/src/it/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/it/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/it/contributing/guidelines.md b/docs/src/it/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/it/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/it/contributing/setup-development.md b/docs/src/it/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/it/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/it/index.md b/docs/src/it/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/it/index.md +++ b/docs/src/it/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/ja/index.md b/docs/src/ja/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/ja/index.md +++ b/docs/src/ja/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/kk/index.md b/docs/src/kk/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/kk/index.md +++ b/docs/src/kk/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/ko/index.md b/docs/src/ko/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/ko/index.md +++ b/docs/src/ko/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/nl/contributing/_category_.json b/docs/src/nl/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/nl/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/nl/contributing/guidelines.md b/docs/src/nl/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/nl/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/nl/contributing/setup-development.md b/docs/src/nl/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/nl/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/nl/index.md b/docs/src/nl/index.md index 12ac44f3..ee8c0132 100644 --- a/docs/src/nl/index.md +++ b/docs/src/nl/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/nn-NO/contributing/_category_.json b/docs/src/nn-NO/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/nn-NO/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/nn-NO/contributing/guidelines.md b/docs/src/nn-NO/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/nn-NO/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/nn-NO/contributing/setup-development.md b/docs/src/nn-NO/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/nn-NO/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md index dab9b77e..df53e5d1 100644 --- a/docs/src/nn-NO/index.md +++ b/docs/src/nn-NO/index.md @@ -164,7 +164,7 @@ så du veit kva slags åtferd me godtek og ikkje. ### Korleis bidra -Les gjerne [korleis du bidreg](./contributing/guidelines.md) for å læra korleis +Les gjerne [korleis du bidreg](../contributing/guidelines.md) for å læra korleis me utviklar Castopod, korleis me føreslær rettingar og forbetringar, og korleis me byggjer og prøver ut endringar i programmet. diff --git a/docs/src/oc/contributing/_category_.json b/docs/src/oc/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/oc/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/oc/contributing/guidelines.md b/docs/src/oc/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/oc/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/oc/contributing/setup-development.md b/docs/src/oc/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/oc/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/oc/index.md b/docs/src/oc/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/oc/index.md +++ b/docs/src/oc/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/pl/contributing/_category_.json b/docs/src/pl/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/pl/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/pl/contributing/guidelines.md b/docs/src/pl/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/pl/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/pl/contributing/setup-development.md b/docs/src/pl/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/pl/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/pl/index.md b/docs/src/pl/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/pl/index.md +++ b/docs/src/pl/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/pt-BR/contributing/_category_.json b/docs/src/pt-BR/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/pt-BR/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/pt-BR/contributing/guidelines.md b/docs/src/pt-BR/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/pt-BR/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/pt-BR/contributing/setup-development.md b/docs/src/pt-BR/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/pt-BR/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/pt-BR/index.md b/docs/src/pt-BR/index.md index 84bbb788..38593f36 100644 --- a/docs/src/pt-BR/index.md +++ b/docs/src/pt-BR/index.md @@ -160,7 +160,7 @@ so that you can understand what actions will and will not be tolerated. ### Guia de contribuição -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/pt/contributing/_category_.json b/docs/src/pt/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/pt/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/pt/contributing/guidelines.md b/docs/src/pt/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/pt/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/pt/contributing/setup-development.md b/docs/src/pt/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/pt/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/pt/index.md b/docs/src/pt/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/pt/index.md +++ b/docs/src/pt/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/ro/index.md b/docs/src/ro/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/ro/index.md +++ b/docs/src/ro/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/ru/contributing/_category_.json b/docs/src/ru/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/ru/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/ru/contributing/guidelines.md b/docs/src/ru/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/ru/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/ru/contributing/setup-development.md b/docs/src/ru/contributing/setup-development.md deleted file mode 100644 index 7e42892a..00000000 --- a/docs/src/ru/contributing/setup-development.md +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `npm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - npm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # npm is installed - npm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use npm - docker-compose run --rm app npm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [npm](https://www.npmjs.com/) - - ```bash - npm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. Npm will check - the `package.json` and `package.lock` files to download the packages with the - right versions. The dependencies will live under the `node_module` folder. - For more info, check out the [NPM documentation](https://docs.npmjs.com/). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - npm run build:static - - # build specific assets - npm run build:icons - npm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `npm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `npm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/ru/index.md b/docs/src/ru/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/ru/index.md +++ b/docs/src/ru/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. diff --git a/docs/src/sv/contributing/_category_.json b/docs/src/sv/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/sv/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/sv/contributing/guidelines.md b/docs/src/sv/contributing/guidelines.md deleted file mode 100644 index 1a53c89e..00000000 --- a/docs/src/sv/contributing/guidelines.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -::: info Note - -**Any** contribution made on a repository other than -[the original repository](https://code.castopod.org/adaures/castopod) will not -be accepted. - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/sv/contributing/setup-development.md b/docs/src/sv/contributing/setup-development.md deleted file mode 100644 index b8f87717..00000000 --- a/docs/src/sv/contributing/setup-development.md +++ /dev/null @@ -1,424 +0,0 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - -# Setup your development environment - -## Introduction - -Castopod is a web app based on the `php` framework -[CodeIgniter 4](https://codeigniter.com). - -We use [Docker](https://www.docker.com/) quickly setup a dev environment. A -`docker-compose.yml` and `Dockerfile` are included in the project's root folder -to help you kickstart your contribution. - -> You don't need any prior knowledge of Docker to follow the next steps. -> However, if you wish to use your own environment, feel free to do so! - -## Setup instructions - -### 1. Pre-requisites - -0. Install [docker](https://docs.docker.com/get-docker). - -1. Clone Castopod project by running: - - ```bash - git clone https://code.castopod.org/adaures/castopod.git - ``` - -2. Create a `.env` file with the minimum required config to connect the app to - the database and use redis as a cache handler: - - ```ini - CI_ENVIRONMENT="development" - # If set to development, you must run `pnpm run dev` to start the static assets server - vite.environment="development" - - # By default, this is set to true in the app config. - # For development, this must be set to false as it is - # on a local environment - app.forceGlobalSecureRequests=false - - app.baseURL="http://localhost:8080/" - media.baseURL="http://localhost:8080/" - - admin.gateway="cp-admin" - auth.gateway="cp-auth" - - database.default.hostname="mariadb" - database.default.database="castopod" - database.default.username="castopod" - database.default.password="castopod" - - cache.handler="redis" - cache.redis.host = "redis" - - # You may not want to use redis as your cache handler - # Comment/remove the two lines above and uncomment - # the next line for file caching. - #cache.handler="file" - ``` - - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the - > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) - > for more info. - -3. (for docker desktop) Add the repository you've cloned to docker desktop's - `Settings` > `Resources` > `File Sharing` - -### 2. (recommended) Develop inside the app Container with VSCode - -If you're working in VSCode, you can take advantage of the `.devcontainer/` -folder. It defines a development environment (dev container) with preinstalled -requirements and VSCode extensions so you don't have to worry about them. All -required services will be loaded automagically! 🪄 - -1. Install the VSCode extension - [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -2. `Ctrl/Cmd + Shift + P` > `Open in container` - - > The VSCode window will reload inside the dev container. Expect several - > minutes during first load as it is building all necessary services. - - **Note**: The dev container will start by running Castopod's php server. - During development, you will have to start [Vite](https://vitejs.dev)'s dev - server for compiling the typescript code and styles: - - ```bash - # run Vite dev server - pnpm run dev - ``` - - If there is any issue with the php server not running, you can restart them - using the following commands: - - ```bash - # run Castopod server - php spark serve - 0.0.0.0 - ``` - -3. You're all set! 🎉 - - You're now **inside the dev container**, you may use the VSCode console - (`Terminal` > `New Terminal`) to run any command: - - ```bash - # PHP is installed - php -v - - # Composer is installed - composer -V - - # pnpm is installed - pnpm -v - - # git is installed - git version - ``` - -For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) - -### 3. Start hacking - -You're all set! Start working your magic by updating the project's files! Help -yourself to the -[CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) for -more insights. - -To see your changes, go to: - -- `http://localhost:8080/` for the Castopod app -- `http://localhost:8888/` for the phpmyadmin interface: - - - username: **castopod** - - password: **castopod** - -### 2-alt. Develop outside the app container - -You do not wish to use the VSCode devcontainer? No problem! - -1. Start docker containers manually: - - Go to project's root folder and run: - - ```bash - # starts all services declared in docker-compose.yml file - # -d option starts the containers in the background - docker-compose up -d - - # See all running processes (you should see 3 processes running) - docker-compose ps - - # Alternatively, you can check all docker processes - docker ps -a - - ``` - - > The `docker-compose up -d` command will boot 4 containers in the - > background: - > - > - `castopod_app`: a php based container with Castopod requirements - > installed - > - `castopod_redis`: a [redis](https://redis.io/) database to handle queries - > and pages caching - > - `castopod_mariadb`: a [mariadb](https://mariadb.org/) server for - > persistent data - > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb - > database. - -2. Run any command inside the containers by prefixing them with - `docker-compose run --rm app`: - - ```bash - # use PHP - docker-compose run --rm app php -v - - # use Composer - docker-compose run --rm app composer -V - - # use pnpm - docker-compose run --rm app pnpm -v - - # use git - docker-compose run --rm app git version - ``` - ---- - -## Going Further - -### Install Castopod's dependencies - -1. Install php dependencies with [Composer](https://getcomposer.org/) - - ```bash - composer install - ``` - - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: - -2. Install javascript dependencies with [pnpm](https://pnpm.io/) - - ```bash - pnpm install - ``` - - ::: info Note - - The javascript dependencies aren't included in the repository. pnPM will - check the `package.json` and `pnpm-lock.yaml` files to download the packages - with the right versions. The dependencies will live under the `node_module` - folder. For more info, check out the - [pnPM documentation](https://pnpm.io/motivation). - - ::: - -3. Generate static assets: - - ```bash - # build all static assets at once - pnpm run build:static - - # build specific assets - pnpm run build:icons - pnpm run build:svg - ``` - - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: - -### Initialize and populate database - -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: - -1. Build the database with the migrate command: - - ```bash - # loads the database schema during first migration - php spark migrate -all - ``` - - You may need to undo the migration (rollback): - - ```bash - # rolls back database schema (deletes all tables and their content) - php spark migrate:rollback - ``` - -2. Populate the database with the required data: - - ```bash - # Populates all required data - php spark db:seed AppSeeder - ``` - - You may choose to add data separately: - - ```bash - # Populates all categories - php spark db:seed CategorySeeder - - # Populates all Languages - php spark db:seed LanguageSeeder - - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - - # Populates all Authentication data (roles definition…) - php spark db:seed AuthSeeder - ``` - -3. (optionnal) Populate the database with test data: - - - Populate test data (login: admin / password: AGUehL3P) - - ```bash - php spark db:seed TestSeeder - ``` - - - Populate with fake podcast analytics: - - ```bash - php spark db:seed FakePodcastsAnalyticsSeeder - ``` - - - Populate with fake website analytics: - - ```bash - php spark db:seed FakeWebsiteAnalyticsSeeder - ``` - - TestSeeder will add an active superadmin user with the following credentials: - - - username: **admin** - - password: **AGUehL3P** - -### Useful docker / docker-compose commands - -- Monitor the app container: - -```bash -docker-compose logs --tail 50 --follow --timestamps app -``` - -- Interact with redis server using included redis-cli command: - -```bash -docker exec -it castopod_redis redis-cli -``` - -- Monitor the redis container: - -```bash -docker-compose logs --tail 50 --follow --timestamps redis -``` - -- Monitor the mariadb container: - -```bash -docker-compose logs --tail 50 --follow --timestamps mariadb -``` - -- Monitor the phpmyadmin container: - -```bash -docker-compose logs --tail 50 --follow --timestamps phpmyadmin -``` - -- Restart docker containers: - -```bash -docker-compose restart -``` - -- Destroy all containers, opposite of `up` command: - -```bash -docker-compose down -``` - -- Rebuild app container: - -```bash -docker-compose build app -``` - -Check [docker](https://docs.docker.com/engine/reference/commandline/docker/) and -[docker-compose](https://docs.docker.com/compose/reference/) documentations for -more insights. - -## Known issues - -### Allocation failed - JavaScript heap out of memory - -This happens when running `pnpm install`. - -👉 By default, docker might not have access to enough RAM. Allocate more memory -and run `pnpm install` again. - -### (Linux) Files created inside container are attributed to root locally - -You may use Linux user namespaces to fix this on your machine: - -::: info Note - -Replace "username" with your local username - -::: - -1. Go to `/etc/docker/daemon.json` and add: - - ```json - { - "userns-remap": "username" - } - ``` - -2. Configure the subordinate uid/guid: - - ```bash - # in /etc/subuid - username:1000:1 - username:100000:65536 - ``` - - ```bash - # in /etc/subgid - username:1000:1 - username:100000:65536 - ``` - -3. Restart docker: - - ```bash - sudo systemctl restart docker - ``` - -4. That's it! Now, the root user in the container will be mapped to the user on - your local machine, no more permission issues! 🎉 - -You can check -[this great article](https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/) -to know more about how it works. diff --git a/docs/src/uk/index.md b/docs/src/uk/index.md index b63ff645..7f012c6c 100644 --- a/docs/src/uk/index.md +++ b/docs/src/uk/index.md @@ -159,7 +159,7 @@ so that you can understand what actions will and will not be tolerated. ### Contributing guide -Read our [contributing guide](./contributing/guidelines.md) to learn about our +Read our [contributing guide](../contributing/guidelines.md) to learn about our development process, how to propose bugfixes and improvements, and how to build and test your changes to Castopod. From 656627050a4b992c7862c23dd87db66f9d198086 Mon Sep 17 00:00:00 2001 From: crowdin Date: Fri, 8 Mar 2024 13:05:48 +0000 Subject: [PATCH 314/477] chore(i18n): new Crowdin updates --- app/Language/br/Comment.php | 14 +-- app/Language/br/Episode.php | 13 +-- app/Language/br/Podcast.php | 109 ++++-------------- app/Language/nl/Episode.php | 4 +- app/Language/nn-NO/Episode.php | 4 +- app/Language/nn-NO/Podcast.php | 2 +- docs/src/br/getting-started/docker.md | 11 +- docs/src/br/getting-started/install.md | 4 +- docs/src/br/index.md | 2 +- docs/src/nn-NO/getting-started/install.md | 10 +- docs/src/nn-NO/index.md | 4 +- modules/Admin/Language/ar/Validation.php | 1 + modules/Admin/Language/br/Breadcrumb.php | 2 +- modules/Admin/Language/br/Countries.php | 8 +- modules/Admin/Language/br/Navigation.php | 2 +- modules/Admin/Language/br/Podcast.php | 17 +-- .../Admin/Language/br/PodcastNavigation.php | 2 +- modules/Admin/Language/br/Settings.php | 30 ++--- modules/Admin/Language/br/Validation.php | 1 + modules/Admin/Language/ca/Validation.php | 1 + modules/Admin/Language/da/Validation.php | 1 + modules/Admin/Language/de/Validation.php | 1 + modules/Admin/Language/el/Validation.php | 1 + modules/Admin/Language/es/Validation.php | 1 + modules/Admin/Language/fa/Validation.php | 1 + modules/Admin/Language/fr/Validation.php | 1 + modules/Admin/Language/fr2/Validation.php | 1 + modules/Admin/Language/fr_CA/Validation.php | 1 + modules/Admin/Language/gd/Validation.php | 1 + modules/Admin/Language/gl/Validation.php | 1 + modules/Admin/Language/id/Validation.php | 1 + modules/Admin/Language/it/Validation.php | 1 + modules/Admin/Language/ja/Validation.php | 1 + modules/Admin/Language/kk/Validation.php | 1 + modules/Admin/Language/ko/Validation.php | 1 + modules/Admin/Language/nl/Breadcrumb.php | 2 +- modules/Admin/Language/nl/Dashboard.php | 4 +- modules/Admin/Language/nl/Fediverse.php | 2 +- modules/Admin/Language/nl/Navigation.php | 2 +- modules/Admin/Language/nl/Notifications.php | 2 +- modules/Admin/Language/nl/Person.php | 6 +- modules/Admin/Language/nl/Podcast.php | 2 +- .../Admin/Language/nl/PodcastNavigation.php | 12 +- modules/Admin/Language/nl/Validation.php | 1 + modules/Admin/Language/nn-NO/Breadcrumb.php | 4 +- modules/Admin/Language/nn-NO/Common.php | 2 +- modules/Admin/Language/nn-NO/Episode.php | 4 +- modules/Admin/Language/nn-NO/Navigation.php | 1 + modules/Admin/Language/nn-NO/Platforms.php | 20 ++-- modules/Admin/Language/nn-NO/Podcast.php | 26 ++--- .../Language/nn-NO/PodcastNavigation.php | 14 +-- modules/Admin/Language/nn-NO/Validation.php | 1 + modules/Admin/Language/oc/Validation.php | 1 + modules/Admin/Language/pl/Validation.php | 1 + modules/Admin/Language/pt-BR/Validation.php | 1 + modules/Admin/Language/pt/Validation.php | 1 + modules/Admin/Language/ro/Validation.php | 1 + modules/Admin/Language/ru/Validation.php | 1 + modules/Admin/Language/sk/Validation.php | 1 + modules/Admin/Language/sr_Latn/Validation.php | 1 + modules/Admin/Language/sv/Validation.php | 1 + modules/Admin/Language/uk/Validation.php | 1 + modules/Admin/Language/zh-Hans/Validation.php | 1 + modules/Auth/Language/br/Auth.php | 86 +++++++------- modules/Auth/Language/br/Contributor.php | 8 +- modules/Auth/Language/br/User.php | 24 ++-- .../Language/br/PodcastImport.php | 2 +- .../Language/nn-NO/PodcastImport.php | 8 +- .../Language/br/PremiumPodcasts.php | 22 ++-- .../Language/nn-NO/Subscription.php | 2 +- 70 files changed, 245 insertions(+), 279 deletions(-) diff --git a/app/Language/br/Comment.php b/app/Language/br/Comment.php index 5ce07ee5..fd4e4110 100644 --- a/app/Language/br/Comment.php +++ b/app/Language/br/Comment.php @@ -19,18 +19,16 @@ return [ ], 'likes' => '{numberOfLikes, plural, one {# muiañ-karet} - 2 {# vuiañ-karet} - 22 {# vuiañ-karet} - 32 {# vuiañ-karet} - 42 {# vuiañ-karet} - 52 {# vuiañ-karet} - 62 {# vuiañ-karet} - 82 {# vuiañ-karet} + two {# vuiañ-karet} + few {# muiañ-karet} + many {# muiañ-karet} other {# muiañ-karet} }', 'replies' => '{numberOfReplies, plural, - 0 {respont ebet} one {# respont} + two {# respont} + few {# respont} + many {# respont} other {# respont} }', 'like' => 'Muiañ-karet', diff --git a/app/Language/br/Episode.php b/app/Language/br/Episode.php index cc9be466..319aafbd 100644 --- a/app/Language/br/Episode.php +++ b/app/Language/br/Episode.php @@ -16,16 +16,11 @@ return [ 'season_episode' => 'Koulzad {seasonNumber} rann {episodeNumber}', 'season_episode_abbr' => 'K{seasonNumber}:R{episodeNumber}', 'persons' => '{personsCount, plural, - 0 {den ebet} one {# den} two {# zen} + few {# den} + many {# den} other {# den} - 22 {# zen} - 32 {# zen} - 42 {# zen} - 52 {# zen} - 62 {# zen} - 82 {# zen} }', 'persons_list' => 'Emellerien·ezed', 'back_to_episodes' => 'Mont da rannoù {podcast}', @@ -34,8 +29,10 @@ return [ 'chapters' => 'Chabistroù', 'description' => 'Deskrivadur ar rann', 'number_of_comments' => '{numberOfComments, plural, - 0 {evezhiadenn ebet} one {# evezhiadenn} + two {# evezhiadenn} + few {# evezhiadenn} + many {# evezhiadenn} other {# evezhiadenn} }', 'all_podcast_episodes' => 'Holl rannoù ar podkast', diff --git a/app/Language/br/Podcast.php b/app/Language/br/Podcast.php index 4b54ce03..59bec804 100644 --- a/app/Language/br/Podcast.php +++ b/app/Language/br/Podcast.php @@ -16,50 +16,20 @@ return [ 'Rannoù koulzad {seasonNumber} ({episodeCount})', 'no_episode' => 'N\'eo bet kavet rann ebet!', 'follow' => 'Heuliañ', - 'followTitle' => 'Heuliañ {actorDisplayName} war ar c\'hevrebed!', + 'followTitle' => 'Heuliañ {actorDisplayName} war ar fediverse!', 'followers' => '{numberOfFollowers, plural, - 0 {heulier·ez ebet} one {# heulier·ez} + two {# heulier·ez} + few {# heulier·ez} + many {# heulier·ez} other {# heulier·ez} }', 'posts' => '{numberOfPosts, plural, - 0 {kemennadenn ebet} - 1 {# gemennadenn} - 2 {# gemennadenn} - 3 {# c\'hemennadenn} - 4 {# c\'hemennadenn} - 9 {# c\'hemennadenn} + one {# gemennadenn} + two {# gemennadenn} + few {# c\'hemennadenn} + many {# kemennadenn} other {# kemennadenn} - 21 {# gemennadenn} - 22 {# gemennadenn} - 23 {# c\'hemennadenn} - 24 {# c\'hemennadenn} - 29 {# c\'hemennadenn} - 31 {# gemennadenn} - 32 {# gemennadenn} - 33 {# c\'hemennadenn} - 34 {# c\'hemennadenn} - 39 {# c\'hemennadenn} - 41 {# gemennadenn} - 42 {# gemennadenn} - 43 {# c\'hemennadenn} - 44 {# c\'hemennadenn} - 49 {# c\'hemennadenn} - 51 {# gemennadenn} - 52 {# gemennadenn} - 53 {# c\'hemennadenn} - 54 {# c\'hemennadenn} - 59 {# c\'hemennadenn} - 61 {# gemennadenn} - 62 {# gemennadenn} - 63 {# c\'hemennadenn} - 64 {# c\'hemennadenn} - 69 {# c\'hemennadenn} - 81 {# gemennadenn} - 82 {# gemennadenn} - 83 {# c\'hemennadenn} - 84 {# c\'hemennadenn} - 89 {# c\'hemennadenn} }', 'links' => 'Liammoù', 'activity' => 'Obererezh', @@ -69,49 +39,19 @@ return [ 'stats' => [ 'title' => 'Stadegoù', 'number_of_seasons' => '{0, plural, - 0 {koulzad ebet} - 1 {# c\'houlzad} - 2 {# goulzad} - 3 {# c\'houlzad} - 4 {# c\'houlzad} - 9 {# c\'houlzad} - other {# koulzad} - 21 {# c\'houlzad} - 22 {# goulzad} - 23 {# c\'houlzad} - 24 {# c\'houlzad} - 29 {# c\'houlzad} - 31 {# c\'houlzad} - 32 {# goulzad} - 33 {# c\'houlzad} - 34 {# c\'houlzad} - 39 {# c\'houlzad} - 41 {# c\'houlzad} - 42 {# goulzad} - 43 {# c\'houlzad} - 44 {# c\'houlzad} - 49 {# c\'houlzad} - 51 {# c\'houlzad} - 52 {# goulzad} - 53 {# c\'houlzad} - 54 {# c\'houlzad} - 59 {# c\'houlzad} - 61 {# c\'houlzad} - 62 {# goulzad} - 63 {# c\'houlzad} - 64 {# c\'houlzad} - 69 {# c\'houlzad} - 81 {# c\'houlzad} - 82 {# goulzad} - 83 {# c\'houlzad} - 84 {# c\'houlzad} - 89 {# c\'houlzad} - }', + one {# c\'houlzad} + two {# goulzad} + few {# c\'houlzad} + many {# koulzad} + other {# koulzad} + }', 'number_of_episodes' => '{0, plural, - 0 {rann ebet} - one {# rann} - other {# rann} - }', + one {# rann} + two {# rann} + few {# rann} + many {# rann} + other {# rann} + }', 'first_published_at' => 'Embannet eo bet ar rann gentañ d\'ar/d\'an {0, date, medium}', ], 'sponsor' => 'Harpit', @@ -119,16 +59,11 @@ return [ 'find_on' => 'Kavit {podcastTitle} war', 'listen_on' => 'Selaouit war', 'persons' => '{personsCount, plural, - 0 {den ebet} one {# den} two {# zen} + few {# den} + many {# den} other {# den} - 22 {# zen} - 32 {# zen} - 42 {# zen} - 52 {# zen} - 62 {# zen} - 82 {# zen} }', 'persons_list' => 'Emellerien·ezed', 'castopod_website' => 'Castopod (lec\'hienn)', diff --git a/app/Language/nl/Episode.php b/app/Language/nl/Episode.php index fb2e1088..81069be9 100644 --- a/app/Language/nl/Episode.php +++ b/app/Language/nl/Episode.php @@ -23,7 +23,7 @@ return [ 'back_to_episodes' => 'Terug naar de afleveringen van {podcast}', 'comments' => 'Reacties', 'activity' => 'Activiteiten', - 'chapters' => 'Chapters', + 'chapters' => 'Hoofdstukken', 'description' => 'Omschrijving aflevering', 'number_of_comments' => '{numberOfComments, plural, one {# reactie} @@ -43,5 +43,5 @@ return [ 'publish' => 'Publiceer', 'publish_edit' => 'Publicatie bewerken', ], - 'no_chapters' => 'No chapters are available for this episode.', + 'no_chapters' => 'Voor deze aflevering zijn geen hoofdstukken beschikbaar.', ]; diff --git a/app/Language/nn-NO/Episode.php b/app/Language/nn-NO/Episode.php index 187d40af..75ce64f3 100644 --- a/app/Language/nn-NO/Episode.php +++ b/app/Language/nn-NO/Episode.php @@ -23,7 +23,7 @@ return [ 'back_to_episodes' => 'Tilbake til episodane av {podcast}', 'comments' => 'Kommentarar', 'activity' => 'Aktivitet', - 'chapters' => 'Chapters', + 'chapters' => 'Kapittel', 'description' => 'Skildring av episoden', 'number_of_comments' => '{numberOfComments, plural, one {# kommentar} @@ -43,5 +43,5 @@ return [ 'publish' => 'Legg ut', 'publish_edit' => 'Rediger publiseringa', ], - 'no_chapters' => 'No chapters are available for this episode.', + 'no_chapters' => 'Det finst ingen kapittel for denne episoden.', ]; diff --git a/app/Language/nn-NO/Podcast.php b/app/Language/nn-NO/Podcast.php index 2f5b24a1..7ff4ac24 100644 --- a/app/Language/nn-NO/Podcast.php +++ b/app/Language/nn-NO/Podcast.php @@ -51,5 +51,5 @@ return [ other {# personar} }', 'persons_list' => 'Personar', - 'castopod_website' => 'Castopod (website)', + 'castopod_website' => 'Castopod (nettstad)', ]; diff --git a/docs/src/br/getting-started/docker.md b/docs/src/br/getting-started/docker.md index 081a19f9..b6842152 100644 --- a/docs/src/br/getting-started/docker.md +++ b/docs/src/br/getting-started/docker.md @@ -87,8 +87,9 @@ can be added as a cache handler. castopod-db: ``` - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + Rankout a rit azasaat un nebeud variennoù hervez hoc'h ezhommoù (da skouer + `CP_BASEURL`, `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` ha + `CP_ANALYTICS_SALT`). 3. Setup a reverse proxy for TLS (SSL/HTTPS) @@ -107,11 +108,11 @@ can be added as a cache handler. 5. You're all set, start podcasting! 🎙️🚀 -## Environment Variables +## Variennoù endro - **castopod/castopod** and **castopod/app** - | Variable name | Type (`default`) | Dre ziouer | + | Anv ar varienn | Type (`default`) | Dre ziouer | | ------------------------------------- | ----------------------- | ---------------- | | **`CP_BASEURL`** | string | `undefined` | | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | @@ -151,7 +152,7 @@ can be added as a cache handler. - **castopod/web-server** - | Variable name | Doare | Default | + | Anv ar varienn | Doare | Default | | ---------------------- | --------------------- | ------- | | **`CP_APP_HOSTNAME`** | ?string | `"app"` | | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | diff --git a/docs/src/br/getting-started/install.md b/docs/src/br/getting-started/install.md index d272fb9a..0825d93f 100644 --- a/docs/src/br/getting-started/install.md +++ b/docs/src/br/getting-started/install.md @@ -159,7 +159,7 @@ email.SMTPPass="your_smtp_password" #### Email config options -| Variable name | Doare | Dre ziouer | +| Anv ar varienne | Doare | Dre ziouer | | ---------------- | -------------------- | ------------ | | **`fromEmail`** | string | `undefined` | | **`fromName`** | string | `"Castopod"` | @@ -202,7 +202,7 @@ media.s3.region="your_s3_region" #### Arventennoù S3 -| Variable name | Doare | Dre ziouer | +| Anv ar varienn | Doare | Dre ziouer | | ----------------------- | ------- | ----------- | | **`endpoint`** | string | `undefined` | | **`key`** | string | `undefined` | diff --git a/docs/src/br/index.md b/docs/src/br/index.md index 96100dbf..292aceac 100644 --- a/docs/src/br/index.md +++ b/docs/src/br/index.md @@ -17,7 +17,7 @@ small footprint. Staliañ
    -## Features +## Perzhioù - 🌱  Free & open-source (AGPL v3 License) - 🔐  Focused on data sovereignty: your content, audience, and analytics diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/nn-NO/getting-started/install.md index 0d3e99ca..a42a42ba 100644 --- a/docs/src/nn-NO/getting-started/install.md +++ b/docs/src/nn-NO/getting-started/install.md @@ -124,22 +124,22 @@ manuelt basert på `.env.example`-fila. ::: -### Using CLI +### Med kommandolina -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: +1. Lag ei `.env`-fil i rotmappa til pakka, basert på `.env.example`-fila. +2. Gjer klar databasen ved hjelp av: ```sh php spark install:init-database ``` -3. Create the superadmin user using: +3. Lag superadmin-brukaren med: ```sh php spark install:create-superadmin ``` -4. Head on to your admin gateway to start podcasting! +4. Gå til styringspanelet for å byrja med podkasting! ### Epost/SMTP-oppsett diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md index df53e5d1..9fce23bb 100644 --- a/docs/src/nn-NO/index.md +++ b/docs/src/nn-NO/index.md @@ -188,7 +188,7 @@ Mange takk til dei flotte folka på Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔 - Ewen
    Ewen

    🌍 🤔 💻 + Ewen
    Ewen

    🌍 🤔 💻 Bastien Luneteau
    Bastien Luneteau

    💻 🐛 Cécile Ricordeau
    Cécile Ricordeau

    🎨 Patryk Miś
    Patryk Miś

    🌍 @@ -243,7 +243,7 @@ Mange takk til dei flotte folka på KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻 - Guy Martin
    Guy Martin

    🐛 💻 + Guy Martin
    Guy Martin

    🐛 💻 diff --git a/modules/Admin/Language/ar/Validation.php b/modules/Admin/Language/ar/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/ar/Validation.php +++ b/modules/Admin/Language/ar/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/br/Breadcrumb.php b/modules/Admin/Language/br/Breadcrumb.php index cad5bfa0..10d011df 100644 --- a/modules/Admin/Language/br/Breadcrumb.php +++ b/modules/Admin/Language/br/Breadcrumb.php @@ -32,7 +32,7 @@ return [ 'unpublish' => 'diembannañ', 'delete' => 'dilemel', 'remove' => 'lemel', - 'fediverse' => 'kevrebed', + 'fediverse' => 'fediverse', 'blocked-actors' => 'aktourien·ezed stanket', 'blocked-domains' => 'domanioù stanket', 'users' => 'implijerien·ezed', diff --git a/modules/Admin/Language/br/Countries.php b/modules/Admin/Language/br/Countries.php index 2187df89..229abb0d 100644 --- a/modules/Admin/Language/br/Countries.php +++ b/modules/Admin/Language/br/Countries.php @@ -116,7 +116,7 @@ return [ 'IL' => 'Israel', 'IM' => 'Enez-Vanav', 'IN' => 'Indez', - 'IO' => 'British Indian Ocean Territory', + 'IO' => 'Tiriad Meurvor Indez Breizh-Veur', 'IQ' => 'Irak', 'IR' => 'Iran', 'IS' => 'Island', @@ -136,7 +136,7 @@ return [ 'KW' => 'Kowait', 'KY' => 'Cayman, Inizi', 'KZ' => 'Kazakstan', - 'LA' => "Lao People's Democratic Republic", + 'LA' => "Bro-Laos", 'LB' => 'Liban', 'LC' => 'Santez-Lusia', 'LI' => 'Liechtenstein', @@ -210,7 +210,7 @@ return [ 'SD' => 'Soudan', 'SE' => 'Sveden', 'SG' => 'Singapoura', - 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SH' => 'Saint Helena, Ascension ha Tristan da Cunha', 'SI' => 'Sloveni', 'SJ' => 'Svalbard ha Jan Mayen', 'SK' => 'Slovaki', @@ -243,7 +243,7 @@ return [ 'TZ' => 'Tanzania, Republik Unanet', 'UA' => 'Ukraina', 'UG' => 'Ouganda', - 'UM' => 'United States Minor Outlying Islands', + 'UM' => 'Inizi bihan diabell ar Stadoù-Unanet', 'US' => 'Stadoù-Unanet', 'UY' => 'Uruguay', 'UZ' => 'Uzbekistan', diff --git a/modules/Admin/Language/br/Navigation.php b/modules/Admin/Language/br/Navigation.php index 31d4dcd3..de1da33e 100644 --- a/modules/Admin/Language/br/Navigation.php +++ b/modules/Admin/Language/br/Navigation.php @@ -23,7 +23,7 @@ return [ 'persons' => 'Emellerien·ezed', 'person-list' => 'An holl emellerien·ezed', 'person-create' => 'Krouiñ un emeller·ez', - 'fediverse' => 'Kevrebed', + 'fediverse' => 'Fediverse', 'fediverse-blocked-actors' => 'Implijerien·ezed stanket', 'fediverse-blocked-domains' => 'Domanioù stanket', 'users' => 'Implijerien·ezed', diff --git a/modules/Admin/Language/br/Podcast.php b/modules/Admin/Language/br/Podcast.php index 00841487..0936ffd2 100644 --- a/modules/Admin/Language/br/Podcast.php +++ b/modules/Admin/Language/br/Podcast.php @@ -106,14 +106,14 @@ return [ ], 'author_section_title' => 'Aozer·ez', 'author_section_subtitle' => 'Piv zo o verañ ar podkast?', - 'owner_name' => 'Anv ar perc\'henn', + 'owner_name' => 'Anv ar perc\'henn·ez', 'owner_name_hint' => 'Evit a sell ouzh ar mererezh. War ar wazh RSS publik e vo.', - 'owner_email' => 'Chomlec\'h postel ar perc\'henn', + 'owner_email' => 'Chomlec\'h postel ar perc\'henn·ez', 'owner_email_hint' => 'Implijet e vo gant an darn vrasañ eus ar savennoù evit gwiriañ perc\'hentiezh ar podkast. War ar wazh RSS publik e vo.', - 'is_owner_email_removed_from_feed' => 'Lemel chomlec\'h postel ar perc\'henn diouzh ar wazh RSS publik', - 'is_owner_email_removed_from_feed_hint' => 'Rankout a rafec\'h lakaat ar chomlec\'h war wel adarre, evit ur mare, evit ma vefe gouest ur meneger da wiriañ oc\'h ar perc\'henn.', + 'is_owner_email_removed_from_feed' => 'Lemel chomlec\'h postel ar perc\'henn·ez diouzh ar wazh RSS publik', + 'is_owner_email_removed_from_feed_hint' => 'Rankout a rafec\'h lakaat ar chomlec\'h war wel adarre, evit ur mare, evit ma vefe gouest ur meneger da wiriañ oc\'h ar perc\'henn·ez.', 'publisher' => 'Embanner·ez', 'publisher_hint' => 'Ar strollad kiriek eus sevel ar podkast. Alies eo embregerezh pe rouedad ar podkast. A-wechoù e vez anvet ar vaezienn-mañ "Aozer·ez".', @@ -130,7 +130,7 @@ return [ 'premium_by_default_hint' => 'Rannoù ar podkast a vo merket Premium dre ziouer. Gallout a rit lakaat rannoù zo evel publik.', 'op3' => 'Open Podcast Prefix Project (OP3)', 'op3_link' => 'Mont da welet ho taolenn-stur OP3 (liamm diavaez)', - 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_hint' => 'Talvoudekait ho roadennoù gant OP3, zo ur servij open source diavaez evit dielfennañ ar muzulioù heklev. Rannit, kadarnait ha lakait ho roadennoù keñver-ha-keñver gant re ekosistem ar podkastoù digor.', 'op3_enable' => 'Gweredekaat ar servij dielfennañ OP3', 'op3_enable_hint' => 'Evit abegoù surentez ne vo ket rannet roadennoù ar rannoù Premium gant OP3.', 'payment_pointer' => 'Chomlec\'h paeañ (Payment Poienter) evit Web Monetization', @@ -319,8 +319,11 @@ return [ other {# heulier·ez} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + one {# gemennadenn} + two {# gemennadenn} + few {# c\'hemennadenn} + many {a gemennadennoù} + other {# kemennadenn} }', 'activity' => 'Oberiantiz', 'episodes' => 'Rannoù', diff --git a/modules/Admin/Language/br/PodcastNavigation.php b/modules/Admin/Language/br/PodcastNavigation.php index 132594e6..f3d2a8e6 100644 --- a/modules/Admin/Language/br/PodcastNavigation.php +++ b/modules/Admin/Language/br/PodcastNavigation.php @@ -34,7 +34,7 @@ return [ 'contributors' => 'Perzhidi, perzhiadezed', 'contributor-list' => 'An holl berzhidi ha perzhiadezed', 'contributor-add' => 'Ouzhpennañ ur perzhiad pe ur berzhiadez', - 'broadcast' => 'Broadcast', + 'broadcast' => 'Skignañ', 'platforms-podcasting' => 'Arloadoù podkastoù', 'platforms-social' => 'Rouedadoù sokial', 'platforms-funding' => 'Liammoù arc\'hantaouiñ', diff --git a/modules/Admin/Language/br/Settings.php b/modules/Admin/Language/br/Settings.php index b322dd56..62dab9f1 100644 --- a/modules/Admin/Language/br/Settings.php +++ b/modules/Admin/Language/br/Settings.php @@ -14,31 +14,31 @@ return [ 'title' => 'Istañs', 'site_icon' => 'Arlun al lec\'hienn', 'site_icon_delete' => 'Dilemel arlun al lec\'hienn', - 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_hint' => 'Arlunioù al lec\'hienn zo ar pezh a welit war ivinelloù ho merdeer, barrenn ar pennrolloù, ha pa vez ouzhpennet al lec\'hienn d\'ur pellgomzer evel ur verradenn.', 'site_icon_helper' => 'An arlun a rankfe bezañ ur c\'harrez ha 512px e vent da nebeutañ.', 'site_name' => 'Titl al lec\'hienn', 'site_description' => 'Deskrivadur al lec\'hienn', 'submit' => 'Enrollañ', - 'editSuccess' => 'Instance has been updated successfully!', - 'deleteIconSuccess' => 'Site icon has been remove successfully!', + 'editSuccess' => 'Nevesaet eo bet an istañs gant berzh!', + 'deleteIconSuccess' => 'Skarzhet eo bet arlun al lec\'hienn gant berzh!', ], 'images' => [ 'title' => 'Skeudennoù', - 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'subtitle' => 'Amañ e c\'hellit azgenel an holl skeudennoù diwar ar skeudennoù orin a oa bet karget. Da vezañ implijet ma kav deoc\'h e vank skeudennoù zo. Hir a-walc\'h e c\'hell bezañ al labour-mañ.', 'regenerate' => 'Azgenel ar skeudennoù', - 'regenerationSuccess' => 'All images have been regenerated successfully!', + 'regenerationSuccess' => 'An holl skeudennoù zo bet azganet gant berzh!', ], 'housekeeping' => [ - 'title' => 'Kempenn', - 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', - 'reset_counts' => 'Reset counts', - 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', - 'rewrite_media' => 'Rewrite media metadata', - 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', - 'rename_episodes_files' => 'Rename episode audio files', - 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', - 'clear_cache' => 'Lemel ar grubuilh', - 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'title' => 'Kempenn an istañs', + 'subtitle' => 'Lañsañ labourioù a bep seurt evit kempenn an istañs. Da vezañ implijet ma welit kudennoù gant restroù media pe aterinder ar roadennoù. Hir a-walc\'h e c\'hell bezañ al labourioù-mañ.', + 'reset_counts' => 'Adderaouekaat ar c\'honterioù', + 'reset_counts_helper' => 'Gant an dibarzh-mañ e vo adjedet hag adderaouekaet ar c\'hontoù (niver a heulierien·ezed, a bostoù, a evezhiadennoù, …).', + 'rewrite_media' => 'Adskrivañ metaroadennoù ar media', + 'rewrite_media_helper' => 'Gant an dibarzh-mañ e vo skarzhet ar restroù media diezhomm hag adkrouet en-dro (skeudennoù, restroù aodio, treuzskrivadurioù, chabistroù, …)', + 'rename_episodes_files' => 'Adenvel restroù aodio ar rannoù', + 'rename_episodes_files_hint' => 'Gant an dibarzh-mañ e vo adanvet restroù aodio an holl rannoù gant ur chadenn arouezennoù dre zegouezh. Da implijout m\'eo bet kavet unan eus liammoù ho rannoù prevez, rak an dra-se a guzho anezhañ en-dro.', + 'clear_cache' => 'Naetaat ar grubuilh', + 'clear_cache_helper' => 'Gant an dibarzh-mañ e vo naetaet krubuilh Redis pe restroù an teuliad writable/cache.', 'run' => 'Lañsañ ar c\'hempenn', 'runSuccess' => 'Echu eo ar c\'hempenn gant berzh!', ], diff --git a/modules/Admin/Language/br/Validation.php b/modules/Admin/Language/br/Validation.php index e06708bf..59c49e93 100644 --- a/modules/Admin/Language/br/Validation.php +++ b/modules/Admin/Language/br/Validation.php @@ -13,4 +13,5 @@ return [ '{field} n\'eo ket ur skeudenn, peotrament n\'eo ket ledan a-walc\'h pe uhel a-walc\'h.', 'is_image_ratio' => '{field} n\'eo ket ur skeudenn, peotrament n\'eo ket mat ar ratio.', + 'is_json' => 'JSON direizh a zo e-barzh {field}.', ]; diff --git a/modules/Admin/Language/ca/Validation.php b/modules/Admin/Language/ca/Validation.php index bcc1dde2..fc83ea02 100644 --- a/modules/Admin/Language/ca/Validation.php +++ b/modules/Admin/Language/ca/Validation.php @@ -13,4 +13,5 @@ return [ '{field} no és una imatge, o no és prou ample o alt.', 'is_image_ratio' => '{field} no és una imatge o no té la proporció correcta.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/da/Validation.php b/modules/Admin/Language/da/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/da/Validation.php +++ b/modules/Admin/Language/da/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/de/Validation.php b/modules/Admin/Language/de/Validation.php index 9881d307..212cfb73 100644 --- a/modules/Admin/Language/de/Validation.php +++ b/modules/Admin/Language/de/Validation.php @@ -13,4 +13,5 @@ return [ '{field} ist entweder kein Bild, oder es ist nicht breit oder hoch genug.', 'is_image_ratio' => '{field} ist entweder kein Bild oder nicht das richtige Verhältnis.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/el/Validation.php b/modules/Admin/Language/el/Validation.php index 642f195d..2c5bcf7c 100644 --- a/modules/Admin/Language/el/Validation.php +++ b/modules/Admin/Language/el/Validation.php @@ -13,4 +13,5 @@ return [ '{field} είτε δεν είναι μια εικόνα, είτε δεν είναι αρκετά ευρεία ή ψηλή.', 'is_image_ratio' => '{field} είτε δεν είναι εικόνα είτε όχι της σωστής αναλογίας.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/es/Validation.php b/modules/Admin/Language/es/Validation.php index 2f234a7f..5478dfe8 100644 --- a/modules/Admin/Language/es/Validation.php +++ b/modules/Admin/Language/es/Validation.php @@ -13,4 +13,5 @@ return [ '{field} no es una imagen, o no es suficientemente ancha o alta.', 'is_image_ratio' => '{field} no es una imagen o no es de la proporción correcta.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/fa/Validation.php b/modules/Admin/Language/fa/Validation.php index 2759ccc9..0659cd86 100644 --- a/modules/Admin/Language/fa/Validation.php +++ b/modules/Admin/Language/fa/Validation.php @@ -13,4 +13,5 @@ return [ '{field} تصویر نبوده یا پنها و بلندایش کافی نیست.', 'is_image_ratio' => '{field} تصویر نبوده یا ابعادش درست نیست.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/fr/Validation.php b/modules/Admin/Language/fr/Validation.php index 6a1a8566..02f55651 100644 --- a/modules/Admin/Language/fr/Validation.php +++ b/modules/Admin/Language/fr/Validation.php @@ -13,4 +13,5 @@ return [ '{field} n’est pas une image ou n’a pas la taille minimale requise.', 'is_image_ratio' => '{field} n’est pas une image ou n’est pas au bon format.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/fr2/Validation.php b/modules/Admin/Language/fr2/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/fr2/Validation.php +++ b/modules/Admin/Language/fr2/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/fr_CA/Validation.php b/modules/Admin/Language/fr_CA/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/fr_CA/Validation.php +++ b/modules/Admin/Language/fr_CA/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/gd/Validation.php b/modules/Admin/Language/gd/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/gd/Validation.php +++ b/modules/Admin/Language/gd/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/gl/Validation.php b/modules/Admin/Language/gl/Validation.php index dbeaea55..42d6a672 100644 --- a/modules/Admin/Language/gl/Validation.php +++ b/modules/Admin/Language/gl/Validation.php @@ -13,4 +13,5 @@ return [ 'ou ben {field} non é unha imaxe ou non é suficientemente alta ou ancha.', 'is_image_ratio' => 'ou ben {field} non é unha imaxe ou non ten proporcións axeitadas.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/id/Validation.php b/modules/Admin/Language/id/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/id/Validation.php +++ b/modules/Admin/Language/id/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/it/Validation.php b/modules/Admin/Language/it/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/it/Validation.php +++ b/modules/Admin/Language/it/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/ja/Validation.php b/modules/Admin/Language/ja/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/ja/Validation.php +++ b/modules/Admin/Language/ja/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/kk/Validation.php b/modules/Admin/Language/kk/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/kk/Validation.php +++ b/modules/Admin/Language/kk/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/ko/Validation.php b/modules/Admin/Language/ko/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/ko/Validation.php +++ b/modules/Admin/Language/ko/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/nl/Breadcrumb.php b/modules/Admin/Language/nl/Breadcrumb.php index d131f786..374ddc2e 100644 --- a/modules/Admin/Language/nl/Breadcrumb.php +++ b/modules/Admin/Language/nl/Breadcrumb.php @@ -39,7 +39,7 @@ return [ 'my-account' => 'mijn account', 'change-password' => 'wachtwoord wijzigen', 'imports' => 'imports', - 'sync-feeds' => 'synchronize feeds', + 'sync-feeds' => 'feeds synchroniseren', 'platforms' => 'platformen', 'social' => 'sociale netwerken', 'funding' => 'financiering', diff --git a/modules/Admin/Language/nl/Dashboard.php b/modules/Admin/Language/nl/Dashboard.php index a768a6ce..15c43acb 100644 --- a/modules/Admin/Language/nl/Dashboard.php +++ b/modules/Admin/Language/nl/Dashboard.php @@ -13,12 +13,12 @@ return [ 'welcome_message' => 'Welkom bij de beheeromgeving!', 'podcasts' => [ 'title' => 'Podcasts', - 'not_found' => 'No published podcast', + 'not_found' => 'Geen gepubliceerde podcast', 'last_published' => 'Laatst gepubliceerd op {lastPublicationDate}', ], 'episodes' => [ 'title' => 'Afleveringen', - 'not_found' => 'No published episode', + 'not_found' => 'Geen gepubliceerde aflevering', 'last_published' => 'Laatst gepubliceerd op {lastPublicationDate}', ], 'storage' => [ diff --git a/modules/Admin/Language/nl/Fediverse.php b/modules/Admin/Language/nl/Fediverse.php index b05be18a..2ce69a02 100644 --- a/modules/Admin/Language/nl/Fediverse.php +++ b/modules/Admin/Language/nl/Fediverse.php @@ -12,7 +12,7 @@ return [ 'messages' => [ 'actorNotFound' => 'Het account werd niet gevonden!', 'blockActorSuccess' => '{actor} is geblokkeerd!', - 'unblockActorSuccess' => 'Actor has been unblocked!', + 'unblockActorSuccess' => 'Acteur is gedeblokkeerd!', 'blockDomainSuccess' => '{domain} is geblokkeerd!', 'unblockDomainSuccess' => '{domain} is gedeblokkeerd!', ], diff --git a/modules/Admin/Language/nl/Navigation.php b/modules/Admin/Language/nl/Navigation.php index 37989fff..62f09b7c 100644 --- a/modules/Admin/Language/nl/Navigation.php +++ b/modules/Admin/Language/nl/Navigation.php @@ -12,7 +12,7 @@ return [ 'toggle_sidebar' => 'Zijbalk tonen/verbergen', 'go_to_website' => 'Ga naar website', 'go_to_admin' => 'Go to admin', - 'not-authorized' => 'Not authorized', + 'not-authorized' => 'Niet geautoriseerd', 'dashboard' => 'Dashboard', 'admin' => 'Hoofdpagina', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/nl/Notifications.php b/modules/Admin/Language/nl/Notifications.php index 41345c11..76d9697b 100644 --- a/modules/Admin/Language/nl/Notifications.php +++ b/modules/Admin/Language/nl/Notifications.php @@ -11,7 +11,7 @@ declare(strict_types=1); return [ 'title' => 'Meldingen', 'reply' => '{actor_username} heeft op uw bericht gereageerd', - 'favourite' => '{actor_username} favourited your post', + 'favourite' => '{actor_username} heeft je post als favoriet gemarkeerd', 'reblog' => '{actor_username} heeft je bericht gedeeld', 'follow' => '{actor_username} volgt je nu', 'no_notifications' => 'Geen meldingen', diff --git a/modules/Admin/Language/nl/Person.php b/modules/Admin/Language/nl/Person.php index 18c56722..19a25696 100644 --- a/modules/Admin/Language/nl/Person.php +++ b/modules/Admin/Language/nl/Person.php @@ -27,9 +27,9 @@ return [ 'Avatar must be squared and at least 400px wide and tall.', 'full_name' => 'Volledige naam', 'full_name_hint' => 'Dit is de volledige naam of alias van de persoon.', - 'unique_name' => 'Unique name', - 'unique_name_hint' => 'Used for URLs', - 'information_url' => 'Information URL', + 'unique_name' => 'Unieke naam', + 'unique_name_hint' => 'Gebruikt voor URLs', + 'information_url' => 'Informatie URL', 'information_url_hint' => 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', 'submit_create' => 'Persoon aanmaken', diff --git a/modules/Admin/Language/nl/Podcast.php b/modules/Admin/Language/nl/Podcast.php index 6daad4e6..d22b16bc 100644 --- a/modules/Admin/Language/nl/Podcast.php +++ b/modules/Admin/Language/nl/Podcast.php @@ -26,7 +26,7 @@ return [ 'go_to_page' => 'Ga naar pagina', 'latest_episodes' => 'Laatste afleveringen', 'see_all_episodes' => 'Toon alle afleveringen', - 'draft' => 'Draft', + 'draft' => 'Concept', 'messages' => [ 'createSuccess' => 'Podcast succesvol aangemaakt!', 'editSuccess' => 'Podcast is succesvol bijgewerkt!', diff --git a/modules/Admin/Language/nl/PodcastNavigation.php b/modules/Admin/Language/nl/PodcastNavigation.php index f80c3e40..6cbfcdbb 100644 --- a/modules/Admin/Language/nl/PodcastNavigation.php +++ b/modules/Admin/Language/nl/PodcastNavigation.php @@ -16,21 +16,21 @@ return [ 'podcast-edit' => 'Podcast bewerken', 'podcast-persons-manage' => 'Personen beheren', 'podcast-imports' => 'Podcast importeren', - 'podcast-imports-sync' => 'Sync feeds', + 'podcast-imports-sync' => 'Synchroniseer feeds', 'episodes' => 'Afleveringen', 'episode-list' => 'Alle afleveringen', 'episode-create' => 'Nieuwe aflevering', - 'analytics' => 'Analytics', + 'analytics' => 'Statistieken', 'podcast-analytics' => 'Audience overview', 'podcast-analytics-webpages' => 'Web pages visits', 'podcast-analytics-locations' => 'Locaties', - 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-unique-listeners' => 'Unieke luisteraars', 'podcast-analytics-players' => 'Players', - 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-listening-time' => 'Luistertijd', 'podcast-analytics-time-periods' => 'Time periods', 'monetization' => 'Monetization', - 'subscription-list' => 'All subscriptions', - 'subscription-create' => 'Add subscription', + 'subscription-list' => 'Alle abonnementen', + 'subscription-create' => 'Abonnement toevoegen', 'contributors' => 'Bijdragers', 'contributor-list' => 'Alle bijdragers', 'contributor-add' => 'Bijdragers toevoegen', diff --git a/modules/Admin/Language/nl/Validation.php b/modules/Admin/Language/nl/Validation.php index ecf301a4..1e61ef35 100644 --- a/modules/Admin/Language/nl/Validation.php +++ b/modules/Admin/Language/nl/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is geen afbeelding of niet van de juiste verhouding.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-NO/Breadcrumb.php index c2b222af..15a1c2a9 100644 --- a/modules/Admin/Language/nn-NO/Breadcrumb.php +++ b/modules/Admin/Language/nn-NO/Breadcrumb.php @@ -39,11 +39,11 @@ return [ 'my-account' => 'kontoen min', 'change-password' => 'endre passord', 'imports' => 'importar', - 'sync-feeds' => 'synchronize feeds', + 'sync-feeds' => 'synkroniser straumar', 'platforms' => 'plattformer', 'social' => 'sosiale nettverk', 'funding' => 'finansiering', - 'monetization-other' => 'other monetization', + 'monetization-other' => 'andre måtar å tena pengar på', 'analytics' => 'analysar', 'locations' => 'stader', 'webpages' => 'nettsider', diff --git a/modules/Admin/Language/nn-NO/Common.php b/modules/Admin/Language/nn-NO/Common.php index b37e1394..f9678459 100644 --- a/modules/Admin/Language/nn-NO/Common.php +++ b/modules/Admin/Language/nn-NO/Common.php @@ -40,7 +40,7 @@ return [ ], 'upload_file' => 'Last opp ei fil', 'remote_url' => 'Ekstern URL-adresse', - 'save' => 'Save', + 'save' => 'Lagre', ], 'play_episode_button' => [ 'play' => 'Spel', diff --git a/modules/Admin/Language/nn-NO/Episode.php b/modules/Admin/Language/nn-NO/Episode.php index e8ec8c80..4e7bb526 100644 --- a/modules/Admin/Language/nn-NO/Episode.php +++ b/modules/Admin/Language/nn-NO/Episode.php @@ -139,9 +139,9 @@ return [ 'location_name' => 'Stadnamn eller adresse', 'location_name_hint' => 'Dette kan vera ein verkeleg eller oppdikta stad', 'transcript' => 'Transkribering (undertitlar eller teksting)', - 'transcript_hint' => 'Only .srt or .vtt are allowed.', + 'transcript_hint' => 'Berre .srt eller .vtt er lov.', 'transcript_download' => 'Last ned transkriberinga', - 'transcript_file' => 'Transcript file (.srt or .vtt)', + 'transcript_file' => 'Transkriberingsfil (.srt eller .vtt)', 'transcript_remote_url' => 'Ekstern URL for teksting', 'transcript_file_delete' => 'Slett transkriberingsfila', 'chapters' => 'Kapittel', diff --git a/modules/Admin/Language/nn-NO/Navigation.php b/modules/Admin/Language/nn-NO/Navigation.php index 39f24642..d7101730 100644 --- a/modules/Admin/Language/nn-NO/Navigation.php +++ b/modules/Admin/Language/nn-NO/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Vis/gøym sidepanelet', 'go_to_website' => 'Gå til nettsida', 'go_to_admin' => 'Gå til styringspanelet', + 'not-authorized' => 'Ikkje godkjent', 'dashboard' => 'Styringspanel', 'admin' => 'Heim', 'podcasts' => 'Podkastar', diff --git a/modules/Admin/Language/nn-NO/Platforms.php b/modules/Admin/Language/nn-NO/Platforms.php index f1fd7c9a..5d1e2a75 100644 --- a/modules/Admin/Language/nn-NO/Platforms.php +++ b/modules/Admin/Language/nn-NO/Platforms.php @@ -10,21 +10,21 @@ declare(strict_types=1); return [ 'title' => [ - 'podcasting' => 'Podcasting platforms', - 'social' => 'Social networks', - 'funding' => 'Funding links', + 'podcasting' => 'Podkastplattformer', + 'social' => 'Sosiale nettverk', + 'funding' => 'Donasjonslenker', ], - 'website' => 'Website', + 'website' => 'Nettside', 'home_url' => 'Gå til {platformName}-nettstaden', - 'register' => 'Register', + 'register' => 'Registrer deg', 'submit_url' => 'Send podkasten din til {platformName}', - 'your_link' => 'Your link', + 'your_link' => 'Lenka di', 'your_id' => [ - 'podcasting' => 'Your ID', - 'social' => 'Your ID', - 'funding' => 'Your CTA', + 'podcasting' => 'ID-en din', + 'social' => 'ID-en din', + 'funding' => 'Lokkeordet ditt', ], - 'your_cta' => 'Your call to action', + 'your_cta' => 'Lokkeordet ditt', 'visible' => 'Vis på heimesida til podkasten?', 'on_embed' => 'Vis i den innbyggbare spelaren?', 'remove' => 'Fjern {platformName}', diff --git a/modules/Admin/Language/nn-NO/Podcast.php b/modules/Admin/Language/nn-NO/Podcast.php index eb12a113..314473b3 100644 --- a/modules/Admin/Language/nn-NO/Podcast.php +++ b/modules/Admin/Language/nn-NO/Podcast.php @@ -22,7 +22,7 @@ return [ 'delete' => 'Slett podkasten', 'see_episodes' => 'Sjå episodane', 'see_contributors' => 'Sjå bidragsytarane', - 'monetization_other' => 'Other monetization', + 'monetization_other' => 'Andre måtar å tena pengar på', 'go_to_page' => 'Gå til side', 'latest_episodes' => 'Dei nyaste episodane', 'see_all_episodes' => 'Sjå alle episodane', @@ -58,7 +58,7 @@ return [ 'form' => [ 'identity_section_title' => 'Podkastidentitet', 'identity_section_subtitle' => 'Desse felta gjer at du blir lagt merke til.', - 'fediverse_section_title' => 'Fediverse identity', + 'fediverse_section_title' => 'Allheim-identitet', 'cover' => 'Podkastomslag', 'cover_size_hint' => 'Omslaget må vera kvadratisk, og minst 1400pkt breitt og høgt.', @@ -74,17 +74,17 @@ return [ 'episodic' => 'Med episodar', 'episodic_hint' => 'Viss det er meininga at episodane skal kunna lyttast til uansett rekkjefylgje. Dei nyaste episodane blir presenterte fyrst.', 'serial' => 'I serie', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. Episodes will be presented in numeric order.', + 'serial_hint' => 'Om det er meininga at episodane skal koma i ei bestemt rekkjefylgje. Episodane med lågast nummer blir presenterte fyrst.', ], 'medium' => [ 'label' => 'Medium', - 'hint' => 'Medium as represented by podcast:medium tag in RSS. Changing this may change how players present your feed.', - 'podcast' => 'Podcast', - 'podcast_hint' => 'Describes a feed for a podcast show.', - 'music' => 'Music', - 'music_hint' => 'A feed of music organized into an "album" with each item a song within the album.', - 'audiobook' => 'Audiobook', - 'audiobook_hint' => 'Specific types of audio with one item per feed, or where items represent chapters within the book.', + 'hint' => 'Medium slik det blir vist av podcast:medium-merkelappen i RSS. Viss du endrar dette, kan det påverka korleis avspelarar viser straumen din.', + 'podcast' => 'Podkast', + 'podcast_hint' => 'Skildrar ein straum for eit podkast-show.', + 'music' => 'Musikk', + 'music_hint' => 'Ein straum med musikk organisert i eit "album" der kvart element er ein song på albumet.', + 'audiobook' => 'Lydbok', + 'audiobook_hint' => 'Spesifikke typar lyd med eit element per straum, eller der elementa er kapittel i boka.', ], 'description' => 'Skildring', 'classification_section_title' => 'Klassifisering', @@ -109,8 +109,8 @@ return [ 'owner_email' => 'Epost til eigaren', 'owner_email_hint' => 'Blir brukt av dei fleste plattformer til å stadfesta eigarskapen til podkasten. Synleg i den offentlege RSS-straumen.', - 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', - 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', + 'is_owner_email_removed_from_feed' => 'Fjernar eposten til eigaren frå den offentlege RSS-straumen', + 'is_owner_email_removed_from_feed_hint' => 'Det kan henda du mellombels må visa eposten din slik at ei katalogtenest kan stadfesta at du eig podkasten.', 'publisher' => 'Utgjevar', 'publisher_hint' => 'Gruppa som er ansvarleg for serien. Det er vanlegvis morselskapet eller nettverket til ein podkast. Dette feltet er stundom merka med «forfattar».', @@ -126,7 +126,7 @@ return [ 'premium_by_default' => 'Episodane må ha premium som standardval', 'premium_by_default_hint' => 'Podkastepisodane vil få premium som standardmerking. Du kan likevel ha nokre episodar, trailerar eller bonusar som offentlege.', 'op3' => 'Open Podcast Prefix-prosjekt (OP3)', - 'op3_link' => 'Visit your OP3 dashboard (external link)', + 'op3_link' => 'Gå til OP3-styringspanelet ditt (ekstern lenke)', 'op3_hint' => 'Verdiset analysedataa dine med OP3, som er ein tredjeparts analyseteneste med open kjeldekode. Del, stadfest og samanlikne analysedataa dine med det opne podkast-økosystemet.', 'op3_enable' => 'Bruk OP3-analysetenesta', 'op3_enable_hint' => 'Av tryggleiksgrunnar deler me ikkje analysedata for premium-episodar med OP3.', diff --git a/modules/Admin/Language/nn-NO/PodcastNavigation.php b/modules/Admin/Language/nn-NO/PodcastNavigation.php index 3b0bd11a..301692bd 100644 --- a/modules/Admin/Language/nn-NO/PodcastNavigation.php +++ b/modules/Admin/Language/nn-NO/PodcastNavigation.php @@ -10,13 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Gå til podkastsida', - 'rss_feed' => 'RSS feed', + 'rss_feed' => 'RSS-straum', 'dashboard' => 'Podkast-styringspanel', 'podcast-view' => 'Heim', 'podcast-edit' => 'Rediger podkasten', 'podcast-persons-manage' => 'Handter personar', 'podcast-imports' => 'Podkast-importar', - 'podcast-imports-sync' => 'Sync feeds', + 'podcast-imports-sync' => 'Synkroniser straumar', 'episodes' => 'Episodar', 'episode-list' => 'Alle episodane', 'episode-create' => 'Ny episode', @@ -28,15 +28,15 @@ return [ 'podcast-analytics-players' => 'Spelarar', 'podcast-analytics-listening-time' => 'Lyttetid', 'podcast-analytics-time-periods' => 'Tidsperiodar', - 'monetization' => 'Monetization', + 'monetization' => 'Kommersialisering', 'subscription-list' => 'Alle abonnement', 'subscription-create' => 'Legg til abonnement', 'contributors' => 'Bidragsytarar', 'contributor-list' => 'Alle bidragsytarane', 'contributor-add' => 'Legg til bidragsytar', - 'broadcast' => 'Broadcast', - 'platforms-podcasting' => 'Podcasting apps', + 'broadcast' => 'Kringkast', + 'platforms-podcasting' => 'Podkastingsappar', 'platforms-social' => 'Sosiale nettverk', - 'platforms-funding' => 'Funding links', - 'podcast-monetization-other' => 'Other', + 'platforms-funding' => 'Donasjonslenker', + 'podcast-monetization-other' => 'Anna', ]; diff --git a/modules/Admin/Language/nn-NO/Validation.php b/modules/Admin/Language/nn-NO/Validation.php index 67faa809..21a34148 100644 --- a/modules/Admin/Language/nn-NO/Validation.php +++ b/modules/Admin/Language/nn-NO/Validation.php @@ -13,4 +13,5 @@ return [ '{field} er anten ikkje eit bilete, eller er ikkje breitt og høgt nok.', 'is_image_ratio' => '{field} er anten ikkje eit bilete, eller har feil forhold mellom høgd og breidd.', + 'is_json' => '{field} inneheld ugyldig JSON.', ]; diff --git a/modules/Admin/Language/oc/Validation.php b/modules/Admin/Language/oc/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/oc/Validation.php +++ b/modules/Admin/Language/oc/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/pl/Validation.php b/modules/Admin/Language/pl/Validation.php index 5b4e8db5..aa4fd90b 100644 --- a/modules/Admin/Language/pl/Validation.php +++ b/modules/Admin/Language/pl/Validation.php @@ -13,4 +13,5 @@ return [ '{field} nie jest obrazem, albo nie jest wystarczająco szeroki lub wysoki.', 'is_image_ratio' => '{field} nie jest obrazem, albo nie ma właściwych proporcji.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/pt-BR/Validation.php b/modules/Admin/Language/pt-BR/Validation.php index 93660630..1db87454 100644 --- a/modules/Admin/Language/pt-BR/Validation.php +++ b/modules/Admin/Language/pt-BR/Validation.php @@ -13,4 +13,5 @@ return [ '{field} não é uma imagem ou não é largo ou alto o suficiente.', 'is_image_ratio' => '{field} não é uma imagem ou não tem a proporção correta.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/pt/Validation.php b/modules/Admin/Language/pt/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/pt/Validation.php +++ b/modules/Admin/Language/pt/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/ro/Validation.php b/modules/Admin/Language/ro/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/ro/Validation.php +++ b/modules/Admin/Language/ro/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/ru/Validation.php b/modules/Admin/Language/ru/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/ru/Validation.php +++ b/modules/Admin/Language/ru/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/sk/Validation.php b/modules/Admin/Language/sk/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/sk/Validation.php +++ b/modules/Admin/Language/sk/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/sr_Latn/Validation.php b/modules/Admin/Language/sr_Latn/Validation.php index d66cbb4f..d83783d4 100644 --- a/modules/Admin/Language/sr_Latn/Validation.php +++ b/modules/Admin/Language/sr_Latn/Validation.php @@ -13,4 +13,5 @@ return [ '{field} ili nije slika ili nije dovoljne dužine/visine.', 'is_image_ratio' => '{field} ili nije slike ili nije u pravom odnosu veličina.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/sv/Validation.php b/modules/Admin/Language/sv/Validation.php index e9112946..8dc9341e 100644 --- a/modules/Admin/Language/sv/Validation.php +++ b/modules/Admin/Language/sv/Validation.php @@ -13,4 +13,5 @@ return [ '{field} är antingen inte en bild, eller så är den inte bred eller tillräckligt hög.', 'is_image_ratio' => '{field} är antingen inte en bild eller inte av rätt förhållande.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/uk/Validation.php b/modules/Admin/Language/uk/Validation.php index 3bc78cfe..f76c3163 100644 --- a/modules/Admin/Language/uk/Validation.php +++ b/modules/Admin/Language/uk/Validation.php @@ -13,4 +13,5 @@ return [ '{field} is either not an image, or it is not wide or tall enough.', 'is_image_ratio' => '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Admin/Language/zh-Hans/Validation.php b/modules/Admin/Language/zh-Hans/Validation.php index fa41468c..4a447d44 100644 --- a/modules/Admin/Language/zh-Hans/Validation.php +++ b/modules/Admin/Language/zh-Hans/Validation.php @@ -13,4 +13,5 @@ return [ '{field} 不是一张图片,或者宽或高度不够。', 'is_image_ratio' => '{field} 不是图片或比例不正确。', + 'is_json' => '{field} contains invalid JSON.', ]; diff --git a/modules/Auth/Language/br/Auth.php b/modules/Auth/Language/br/Auth.php index da152f33..8bd51692 100644 --- a/modules/Auth/Language/br/Auth.php +++ b/modules/Auth/Language/br/Auth.php @@ -12,82 +12,82 @@ return [ 'instance_groups' => [ 'owner' => [ 'title' => 'Perc\'henn·ez an istañs', - 'description' => 'The Castopod owner.', + 'description' => 'Perc\'henn·ez Castopod.', ], 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', + 'title' => 'Dreistmerour·ez', + 'description' => 'Ur c\'hontroll klok en deus war Castopod.', ], 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', + 'title' => 'Merour·ez', + 'description' => 'Merañ a ra endalc\'had Castopod.', ], 'podcaster' => [ 'title' => 'Podkaster', - 'description' => 'General users of Castopod.', + 'description' => 'Implijerien·ezed kustum Castopod.', ], ], 'instance_permissions' => [ - 'admin.access' => 'Can access the Castopod admin area.', - 'admin.settings' => 'Can access the Castopod settings.', - 'users.manage' => 'Can manage Castopod users.', - 'persons.manage' => 'Can manage persons.', - 'pages.manage' => 'Can manage pages.', - 'podcasts.view' => 'Can view all podcasts.', - 'podcasts.create' => 'Can create new podcasts.', + 'admin.access' => 'Gallout a ra gwelet taolenn-stur Castopod.', + 'admin.settings' => 'Gallout a ra gwelet arventennoù Castopod.', + 'users.manage' => 'Gallout a ra ober war-dro implijerien·ezed Castopod.', + 'persons.manage' => 'Gallout a ra merañ an emellerien·ezed.', + 'pages.manage' => 'Gallout a ra merañ ar pajennoù.', + 'podcasts.view' => 'Gallout a ra gwelet an holl bodkastoù.', + 'podcasts.create' => 'Gallout a ra krouiñ podkastoù nevez.', 'podcasts.import' => 'Gallout a ra enporzhiañ podkastoù.', - 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + 'fediverse.manage-blocks' => 'Gallout a ra mirout aktourien·ezed pe domanioù ar Fediverse ouzh kaout darempredoù gant Castopod.', ], 'podcast_groups' => [ 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', + 'title' => 'Perc\'henn·ez ar podkast', + 'description' => 'Perc\'henn·ez ar podkast.', ], 'admin' => [ 'title' => 'Merour·ez', - 'description' => 'Has complete control of podcast #{id}.', + 'description' => 'Ur c\'hontroll klok en deus war ar podkast #{id}.', ], 'editor' => [ 'title' => 'Embanner', - 'description' => 'Manages content and publications of podcast #{id}.', + 'description' => 'Merañ a ra endalc\'had hag embannadurioù ar podkast #{id}.', ], 'author' => [ 'title' => 'Aozer·ez', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', + 'description' => 'Merañ a ra endalc\'had ar podkast #{id} met ne c\'hall ket embann anezho.', ], 'guest' => [ 'title' => 'Kouviad·ez', - 'description' => 'General contributor of the podcast #{id}.', + 'description' => 'Perzhiad·ez eus ar podkast #{id}.', ], ], 'podcast_permissions' => [ - 'view' => 'Can view dashboard and analytics of podcast #{id}.', - 'edit' => 'Can edit podcast #{id}.', - 'delete' => 'Can delete podcast #{id}.', - 'manage-import' => 'Can synchronize imported podcast #{id}.', - 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', - 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', - 'manage-contributors' => 'Can manage contributors of podcast #{id}.', - 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', - 'manage-publications' => 'Can publish podcast #{id}.', - 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', - 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', - 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'view' => 'Gallout a ra gwelet taolenn-stur ha muzulioù heklev ar podkast #{id}.', + 'edit' => 'Gallout a ra kemmañ ar podkast #{id}.', + 'delete' => 'Gallout a ra lemel ar podkast #{id}.', + 'manage-import' => 'Gallout a ra sinkronekaat ar podkast enporzhiet #{id}.', + 'manage-persons' => 'Gallout a ra merañ koumanantoù ar podkast #{id}.', + 'manage-subscriptions' => 'Gallout a ra merañ koumanantoù ar podkast #{id}.', + 'manage-contributors' => 'Gallout a ra merañ perzhidi ha perzhiadezed ar podkast #{id}.', + 'manage-platforms' => 'Gallout a ra ouzhpennañ pe lemel liammoù etrezek savennoù diavaez evit ar podkast #{id}.', + 'manage-publications' => 'Gallout a ra embann ar podkast #{id}.', + 'manage-notifications' => 'Gallout a ra gwelet kemennoù ar podkast #{id} ha lakaat anezho evel lennet.', + 'interact-as' => 'Gallout a ra ober traoù gant identelezh ar podkast #{id}: ouzhpennañ ur gemennadenn d\'ar re garetañ, rannañ anezhi pe respont dezhi.', + 'episodes.view' => 'Gallout a ra gwelet taolennoù-stur ha muzulioù heklev rannoù ar podkast #{id}.', + 'episodes.create' => 'Gallout a ra krouiñ rannoù evit podkast #{id}.', + 'episodes.edit' => 'Gallout a ra kemmañ rannoù ar podkast #{id}.', + 'episodes.delete' => 'Gallout a ra lemel rannoù ar podkast #{id}.', + 'episodes.manage-persons' => 'Gallout a ra merañ emellerien·ezed ar podkast #{id}.', + 'episodes.manage-clips' => 'Gallout a ra merañ klipoù video pe tennadoù son ar podkast #{id}.', + 'episodes.manage-publications' => 'Gallout a ra embann pe diembann rannoù ha kemennadennoù ar podkast #{id}.', + 'episodes.manage-comments' => 'Gallout a ra krouiñ/lemel evezhiadennoù evit rannoù ar podkast #{id}.', ], // missing keys - 'code' => 'Your 6-digit code', + 'code' => 'Ho kod 6 sifr dezhañ', - 'set_password' => 'Set your password', + 'set_password' => 'Skrivit ho ker-tremen', // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', + 'welcomeSubject' => 'Pedet oc\'h bet da vont war {siteName}', + 'emailWelcomeMailBody' => 'Krouet ez eus bet ur gont deoc\'h war {domain}. Klikit war al liamm amañ-dindan evit choaz ur ger-tremen. Bev e vo al liamm betek {numberOfHours} eur goude m\'eo bet kaset ar postel-mañ.', ]; diff --git a/modules/Auth/Language/br/Contributor.php b/modules/Auth/Language/br/Contributor.php index 90976a46..bffc79e0 100644 --- a/modules/Auth/Language/br/Contributor.php +++ b/modules/Auth/Language/br/Contributor.php @@ -31,13 +31,13 @@ return [ 'delete_form' => [ 'title' => 'Dilemel {contributor}', 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'Emaoc\'h o vont da lemel {contributor} eus ar berzhidi/perzhiadezed. Ne c\'hallo ket gwelet "{podcastTitle}" ken.', + 'understand' => 'Komprenet em eus. Fellout a ra din lemel {contributor} eus "{podcastTitle}"', 'submit' => 'Lemel', ], 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", + 'editSuccess' => 'Cheñchet eo bet ar roll gant berzh!', + 'editOwnerError' => "Ne c'hellit ket kemmañ perc'henn·ez ar podkast!", 'removeOwnerError' => "Ne c'hellit ket lemel perc'henn ar podkast!", 'removeSuccess' => 'Lamet ho peus {username} diouzh {podcastTitle} gant berzh', diff --git a/modules/Auth/Language/br/User.php b/modules/Auth/Language/br/User.php index 5ca96939..accd5af9 100644 --- a/modules/Auth/Language/br/User.php +++ b/modules/Auth/Language/br/User.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'edit_role' => "Edit {username}'s role", + 'edit_role' => "Kemmañ roll {username}", 'ban' => 'Stankañ', 'unban' => 'Distankañ', 'delete' => 'Dilemel', @@ -19,7 +19,7 @@ return [ 'list' => [ 'user' => 'Implijer·ez', 'role' => 'Roll', - 'banned' => 'Banned?', + 'banned' => 'Stanket?', ], 'form' => [ 'email' => 'Postel', @@ -34,27 +34,27 @@ return [ 'submit_password_change' => 'Kemm!', ], 'delete_form' => [ - 'title' => 'Delete {user}', + 'title' => 'Dilemel {user}', 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', + "Emaoc'h o vont da lemel {user} da vat. Ne c'hallo ket gwelet an daolenn-stur ken.", + 'understand' => 'Komprenet em eus. Fellout a ra din lemel {user} da vat', 'submit' => 'Dilemel', ], 'messages' => [ 'createSuccess' => 'User created successfully! {username} will be prompted with a password reset upon first authentication.', 'roleEditSuccess' => - "{username}'s roles have been successfully updated.", - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', + "Rolloù {username} zo bet nevesaet gant berzh.", + 'banSuccess' => 'Stanket eo bet {username}.', + 'unbanSuccess' => 'Distanket eo bet {username}.', 'editOwnerError' => - '{username} eo perc\'henn·erez an istañs. Ne c\'hallit ket kemmañ e rolloù…', + '{username} eo perc\'henn·ez an istañs. Ne c\'hallit ket kemmañ e rolloù…', 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', + 'Dreistmerour·ez eo {username}, n\'haller ket stankañ un dreistmerour·ez ken aes-se…', 'deleteOwnerError' => - '{username} is the instance owner, one does not simply delete the owner…', + '{username} eo perc\'henn·ez an istañs. N\'haller ket lemel ar perc\'henn·ez ken aes-se…', 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', + 'Dreistmerour·ez eo {username}, n\'haller ket lemel un dreistmerour·ez ken aes-se…', 'deleteSuccess' => 'Dilamet eo bet {username}.', ], ]; diff --git a/modules/PodcastImport/Language/br/PodcastImport.php b/modules/PodcastImport/Language/br/PodcastImport.php index e3e59cea..c4f01d81 100644 --- a/modules/PodcastImport/Language/br/PodcastImport.php +++ b/modules/PodcastImport/Language/br/PodcastImport.php @@ -22,7 +22,7 @@ return [ 'imported_feed_url_hint' => 'Rankout a ra ar wazh bezañ er furmad xml pe rss.', 'new_podcast_section_title' => 'Ar podkast nevez', 'lock_import' => - 'Gwarezet eo ar wazh-mañ. Ne c\'hallit ket enporzhiañ anezhi. Ma\'z oc\'h ar perc\'henn·erez, dibrennit anezhi war ar savenn orin.', + 'Gwarezet eo ar wazh-mañ. Ne c\'hallit ket enporzhiañ anezhi. Ma\'z oc\'h ar perc\'henn·ez, dibrennit anezhi war ar savenn orin.', 'submit' => 'Ouzhpennañ an enporzh d\'al lost', 'queue' => [ 'status' => [ diff --git a/modules/PodcastImport/Language/nn-NO/PodcastImport.php b/modules/PodcastImport/Language/nn-NO/PodcastImport.php index f778e048..83cdd088 100644 --- a/modules/PodcastImport/Language/nn-NO/PodcastImport.php +++ b/modules/PodcastImport/Language/nn-NO/PodcastImport.php @@ -49,10 +49,10 @@ return [ ], ], 'syncForm' => [ - 'title' => 'Synchronize feeds', - 'feed_url' => 'Feed URL', - 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', - 'submit' => 'Add to queue', + 'title' => 'Synkroniser straumar', + 'feed_url' => 'URL til straumen', + 'feed_url_hint' => 'URL til straumen du vil synkronisera med denne podkasten.', + 'submit' => 'Legg til i køen', ], 'messages' => [ 'canceled' => 'Importen vart avbroten.', diff --git a/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php index 096fcf04..42e897b6 100644 --- a/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php +++ b/modules/PremiumPodcasts/Language/br/PremiumPodcasts.php @@ -9,26 +9,26 @@ declare(strict_types=1); */ return [ - 'podcast_is_premium' => 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'podcast_is_premium' => 'Rannoù Premium a zo er podkast-mañ', + 'episode_is_premium' => 'Ur rann Premium eo, ne c\'hell bezañ gwelet nemet gant koumananterien·ezed Premium', + 'unlock_episode' => 'Evit koumananterien·ezed Premium eo ar rann-mañ. Klikit evit dibrennañ anezhi!', + 'banner_unlock' => 'Rannoù Premium a zo er podkast-mañ, ne c\'hellont bezañ gwelet nemet gant koumananterien·ezed Premium.', + 'banner_lock' => 'Dibrennet eo bet ar podkast. Plijadur deoc\'h gant ar rannoù Premium!', 'subscribe' => 'Koumanantiñ', 'lock' => 'Prennañ', 'unlock' => 'Dibrennañ', 'unlock_form' => [ 'title' => 'Endalc\'had Premium', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'subtitle' => 'Rannoù Premium prennet zo er podkast-mañ. Ha ganeoc\'h emañ an alc\'hwez evit dibrennañ anezho?', 'token' => 'Lakait hoc’h alc\'hwez', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'token_hint' => 'Ma\'z oc\'h koumanantet ouzh {podcastTitle} e c\'hellit eilañ an alc’hwez a zo bet kaset deoc\'h dre bostel ha pegañ anezhañ amañ.', 'submit' => 'Dibrennañ an holl rannoù!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'call_to_action' => 'Dibrennit holl rannoù {podcastTitle}:', 'subscribe_cta' => 'Koumanantit bremañ!', ], 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', + 'unlockSuccess' => 'Dibrennet eo bet ar podkast gant berzh! Plijadur deoc\'h gant ar rannoù Premium!', + 'unlockBadAttempt' => 'Hoc\'h alc\'hwez n\'eo seblant ket bezañ mat…', + 'lockSuccess' => 'Dibrennet eo bet ar podkast gant berzh!', ], ]; diff --git a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php index a7bc5620..d32055c8 100644 --- a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php +++ b/modules/PremiumPodcasts/Language/nn-NO/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'Epost', 'expiration_date' => 'Gyldig til', 'expiration_date_hint' => 'Datoen og tidspunket abonnementet stoppar. La det stå tomt viss abonnementet skal gå utan sluttdato.', - 'submit_create' => 'Create subscription', + 'submit_create' => 'Opprett abonnement', 'submit_edit' => 'Rediger abonnementet', ], 'form_link_add' => [ From c24850bda9722fc297a6620074073ee818f2d570 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 8 Mar 2024 15:45:20 +0000 Subject: [PATCH 315/477] build(i18n): include Breton and Serbian (Latin) languages to Castopod bundle --- app/Config/App.php | 14 +++++++++++++- app/Language/.rsync-filter | 2 ++ app/Language/{sr_Latn => sr-Latn}/Comment.php | 0 app/Language/{sr_Latn => sr-Latn}/Common.php | 0 app/Language/{sr_Latn => sr-Latn}/Episode.php | 0 app/Language/{sr_Latn => sr-Latn}/Fediverse.php | 0 app/Language/{sr_Latn => sr-Latn}/Home.php | 0 app/Language/{sr_Latn => sr-Latn}/Page.php | 0 app/Language/{sr_Latn => sr-Latn}/Podcast.php | 0 app/Language/{sr_Latn => sr-Latn}/Post.php | 0 modules/Admin/Language/.rsync-filter | 2 ++ .../{sr_Latn => sr-Latn}/AboutCastopod.php | 0 .../{sr_Latn => sr-Latn}/Breadcrumb.php | 0 .../Language/{sr_Latn => sr-Latn}/Charts.php | 0 .../Language/{sr_Latn => sr-Latn}/Common.php | 0 .../Language/{sr_Latn => sr-Latn}/Countries.php | 0 .../Language/{sr_Latn => sr-Latn}/Dashboard.php | 0 .../Language/{sr_Latn => sr-Latn}/Episode.php | 0 .../{sr_Latn => sr-Latn}/EpisodeNavigation.php | 0 .../Language/{sr_Latn => sr-Latn}/Fediverse.php | 0 .../Language/{sr_Latn => sr-Latn}/Home.php | 0 .../Language/{sr_Latn => sr-Latn}/Install.php | 0 .../{sr_Latn => sr-Latn}/Navigation.php | 0 .../{sr_Latn => sr-Latn}/Notifications.php | 0 .../Language/{sr_Latn => sr-Latn}/Page.php | 0 .../Language/{sr_Latn => sr-Latn}/Pager.php | 0 .../Language/{sr_Latn => sr-Latn}/Person.php | 0 .../Language/{sr_Latn => sr-Latn}/Platforms.php | 0 .../Language/{sr_Latn => sr-Latn}/Podcast.php | 0 .../{sr_Latn => sr-Latn}/PodcastNavigation.php | 0 .../Language/{sr_Latn => sr-Latn}/Settings.php | 0 .../Language/{sr_Latn => sr-Latn}/Soundbite.php | 0 modules/Admin/Language/sr-Latn/Validation.php | 17 +++++++++++++++++ .../Language/{sr_Latn => sr-Latn}/VideoClip.php | 0 modules/Install/Language/.rsync-filter | 2 ++ .../Language/{sr_Latn => sr-Latn}/Install.php | 0 36 files changed, 36 insertions(+), 1 deletion(-) rename app/Language/{sr_Latn => sr-Latn}/Comment.php (100%) rename app/Language/{sr_Latn => sr-Latn}/Common.php (100%) rename app/Language/{sr_Latn => sr-Latn}/Episode.php (100%) rename app/Language/{sr_Latn => sr-Latn}/Fediverse.php (100%) rename app/Language/{sr_Latn => sr-Latn}/Home.php (100%) rename app/Language/{sr_Latn => sr-Latn}/Page.php (100%) rename app/Language/{sr_Latn => sr-Latn}/Podcast.php (100%) rename app/Language/{sr_Latn => sr-Latn}/Post.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/AboutCastopod.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Breadcrumb.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Charts.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Common.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Countries.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Dashboard.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Episode.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/EpisodeNavigation.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Fediverse.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Home.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Install.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Navigation.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Notifications.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Page.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Pager.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Person.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Platforms.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Podcast.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/PodcastNavigation.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Settings.php (100%) rename modules/Admin/Language/{sr_Latn => sr-Latn}/Soundbite.php (100%) create mode 100644 modules/Admin/Language/sr-Latn/Validation.php rename modules/Admin/Language/{sr_Latn => sr-Latn}/VideoClip.php (100%) rename modules/Install/Language/{sr_Latn => sr-Latn}/Install.php (100%) diff --git a/app/Config/App.php b/app/Config/App.php index a7c7b770..a67511d5 100644 --- a/app/Config/App.php +++ b/app/Config/App.php @@ -98,7 +98,19 @@ class App extends BaseConfig * * @var list */ - public array $supportedLocales = ['en', 'fr', 'pl', 'de', 'pt-BR', 'nn-NO', 'es', 'zh-Hans', 'ca']; + public array $supportedLocales = [ + 'en', + 'fr', + 'pl', + 'de', + 'pt-BR', + 'nn-NO', + 'es', + 'zh-Hans', + 'ca', + 'br', + 'sr-Latn', + ]; /** * -------------------------------------------------------------------------- diff --git a/app/Language/.rsync-filter b/app/Language/.rsync-filter index 2a742b26..c6a78436 100644 --- a/app/Language/.rsync-filter +++ b/app/Language/.rsync-filter @@ -7,4 +7,6 @@ + es/*** + zh-Hans/*** + ca/*** ++ br/*** ++ sr-Latn/*** - ** diff --git a/app/Language/sr_Latn/Comment.php b/app/Language/sr-Latn/Comment.php similarity index 100% rename from app/Language/sr_Latn/Comment.php rename to app/Language/sr-Latn/Comment.php diff --git a/app/Language/sr_Latn/Common.php b/app/Language/sr-Latn/Common.php similarity index 100% rename from app/Language/sr_Latn/Common.php rename to app/Language/sr-Latn/Common.php diff --git a/app/Language/sr_Latn/Episode.php b/app/Language/sr-Latn/Episode.php similarity index 100% rename from app/Language/sr_Latn/Episode.php rename to app/Language/sr-Latn/Episode.php diff --git a/app/Language/sr_Latn/Fediverse.php b/app/Language/sr-Latn/Fediverse.php similarity index 100% rename from app/Language/sr_Latn/Fediverse.php rename to app/Language/sr-Latn/Fediverse.php diff --git a/app/Language/sr_Latn/Home.php b/app/Language/sr-Latn/Home.php similarity index 100% rename from app/Language/sr_Latn/Home.php rename to app/Language/sr-Latn/Home.php diff --git a/app/Language/sr_Latn/Page.php b/app/Language/sr-Latn/Page.php similarity index 100% rename from app/Language/sr_Latn/Page.php rename to app/Language/sr-Latn/Page.php diff --git a/app/Language/sr_Latn/Podcast.php b/app/Language/sr-Latn/Podcast.php similarity index 100% rename from app/Language/sr_Latn/Podcast.php rename to app/Language/sr-Latn/Podcast.php diff --git a/app/Language/sr_Latn/Post.php b/app/Language/sr-Latn/Post.php similarity index 100% rename from app/Language/sr_Latn/Post.php rename to app/Language/sr-Latn/Post.php diff --git a/modules/Admin/Language/.rsync-filter b/modules/Admin/Language/.rsync-filter index 2a742b26..c6a78436 100644 --- a/modules/Admin/Language/.rsync-filter +++ b/modules/Admin/Language/.rsync-filter @@ -7,4 +7,6 @@ + es/*** + zh-Hans/*** + ca/*** ++ br/*** ++ sr-Latn/*** - ** diff --git a/modules/Admin/Language/sr_Latn/AboutCastopod.php b/modules/Admin/Language/sr-Latn/AboutCastopod.php similarity index 100% rename from modules/Admin/Language/sr_Latn/AboutCastopod.php rename to modules/Admin/Language/sr-Latn/AboutCastopod.php diff --git a/modules/Admin/Language/sr_Latn/Breadcrumb.php b/modules/Admin/Language/sr-Latn/Breadcrumb.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Breadcrumb.php rename to modules/Admin/Language/sr-Latn/Breadcrumb.php diff --git a/modules/Admin/Language/sr_Latn/Charts.php b/modules/Admin/Language/sr-Latn/Charts.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Charts.php rename to modules/Admin/Language/sr-Latn/Charts.php diff --git a/modules/Admin/Language/sr_Latn/Common.php b/modules/Admin/Language/sr-Latn/Common.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Common.php rename to modules/Admin/Language/sr-Latn/Common.php diff --git a/modules/Admin/Language/sr_Latn/Countries.php b/modules/Admin/Language/sr-Latn/Countries.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Countries.php rename to modules/Admin/Language/sr-Latn/Countries.php diff --git a/modules/Admin/Language/sr_Latn/Dashboard.php b/modules/Admin/Language/sr-Latn/Dashboard.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Dashboard.php rename to modules/Admin/Language/sr-Latn/Dashboard.php diff --git a/modules/Admin/Language/sr_Latn/Episode.php b/modules/Admin/Language/sr-Latn/Episode.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Episode.php rename to modules/Admin/Language/sr-Latn/Episode.php diff --git a/modules/Admin/Language/sr_Latn/EpisodeNavigation.php b/modules/Admin/Language/sr-Latn/EpisodeNavigation.php similarity index 100% rename from modules/Admin/Language/sr_Latn/EpisodeNavigation.php rename to modules/Admin/Language/sr-Latn/EpisodeNavigation.php diff --git a/modules/Admin/Language/sr_Latn/Fediverse.php b/modules/Admin/Language/sr-Latn/Fediverse.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Fediverse.php rename to modules/Admin/Language/sr-Latn/Fediverse.php diff --git a/modules/Admin/Language/sr_Latn/Home.php b/modules/Admin/Language/sr-Latn/Home.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Home.php rename to modules/Admin/Language/sr-Latn/Home.php diff --git a/modules/Admin/Language/sr_Latn/Install.php b/modules/Admin/Language/sr-Latn/Install.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Install.php rename to modules/Admin/Language/sr-Latn/Install.php diff --git a/modules/Admin/Language/sr_Latn/Navigation.php b/modules/Admin/Language/sr-Latn/Navigation.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Navigation.php rename to modules/Admin/Language/sr-Latn/Navigation.php diff --git a/modules/Admin/Language/sr_Latn/Notifications.php b/modules/Admin/Language/sr-Latn/Notifications.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Notifications.php rename to modules/Admin/Language/sr-Latn/Notifications.php diff --git a/modules/Admin/Language/sr_Latn/Page.php b/modules/Admin/Language/sr-Latn/Page.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Page.php rename to modules/Admin/Language/sr-Latn/Page.php diff --git a/modules/Admin/Language/sr_Latn/Pager.php b/modules/Admin/Language/sr-Latn/Pager.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Pager.php rename to modules/Admin/Language/sr-Latn/Pager.php diff --git a/modules/Admin/Language/sr_Latn/Person.php b/modules/Admin/Language/sr-Latn/Person.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Person.php rename to modules/Admin/Language/sr-Latn/Person.php diff --git a/modules/Admin/Language/sr_Latn/Platforms.php b/modules/Admin/Language/sr-Latn/Platforms.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Platforms.php rename to modules/Admin/Language/sr-Latn/Platforms.php diff --git a/modules/Admin/Language/sr_Latn/Podcast.php b/modules/Admin/Language/sr-Latn/Podcast.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Podcast.php rename to modules/Admin/Language/sr-Latn/Podcast.php diff --git a/modules/Admin/Language/sr_Latn/PodcastNavigation.php b/modules/Admin/Language/sr-Latn/PodcastNavigation.php similarity index 100% rename from modules/Admin/Language/sr_Latn/PodcastNavigation.php rename to modules/Admin/Language/sr-Latn/PodcastNavigation.php diff --git a/modules/Admin/Language/sr_Latn/Settings.php b/modules/Admin/Language/sr-Latn/Settings.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Settings.php rename to modules/Admin/Language/sr-Latn/Settings.php diff --git a/modules/Admin/Language/sr_Latn/Soundbite.php b/modules/Admin/Language/sr-Latn/Soundbite.php similarity index 100% rename from modules/Admin/Language/sr_Latn/Soundbite.php rename to modules/Admin/Language/sr-Latn/Soundbite.php diff --git a/modules/Admin/Language/sr-Latn/Validation.php b/modules/Admin/Language/sr-Latn/Validation.php new file mode 100644 index 00000000..d83783d4 --- /dev/null +++ b/modules/Admin/Language/sr-Latn/Validation.php @@ -0,0 +1,17 @@ + + '{field} ili nije slika ili nije dovoljne dužine/visine.', + 'is_image_ratio' => + '{field} ili nije slike ili nije u pravom odnosu veličina.', + 'is_json' => '{field} contains invalid JSON.', +]; diff --git a/modules/Admin/Language/sr_Latn/VideoClip.php b/modules/Admin/Language/sr-Latn/VideoClip.php similarity index 100% rename from modules/Admin/Language/sr_Latn/VideoClip.php rename to modules/Admin/Language/sr-Latn/VideoClip.php diff --git a/modules/Install/Language/.rsync-filter b/modules/Install/Language/.rsync-filter index 2a742b26..c6a78436 100644 --- a/modules/Install/Language/.rsync-filter +++ b/modules/Install/Language/.rsync-filter @@ -7,4 +7,6 @@ + es/*** + zh-Hans/*** + ca/*** ++ br/*** ++ sr-Latn/*** - ** diff --git a/modules/Install/Language/sr_Latn/Install.php b/modules/Install/Language/sr-Latn/Install.php similarity index 100% rename from modules/Install/Language/sr_Latn/Install.php rename to modules/Install/Language/sr-Latn/Install.php From bd205d56ca5ffc3762699a3ca7719ef502bc84f1 Mon Sep 17 00:00:00 2001 From: crowdin Date: Mon, 11 Mar 2024 15:13:48 +0000 Subject: [PATCH 316/477] chore(i18n): new Crowdin updates --- app/Language/gl/Episode.php | 12 +- app/Language/kk/Comment.php | 2 +- app/Language/kk/Home.php | 2 +- app/Language/sv/Podcast.php | 2 +- docs/src/br/getting-started/auth.md | 8 +- docs/src/ca/getting-started/auth.md | 86 ++--- docs/src/de/getting-started/auth.md | 66 ++-- docs/src/el/getting-started/auth.md | 36 +-- docs/src/es/getting-started/auth.md | 50 +-- docs/src/es/getting-started/update.md | 3 +- docs/src/fr/getting-started/auth.md | 86 ++--- docs/src/fr/getting-started/update.md | 5 +- docs/src/gd/getting-started/auth.md | 86 ++--- docs/src/gl/getting-started/auth.md | 86 ++--- docs/src/it/getting-started/auth.md | 86 ++--- docs/src/nl/getting-started/auth.md | 42 +-- docs/src/nn-NO/getting-started/auth.md | 10 +- docs/src/pt-BR/getting-started/auth.md | 66 ++-- docs/src/ro/getting-started/auth.md | 86 ++--- docs/src/sr-Latn/getting-started/auth.md | 87 +++++ docs/src/sr-Latn/getting-started/docker.md | 159 +++++++++ docs/src/sr-Latn/getting-started/install.md | 242 ++++++++++++++ docs/src/sr-Latn/getting-started/security.md | 27 ++ docs/src/sr-Latn/getting-started/update.md | 107 +++++++ docs/src/sr-Latn/index.md | 302 ++++++++++++++++++ docs/src/sv/getting-started/auth.md | 86 ++--- docs/src/uk/getting-started/auth.md | 12 +- docs/src/zh-Hans/getting-started/auth.md | 10 +- docs/src/zh-Hans/getting-started/update.md | 4 +- docs/src/zh-Hans/index.md | 2 +- modules/Admin/Language/ar/Navigation.php | 1 + modules/Admin/Language/ca/Navigation.php | 1 + .../Admin/Language/ca/PodcastNavigation.php | 2 +- modules/Admin/Language/da/Navigation.php | 1 + modules/Admin/Language/de/Navigation.php | 3 +- .../Admin/Language/de/PodcastNavigation.php | 2 +- modules/Admin/Language/el/Navigation.php | 1 + .../Admin/Language/el/PodcastNavigation.php | 2 +- modules/Admin/Language/es/Navigation.php | 3 +- .../Admin/Language/es/PodcastNavigation.php | 2 +- modules/Admin/Language/fa/Navigation.php | 1 + modules/Admin/Language/fr/Validation.php | 2 +- modules/Admin/Language/fr2/Navigation.php | 1 + modules/Admin/Language/fr_CA/Navigation.php | 1 + modules/Admin/Language/gd/Navigation.php | 1 + modules/Admin/Language/gl/Navigation.php | 1 + .../Admin/Language/gl/PodcastNavigation.php | 2 +- modules/Admin/Language/id/Navigation.php | 1 + modules/Admin/Language/it/Navigation.php | 1 + modules/Admin/Language/ja/Navigation.php | 1 + modules/Admin/Language/kk/Navigation.php | 1 + modules/Admin/Language/ko/Navigation.php | 1 + modules/Admin/Language/oc/Navigation.php | 1 + modules/Admin/Language/pl/Navigation.php | 3 +- .../Admin/Language/pl/PodcastNavigation.php | 2 +- modules/Admin/Language/pt-BR/Navigation.php | 3 +- .../Language/pt-BR/PodcastNavigation.php | 2 +- modules/Admin/Language/pt/Navigation.php | 1 + modules/Admin/Language/ro/Navigation.php | 1 + modules/Admin/Language/ru/Navigation.php | 1 + modules/Admin/Language/sk/Install.php | 2 +- modules/Admin/Language/sk/Navigation.php | 1 + modules/Admin/Language/sr-Latn/Navigation.php | 1 + modules/Admin/Language/sv/Common.php | 2 +- modules/Admin/Language/sv/Navigation.php | 1 + .../Admin/Language/sv/PodcastNavigation.php | 2 +- modules/Admin/Language/uk/Navigation.php | 1 + modules/Admin/Language/zh-Hans/Navigation.php | 3 +- .../Language/zh-Hans/PodcastNavigation.php | 2 +- modules/Auth/Language/sr-Latn/Auth.php | 93 ++++++ modules/Auth/Language/sr-Latn/Contributor.php | 47 +++ modules/Auth/Language/sr-Latn/MyAccount.php | 18 ++ modules/Auth/Language/sr-Latn/User.php | 60 ++++ modules/Auth/Language/sv/Contributor.php | 10 +- modules/Auth/Language/sv/MyAccount.php | 2 +- modules/Auth/Language/sv/User.php | 8 +- .../Language/sr-Latn/PodcastImport.php | 66 ++++ .../Language/sr-Latn/PremiumPodcasts.php | 34 ++ .../Language/sr-Latn/Subscription.php | 100 ++++++ 79 files changed, 1862 insertions(+), 495 deletions(-) create mode 100644 docs/src/sr-Latn/getting-started/auth.md create mode 100644 docs/src/sr-Latn/getting-started/docker.md create mode 100644 docs/src/sr-Latn/getting-started/install.md create mode 100644 docs/src/sr-Latn/getting-started/security.md create mode 100644 docs/src/sr-Latn/getting-started/update.md create mode 100644 docs/src/sr-Latn/index.md create mode 100644 modules/Auth/Language/sr-Latn/Auth.php create mode 100644 modules/Auth/Language/sr-Latn/Contributor.php create mode 100644 modules/Auth/Language/sr-Latn/MyAccount.php create mode 100644 modules/Auth/Language/sr-Latn/User.php create mode 100644 modules/PodcastImport/Language/sr-Latn/PodcastImport.php create mode 100644 modules/PremiumPodcasts/Language/sr-Latn/PremiumPodcasts.php create mode 100644 modules/PremiumPodcasts/Language/sr-Latn/Subscription.php diff --git a/app/Language/gl/Episode.php b/app/Language/gl/Episode.php index eea2fdd9..43c16681 100644 --- a/app/Language/gl/Episode.php +++ b/app/Language/gl/Episode.php @@ -23,7 +23,7 @@ return [ 'back_to_episodes' => 'Volver aos episodios de {podcast}', 'comments' => 'Comentarios', 'activity' => 'Actividade', - 'chapters' => 'Chapters', + 'chapters' => 'Capítulos', 'description' => 'Descrición do episodio', 'number_of_comments' => '{numberOfComments, plural, one {# comentario} @@ -35,13 +35,13 @@ return [ 'title' => 'Vista previa', 'not_published' => 'Sen publicar', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {Episodio publicado correctamente.} + scheduled {Episodio programado correctamente para {publication_date}.} + with_podcast {Este episodio vaise publicar ao mesmo tempo que o podcast.} + other {Este episodio aínda non se publicou.} }', 'publish' => 'Publicar', 'publish_edit' => 'Editar publicación', ], - 'no_chapters' => 'No chapters are available for this episode.', + 'no_chapters' => 'Non hai capítulos dispoñibles para este episodio.', ]; diff --git a/app/Language/kk/Comment.php b/app/Language/kk/Comment.php index 1dd8f5ea..1f9ee3c9 100644 --- a/app/Language/kk/Comment.php +++ b/app/Language/kk/Comment.php @@ -15,7 +15,7 @@ return [ 'episode_message_placeholder' => 'Write a comment…', 'reply_to_placeholder' => 'Reply to @{actorUsername}', 'submit' => 'Send', - 'submit_reply' => 'Reply', + 'submit_reply' => 'Жауап беру', ], 'likes' => '{numberOfLikes, plural, one {# like} diff --git a/app/Language/kk/Home.php b/app/Language/kk/Home.php index 1518239b..242ce571 100644 --- a/app/Language/kk/Home.php +++ b/app/Language/kk/Home.php @@ -9,7 +9,7 @@ declare(strict_types=1); */ return [ - 'all_podcasts' => 'All podcasts', + 'all_podcasts' => 'Барлық подкастар', 'sort_by' => 'Sort by', 'sort_options' => [ 'activity' => 'Recent activity', diff --git a/app/Language/sv/Podcast.php b/app/Language/sv/Podcast.php index fd2d786b..76ec241a 100644 --- a/app/Language/sv/Podcast.php +++ b/app/Language/sv/Podcast.php @@ -25,7 +25,7 @@ return [ one {# inlägg} other {# inlägg} }', - 'links' => 'Links', + 'links' => 'Länkar', 'activity' => 'Aktivitet', 'episodes' => 'Avsnitt', 'episodes_title' => 'Avsnitt av {podcastTitle}', diff --git a/docs/src/br/getting-started/auth.md b/docs/src/br/getting-started/auth.md index f60d7b66..851b3ebc 100644 --- a/docs/src/br/getting-started/auth.md +++ b/docs/src/br/getting-started/auth.md @@ -17,7 +17,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | +| roll | description | permissions | | ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | | Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | @@ -29,7 +29,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | +| aotre | description | | ----------------------- | ------------------------------------------------------------------ | | admin.access | Can access the Castopod admin area. | | admin.settings | Can access the Castopod settings. | @@ -49,7 +49,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | +| roll | description | permissions | | ---------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Merour·ez | Has complete control of podcast #{id}. | \* | | Embanner | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | @@ -62,7 +62,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | +| aotre | description | | ---------------------------- | ------------------------------------------------------------------------ | | view | Can view dashboard and analytics of podcast #{id}. | | edit | Can edit podcast #{id}. | diff --git a/docs/src/ca/getting-started/auth.md b/docs/src/ca/getting-started/auth.md index d0c8d512..4a873da4 100644 --- a/docs/src/ca/getting-started/auth.md +++ b/docs/src/ca/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------ | -| Super administrador | Té control complet sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Administrador | Administra el contingut de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Usos generals de Castopod. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | -------------------------------------------------------------------- | -| admin.access | Pot accedir a l'àrea d'administració de Castopod. | -| admin.settings | Pot accedir a la configuració de Castopod. | -| users.manage | Pot administrar els usuaris de Castopod. | -| persons.manage | Pot administrar persones. | -| pages.manage | Pot administrar pàgines. | -| podcasts.view | Pot veure els pòdcasts. | -| podcasts.create | Pot crear nous pòdcasts. | -| podcasts.import | Pot importar pòdcasts. | -| fediverse.manage-blocks | Pot evitar que actors/dominis del fedivers interactuen amb Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrador | Té control complet del pòdcast #{id}. | \* | -| Editor | Administra els continguts i la publicació del pòdcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autor | Administra el contingut del podcast #{id} però no el pot publicar. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Convidat | Col·laborador general del podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | -------------------------------------------------------------------------------------------------------------------- | -| view | Pot veure el tauler i les estadístiques del podcast #{id}. | -| edit | Pot editar el podcast #{id}. | -| delete | Pot suprimir el podcast #{id}. | -| manage-import | Pot sincronitzar el podcast importat #{id}. | -| manage-persons | Pot gestionar les subscripcions del podcast #{id}. | -| manage-subscriptions | Pot gestionar les subscripcions del podcast #{id}. | -| manage-contributors | Pot gestionar els col·laboradors del podcast #{id}. | -| manage-platforms | Pot establir/eliminar enllaços de plataforma del podcast #{id}. | -| manage-publications | Pot publicar el podcast #{id}. | -| manage-notifications | Pot veure i marcar les notificacions com a llegides per al podcast #{id}. | -| interact-as | Pot interactuar en nom del podcast #{id} per marcar les publicacions com a preferides, compartir-les o respondre-hi. | -| episodes.view | Pot veure el tauler i les estadístiques del podcast #{id}. | -| episodes.create | Pot crear episodis per al podcast #{id}. | -| episodes.edit | Pot editar el podcast #{id}. | -| episodes.delete | Pot suprimir el podcast #{id}. | -| episodes.manage-persons | Pot gestionar les subscripcions del podcast #{id}. | -| episodes.manage-clips | Pot gestionar clips de vídeo o fragments de so del pòdcast #{id}. | -| episodes.manage-publications | Pot publicar el podcast #{id}. | -| episodes.manage-comments | Pot crear/eliminar comentaris d'episodi del pòdcast #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/de/getting-started/auth.md b/docs/src/de/getting-started/auth.md index 2c471373..1f029437 100644 --- a/docs/src/de/getting-started/auth.md +++ b/docs/src/de/getting-started/auth.md @@ -10,7 +10,7 @@ kombiniert mit eigenen Regeln. Rollen und Berechtigungen sind auf zwei Ebenen definiert: 1. [instanzweit](#1-instance-wide-roles-and-permissions) -2. [pro Podcast](#2-per-podcast-roles-and-permissions) +2. [je Podcast](#2-per-podcast-roles-and-permissions) ## 1. Instanzweite Rollen und Berechtigungen @@ -18,11 +18,11 @@ definiert: -| role | description | permissions | +| Rolle | Beschreibung | Berechtigungen | | ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------ | | Super-Administrator | Hat die vollständige Kontrolle über Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Verwaltet Castopods Inhalte. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Allgemeine Benutzer von Castopod. | admin.access | +| Manager | Verwaltet Castopods Inhalt. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Generelle Benutzer von Castopod. | admin.access | @@ -30,17 +30,17 @@ definiert: -| permission | description | +| Berechtigung | Beschreibung | | ----------------------- | ---------------------------------------------------------------------------- | -| admin.access | Kann auf den Admin-Bereich von Castopod zugreifen. | -| admin.settings | Kann auf die Einstellungen von Castopod zugreifen. | -| users.manage | Kann Castopod-Benutzer verwalten. | -| persons.manage | Kann Mitwirkende verwalten. | +| admin.access | Kann auf den Castopod Adminbereich zugreifen. | +| admin.settings | Kann auf die Castopod Einstellungen zugreifen. | +| users.manage | Kann Castopod Benutzer verwalten. | +| persons.manage | Kann Personen verwalten. | | pages.manage | Kann Seiten verwalten. | | podcasts.view | Kann alle Podcasts einsehen. | | podcasts.create | Kann neue Podcasts erstellen. | | podcasts.import | Kann Podcasts importieren. | -| fediverse.manage-blocks | Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren. | +| fediverse.manage-blocks | Kann Fediverse Akteure/Domains davon abhalten, mit Castopod zu interagieren. | @@ -50,9 +50,9 @@ definiert: -| role | description | permissions | +| Rolle | Beschreibung | Berechtigungen | | ------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrator | Hat die vollständige Kontrolle über Podcast #{id}. | \* | +| Administrator | Hat vollständige Kontrolle über Podcast #{id}. | \* | | Editor | Verwaltet Inhalte und Veröffentlichungen von Podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | | Autor | Verwaltet Inhalte von Podcast #{id}, kann diese aber nicht veröffentlichen. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | | Gast | Allgemeiner Mitwirkender des Podcasts #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ definiert: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------------------------------------ | -| view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. | -| edit | Kann Podcast #{id} bearbeiten. | -| delete | Kann Podcast #{id} löschen. | -| manage-import | Kann den importierten Podcast #{id} synchronisieren. | -| manage-persons | Kann Abonnements des Podcasts #{id} verwalten. | -| manage-subscriptions | Kann Abonnements des Podcasts #{id} verwalten. | -| manage-contributors | Kann Mitwirkende des Podcasts #{id} verwalten. | -| manage-platforms | Kann Plattform-Links des Podcasts #{id} verwalten. | -| manage-publications | Kann Podcast #{id} veröffentlichen. | -| manage-notifications | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. | -| interact-as | Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten. | -| episodes.view | Kann das Dashboard und Analysen des Podcasts #{id} einsehen. | -| episodes.create | Kann Folgen für Podcast #{id} erstellen. | -| episodes.edit | Kann Podcast #{id} bearbeiten. | -| episodes.delete | Kann Podcast #{id} löschen. | -| episodes.manage-persons | Kann Abonnements des Podcasts #{id} verwalten. | -| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #{id} verwalten. | -| episodes.manage-publications | Kann Podcast #{id} veröffentlichen. | -| episodes.manage-comments | Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen. | +| Berechtigung | Beschreibung | +| ---------------------------- | ------------------------------------------------------------------------------------------------ | +| view | Kann Dashboard und Analysen des Podcasts #{id} einsehen. | +| edit | Kann Podcast #{id} bearbeiten. | +| delete | Kann Podcast #{id} löschen. | +| manage-import | Kann importierten Podcast #{id} synchronisieren. | +| manage-persons | Kann Mitwirkende des Podcasts #{id} verwalten. | +| manage-subscriptions | Kann Abonnements des Podcast #{id} verwalten. | +| manage-contributors | Kann Mitwirkende des Podcasts #{id} verwalten. | +| manage-platforms | Kann Plattform-Links des Podcast #{id} setzen/entfernen. | +| manage-publications | Kann Podcast #{id} veröffentlichen. | +| manage-notifications | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. | +| interact-as | Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder zu beantworten. | +| episodes.view | Kann Dashboard und Analysen des Podcasts #{id} einsehen. | +| episodes.create | Kann Folgen für Podcast #{id} erstellen. | +| episodes.edit | Kann Podcast #{id} bearbeiten. | +| episodes.delete | Kann Podcast #{id} löschen. | +| episodes.manage-persons | Kann Abonnements des Podcast #{id} verwalten. | +| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #{id} verwalten. | +| episodes.manage-publications | Kann Podcast #{id} veröffentlichen. | +| episodes.manage-comments | Du kannst Episodenkommentare von Podcast #{id} erstellen/entfernen. | diff --git a/docs/src/el/getting-started/auth.md b/docs/src/el/getting-started/auth.md index a9f7df64..e041016b 100644 --- a/docs/src/el/getting-started/auth.md +++ b/docs/src/el/getting-started/auth.md @@ -18,7 +18,7 @@ sidebarDepth: 3 -| role | description | permissions | +| ρόλος | περιγραφή | δικαιώματα | | ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | | Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | @@ -30,17 +30,17 @@ sidebarDepth: 3 -| permission | description | -| ----------------------- | -------------------------------------------------------------------------------------- | -| admin.access | Μπορεί να έχει πρόσβαση στην περιοχή διαχείρισης Castopod. | -| admin.settings | Μπορεί να έχει πρόσβαση στις ρυθμίσεις Castopod. | -| users.manage | Μπορεί να διαχειριστεί τους χρήστες Castopod. | -| persons.manage | Μπορεί να διαχειριστεί τα άτομα. | -| pages.manage | Μπορεί να διαχειριστεί τις σελίδες. | -| podcasts.view | Μπορεί να δει όλα τα podcasts. | -| podcasts.create | Μπορεί να δημιουργήσει νέα podcasts. | -| podcasts.import | Μπορεί να εισάγει podcasts. | -| fediverse.manage-blocks | Μπορεί να εμποδίσει τους ψευτογενείς ηθοποιούς/τομείς να αλληλεπιδρούν με το Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -50,12 +50,12 @@ sidebarDepth: 3 -| role | description | permissions | -| ------------ | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Διαχειριστής | Έχει πλήρη έλεγχο του podcast #{id}. | \* | -| Εκδότης | Διαχειρίζεται περιεχόμενο και δημοσιεύσεις του podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Συντάκτης | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Επισκέπτης | Γενικός συντελεστής του podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | diff --git a/docs/src/es/getting-started/auth.md b/docs/src/es/getting-started/auth.md index 5a049c42..9024c6c0 100644 --- a/docs/src/es/getting-started/auth.md +++ b/docs/src/es/getting-started/auth.md @@ -18,10 +18,10 @@ niveles: -| role | description | permissions | +| roles | descripción | permisos | | ------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------ | | Super administrador | Tiene control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Administrador | Administrar contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Administrador | Gestiona el contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | | Podcaster | Usuarios generales de Castopod. | admin.access | @@ -30,7 +30,7 @@ niveles: -| permission | description | +| permisos | descripción | | ----------------------- | ------------------------------------------------------------------------------ | | admin.access | Puedes acceder al área de administración de Castopod. | | admin.settings | Puede acceder a la configuración de Castopod. | @@ -50,7 +50,7 @@ niveles: -| role | description | permissions | +| roles | descripción | permisos | | ------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Administrador | Tiene el control completo del podcast #{id}. | \* | | Editor | Gestiona el contenido y las publicaciones del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | @@ -63,26 +63,26 @@ niveles: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------- | -| view | Puede ver el panel de control y analíticas del episodio #{id}. | -| edit | Puede editar el podcast #{id}. | -| delete | Puede borrar el podcast #{id}. | -| manage-import | Puede sincronizar el podcast importado #{id}. | -| manage-persons | Puede administrar las suscripciones del podcast #{id}. | -| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. | -| manage-contributors | Puede administrar colaboradores del podcast #{id}. | -| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. | -| manage-publications | Puede publicar el podcast #{id}. | -| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. | -| interact-as | Puede interactuar como el podcast #{id} para marcar como favarito, compartir o responder a las publicaciones. | -| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. | -| episodes.create | Puede crear episodios para el podcast #{id}. | -| episodes.edit | Puede editar el podcast #{id}. | -| episodes.delete | Puede borrar el podcast #{id}. | -| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. | -| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. | -| episodes.manage-publications | Puede publicar el podcast #{id}. | -| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. | +| permisos | descripción | +| ---------------------------- | -------------------------------------------------------------------------------------------------- | +| view | Puede ver el panel de control y análisis del podcast #{id}. | +| edit | Puede editar podcast #{id}. | +| delete | Puede borrar el podcast #{id}. | +| manage-import | Puede sincronizar el podcast importado #{id}. | +| manage-persons | Puede administrar las suscripciones del podcast #{id}. | +| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. | +| manage-contributors | Puede administrar colaboradores del podcast #{id}. | +| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. | +| manage-publications | Puede publicar el podcast #{id}. | +| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. | +| interact-as | Puede interactuar como el podcast #{id} para favoritar, compartir o responder a las publicaciones. | +| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. | +| episodes.create | Puede crear episodios para el podcast #{id}. | +| episodes.edit | Puede editar episodios #{id}. | +| episodes.delete | Puede borrar el podcast #{id}. | +| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. | +| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. | +| episodes.manage-publications | Puede publicar el podcast #{id}. | +| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. | diff --git a/docs/src/es/getting-started/update.md b/docs/src/es/getting-started/update.md index db80c992..bf7552ea 100644 --- a/docs/src/es/getting-started/update.md +++ b/docs/src/es/getting-started/update.md @@ -61,8 +61,7 @@ Las versiones pueden venir con instrucciones de actualización adicionales (véa la página de [lanzamientos](https://code.castopod.org/adaures/castopod/-/releases)). -- cf. - [No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?](#no-he-actualizado-mi-instancia-en-mucho-tiempo-¿qué-debo-hacer) +- cf. No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer? ::: diff --git a/docs/src/fr/getting-started/auth.md b/docs/src/fr/getting-started/auth.md index ee460680..db3e409c 100644 --- a/docs/src/fr/getting-started/auth.md +++ b/docs/src/fr/getting-started/auth.md @@ -18,11 +18,11 @@ autorisations sont définis sur deux niveaux : -| role | description | permissions | -| -------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super administrat·rice·eur | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Gestionnaire | Gère le contenu de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcast·rice·eur | Utilisateurs généraux de Castopod. | admin.access | +| rôle | description | permissions | +| ------------ | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Gestionnaire | Gère le contenu de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Utilisateurs généraux de Castopod. | admin.access | @@ -30,17 +30,17 @@ autorisations sont définis sur deux niveaux : -| permission | description | -| ----------------------- | -------------------------------------------------------------------- | -| admin.access | Peut accéder à la zone d'administration Castopod. | -| admin.settings | Peut accéder aux paramètres de Castopod. | -| users.manage | Peut gérer les utilisateurs de Castopod. | -| persons.manage | Permet de gérer les personnes. | -| pages.manage | Permet de gérer les pages. | -| podcasts.view | Peut voir tous les podcasts. | -| podcasts.create | Peut créer de nouveaux podcasts. | -| podcasts.import | Peut importer des podcasts. | -| fediverse.manage-blocks | Peut empêcher des act·rice·eur·s/domaines d'interagir avec Castopod. | +| autorisation | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Peut accéder à la zone d'administration Castopod. | +| admin.settings | Peut accéder aux paramètres de Castopod. | +| users.manage | Peut gérer les utilisateurs de Castopod. | +| persons.manage | Can manage persons. | +| pages.manage | Permet de gérer les pages. | +| podcasts.view | Peut voir tous les podcasts. | +| podcasts.create | Peut créer de nouveaux podcasts. | +| podcasts.import | Peut importer des podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -50,12 +50,12 @@ autorisations sont définis sur deux niveaux : -| role | description | permissions | -| ---------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrateur | A un contrôle total sur le podcast #{id}. | \* | -| Éditeur | Gère le contenu et les publications du podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Auteur / Autrice | Gère le contenu du podcast #{id} , mais ne peut pas le publier. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Invité | Contributeur général du podcast #{id}. | view, episodes.view | +| rôle | description | permissions | +| ------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | A un contrôle total sur le podcast #{id}. | \* | +| Éditeur | Gère le contenu et les publications du podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Auteur | Gère le contenu du podcast #{id} , mais ne peut pas le publier. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Invité | Contributeur général du podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ autorisations sont définis sur deux niveaux : -| permission | description | -| ---------------------------- | -------------------------------------------------------------------------------------------------- | -| view | Peut voir le tableau de bord et les analyses du podcast #{id}. | -| edit | Peut éditer le podcast #{id}. | -| delete | Peut supprimer le podcast #{id}. | -| manage-import | Peut synchroniser le podcast importé #{id}. | -| manage-persons | Permet de gérer les abonnements au podcast #{id}. | -| manage-subscriptions | Permet de gérer les abonnements au podcast #{id}. | -| manage-contributors | Permet de gérer les contributeurs du podcast #{id}. | -| manage-platforms | Peut configurer/supprimer les liens de la plateforme du podcast #{id}. | -| manage-publications | Peut publier le podcast #{id}. | -| manage-notifications | Peut afficher et marquer les notifications comme lues pour le podcast #{id}. | -| interact-as | Peut interagir en tant que podcast #{id} pour mettre en favori, partager ou répondre aux messages. | -| episodes.view | Peut voir le tableau de bord et les analyses du podcast #{id}. | -| episodes.create | Peut créer des épisodes pour le podcast #{id}. | -| episodes.edit | Peut éditer le podcast #{id}. | -| episodes.delete | Peut supprimer le podcast #{id}. | -| episodes.manage-persons | Permet de gérer les abonnements au podcast #{id}. | -| episodes.manage-clips | Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}. | -| episodes.manage-publications | Peut publier le podcast #{id}. | -| episodes.manage-comments | Peut créer/supprimer les commentaires de l'épisode du podcast #{id}. | +| autorisation | description | +| ---------------------------- | ----------------------------------------------------------------------------------------- | +| voir | Visualisation du tableau de bord et de l'analyse du podcast #{id}. | +| éditer | Peut éditer le podcast #{id}. | +| supprimer | Peut supprimer le podcast #{id}. | +| gérer les importations | Peut synchroniser le podcast importé #{id}. | +| gérer les personnes | Permet de gérer les abonnements au podcast #{id}. | +| gérer les abonnements | Permet de gérer les abonnements au podcast #{id}. | +| gérer contributeurs | Permet de gérer les contributeurs du podcast #{id}. | +| gérer les plates-formes | Peut configurer/supprimer les liens de la plateforme du podcast #{id}. | +| gérer les publications | Peut publier le podcast #{id}. | +| gérer les notifications | Peut afficher et marquer les notifications comme lues pour le podcast #{id}. | +| interagir en tant que | Peut interagir en tant que podcast #{id} pour ajouter, partager ou répondre aux messages. | +| episodes.view | Peut voir le tableau de bord et les analyses du podcast #{id}. | +| créer des épisodes | Peut créer des épisodes pour le podcast #{id}. | +| éditer les épisodes | Peut éditer le podcast #{id}. | +| supprimer les épisodes | Peut supprimer le podcast #{id}. | +| episodes.manage-persons | Permet de gérer les abonnements au podcast #{id}. | +| episodes.manage-clips | Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}. | +| episodes.manage-publications | Peut publier le podcast #{id}. | +| episodes.manage-comments | Peut créer/supprimer les commentaires de l'épisode du podcast #{id}. | diff --git a/docs/src/fr/getting-started/update.md b/docs/src/fr/getting-started/update.md index c064bb13..b414e25c 100644 --- a/docs/src/fr/getting-started/update.md +++ b/docs/src/fr/getting-started/update.md @@ -61,8 +61,7 @@ Les versions peuvent être accompagnées d'instructions de mise à jour supplémentaires (cf. la [page des notes de versions](https://code.castopod.org/adaures/castopod/-/releases)). -- cf. - [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#je-nai-pas-mis-à-jour-mon-instance-depuis-longtemps-que-devrais-je-faire) +- Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ? ::: @@ -80,7 +79,7 @@ bas à gauche. Vous pouvez également trouver la version dans l'application `> Configuration > Constantes.php` dossier. -### Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ? +### [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) Pas de problème ! Il suffit d'obtenir la dernière version comme décrit ci-dessus. Lorsque vous exécutez les instructions de mise à jour (4), lancez-les diff --git a/docs/src/gd/getting-started/auth.md b/docs/src/gd/getting-started/auth.md index d2dc39ab..ff5d59c0 100644 --- a/docs/src/gd/getting-started/auth.md +++ b/docs/src/gd/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | -| Sàr-rianaire | Smachd gu lèir air Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manaidsear | Stiùireadh susbaint Chastopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Pod-chraoladair | Luchd-cleachdaidh coitcheann Chastopod. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | --------------------------------------------------------------------------------------------- | -| admin.access | ’S urrainn dhaibh raon rianachd Chastopod inntrigeadh. | -| admin.settings | ’S urrainn dhaibh roghainnean Chastopod inntrigeadh. | -| users.manage | ’S urrainn dhaibh luchdc-leachdaidh Chastopod a stiùireadh. | -| persons.manage | ’S urrainn dhaibh daoine a stiùireadh. | -| pages.manage | ’S urrainn dhaibh duilleagan a stiùireadh. | -| podcasts.view | Chì iad a h-uile pod-chraoladh. | -| podcasts.create | ’S urrainn dhaibh pod-chraolaidhean ùra a chruthachadh. | -| podcasts.import | ’S urrainn dhaibh pod-chraolaidhean ion-phortadh. | -| fediverse.manage-blocks | ’S urrainn dhaibh actairean/àrainnean a cho-shaoghail a bhacadh o eadar-ghabhail le Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| --------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Rianaire | Smachd gu lèir air air a’ phod-chraoladh #{id}. | \* | -| Deasaiche | A’ stiùireadh susbaint is foillseachaidhean a’ phod-chraoladh #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Ùghdar | A’ stiùireadh susbaint a’ phod-chraolaidh #{id} ach gun chomas foillseachaidh. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Aoigh | Neach-cuideachaidh a’ phod-chraolaidh #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| view | Cead an deas-bhòrd agus anailiseachd a’ phod-chraolaidh #{id} a shealltainn. | -| edit | ’S urrainn dhaibh am pod-chraoladh #{id} a dheasachadh. | -| delete | ’S urrainn dhaibh am pod-chraoladh #{id} a sguabadh às. | -| manage-import | ’S urrainn dhaibh am pod-chraoladh #{id} air ion-phortadh a shioncronachadh. | -| manage-persons | ’S urrainn dhaibh na fo-sgrìobhaidhean air a’ phod-chraoladh #{id} a stiùireadh. | -| manage-subscriptions | ’S urrainn dhaibh na fo-sgrìobhaidhean air a’ phod-chraoladh #{id} a stiùireadh. | -| manage-contributors | ’S urrainn dhaibh an luchd-cuideachaidh aig a’ phod-chraoladh #{id} a stiùireadh. | -| manage-platforms | ’S urrainn dhaibh ceanglaichean-ùrlair a’ phod-chraolaidh #{id} a shuidheachadh/a thoirt air falbh. | -| manage-publications | ’S urrainn dhaibh am pod-chraoladh #{id} fhoillseachadh. | -| manage-notifications | Chì iad brathan a’ phod-chraolaidh #{id} agus ’s urrainn dhaibh comharra a chur gun deach an leughadh. | -| interact-as | ’S urrainn dhaibh eadar-ghabhail ’na phod-chraoladh #{id} airson annsachdan, co-roinneadh is freagairtean do phostaichean. | -| episodes.view | Cead an deas-bhòrd agus anailiseachd a’ phod-chraolaidh #{id} a shealltainn. | -| episodes.create | ’S urrainn dhaibh eapasodan a chruthachadh dhan phod-chraoladh #{id}. | -| episodes.edit | ’S urrainn dhaibh am pod-chraoladh #{id} a dheasachadh. | -| episodes.delete | ’S urrainn dhaibh am pod-chraoladh #{id} a sguabadh às. | -| episodes.manage-persons | ’S urrainn dhaibh na fo-sgrìobhaidhean air a’ phod-chraoladh #{id} a stiùireadh. | -| episodes.manage-clips | ’S urrainn dhaibh cliopaichean video no blasan-fuaime aig a’ phod-chraoladh #{id} a stiùireadh. | -| episodes.manage-publications | ’S urrainn dhaibh am pod-chraoladh #{id} fhoillseachadh. | -| episodes.manage-comments | ’S urrainn dhaibh beachdan air eapasod a’ phod-chraolaidh #{id} a chruthachadh/a thoirt air falbh. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/gl/getting-started/auth.md b/docs/src/gl/getting-started/auth.md index 0faec1c6..ff5d59c0 100644 --- a/docs/src/gl/getting-started/auth.md +++ b/docs/src/gl/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ------------------------------------ | ------------------------------------------------------------------------------------------ | -| Super Admin | Ten control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Xestora | Quen xestiona o contido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Usuaria común de Castopod. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ------------------------------------------------------------------------------ | -| admin.access | Pode acceder á área de administración. | -| admin.settings | Pode acceder aos axustes de Castopod. | -| users.manage | Pode xestionar as usuarias de Castopod. | -| persons.manage | Pode xestionar persoas. | -| pages.manage | Pode xestionar páxinas. | -| podcasts.view | Pode ver tódolos podcast. | -| podcasts.create | Pode crear novos podcast. | -| podcasts.import | Pode importar podcasts. | -| fediverse.manage-blocks | Pode bloquear actores/dominios do fediverso evitando interactuar con Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| --------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Ten control total sobre o podcast #{id}. | \* | -| Editora | Persoa que xestiona o contido e publicacións do podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autora | Persoa que xestiona o contido do podcast #{id} pero non pode publicalo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Convidada | Contribuínte básico ao podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | --------------------------------------------------------------------------------------- | -| view | Pode ver o taboleiro e estatísticas do podcast #{id}. | -| edit | Pode editar o podcast #{id}. | -| delete | Pode eliminar o podcast #{id}. | -| manage-import | Pode sincronizar o podcast importado #{id}. | -| manage-persons | Pode xestionar as subscricións do podcast #{id}. | -| manage-subscriptions | Pode xestionar as subscricións do podcast #{id}. | -| manage-contributors | Pode xestionar as contribucións ao podcast #{id}. | -| manage-platforms | Pode establecer/eliminar ligazóns a plataformas do podcast #{id}. | -| manage-publications | Pode publicar o podcast #{id}. | -| manage-notifications | Pode ver e marcar as notificacións como lidas no podcast #{id}. | -| interact-as | Pode actuar como o podcast #{id} para compartir, favorecer ou responder a publicacións. | -| episodes.view | Pode ver o taboleiro e estatísticas do podcast #{id}. | -| episodes.create | Pode crear episodios para o podcast #{id}. | -| episodes.edit | Pode editar o podcast #{id}. | -| episodes.delete | Pode eliminar o podcast #{id}. | -| episodes.manage-persons | Pode xestionar as subscricións do podcast #{id}. | -| episodes.manage-clips | Pode xestionar os clips de vídeo e extractos de audio do podcast #{id}. | -| episodes.manage-publications | Pode publicar o podcast #{id}. | -| episodes.manage-comments | Pode crear/eliminar comentarios dos episodios do podcast #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/it/getting-started/auth.md b/docs/src/it/getting-started/auth.md index 4d2de508..18fb8027 100644 --- a/docs/src/it/getting-started/auth.md +++ b/docs/src/it/getting-started/auth.md @@ -18,11 +18,11 @@ definiti a due livelli: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| ruolo | descrizione | permessi | +| ----------- | ---------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Ha il pieno controllo su Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Gestisce il contenuto di Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Utenti generali di Castopod. | admin.access | @@ -30,17 +30,17 @@ definiti a due livelli: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permesso | descrizione | +| ----------------------- | ------------------------------------------------------------------------- | +| admin.access | Può accedere alla zona di amministrazione di Castopod. | +| admin.settings | Può accedere alle impostazioni di Castopod. | +| users.manage | Può gestire gli utenti di Castopod. | +| persons.manage | Può gestire le persone. | +| pages.manage | Può gestire le pagine. | +| podcasts.view | Può visualizzare tutti i podcast. | +| podcasts.create | Può creare nuovi podcast. | +| podcasts.import | Può importare podcast. | +| fediverse.manage-blocks | Può impedire agli attori/domini del fediverso di interagire con Castopod. | @@ -50,12 +50,12 @@ definiti a due livelli: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| ruolo | descrizione | autorizzazioni | +| ------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Ha il controllo completo del podcast #{id}. | \* | +| Editor | Gestisce contenuti e pubblicazioni del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autore | Gestisce i contenuti del podcast #{id}, ma non li può pubblicare. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Ospite | Collaboratore generale del podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ definiti a due livelli: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| autorizzazione | descrizione | +| ---------------------------- | ---------------------------------------------------------------------------------------------------- | +| view | Può visualizzare il pannello di controllo e le statistiche del podcast #{id}. | +| edit | Può modificare il podcast #{id}. | +| delete | Può eliminare il podcast #{id}. | +| manage-import | Può sincronizzare il podcast #{id} importato. | +| manage-persons | Può gestire le iscrizioni del podcast #{id}. | +| manage-subscriptions | Può gestire le iscrizioni del podcast #{id}. | +| manage-contributors | Può gestire i collaboratori del podcast #{id}. | +| manage-platforms | Può impostare/rimuovere i link della piattaforma del podcast #{id}. | +| manage-publications | Può pubblicare il podcast #{id}. | +| manage-notifications | Può visualizzare e contrassegnare le notifiche come lette per il podcast #{id}. | +| interact-as | Può interagire come il podcast #{id}, per salvare tra i preferiti, condividere o rispondere ai post. | +| episodes.view | Può visualizzare il pannello di controllo e le statistiche del podcast #{id}. | +| episodes.create | Può creare episodi per il podcast #{id}. | +| episodes.edit | Può modificare il podcast #{id}. | +| episodes.delete | Può eliminare il podcast #{id}. | +| episodes.manage-persons | Può gestire gli abbonamenti del podcast #{id}. | +| episodes.manage-clips | Può gestire le clip video o i suoni del podcast #{id}. | +| episodes.manage-publications | Può pubblicare il podcast #{id}. | +| episodes.manage-comments | Può creare/rimuovere i commenti dell'episodio del podcast #{id}. | diff --git a/docs/src/nl/getting-started/auth.md b/docs/src/nl/getting-started/auth.md index 1dfdc972..01b2a298 100644 --- a/docs/src/nl/getting-started/auth.md +++ b/docs/src/nl/getting-started/auth.md @@ -18,11 +18,11 @@ niveaus: -| role | description | permissions | -| --------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | -| Super beheerder | Heeft de volledige controle over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Beheerder | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Algemene gebruikers van Castopod. | admin.access | +| rol | omschrijving | rechten | +| ----------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | +| Super admin | Heeft de volledige controle over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Beheerder | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Algemene gebruikers van Castopod. | admin.access | @@ -30,7 +30,7 @@ niveaus: -| permission | description | +| recht | omschrijving | | ----------------------- | -------------------------------------------------------------------- | | admin.access | Kan toegang krijgen tot de beheeromgeving van Castopod. | | admin.settings | Kan toegang krijgen tot de instellingen van Castopod. | @@ -50,10 +50,10 @@ niveaus: -| role | description | permissions | +| rol | omschrijving | rechten | | --------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Beheerder | Heeft de volledige controle over podcast #{id}. | \* | -| Redacteur | Beheert inhoud en publicaties van podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Editor | Beheert inhoud en publicaties van podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | | Auteur | Beheert de inhoud van podcast #{id} maar kan deze niet publiceren. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | | Gast | Algemene bijdrager van podcast #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ niveaus: -| permission | description | +| recht | omschrijving | | ---------------------------- | -------------------------------------------------------------------------------------- | -| view | Kan dashboard en analyses van podcast #{id} zien. | -| edit | Kan podcast #{id} wijzigen. | -| delete | Kan podcast #{id} verwijderen. | +| weergeven | Kan dashboard en statistieken van podcast #{id} zien. | +| bewerken | Kan podcast #{id} wijzigen. | +| verwijderen | Kan podcast #{id} verwijderen. | | manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. | -| manage-persons | Kan abonnementen van podcast #{id} beheren. | -| manage-subscriptions | Kan abonnementen van podcast #{id} beheren. | +| manage-persons | Kan personen van podcast #{id} beheren. | +| manage-subscriptions | Kan abonnees van podcast #{id} beheren. | | manage-contributors | Kan bijdragers van podcast #{id} beheren. | | manage-platforms | Kan platform links van podcast #{id} instellen of verwijderen. | | manage-publications | Kan podcast #{id} publiceren. | -| manage-notifications | Kan meldingen bekijken en markeren als gelezen voor podcast #{id}. | +| manage-notifications | Kan meldingen voor podcast #{id} bekijken en als gelezen markeren. | | interact-as | Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten. | -| episodes.view | Kan dashboard en analyses van podcast #{id} zien. | +| episodes.view | Kan dashboard en statistieken van podcast #{id} zien. | | episodes.create | Kan afleveringen voor podcast #{id} aanmaken. | -| episodes.edit | Kan podcast #{id} wijzigen. | -| episodes.delete | Kan podcast #{id} verwijderen. | -| episodes.manage-persons | Kan abonnementen van podcast #{id} beheren. | +| episodes.edit | Kan afleveringen van podcast #{id} wijzigen. | +| episodes.delete | Kan afleveringen van podcast #{id} verwijderen. | +| episodes.manage-persons | Kan personen in aflevering van podcast #{id} beheren. | | episodes.manage-clips | Kan videoclips of soundbites van podcast #{id} beheren. | -| episodes.manage-publications | Kan podcast #{id} publiceren. | -| episodes.manage-comments | Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen. | +| episodes.manage-publications | Kan afleveringen van podcast #{id} publiceren. | +| episodes.manage-comments | Kan reacties op afleveringen van podcast #{id} maken of verwijderen. | diff --git a/docs/src/nn-NO/getting-started/auth.md b/docs/src/nn-NO/getting-started/auth.md index 79c5653a..7cd0073d 100644 --- a/docs/src/nn-NO/getting-started/auth.md +++ b/docs/src/nn-NO/getting-started/auth.md @@ -17,11 +17,11 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: -| role | description | permissions | +| rolle | skildring | løyve | | ----------- | -------------------------------- | ------------------------------------------------------------------------------------------ | | Superstyrar | Har full kontroll over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Leiar | Styrer innhaldet på Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podkastar | Vanlege Castopod-brukarar. | admin.access | +| Podkastar | Vanlege Castopod-brukarar. | admin.tilgang | @@ -29,7 +29,7 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: -| permission | description | +| løyve | skildring | | ----------------------- | ---------------------------------------------------------------------- | | admin.access | Kan bruka styringspanelet for Castopod. | | admin.settings | Kan få tilgang til innstillingane for Castopod. | @@ -49,7 +49,7 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: -| role | description | permissions | +| rolle | skildring | løyve | | ------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Administrator | Har full kontroll over podkasten #{id}. | \* | | Redaktør | Styrer innhald og publisering for podkasten #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | @@ -62,7 +62,7 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: -| permission | description | +| løyve | description | | ---------------------------- | ------------------------------------------------------------------ | | view | Kan sjå styringspanelet og analysedata for podkasten #{id}. | | edit | Kan redigera podkasten #{id}. | diff --git a/docs/src/pt-BR/getting-started/auth.md b/docs/src/pt-BR/getting-started/auth.md index 79acc264..71ae5a8f 100644 --- a/docs/src/pt-BR/getting-started/auth.md +++ b/docs/src/pt-BR/getting-started/auth.md @@ -18,11 +18,11 @@ níveis: -| role | description | permissions | -| ------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super administrador | Tem controle completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Gerente | Gerencia o conteúdo de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Usuários gerais do Castopod. | admin.access | +| cargos | descrição | permissões | +| ----------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Tem controle completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Gerentes | Gerencia o conteúdo de Castopod. | criar.podcasts, importar.podcasts, gerenciar.pessoas, gerenciar.páginas | +| Podcaster | Usuários gerais do Castopod. | admin.access | @@ -30,7 +30,7 @@ níveis: -| permission | description | +| permissões | descrição | | ----------------------- | ---------------------------------------------------------------- | | admin.access | Pode acessar a área de administração do Castopod. | | admin.settings | Pode acessar as configurações de Castopod. | @@ -50,12 +50,12 @@ níveis: -| role | description | permissions | -| ------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrador | Tem controle completo do podcast #{id}. | \* | -| Editor | Gerencia o conteúdo e as publicações do podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autor | Gerencia o conteúdo do podcast #{id} mas não pode publicá-los. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Convidado | Contribuidor geral do podcast #{id}. | view, episodes.view | +| cargos | descrição | permissões | +| --------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Tem controle completo de podcast #{id}. | \* | +| Editor | Gerencia o conteúdo e as publicações do podcast #{id}. | visualizar, editar, gerenciar-importação, gerenciar-pessoas, gerenciar-plataformas, gerenciar-publicações, gerenciar-notificações, interagir-com, visualizar.episódios, criar.episódios,deletar.episódios, gerenciar-pessoas.episódios, gerenciar-clips.episódios, gerenciar-publicações.episódios, gerenciar-comentários.episódios | +| Autor | Gerencia o conteúdo do podcast #{id} mas não pode publicá-los. | visualizar, gerenciar-pessoas, visualizar.episódios, criar.episódios, editar.episódios, gerenciar-pessoas.episódios, gerenciar-clips.episódios | +| Convidado | Contribuidor geral do podcast #{id}. | visualizar, visualizar.episódios | @@ -63,26 +63,26 @@ níveis: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------------------------- | -| view | Pode visualizar o painel de controle e análises do podcast #{id}. | -| edit | Pode editar o podcast #{id}. | -| delete | Pode deletar episódios do podcast #{id}. | -| manage-import | Pode sincronizar o podcast importado #{id}. | -| manage-persons | Pode gerenciar assinaturas do podcast #{id}. | -| manage-subscriptions | Pode gerenciar assinaturas do podcast #{id}. | -| manage-contributors | Pode gerenciar contribuidores do podcast #{id}. | -| manage-platforms | Pode definir/remover links de plataforma do podcast #{id}. | -| manage-publications | Pode publicar podcast #{id}. | -| manage-notifications | Pode ver e marcar notificações como lidas para o podcast #{id}. | -| interact-as | Pode interagir com o podcast #{id} para favorito, compartilhar ou responder às publicações. | -| episodes.view | Pode visualizar o painel de controle e análises do podcast #{id}. | -| episodes.create | Pode criar episódios para o podcast #{id}. | -| episodes.edit | Pode editar o podcast #{id}. | -| episodes.delete | Pode deletar episódios do podcast #{id}. | -| episodes.manage-persons | Pode gerenciar assinaturas do podcast #{id}. | -| episodes.manage-clips | Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}. | -| episodes.manage-publications | Pode publicar podcast #{id}. | -| episodes.manage-comments | Pode criar/remover comentários de episódio do podcast #{id}. | +| permissões | descrição | +| --------------------------------- | ------------------------------------------------------------------------------------------- | +| visualizar | Pode visualizar o painel de controle e análise de podcast #{id}. | +| editar | Pode editar podcast #{id}. | +| excluir | Pode excluir o podcast #{id}. | +| gerenciar-importações | Pode sincronizar o podcast importado #{id}. | +| gerenciar-pessoas | Pode gerenciar assinantes de podcast #{id}. | +| gerenciar-assinaturas | Pode gerenciar assinaturas de podcast #{id}. | +| gerente-contribuidores | Pode gerenciar contribuidores do podcast #{id}. | +| gerenciar-plataformas | Pode definir/remover links de plataforma do podcast #{id}. | +| gerencie-publicações | Pode publicar podcast #{id}. | +| gerenciar-notificações | Pode ver e marcar notificações como lidas para o podcast #{id}. | +| interagir-como | Pode interagir com o podcast #{id} para favorito, compartilhar ou responder às publicações. | +| visualizar.episódios | Pode visualizar o painel de controle e análise de podcast #{id}. | +| criar.episódio | Pode criar episódios para o podcast #{id}. | +| editar.episódios | Pode editar o podcast #{id}. | +| deletar.episódios | Pode deletar episódios do podcast #{id}. | +| gerenciar-pessoas.episódios | Pode gerenciar assinaturas de episódios do podcast #{id}. | +| gerenciar-clips.episódios | Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}. | +| gerenciar-publicações.episódios | Pode publicar episódios do podcast #{id}. | +| gerenteciar-comentários.episódios | Pode criar/remover comentários de episódio do podcast #{id}. | diff --git a/docs/src/ro/getting-started/auth.md b/docs/src/ro/getting-started/auth.md index 093969f2..4b279e34 100644 --- a/docs/src/ro/getting-started/auth.md +++ b/docs/src/ro/getting-started/auth.md @@ -18,11 +18,11 @@ niveluri: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| rol | descriere | permisiuni | +| ----------- | ----------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Deține controlul complet asupra Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Gestionează conținutul Castopodului. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Utilizatorii generali ai Castopod. | admin.access | @@ -30,17 +30,17 @@ niveluri: -| permission | description | -| ----------------------- | ------------------------------------------------------------------ | -| admin.access | Can access the Castopod admin area. | -| admin.settings | Can access the Castopod settings. | -| users.manage | Can manage Castopod users. | -| persons.manage | Can manage persons. | -| pages.manage | Can manage pages. | -| podcasts.view | Can view all podcasts. | -| podcasts.create | Can create new podcasts. | -| podcasts.import | Can import podcasts. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | +| permisiune | descriere | +| ----------------------- | -------------------------------------------------------------------------- | +| admin.access | Poate accesa zona de administrare Castopod. | +| admin.settings | Poate accesa setările Castopod. | +| users.manage | Poate gestiona utilizatorii Castopod. | +| persons.manage | Poate gestiona persoane. | +| pages.manage | Poate gestiona pagini. | +| podcasts.view | Poate vedea toate podcast-urile. | +| podcasts.create | Poate crea noi podcast-uri. | +| podcasts.import | Poate importa podcast-uri. | +| fediverse.manage-blocks | Poate bloca actorilor/domenii din fediverse să interacționeze cu Castopod. | @@ -50,12 +50,12 @@ niveluri: -| role | description | permissions | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Has complete control of podcast #{id}. | \* | -| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | General contributor of the podcast #{id}. | view, episodes.view | +| rol | descriere | permisiuni | +| ------ | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Deține controlul complet asupra podcastului #{id}. | \* | +| Editor | Gestionează conținutul și publicațiile podcastului #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Gestionează conținutul podcastului #{id} dar nu poate publica. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | Contribuitor al podcastului #{id}. | view, episodes.view | @@ -63,26 +63,26 @@ niveluri: -| permission | description | -| ---------------------------- | ------------------------------------------------------------------------ | -| view | Can view dashboard and analytics of podcast #{id}. | -| edit | Can edit podcast #{id}. | -| delete | Can delete podcast #{id}. | -| manage-import | Can synchronize imported podcast #{id}. | -| manage-persons | Can manage subscriptions of podcast #{id}. | -| manage-subscriptions | Can manage subscriptions of podcast #{id}. | -| manage-contributors | Can manage contributors of podcast #{id}. | -| manage-platforms | Can set/remove platform links of podcast #{id}. | -| manage-publications | Can publish podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | -| episodes.view | Can view dashboard and analytics of podcast #{id}. | -| episodes.create | Can create episodes for podcast #{id}. | -| episodes.edit | Can edit podcast #{id}. | -| episodes.delete | Can delete podcast #{id}. | -| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | -| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | -| episodes.manage-publications | Can publish podcast #{id}. | -| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | +| permisiune | descriere | +| ---------------------------- | ------------------------------------------------------------------------------------------------------- | +| view | Poate vedea panoul de control și analiticele podcastului #{id}. | +| edit | Poate edita podcastul #{id}. | +| delete | Poate șterge podcastul #{id}. | +| manage-import | Poate sincroniza podcastul importat #{id}. | +| manage-persons | Poate administra abonamentele podcastului #{id}. | +| manage-subscriptions | Poate administra abonamentele podcastului #{id}. | +| manage-contributors | Poate administra colaboratorii podcastului #{id}. | +| manage-platforms | Poate seta/elimina link-urile podcastului #{id}. | +| manage-publications | Poate publica podcastul #{id}. | +| manage-notifications | Poate vizualiza și marca notificările ca fiind citite pentru podcastul #{id}. | +| interact-as | Poate interacționa ca podcastul #{id} pentru adăuga la favorite, a distribui sau a răspunde la postări. | +| episodes.view | Poate vizualiza panoul de control și analiticile podcastului #{id}. | +| episodes.create | Poate crea episoade pentru podcastul #{id}. | +| episodes.edit | Poate edita podcastul #{id}. | +| episodes.delete | Poate șterge podcastul #{id}. | +| episodes.manage-persons | Poate administra abonamentele podcastului #{id}. | +| episodes.manage-clips | Poate administra clipuri video sau biții de sunet ai podcastului #{id}. | +| episodes.manage-publications | Poate publica podcastul #{id}. | +| episodes.manage-comments | Poate crea/elimina comentariile episodului podcastului #{id}. | diff --git a/docs/src/sr-Latn/getting-started/auth.md b/docs/src/sr-Latn/getting-started/auth.md new file mode 100644 index 00000000..663557e1 --- /dev/null +++ b/docs/src/sr-Latn/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Verifikacija i Odobravanje +sidebarDepth: 3 +--- + +# Verifikacija i Odobravanje + +Castopod upravlja verifikacijom i odobravanjem koristeći `codeigniter/shield` u +paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: + +1. [po nalogu](#1-instance-wide-roles-and-permissions) +2. [po podkastu](#2-per-podcast-roles-and-permissions) + +## 1. Uloge i dozvole po nalogu + +### Uloge po nalogu + + + +| uloga | opis | dozvola | +| ------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administrator | Ima kompletnu kontrolu nad Castopod nalogom. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Menadžer | Upravlja sadržajem na Castopod-u. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podkaster | Opšti korisnici Castopod-a. | admin.access | + + + +### Dozvole po nalogu + + + +| dozvola | opis | +| ----------------------- | --------------------------------------------------------------- | +| admin.access | Može pristupiti administratorskom delu Castopod-a. | +| admin.settings | Može pristupiti podešavanjima Castopod-a. | +| users.manage | Može upravljati korisnicima Castopod-a. | +| persons.manage | Može upravljati osobama. | +| pages.manage | Može upravljati stranicama. | +| podcasts.view | Može videti sve podkaste. | +| podcasts.create | Može napraviti nove podkaste. | +| podcasts.import | Može uvesti nove podkaste. | +| fediverse.manage-blocks | Može blokirati interakciju Castopoda i fediverse naloga/domena. | + + + +## 2. Uloge i dozvole po podkastu + +### Uloge po podkastu + + + +| uloga | opis | dozvola | +| ------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrator | Ima kompletnu kontrolu nad podkastom #{id}. | \* | +| Urednik | Upravlja sadržajem i objavama podkasta #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Upravlja sadržajem podkasta #{id} ali ne može da ga objavi. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gost | Saradnik na podkastu #{id}. | view, episodes.view | + + + +### Dozvole po podkastu + + + +| dozvola | opis | +| ---------------------------- | -------------------------------------------------------------------------------------- | +| view | Može videti upravljačku tablu i analitiku podkasta #{id}. | +| edit | Može uređivati podkast #{id}. | +| delete | Može obrisati podkast #{id}. | +| manage-import | Može upravljati uvozom podkasta #{id}. | +| manage-persons | Može upravljati osobama na podkastu #{id}. | +| manage-subscriptions | Može upravljati pretplatama na podkast #{id}. | +| manage-contributors | Može upravljati saradnicima na podkastu #{id}. | +| manage-platforms | Može ubaciti/izbaciti veze ka platformama podkasta #{id}. | +| manage-publications | Može objaviti podkast #{id}. | +| manage-notifications | Može videti obaveštenja i označiti ih kao pročitana za podkast #{id}. | +| interact-as | Može da komunicira kao podkast #{id} i deli, odgovara na i stavlja u omiljene postove. | +| episodes.view | Može videti upravljačku tablu i analitiku podkasta #{id}. | +| episodes.create | Može napraviti epizodu podkasta #{id}. | +| episodes.edit | Može uređivati epizodu podkasta #{id}. | +| episodes.delete | Može obrisati epizodu podkasta #{id}. | +| episodes.manage-persons | Može upravljati pretplatama na podkast #{id}. | +| episodes.manage-clips | Može upravljati video klipovima i zvučnim isečcima podkasta #{id}. | +| episodes.manage-publications | Može objaviti podkast #{id}. | +| episodes.manage-comments | Može dodati/obrisati komentar na epizodi podkasta #{id}. | + + diff --git a/docs/src/sr-Latn/getting-started/docker.md b/docs/src/sr-Latn/getting-started/docker.md new file mode 100644 index 00000000..b73daca5 --- /dev/null +++ b/docs/src/sr-Latn/getting-started/docker.md @@ -0,0 +1,159 @@ +--- +title: Zvanične Docker slike +sidebarDepth: 3 +--- + +# Zvanične Docker slike + +Castopod gura 3 Docker slike u Docker Hub tokom njegovog automatizovanog procesa +izrade: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): sve u + jednoj castopod slici koristeći ngink jedinicu +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): paket aplikacija + sa svim Castopod zavisnostima +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): + Nginx konfiguracija za Castopod + +Pored toga, Castopod zahteva MySQL kompatibilnu bazu podataka. Redis baza +podataka može se dodati kao obrađivač keša. + +## Podržani tagovi + +- `develop` [nestabilno], najnoviji razvojni ogranak +- `beta` [stabilno], poslednja beta verzija +- `latest` [stabilno], poslednja verzija +- `1.x.x` [stabilno], specifična verzija (od `1.0.0`) + +## Primer upotrebe + +1. Instalirajte [docker](https://docs.docker.com/get-docker/) i + [docker-compose](https://docs.docker.com/compose/install/) +2. Napravite `docker-compose.yml` datoteku sa sledećim: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + Morate prilagoditi neke varijable svojim potrebama (npr. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Podesite obrnuti proksi za TLS (SSL/HTTPS) + + TLS je obavezan da bu ActivityPub radio. Ovaj posao se lako može obaviti + obrnutim proksijem, na primer sa [Caddy-ijem](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +4. Pokrenite `docker-compose up -d`, sačekajte da se pokrene i idite na + `https://castopod.example.com/cp-install` da biste završili instalaciju + Castopod-a! + +5. Sve je spremno, započnite sa podkastingom! 🎙️🚀 + +## Promenljive okruženja + +- **castopod/castopod** i **castopod/app** + + | Naziv promenljive | Vrsta (`uobičajeno`) | Podrazumevano | + | ------------------------------------- | ---------------------------- | ---------------- | + | **`CP_BASEURL`** | string | `nedefinisano` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `nedefinisano` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"datoteka"` ili `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `nedefinisano` | + | **`CP_EMAIL_FROM`** | ?string | `nedefinisano` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` ili `"ssl"`] | `"tls"` | + | **`CP_ENABLE_2FA`** | ?boolean | `nedefinisano` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_KEY`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_REGION`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `nedefinisano` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `nedefinisano` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `nedefinisano` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `nedefinisano` | + | **`CP_DISABLE_HTTPS`** | ?[`0` ili `1`] | `nedefinisano` | + | **`CP_MAX_BODY_SIZE`** | ?number (sa sufiksom) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (sa sufiksom) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/veb server** + + | Naziv promenljive | Vrsta | Podrazumevano | + | ---------------------- | --------------------- | ------------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (sa sufiksom) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/sr-Latn/getting-started/install.md b/docs/src/sr-Latn/getting-started/install.md new file mode 100644 index 00000000..be94565a --- /dev/null +++ b/docs/src/sr-Latn/getting-started/install.md @@ -0,0 +1,242 @@ +--- +title: Instalacija +sidebarDepth: 3 +--- + +# Kako Instalirati Castopod? + +Zamišljeno je da Castopod bude jednostavan za instalaciju. Bilo da se koristi +namenski ili deljeni hosting, možete ga instalirati na većinu PHP-MySQL +kompatibilnih veb servera. + +::: savet Napomena + +Objavili smo zvanične Docker slike za Castopod! + +Ako više volite da koristite Docker, možete ovo preskočiti i preći direktno na +[docker dokumentaciju](./docker.md) za Castopod. + +::: + +## Uslovi + +- PHP v8.1 ili novija verzija +- MySQL verzija 5.7 ili novija ili MariaDB verzija 10.2 ili novija +- HTTPS podrška +- [ntp-sinhronizovani sat](https://viki.debian.org/NTP) za potvrdu dolaznih + zahteva federacije + +### PHP v8.1 ili kasnija verzija + +Potrebna je PHP verzija 8.1 ili novija, sa instaliranim sledećim ekstenzijama: + +- [intl](https://php.net/manual/en/intl.requirements.php) +- [libcurl](https://php.net/manual/en/curl.requirements.php) +- [mbstring](https://php.net/manual/en/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) sa **JPEG**, + **PNG** i **WEBP** bibliotekama. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Pored toga, uverite se da su sledeće ekstenzije omogućene u vašem PHP-u: + +- json (podrazumevano omogućeno - ne isključujte ga) +- xml (podrazumevano omogućeno - ne isključujte ga) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL kompatibilne baze podataka + +> Preporučujemo korišćenje [MariaDB](https://mariadb.org). + +::: upozorenje Upozorenje + +Castopod radi samo sa podržanim MySQL 5.7 ili novijim kompatibilnim bazama +podataka. Kvari se na MySQL v5.6 na primer, jer je njen životni vek istekao 5. +februara 2021. + +::: + +Trebaće vam ime servera, ime baze podataka, korisničko ime i lozinka za završite +proces instalacije. Ako ih nemate, obratite se svom administratoru servera. + +#### Privilegije + +Korisnik mora imati najmanje ove privilegije u bazi podataka da bi Castopod +radio: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, +`UPDATE`, `REFERENCES`, `CREATE VIEW`. + +### (Opciono) FFmpeg v4.1.8 ili kasnija verzija za video isečke + +[FFmpeg](https://www.ffmpeg.org/) verzija 4.1.8 ili kasnija je neophodna ukoliko +želite da pravite video isečke. Sledeće ekstenzije moraju biti instalirane: + +- **FreeType 2** biblioteka za + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Opciono) Ostale preporuke + +- Redis za bolje performanse keša. +- CDN za keširanje statičnih datoteka i bolje performanse. +- e-mail gateway za izgubljene lozinke. + +## Uputstva za instalaciju + +### Preduslovi + +0. Nabavite veb server sa instaliranim [preduslovima](#requirements) +1. Napravite MySQL bazu podataka za Castopod sa korisnikom koji ima pristup i + privilegije da modifikuje (za više informacija, pogledajte + [MySQL kompatibilna baza podataka](#mysql-compatible-database)). +2. Aktivirajte HTTPS na vašem domenu sa _SSL sertifikatom_. +3. Preuzmite i otpakujte najnoviji [Castopod Paket](https://castopod.org/) na + veb server ako to već niste uradili. + - ⚠️ Podesite root dokument veb servera na `public/` poddirektorijum u okviru + `castopod` direktorijuma. +4. Dodajte **cron zadatke** na vašem veb serveru za različite zadatke u pozadini + (zamenite staze u skladu sa tim): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Pažnja** - ukoliko ne dodate ovaj cron zadatak, sledeće opcije Castopod-a + neće raditi: + + - Uvoz podkasta iz postojeće RSS veze + - Objava društvenih aktivnosti vašim pratiocima u Fediverzumu + - Objava epizoda u otvorenim hub-ovima uz pomoć + [WebSub-a](https://en.wikipedia.org/wiki/WebSub) + - Pravljenje video isečaka - + [zahteva FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (preporučeno) Čarobnjak za instalaciju + +1. Pokrenite Castopod-ovu instalacionu skriptu tako što ćete otići na stranicu + čarobnjaka za instalaciju (`https://your_domain_name.com/cp-install`) u važem + omiljenom pretraživaču. +2. Pratite uputstva na ekranu. +3. Počnite sa podkastingom! + +::: info Napomena + +Instalaciona skripta upisuje `.env` datoteku u root paketa. Ukoliko ne možete da +prođete kroz čarobnjaka za instalaciju, možete sami napraviti i urediti `.env` +datoteku ručno po uzoru na `.env.example` datoteku. + +::: + +### Korišćenje CLI + +1. Napravite `.env` datoteku u root-u paketa, po uzoru na `.env.example` + datoteku. +2. Inicirajte bazu podataka koristeći: + + ```sh + php spark install:init-database + ``` + +3. Napravite super administratora koristeći: + + ```sh + php spark install:create-superadmin + ``` + +4. Idite na vaš administratorski pristup i krenite sa podkastingom! + +### Podešavanja Elektronske pošte/SMTP-a + +Podešavanja elektronske pošte su potrebna kako bi neke opcije radile kako treba +(npr. povratak izgubljene lozinke, slanje uputstava premijum pretplatnicima, …) + +Možete dodati konfiguraciju elektronske pošte u vašu `.env` datoteku instance na +sledeći način: + +```ini +# […] + +email.fromEmail="your_email_address" +email.SMTPHost="your_smtp_host" +email.SMTPUser="your_smtp_user" +email.SMTPPass="your_smtp_password" +``` + +#### Opcije konfigurisanja elektronske pošte + +| Naziv promenljive | Vrsta | Podrazumevano | +| ----------------- | --------------------- | -------------- | +| **`fromEmail`** | string | `nedefinisano` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `nedefinisano` | +| **`SMTPUser`** | string | `nedefinisano` | +| **`SMTPPass`** | string | `nedefinisano` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` ili `"ssl"`] | `"tls"` | + +### Multimedijalno skladište + +Podrazumevano, datoteke se čuvaju u `public/media` direktorijumu koristeći +sistem datoteka. Ukoliko želite da prebacite `media` direktorijum na drugo +mesto, možete to odrediti u svojoj `.env` datoteci na način koji je prikazan +ispod: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +U ovom primeru, datoteke će biti sačuvane u /mnt/storage/media direktorijumu. +Obavezno ažurirajte konfiguraciju svog veb servera kako biste odrazili ovu +promenu. + +### S3 + +Ako više volite da čuvate svoje medijske datoteke na S3 kompatibilnom skladištu, +možete da ga navedete u svojoj `.env` datoteci: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### Opcije konfigurisanja S3 skladišta + +| Naziv promenljive | Vrsta | Podrazumevano | +| ----------------------- | ------- | -------------- | +| **`endpoint`** | string | `nedefinisano` | +| **`key`** | string | `nedefinisano` | +| **`secret`** | string | `nedefinisano` | +| **`region`** | string | `nedefinisano` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `nedefinisano` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `nedefinisano` | + +## Paketi iz zajednice + +Ukoliko ne želite da sami instalirate Castopod ručno, moežete iskoristiti jedan +od paketa koji je napravila i o kome brine zajednica otvorenog koda. + +### Instalirajte sa YunoHost-om + +[YunoHost](https://yunohost.org/) je je distribucija zasnovana na Debian +GNU/Linux-u sačinjena od besplatnih softverskih paketa otvorenog koda. Ona +upravlja teškoćama samo-hostovanje za vas. + +
    + + + Instalirajte Castopod sa YunoHost-om + + +Github +Repo + +
    diff --git a/docs/src/sr-Latn/getting-started/security.md b/docs/src/sr-Latn/getting-started/security.md new file mode 100644 index 00000000..d3f96a9d --- /dev/null +++ b/docs/src/sr-Latn/getting-started/security.md @@ -0,0 +1,27 @@ +--- +title: Bezbednost +--- + +# Bezbednosni interesi + +Castopod je napravljen na [CodeIgniter4](https://codeigniter.com/), PHP okviru +koji podstiče +[dobre bezbednosne prakse](https://codeigniter.com/user_guide/concepts/security.html). + +Da biste maksimalno povećali bezbednost vaše instance i sprečili bilo kakav +zlonamerni napad, mi preporučujemo da ažurirate sve dozvole Castopod datoteka +nakon instalacije ili ažuriranja (da biste izbegli bilo kakvu grešku prethodne +dozvole): + +- `writable/` direktorijum mora biti **readable** i **writable**. +- `public/media/` direktorijum mora biti **readable** i **writable**. +- bilo koja druga datoteka mora biti podešena na **readonly**. + +Na primer, ukoliko koristite Apache ili NGINX sa Ubuntu-om možete uraditi +sledeće: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/sr-Latn/getting-started/update.md b/docs/src/sr-Latn/getting-started/update.md new file mode 100644 index 00000000..5ca69797 --- /dev/null +++ b/docs/src/sr-Latn/getting-started/update.md @@ -0,0 +1,107 @@ +--- +title: Ažuriranje +sidebarDepth: 3 +--- + +# Kako da ažurirate Castopod? + +Nakon instalacije Castopod-a, možete poželeti da ažurirate svoju instancu na +najnoviju verziju kako bi ste uživali u najnovijim opcijama ✨, sređenim +bagovima 🐛 i unapređenim performansama ⚡. + +## Uputstva za ažuriranje + +0. ⚠️ Pre bilo kog ažuriranja, toplo preporučujemo da napravite rezervnu kopiju + svojih Castopod datoteka i baze podataka. + + - cf. + [Da li treba da napravim rezervnu kopiju pre ažuriranja?](#should-i-make-a-backup-before-updating) + +1. Idite na + [stranicu izdanja](https://code.castopod.org/adaures/castopod/-/releases) i + proverite da li je vaša instanca ažurirana sa najnovijom verzijom Castopod-a + + - cf. + [Gde mogu da pronađem moju verziju Castopod-a?](#where-can-i-find-my-castopod-version) + +2. Skinite najnoviji paket izdanja koji se zove `Castopod Package`, možete + odabrati `zip` ili `tar.gz` tip arhive + + - ⚠️ Uverite se da ste preuzeli Castopod paket a **NE** izvorni kod + - Imajte na umu da takođe možete preuzeti najnoviji paket sa + [castopod.org](https://castopod.org/) + +3. Na vašem serveru: + + - Uklonite sve datoteke sem `.env` i `public/media` + - Kopirajte nove datoteke iz preuzetog paketa na vaš server + + ::: info Napomena + + Možda ćete morati da resetujete dozvole za datoteke kao tokom procesa + instalacije. Proverite [Bezbednosne interese](./security.md). + + ::: + +4. Ažurirajte svoju šemu baze podataka iz vaše `Castopod Admin` > `About` + stranice ili tako što ćete pokrenuti: + + ```bash + php spark castopod:database-update + ``` + +5. Očistite keš iz `Castopod Admin` > `Settings` > `general` > `Housekeeping` +6. ✨ Uživajte u svežoj instanci, završili ste! + +::: info Napomena + +Izdanja mogu doći sa dodatnim uputstvima za ažuriranje (pogledajte +[stranicu izdanja](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [Nisam ažurirao/la svoju instancu jako dugo… Šta treba da uradim?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Potpuno automatsko ažuriranje + +> Stiže uskoro... 👀 + +## Često postavljana pitanja (česta pitanja) + +### Gde mogu da pronađem svoju verziju Castopod-a? + +Idite na administratorski panel vašeg Castopod-a, verziju možete pronaći u +donjem levom uglu. + +Alternativno, verziju možete pronaći u `app > Config > Constants.php` datoteci. + +### Nisam ažurirao/la svoju instancu veoma dugo… Šta treba da uradim? + +Nema problema! Samo preuzmite poslednju verziju na način opisan iznad. Samo, +kada idete kroz uputstva izdanja (4), izvodite ih jedno za drugim, od +najstarijih do najnovijih. + +> Možda ćete želeti da napravite rezervnu kopiju instance u zavisnosti od toga +> koliko dugo niste ažurirali Castopod. + +Na primer, ako koristite verziju `v1.0.0-alpha.42` i želite da ažurirate na +verziju `v1.0.0-beta.1`: + +0. (toplo preporučujemo) Napravite kopiju važih datoteka i baze podataka. + +1. Preuzmite najnovije izdanje, preišite svoje datoteke čuvajući `.env` i + `public/media`. + +2. Prođite kroz uputstva za ažuriranje svakog izdanja po redu (od najstarijeg do + najnovijeg) počevši sa `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Uživajte u svežoj instanci, završili ste! + +### Da li treba da napravim kopiju pre ažuriranja? + +Savetujemo vam da to uradite, tako da ne izgubite sve ako nešto krene po zlu! + +Uopštenije, savetujemo vam da redovno pravite rezervne kopije vaših Castopod +datoteka i baze podataka kako biste sprečili da sve izgubite… diff --git a/docs/src/sr-Latn/index.md b/docs/src/sr-Latn/index.md new file mode 100644 index 00000000..9e8a4669 --- /dev/null +++ b/docs/src/sr-Latn/index.md @@ -0,0 +1,302 @@ +--- +sidebarDepth: 2 +--- + +# Dobrodošli 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod je besplatna platforma otvorenog koda napravljena za podkastere koji +žele interakciju sa svojom publikom. + +Castopod se lako instalira i napravljen je na +[CodeIgniter4](https://codeigniter.com/), moćnom PHP okviru sa jako malim +otiskom (footprint). + + + +## Funkcionalnosti + +- 🌱 Besplatan i otvorenog koda (AGPL v3 License) +- 🔐 Fokusiran an suverenitet podataka: vaš sadržaj, publika i analitika pripada + vama i samo vama +- 🪄  Podkasting 2.0 funkcionalnosti: GUID, zaključan, transkripti, + podrška, poglavlja, lokacija, posobe, zvučni isečci, … +- 💬  Ugrađena društvena mreža: + - 🚀  Castopod je deo Fediversa, decentralizovane društvene mreže + - ❤️  Napravite objave, delite, dodajte u omiljene i komentarišite + epizode +- 📈  Ugrađena analitika: + - ⚖️  U skladu sa GDPR / CCPA / LGPD + - 🪙  Merenje publike putem IABv2 standarda + - 🏡  Analitika na licu mesta, bez uključenosti trećih strana +- 📢  Ugrađeni marketinški alati: + - ✅  SEO spremno (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: instalirajte kao samostojeću aplikaciju + - 🎨  Prilagodljive boje teme + - 🎬  Napravite video isečke iz epizoda koji su spremni za deljenje + - 🔉  Napravite audio isečke + - ▶️  Plejer koji možete koristiti na svom sajtu (embed) +- 💸  Monetizacija: + - 🔗  Linkovi za podršku publike + - 📲  Slušaj i klikni reklame + - 🤝  value4value / Veb Monetizacija + - 💎  Premijum podkasti +- 📡  Objavite svoje epizode svugde uz RSS: + - 📱  Na svim agregatorima i aplikacijama: Podcast Index, Apple Podcasts, + Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Emitujte svoje epizode instant uz WebSub +- 📥  Uvoz podkasta: prebacite svoj postojeći podkast na Castopod +- 📤  Prebacite svoj podkast sa Castopod-a +- 🔀  Mreža: hostujte koliko god želite podkasta +- 👥  Više korisnika: dodajte saradnike i odredite njihove uloge +- 🌎  i18n podrška: prevedeno na engleski, francuski, poljski, nemački, + brazilski portugalski, španski… + [još jezika uskoro](https://translate.castopod.org)! + +## Motivacija + +Ekosistem podcasta je po prirodi decentralizovan: možete kreirati svoj podkast +kao RSS datoteku, objavite je na vebu i deliti svuda na mreži. + +To je zapravo jedan od retkih medija koji je ostao decentralizovan ovako dugo. + +Kako se upotreba razvija, sve više ljudi ulazi u podkaste: ili kao kreatori koji +pronalaze nove načine da podele svoje ideje ili kao slušaoci u potrazi za boljim +sadržajem. + +Kako podkasting postaje sve više korišćen, neke kompanije pokušavaju da ga +promene ka kontrolisanijem i centralizovanijem mediju. + +Castopod je stvoren u nastojanju da pruži otvorenu i održivu alternativu za +hostovanje vaših podkasta, promovišući decentralizaciju kako bi se osiguralo da +podkasterska kreativnost može da se izrazi. + +Ovaj projekat gura zajednica otvorenog koda, ponajviše +[Fedivers](https://fediverse.party/en/fediverse/) i +[Podcasting 2.0](https://podcastindex.org/) pokreti. + +## Poređenje sa drugim rešenjima + +Verujemo da jedno rešenje nije dobro za sve, već da sve zavisi od vaših potreba. +Tako da evo poređenja sa drugim alatima kako bi ste mogli da procenite da li je +Castopod prava stvar za vas. + +### Castopod protiv Wordpress-a + +Castopod je često nazivan "Wordpress-om za podkaste" zbog sličnosti koje deli sa +ovom ploatformom. U neku ruku ovo je tačno. I zapravo, Castopod bio je u velikoj +meri inspirisan Wordpress ekosistemom, videvši lakoću usvajanja od zajednice i +broja veb lokacija koje rade na njemu. + +Isto kao i Wordpress, Castopod je besplatan i otvorenog koda, napravljen +koristeći PHP i MySQL baze podataka i spakovan na način koji vam omogućava +jednostavnu instalaciju na većini veb servera. + +Wordpress je odličan način na napravite veb stranicu i upotpunite je dodatcima +kako bi dobili ono što želite. To je potpuno razvijen CMS koji vam pomaže da +dobijete bilo koju vrstu veb stranica na mreži. + +S druge strane, Castopod treba da odgovori na posebne potrebe podkastera, +fokusirajući se na podkasting, i ništa drugo. Nisu vam potrebni nikakvi dodatci +kako bi ste krenuli na svoje podkastersko putovanje. + +Ovo omogućava optimizaciju procesa specifičnih za podcasting: u rasponu od +kreiranja vaših podkasta i objavljivanja novih epizoda sve do emitovanja, +marketinga i analitike. + +Konačno, u zavisnosti od vaših potreba, Wordpress i Castopod mogu čak i da +funkcionišu zajedno jer dele iste zahteve! + +### Castopod protiv Funkwhale-a + +Funkwhale je moderan besplatni muzički server otvorenog koda koji se samostalno +hostuje. Kao i Castopod, Funkwhale je deo Fedivers-a, decentralizovane društvene +mreže što omogućava kompatibilnost između njih. + +Funkwhale je u početku napravljen oko muzike. Kasnije, kako je projekat +napredovao, dodata je opcija hostovanja podkasta. + +Za razliku od Funkwhale-a, Castopod je dizajniran i napravljen isključivo oko +podkasta. Ovo omogućava lakšu implementaciju funkcionalnosti koje se odnose na +podkast ekosistem, kao što su podkasting 2.0 alati (transkripti, poglavlja, +lokacije, osobe, ...). + +Tako da bi ste verovatno trebali da koristite Funkwhale ukoliko želite da +hostujete svoju muziku a Castopod ukoliko želite da hostujete svoje podkaste. + +### Castopod protiv drugih podkast hosting-a + +Postoji mnogo različitih rešenja za hostovanje vaših podkasta, neka od njih su +stvarno fantastična i [ dosta njih](https://podcastindex.org/apps) se +priključuje Podcasting 2.0 trendu, isto kao i Castopod! + +Svako od ovih rešenja se razlikuje jedno od drugog, možete ih uporediti sa +[listom funkcionalnosti](#features). + +Imajući to u vidu, postoje dve glavne razlike u odnosu na druga rešenja za +podkasting: + +- Castopod može biti samostalno hostovan i jedino je rešenje koje vam omogućava + da zadržite punu kontrolu nad onim što proizvodite. Takođe, pošto je otvorenog + koda, možete ga čak prilagoditi kako želite. + +- Castopod je jedino rešenje koje trenutno uklapa decentralizovanu društvenu + mrežu sa ActivityPub-om kao i mnoge funkcionalnosti podkasting-a 2.0, nadajući + se da će ih tako približiti. + +## Doprinos + +Volite Catsopod i voleli bi ste da pomognete? Pogledajte dokumentaciju koja +sledi kako bi ste počeli. + +### Kodeks ponašanja + +Castopod je usvojio Kodeks ponašanja kojeg očekujemo da se učesnici u projektu +pridržavaju. Molimo da pročitate +[Uputstvo Kodeksa ponašanja](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +kako bi ste razumeli šta hoće a šta neće biti tolerisano. + +### Vodič za doprinos + +Pročitajte naše [uputstvo za doprinos](../contributing/guidelines.md) kako bi +ste bolje razumeli naš proces razvoja, kako da predložite popravke bagova i +unapređenja i kako da napravite i testirate svoje promene na Castopod-u. + +## Saradnici ✨ + +Veliko hvala ovim divnim ljudima +([ključ emotikona](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔
    Ewen
    Ewen

    🌍 🤔 💻
    Bastien Luneteau
    Bastien Luneteau

    💻 🐛
    Cécile Ricordeau
    Cécile Ricordeau

    🎨
    Patryk Miś
    Patryk Miś

    🌍
    Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔
    Sebastian Janik
    Sebastian Janik

    💻
    Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻
    denis d
    denis d

    🐛 🤔
    Douglas Kastle
    Douglas Kastle

    🐛 🤔
    cExplorer
    cExplorer

    🐛 🌍
    ImaCrea
    ImaCrea

    🐛 🤔
    Jonas S
    Jonas S

    💻
    LEFEBVRE Yann
    LEFEBVRE Yann

    🐛
    Sebastian Späth
    Sebastian Späth

    🐛 🤔
    rocky III
    rocky III

    🐛
    Hermann Josef Eckl
    Hermann Josef Eckl

    🐛
    Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔
    João Leandro
    João Leandro

    🌍 🤔
    Angelos Chouvardas
    Angelos Chouvardas

    🌍
    Eivind
    Eivind

    🌍
    forght
    forght

    🌍
    glottis0q
    glottis0q

    🌍
    glottis0q
    glottis0q

    🌍
    Lucian I. Last
    Lucian I. Last

    🌍
    LuuzViir
    LuuzViir

    🌍
    CTHTC
    CTHTC

    🌍
    Russian Retro
    Russian Retro

    🌍
    Marek L'ach
    Marek L'ach

    🌍
    GunChleoc
    GunChleoc

    🌍
    GabiSnow
    GabiSnow

    🌍
    bendaha
    bendaha

    🌍
    Samuel Roland
    Samuel Roland

    🌍
    Dimitri Regnier
    Dimitri Regnier

    🤔
    irithys
    irithys

    🌍
    Sergi
    Sergi

    🌍
    ghose (XoseM)
    ghose (XoseM)

    🌍
    Andreas Olsson
    Andreas Olsson

    🌍
    leonfrom
    leonfrom

    🌍
    agentcobra
    agentcobra

    🌍
    Alessandro
    Alessandro

    🌍
    liimee
    liimee

    🌍
    Ahmed Sabouni
    Ahmed Sabouni

    🌍
    KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻
    Guy Martin
    Guy Martin

    🐛 💻
    + + + + + + +Ovaj projekat prati specifikaciju +[svih saradnika](https://github.com/all-contributors/all-contributors). +Doprinosi bilo koje vrste su dobrodošli! + +## Kontakt + +Možete nas kontaktirati za pomoć ili postaviti bilo koje pitanje koje imate na: + +- [Discord-u](https://castopod.org/discord) (za direktnu interakciju sa + programerima i zajednicom) +- [Listi pitanja](https://code.castopod.org/adaures/castopod/-/issues) (za + zahteve za funkcionalnostima i prijavu bagova) + +Takođe, možete nas pratiti na društvenim mrežama kako bi ste dobili najnovije +vesti o Castopod-u: + +- [podlibre.social](https://podlibre.social/@Castopod) (instanca Mastodon-a) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponzori + +Tekući razvoj Castopod-a je omogućen uz podršku vas koji nas podržavate. Ukoliko +želite da pomognete, razmislite o +[sponzorisanju razvoja Castopod-a](https://opencollective.com/castopod/contribute). + +
    + Ad Aures Logo + NLnet Logo +
    + +## Licenca + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Autorska prava © 2020-danas, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/sv/getting-started/auth.md b/docs/src/sv/getting-started/auth.md index d9b869ea..ff5d59c0 100644 --- a/docs/src/sv/getting-started/auth.md +++ b/docs/src/sv/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super administratör | Har fullständig kontroll över Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Hanterare | Hanterar Castopods innehåll. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Generella användare av Castopod. | admin.access | +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | @@ -29,17 +29,17 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ----------------------- | ----------------------------------------------------------------------------- | -| admin.access | Kan komma åt Castopod admin-området. | -| admin.settings | Kan komma åt Castopod-inställningarna. | -| users.manage | Kan hantera Castopod-användare. | -| persons.manage | Kan hantera personer. | -| pages.manage | Kan hantera sidor. | -| podcasts.view | Kan se alla podcasts. | -| podcasts.create | Kan skapa nya podcasts. | -| podcasts.import | Kan importera podcasts. | -| fediverse.manage-blocks | Kan blockera fediverse skådespelare/domäner från att interagera med Castopod. | +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | @@ -49,12 +49,12 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ---------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Har fullständig kontroll över podcast #{id}. | \* | -| Redigerare | Hanterar innehåll och publikationer i podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Författare | Hanterar innehåll i podcast #{id} men kan inte publicera dem. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Gäst | Generell bidragsgivare till podcasten #{id}. | view, episodes.view | +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | @@ -62,26 +62,26 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | -| ---------------------------- | -------------------------------------------------------------------------------- | -| view | Kan visa instrumentpanelen och analysen av podcast #{id}. | -| edit | Kan redigera podcast #{id}. | -| delete | Kan ta bort podcast #{id}. | -| manage-import | Kan synkronisera importerad podcast #{id}. | -| manage-persons | Kan hantera prenumerationer på podcast #{id}. | -| manage-subscriptions | Kan hantera prenumerationer på podcast #{id}. | -| manage-contributors | Kan hantera bidragsgivare för podcast #{id}. | -| manage-platforms | Kan sätta/ta bort plattformslänkar för podcast #{id}. | -| manage-publications | Kan publicera podcast #{id}. | -| manage-notifications | Can view and mark notifications as read for podcast #{id}. | -| interact-as | Kan interagera som podcasten #{id} för att favorita, dela eller svara på inlägg. | -| episodes.view | Kan visa instrumentpanelen och analysen av podcast #{id}. | -| episodes.create | Kan skapa avsnitt för podcast #{id}. | -| episodes.edit | Kan redigera podcast #{id}. | -| episodes.delete | Kan ta bort podcast #{id}. | -| episodes.manage-persons | Kan hantera prenumerationer på podcast #{id}. | -| episodes.manage-clips | Kan hantera videoklipp eller ljudklipp från podcasten #{id}. | -| episodes.manage-publications | Kan publicera podcast #{id}. | -| episodes.manage-comments | Kan skapa/ta bort avsnitt kommentarer från podcasten #{id}. | +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | diff --git a/docs/src/uk/getting-started/auth.md b/docs/src/uk/getting-started/auth.md index 0c330f06..f2548d7e 100644 --- a/docs/src/uk/getting-started/auth.md +++ b/docs/src/uk/getting-started/auth.md @@ -17,11 +17,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| role | description | permissions | -| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | General users of Castopod. | admin.access | +| role | description | permissions | +| ---------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Суперадмін | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Менеджер | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Підкастер | General users of Castopod. | admin.access | @@ -29,7 +29,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: -| permission | description | +| permission | Опис | | ----------------------- | ------------------------------------------------------------------ | | admin.access | Can access the Castopod admin area. | | admin.settings | Can access the Castopod settings. | diff --git a/docs/src/zh-Hans/getting-started/auth.md b/docs/src/zh-Hans/getting-started/auth.md index 5c3109d0..c307588f 100644 --- a/docs/src/zh-Hans/getting-started/auth.md +++ b/docs/src/zh-Hans/getting-started/auth.md @@ -17,7 +17,7 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| role | description | permissions | +| 角色 | 描述 | 权限 | | ---------- | ---------------------------- | ------------------------------------------------------------------------------------------ | | 超级管理员 | 拥有对 Castopod 的完全控制。 | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | 管理 | 管理 Castopod 的内容。 | podcasts.create, podcasts.import, persons.manage, pages.manage | @@ -29,7 +29,7 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| permission | description | +| 权限 | 描述 | | ----------------------- | ------------------------------------------- | | admin.access | 可以访问 Castopod 管理区域。 | | admin.settings | 可以访问 Castopod 设置。 | @@ -49,7 +49,7 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| role | description | permissions | +| 角色 | 描述 | 权限 | | ------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 管理员 | 完全控制播客 #{id}。 | \* | | 编辑 | 管理播客 #{id} 的内容和出版物。 | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | @@ -62,11 +62,11 @@ Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规 -| permission | description | +| 权限 | 描述 | | ---------------------------- | --------------------------------------------------- | | view | 可以查看播客 #{id} 的仪表板和分析。 | | edit | 可以编辑播客 #{id}。 | -| delete | 可以删除播客 #{id}。 | +| 删除 | 可以删除播客 #{id}。 | | manage-import | 可以同步导入的播客 #{id}。 | | manage-persons | 可以管理播客 #{id} 的订阅。 | | manage-subscriptions | 可以管理播客 #{id} 的订阅。 | diff --git a/docs/src/zh-Hans/getting-started/update.md b/docs/src/zh-Hans/getting-started/update.md index 80bdfea7..ab003891 100644 --- a/docs/src/zh-Hans/getting-started/update.md +++ b/docs/src/zh-Hans/getting-started/update.md @@ -53,7 +53,7 @@ sidebarDepth: 3 [发布页面](https://code.castopod.org/adaures/castopod/-/releases))。 - cf. - [我很长时间没有更新我的实例… 我该怎么办?](#我很长时间没有更新我的实例-我该怎么办) + [我很长时间没有更新我的实例… 我该怎么办? 我该怎么办?](#我很长时间没有更新我的实例-我该怎么办-我该怎么办) ::: @@ -69,7 +69,7 @@ sidebarDepth: 3 或者,你可以在 `应用程序 > 配置 > Constants.php` 文件中找到版本号。 -### 我很长时间没有更新我的实例… 我该怎么办? +### 我很长时间没有更新我的实例… 我该怎么办? 我该怎么办? 没问题! 只需如上所述获取最新版本。 No problem! Just get the latest release as described above. Only, when going through the release instructions (4), perform diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md index a305fb50..50b324ee 100644 --- a/docs/src/zh-Hans/index.md +++ b/docs/src/zh-Hans/index.md @@ -257,7 +257,7 @@ Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们, [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) -版权 ©️ 2020 至今, [Audes](https://adaures.com/)。 +版权 ©️ 2020至今, [Audes](https://adaures.com/)。 https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/badge/contributions-welcome-brightgreen.svg diff --git a/modules/Admin/Language/ar/Navigation.php b/modules/Admin/Language/ar/Navigation.php index ebe70420..6a8bd0fa 100644 --- a/modules/Admin/Language/ar/Navigation.php +++ b/modules/Admin/Language/ar/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'الانتقال إلى موقع الويب', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'لوحة التحكم', 'admin' => 'الرئيسية', 'podcasts' => 'البودكاستات', diff --git a/modules/Admin/Language/ca/Navigation.php b/modules/Admin/Language/ca/Navigation.php index 0482c760..5fc3659b 100644 --- a/modules/Admin/Language/ca/Navigation.php +++ b/modules/Admin/Language/ca/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Ocultar/mostrar barra lateral', 'go_to_website' => 'Anar al lloc web', 'go_to_admin' => 'Anar al panell de control', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Panell de control', 'admin' => 'Inici', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/ca/PodcastNavigation.php b/modules/Admin/Language/ca/PodcastNavigation.php index 5ce86ed8..bcbc8120 100644 --- a/modules/Admin/Language/ca/PodcastNavigation.php +++ b/modules/Admin/Language/ca/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => 'Períodes de temps', 'monetization' => 'Monetization', 'subscription-list' => 'Totes les subscripcions', - 'subscription-create' => 'Afegiu una subscripció', + 'subscription-create' => 'Add subscription', 'contributors' => 'Col·laboradors', 'contributor-list' => 'Tots els col·laboradors', 'contributor-add' => 'Afegir un col·laborador', diff --git a/modules/Admin/Language/da/Navigation.php b/modules/Admin/Language/da/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/da/Navigation.php +++ b/modules/Admin/Language/da/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/de/Navigation.php b/modules/Admin/Language/de/Navigation.php index d8c3010b..752c2186 100644 --- a/modules/Admin/Language/de/Navigation.php +++ b/modules/Admin/Language/de/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Seitenleiste ein/aus', 'go_to_website' => 'Gehe zur Webseite', 'go_to_admin' => 'Gehe zu Admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Übersicht', 'admin' => 'Startseite', 'podcasts' => 'Podcasts', @@ -34,7 +35,7 @@ return [ 'settings' => 'Einstellungen', 'settings-general' => 'Allgemein', 'settings-theme' => 'Erscheinungsbild', - 'admin-about' => 'Über', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'Mein Konto', 'change-password' => 'Passwort ändern', diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php index 480d3419..6512d570 100644 --- a/modules/Admin/Language/de/PodcastNavigation.php +++ b/modules/Admin/Language/de/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => 'Zeiträume', 'monetization' => 'Monetization', 'subscription-list' => 'Alle Abonnements', - 'subscription-create' => 'Abonnement hinzufügen', + 'subscription-create' => 'Add subscription', 'contributors' => 'Mitwirkende', 'contributor-list' => 'Alle Unterstützer', 'contributor-add' => 'Mitwirkenden hinzufügen', diff --git a/modules/Admin/Language/el/Navigation.php b/modules/Admin/Language/el/Navigation.php index 0bd1357a..8d766a63 100644 --- a/modules/Admin/Language/el/Navigation.php +++ b/modules/Admin/Language/el/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Εναλλαγή πλαϊνής μπάρας', 'go_to_website' => 'Μεταβείτε στον ιστότοπο', 'go_to_admin' => 'Μεταβείτε στον πίνακα διαχείρισης', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Πίνακας εργαλείων', 'admin' => 'Αρχική σελίδα', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/el/PodcastNavigation.php b/modules/Admin/Language/el/PodcastNavigation.php index 830fdfaa..d5310a9a 100644 --- a/modules/Admin/Language/el/PodcastNavigation.php +++ b/modules/Admin/Language/el/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => 'Χρονικές περίοδοι', 'monetization' => 'Monetization', 'subscription-list' => 'Όλες οι συνδρομές', - 'subscription-create' => 'Προσθέστε συνδρομή', + 'subscription-create' => 'Add subscription', 'contributors' => 'Συντελεστές', 'contributor-list' => 'Όλοι οι συντελεστές', 'contributor-add' => 'Προσθήκη συντελεστή', diff --git a/modules/Admin/Language/es/Navigation.php b/modules/Admin/Language/es/Navigation.php index 8393cb8a..c8936b27 100644 --- a/modules/Admin/Language/es/Navigation.php +++ b/modules/Admin/Language/es/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Ocultar/mostrar barra lateral', 'go_to_website' => 'Ir al sitio web', 'go_to_admin' => 'Ir al panel de administración', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Panel de control', 'admin' => 'Inicio', 'podcasts' => 'Podcasts', @@ -34,7 +35,7 @@ return [ 'settings' => 'Configuración', 'settings-general' => 'General', 'settings-theme' => 'Tema', - 'admin-about' => 'Acerca de', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'Mi cuenta', 'change-password' => 'Cambiar contraseña', diff --git a/modules/Admin/Language/es/PodcastNavigation.php b/modules/Admin/Language/es/PodcastNavigation.php index 0a299f97..43a142bb 100644 --- a/modules/Admin/Language/es/PodcastNavigation.php +++ b/modules/Admin/Language/es/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => 'Periodos de tiempo', 'monetization' => 'Monetization', 'subscription-list' => 'Todas las suscripciones', - 'subscription-create' => 'Añadir suscripción', + 'subscription-create' => 'Add subscription', 'contributors' => 'Colaboradores', 'contributor-list' => 'Todos los colaboradores', 'contributor-add' => 'Añadir colaborador', diff --git a/modules/Admin/Language/fa/Navigation.php b/modules/Admin/Language/fa/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/fa/Navigation.php +++ b/modules/Admin/Language/fa/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/fr/Validation.php b/modules/Admin/Language/fr/Validation.php index 02f55651..2054829b 100644 --- a/modules/Admin/Language/fr/Validation.php +++ b/modules/Admin/Language/fr/Validation.php @@ -13,5 +13,5 @@ return [ '{field} n’est pas une image ou n’a pas la taille minimale requise.', 'is_image_ratio' => '{field} n’est pas une image ou n’est pas au bon format.', - 'is_json' => '{field} contains invalid JSON.', + 'is_json' => '{field} contient un JSON non valide.', ]; diff --git a/modules/Admin/Language/fr2/Navigation.php b/modules/Admin/Language/fr2/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/fr2/Navigation.php +++ b/modules/Admin/Language/fr2/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/fr_CA/Navigation.php b/modules/Admin/Language/fr_CA/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/fr_CA/Navigation.php +++ b/modules/Admin/Language/fr_CA/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/gd/Navigation.php b/modules/Admin/Language/gd/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/gd/Navigation.php +++ b/modules/Admin/Language/gd/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/gl/Navigation.php b/modules/Admin/Language/gl/Navigation.php index bf5026af..eddbd6cb 100644 --- a/modules/Admin/Language/gl/Navigation.php +++ b/modules/Admin/Language/gl/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Activar barra lateral', 'go_to_website' => 'Ir ao sitio web', 'go_to_admin' => 'Ir á administración', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Taboleiro', 'admin' => 'Inicio', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/gl/PodcastNavigation.php b/modules/Admin/Language/gl/PodcastNavigation.php index cb191d10..c47b51dc 100644 --- a/modules/Admin/Language/gl/PodcastNavigation.php +++ b/modules/Admin/Language/gl/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => 'Período de tempo', 'monetization' => 'Monetization', 'subscription-list' => 'Todas as subscricións', - 'subscription-create' => 'Engadir unha subscrición', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contribúen', 'contributor-list' => 'Todas as contribucións', 'contributor-add' => 'Engadir colaboración', diff --git a/modules/Admin/Language/id/Navigation.php b/modules/Admin/Language/id/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/id/Navigation.php +++ b/modules/Admin/Language/id/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/it/Navigation.php b/modules/Admin/Language/it/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/it/Navigation.php +++ b/modules/Admin/Language/it/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/ja/Navigation.php b/modules/Admin/Language/ja/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/ja/Navigation.php +++ b/modules/Admin/Language/ja/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/kk/Navigation.php b/modules/Admin/Language/kk/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/kk/Navigation.php +++ b/modules/Admin/Language/kk/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/ko/Navigation.php b/modules/Admin/Language/ko/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/ko/Navigation.php +++ b/modules/Admin/Language/ko/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/oc/Navigation.php b/modules/Admin/Language/oc/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/oc/Navigation.php +++ b/modules/Admin/Language/oc/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/pl/Navigation.php b/modules/Admin/Language/pl/Navigation.php index 210e9c89..5b83da35 100644 --- a/modules/Admin/Language/pl/Navigation.php +++ b/modules/Admin/Language/pl/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Przełącz pasek boczny', 'go_to_website' => 'Idź do strony internetowej', 'go_to_admin' => 'Idź do administracji', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Pulpit', 'admin' => 'Początek', 'podcasts' => 'Podcasty', @@ -34,7 +35,7 @@ return [ 'settings' => 'Ustawienia', 'settings-general' => 'Ogólne', 'settings-theme' => 'Motyw', - 'admin-about' => 'Informacje', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'Moje konto', 'change-password' => 'Zmień hasło', diff --git a/modules/Admin/Language/pl/PodcastNavigation.php b/modules/Admin/Language/pl/PodcastNavigation.php index 621e411e..6f500f53 100644 --- a/modules/Admin/Language/pl/PodcastNavigation.php +++ b/modules/Admin/Language/pl/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => 'Okresy czasu', 'monetization' => 'Monetization', 'subscription-list' => 'Wszystkie subskrypcje', - 'subscription-create' => 'Dodaj subskrypcję', + 'subscription-create' => 'Add subscription', 'contributors' => 'Kontrybutorzy', 'contributor-list' => 'Wszyscy kontrybutorzy', 'contributor-add' => 'Dodaj kontrybutora', diff --git a/modules/Admin/Language/pt-BR/Navigation.php b/modules/Admin/Language/pt-BR/Navigation.php index bfa6f9e2..a5032c7c 100644 --- a/modules/Admin/Language/pt-BR/Navigation.php +++ b/modules/Admin/Language/pt-BR/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Ativar/Desativar barra lateral', 'go_to_website' => 'Ir para o site', 'go_to_admin' => 'Ir para admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Painel de controle', 'admin' => 'Início', 'podcasts' => 'Podcasts', @@ -34,7 +35,7 @@ return [ 'settings' => 'Confirgurações', 'settings-general' => 'Geral', 'settings-theme' => 'Tema', - 'admin-about' => 'Sobre', + 'admin-about' => 'About', 'account' => [ 'my-account' => 'Minha conta', 'change-password' => 'Alterar senha', diff --git a/modules/Admin/Language/pt-BR/PodcastNavigation.php b/modules/Admin/Language/pt-BR/PodcastNavigation.php index 753b6691..873954db 100644 --- a/modules/Admin/Language/pt-BR/PodcastNavigation.php +++ b/modules/Admin/Language/pt-BR/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => 'Períodos de tempo', 'monetization' => 'Monetization', 'subscription-list' => 'Todas as assinaturas', - 'subscription-create' => 'Adicionar assinatura', + 'subscription-create' => 'Add subscription', 'contributors' => 'Contribuidores', 'contributor-list' => 'Todos os contribuidores', 'contributor-add' => 'Adicionar contribuidor', diff --git a/modules/Admin/Language/pt/Navigation.php b/modules/Admin/Language/pt/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/pt/Navigation.php +++ b/modules/Admin/Language/pt/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/ro/Navigation.php b/modules/Admin/Language/ro/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/ro/Navigation.php +++ b/modules/Admin/Language/ro/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/ru/Navigation.php b/modules/Admin/Language/ru/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/ru/Navigation.php +++ b/modules/Admin/Language/ru/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/sk/Install.php b/modules/Admin/Language/sk/Install.php index b3bb16b6..c9669cdf 100644 --- a/modules/Admin/Language/sk/Install.php +++ b/modules/Admin/Language/sk/Install.php @@ -27,7 +27,7 @@ return [ 'database_config' => 'Nastavenie databázy', 'database_config_hint' => 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', + 'db_hostname' => 'Server databázy', 'db_name' => 'Názov databázy', 'db_username' => 'Prihlasovacie meno do databázy', 'db_password' => 'Heslo databázy', diff --git a/modules/Admin/Language/sk/Navigation.php b/modules/Admin/Language/sk/Navigation.php index e5b43fd3..f66de326 100644 --- a/modules/Admin/Language/sk/Navigation.php +++ b/modules/Admin/Language/sk/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Prepnúť postranný panel', 'go_to_website' => 'Prejsť na webstránku', 'go_to_admin' => 'Spravovať', + 'not-authorized' => 'Neautorizovaný', 'dashboard' => 'Nástenka', 'admin' => 'Úvod', 'podcasts' => 'Podcasty', diff --git a/modules/Admin/Language/sr-Latn/Navigation.php b/modules/Admin/Language/sr-Latn/Navigation.php index d532dc5b..bc4c5518 100644 --- a/modules/Admin/Language/sr-Latn/Navigation.php +++ b/modules/Admin/Language/sr-Latn/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Uključite bočnu traku', 'go_to_website' => 'Idi na sajt', 'go_to_admin' => 'Idi na administratora', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Kontrolna tabla', 'admin' => 'Početna', 'podcasts' => 'Podkasti', diff --git a/modules/Admin/Language/sv/Common.php b/modules/Admin/Language/sv/Common.php index 6551b84d..465f8c4c 100644 --- a/modules/Admin/Language/sv/Common.php +++ b/modules/Admin/Language/sv/Common.php @@ -40,7 +40,7 @@ return [ ], 'upload_file' => 'Ladda upp en fil', 'remote_url' => 'Fjärr URL', - 'save' => 'Save', + 'save' => 'Spara', ], 'play_episode_button' => [ 'play' => 'Spela', diff --git a/modules/Admin/Language/sv/Navigation.php b/modules/Admin/Language/sv/Navigation.php index 77a05b35..4e710a45 100644 --- a/modules/Admin/Language/sv/Navigation.php +++ b/modules/Admin/Language/sv/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Växla sidofält', 'go_to_website' => 'Gå till webbsidan', 'go_to_admin' => 'Gå till admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Översiktspanel', 'admin' => 'Hem', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/sv/PodcastNavigation.php b/modules/Admin/Language/sv/PodcastNavigation.php index 41b0c5b5..383f8817 100644 --- a/modules/Admin/Language/sv/PodcastNavigation.php +++ b/modules/Admin/Language/sv/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => 'Tidsperioder', 'monetization' => 'Monetization', 'subscription-list' => 'Alla prenumerationer', - 'subscription-create' => 'Lägg till en prenumeration', + 'subscription-create' => 'Add subscription', 'contributors' => 'Bidragsgivare', 'contributor-list' => 'Alla bidragsgivare', 'contributor-add' => 'Lägg till bidragsgivare', diff --git a/modules/Admin/Language/uk/Navigation.php b/modules/Admin/Language/uk/Navigation.php index 5d1b4583..f3ffb129 100644 --- a/modules/Admin/Language/uk/Navigation.php +++ b/modules/Admin/Language/uk/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => 'Toggle sidebar', 'go_to_website' => 'Go to website', 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', 'dashboard' => 'Dashboard', 'admin' => 'Home', 'podcasts' => 'Podcasts', diff --git a/modules/Admin/Language/zh-Hans/Navigation.php b/modules/Admin/Language/zh-Hans/Navigation.php index 66e2c290..3ed1fccc 100644 --- a/modules/Admin/Language/zh-Hans/Navigation.php +++ b/modules/Admin/Language/zh-Hans/Navigation.php @@ -12,6 +12,7 @@ return [ 'toggle_sidebar' => '切换侧边栏', 'go_to_website' => '访问网站', 'go_to_admin' => '登录到管理员', + 'not-authorized' => 'Not authorized', 'dashboard' => '控制面板', 'admin' => '主页', 'podcasts' => '播客', @@ -34,7 +35,7 @@ return [ 'settings' => '设置', 'settings-general' => '通用', 'settings-theme' => '主题', - 'admin-about' => '关于', + 'admin-about' => 'About', 'account' => [ 'my-account' => '我的帐户', 'change-password' => '修改密码', diff --git a/modules/Admin/Language/zh-Hans/PodcastNavigation.php b/modules/Admin/Language/zh-Hans/PodcastNavigation.php index e2546046..0978a9b2 100644 --- a/modules/Admin/Language/zh-Hans/PodcastNavigation.php +++ b/modules/Admin/Language/zh-Hans/PodcastNavigation.php @@ -30,7 +30,7 @@ return [ 'podcast-analytics-time-periods' => '时间段', 'monetization' => 'Monetization', 'subscription-list' => '所有订阅', - 'subscription-create' => '添加订阅', + 'subscription-create' => 'Add subscription', 'contributors' => '贡献者', 'contributor-list' => '所有贡献者', 'contributor-add' => '添加贡献者', diff --git a/modules/Auth/Language/sr-Latn/Auth.php b/modules/Auth/Language/sr-Latn/Auth.php new file mode 100644 index 00000000..325856d4 --- /dev/null +++ b/modules/Auth/Language/sr-Latn/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Vlasnik instance', + 'description' => 'Vlasnik Castopoda.', + ], + 'superadmin' => [ + 'title' => 'Super administrator', + 'description' => 'Ima kompletnu kontrolu nad Castopod-om.', + ], + 'manager' => [ + 'title' => 'Menadžer', + 'description' => 'Upravlja sadržajem na Castopod-u.', + ], + 'podcaster' => [ + 'title' => 'Podkaster', + 'description' => 'Opšti korisnici Castopod-a.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Može pristupiti administratorskom delu Castopod-a.', + 'admin.settings' => 'Može pristupiti podešavanjima Castopod-a.', + 'users.manage' => 'Može upravljati korisnicima Castopod-a.', + 'persons.manage' => 'Može upravljati osobama.', + 'pages.manage' => 'Može upravljati stranicama.', + 'podcasts.view' => 'Može videti sve podkaste.', + 'podcasts.create' => 'Može napraviti nove podkaste.', + 'podcasts.import' => 'Može uvesti nove podkaste.', + 'fediverse.manage-blocks' => 'Može blokirati interakciju Castopoda i fedivers naloga/domena.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Vlasnik podkasta', + 'description' => 'Vlasnik podkasta.', + ], + 'admin' => [ + 'title' => 'Administrator', + 'description' => 'Ima kompletnu kontrolu nad podkastom #{id}.', + ], + 'editor' => [ + 'title' => 'Urednik', + 'description' => 'Upravlja sadržajem i objavama podkasta #{id}.', + ], + 'author' => [ + 'title' => 'Autor', + 'description' => 'Upravlja sadržajem podkasta #{id} ali ne može da ga objavi.', + ], + 'guest' => [ + 'title' => 'Gost', + 'description' => 'Saradnik na podkastu #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Može videti upravljačku tablu i analitiku podkasta #{id}.', + 'edit' => 'Može uređivati podkast #{id}.', + 'delete' => 'Može obrisati podkast #{id}.', + 'manage-import' => 'Može sinhronizovati uvezen podkast #{id}.', + 'manage-persons' => 'Može upravljati pretplatama na podkast #{id}.', + 'manage-subscriptions' => 'Može upravljati pretplatama na podkast #{id}.', + 'manage-contributors' => 'Može upravljati saradnicima na podkastu #{id}.', + 'manage-platforms' => 'Može ubaciti/izbaciti veze ka platformama podkasta #{id}.', + 'manage-publications' => 'Može objaviti podkast #{id}.', + 'manage-notifications' => 'Može videti obaveštenja i označiti ih kao pročitana za podkast #{id}.', + 'interact-as' => 'Može da komunicira kao podkast #{id} i deli, odgovara na i stavlja u omiljene postove.', + 'episodes.view' => 'Može videti upravljačku tablu i analitiku epizoda podkasta #{id}.', + 'episodes.create' => 'Može napraviti epizode podkasta #{id}.', + 'episodes.edit' => 'Može uređivati epizode podkasta #{id}.', + 'episodes.delete' => 'Može obrisati epizode podkasta #{id}.', + 'episodes.manage-persons' => 'Može upravljati osobama na epizodama podkasta #{id}.', + 'episodes.manage-clips' => 'Može upravljati video klipovima i zvučnim isečcima podkasta #{id}.', + 'episodes.manage-publications' => 'Može da objavi/poništi objavljivanje epizoda i postova podkasta #{id}.', + 'episodes.manage-comments' => 'Može dodati/obrisati komentar na epizodi podkasta #{id}.', + ], + + // missing keys + 'code' => 'Vaša šestocifrena šifra', + + 'set_password' => 'Podesi lozinku', + + // Welcome email + 'welcomeSubject' => 'Pozvani ste na {siteName}', + 'emailWelcomeMailBody' => 'Za vas je napravljen nalog na {domain}, kliknite na link za prijavu ispod da biste postavili lozinku. Veza je važeća {numberOfHours} sati nakon slanja ove e-pošte.', +]; diff --git a/modules/Auth/Language/sr-Latn/Contributor.php b/modules/Auth/Language/sr-Latn/Contributor.php new file mode 100644 index 00000000..39bcbdb9 --- /dev/null +++ b/modules/Auth/Language/sr-Latn/Contributor.php @@ -0,0 +1,47 @@ + 'Saradnici podkasta', + 'view' => "{username} doprinos {podcastTitle}", + 'add' => 'Dodaj saradnika', + 'add_contributor' => 'Dodaj saradnike za {0}', + 'edit_role' => 'Uredi ulogu za {0}', + 'edit' => 'Izmeni', + 'remove' => 'Ukloni', + 'list' => [ + 'username' => 'Korisničko ime', + 'role' => 'Uloga', + ], + 'form' => [ + 'user' => 'Korisnik', + 'user_placeholder' => 'Izaberi korisnika…', + 'role' => 'Uloga', + 'role_placeholder' => 'Dodaj ulogu…', + 'submit_add' => 'Dodaj saradnika', + 'submit_edit' => 'Ažuriraj ulogu', + ], + 'delete_form' => [ + 'title' => 'Ukloni {contributor}', + 'disclaimer' => + 'Obrisaćete {contributor} iz saradnika. Oni neće moći više da pristupe "{podcastTitle}".', + 'understand' => 'Razumem, želim da uklonim {contributor} iz "{podcastTitle}"', + 'submit' => 'Ukloni', + ], + 'messages' => [ + 'editSuccess' => 'Uloga uspešno promenjena!', + 'editOwnerError' => "Ne možete urediti vlasnika podkasta!", + 'removeOwnerError' => "Ne možete ukloniti vlasnika podkasta!", + 'removeSuccess' => + 'Uspešno ste uklonili {username} iz {podcastTitle}', + 'alreadyAddedError' => + "Saradnik kojeg pokušavate dodati je već dodat!", + ], +]; diff --git a/modules/Auth/Language/sr-Latn/MyAccount.php b/modules/Auth/Language/sr-Latn/MyAccount.php new file mode 100644 index 00000000..5fa13d74 --- /dev/null +++ b/modules/Auth/Language/sr-Latn/MyAccount.php @@ -0,0 +1,18 @@ + 'Infromacije o mom nalogu', + 'changePassword' => 'Promeni moju lozinku', + 'messages' => [ + 'wrongPasswordError' => "Uneli ste pogrešnu lozinku, probajte ponovo.", + 'passwordChangeSuccess' => 'Lozinka je uspešno promenjena!', + ], +]; diff --git a/modules/Auth/Language/sr-Latn/User.php b/modules/Auth/Language/sr-Latn/User.php new file mode 100644 index 00000000..5e128ed8 --- /dev/null +++ b/modules/Auth/Language/sr-Latn/User.php @@ -0,0 +1,60 @@ + "Uredi {username} uloge", + 'ban' => 'Zabrani', + 'unban' => 'Ukini zabranu', + 'delete' => 'Obriši', + 'create' => 'Novi korisnik', + 'view' => "Informacije o korisniku {username}", + 'all_users' => 'Svi korisnici', + 'list' => [ + 'user' => 'Korisnik', + 'role' => 'Uloga', + 'banned' => 'Zabranjen?', + ], + 'form' => [ + 'email' => 'E-pošta', + 'username' => 'Korisničko ime', + 'password' => 'Lozinka', + 'new_password' => 'Nova lozinka', + 'role' => 'Uloga', + 'roles' => 'Uloge', + 'permissions' => 'Dozvole', + 'submit_create' => 'Kreiraj korisnika', + 'submit_edit' => 'Sačuvaj', + 'submit_password_change' => 'Promeni!', + ], + 'delete_form' => [ + 'title' => 'Ukloni korisnika {user}', + 'disclaimer' => + "Spremate se da trajno uklonite korisnika {user}. Korisnik neće moći više da pristupi administratorskoj zoni.", + 'understand' => 'Shvatam, želim da trajno uklonim korisnika {user}', + 'submit' => 'Obriši', + ], + 'messages' => [ + 'createSuccess' => + 'Korisnik je uspešno kreiran! Poruka dobrodošlice je poslata E-poštom korisniku {username}. Ona sadrži vezu za prijavu a od njih će biti zatraženo resetovanje lozinke nakon prve autentifikacije.', + 'roleEditSuccess' => + "Uloge korisnika {username} su uspešno ažurirane.", + 'banSuccess' => 'Korisnik {username} je zabranjen.', + 'unbanSuccess' => 'Korisniku {username} je skinuta zabrana.', + 'editOwnerError' => + 'Korisnik {username} je vlasnik instance, prosto ne možete dirati vlasnika…', + 'banSuperAdminError' => + 'Korisnik {username} je super administrator, prosto ne možete zabraniti super administratora…', + 'deleteOwnerError' => + 'Korisnik {username} je vlasnik instance, prosto ne možete obrisati vlasnika…', + 'deleteSuperAdminError' => + 'Korisnik {username} je super administrator, prosto ne možete obrisati super administratora…', + 'deleteSuccess' => 'Korisnik {username} je obrisan.', + ], +]; diff --git a/modules/Auth/Language/sv/Contributor.php b/modules/Auth/Language/sv/Contributor.php index c70badc0..572b91ad 100644 --- a/modules/Auth/Language/sv/Contributor.php +++ b/modules/Auth/Language/sv/Contributor.php @@ -14,19 +14,19 @@ return [ 'add' => 'Add contributor', 'add_contributor' => 'Add a contributor for {0}', 'edit_role' => 'Update role for {0}', - 'edit' => 'Edit', + 'edit' => 'Redigera', 'remove' => 'Remove', 'list' => [ - 'username' => 'Username', - 'role' => 'Role', + 'username' => 'Användarnamn', + 'role' => 'Roll', ], 'form' => [ 'user' => 'User', 'user_placeholder' => 'Select a user…', - 'role' => 'Role', + 'role' => 'Roll', 'role_placeholder' => 'Select its role…', 'submit_add' => 'Add contributor', - 'submit_edit' => 'Update role', + 'submit_edit' => 'Uppdatera roll', ], 'delete_form' => [ 'title' => 'Remove {contributor}', diff --git a/modules/Auth/Language/sv/MyAccount.php b/modules/Auth/Language/sv/MyAccount.php index 6ebbb30e..78a66902 100644 --- a/modules/Auth/Language/sv/MyAccount.php +++ b/modules/Auth/Language/sv/MyAccount.php @@ -10,7 +10,7 @@ declare(strict_types=1); return [ 'info' => 'My account info', - 'changePassword' => 'Change my password', + 'changePassword' => 'Ändra mitt lösenord', 'messages' => [ 'wrongPasswordError' => "You've entered the wrong password, try again.", 'passwordChangeSuccess' => 'Password has been successfully changed!', diff --git a/modules/Auth/Language/sv/User.php b/modules/Auth/Language/sv/User.php index e7908f5b..d5a57d48 100644 --- a/modules/Auth/Language/sv/User.php +++ b/modules/Auth/Language/sv/User.php @@ -12,7 +12,7 @@ return [ 'edit_role' => "Edit {username}'s role", 'ban' => 'Ban', 'unban' => 'Unban', - 'delete' => 'Delete', + 'delete' => 'Radera', 'create' => 'New user', 'view' => "{username}'s info", 'all_users' => 'All users', @@ -23,9 +23,9 @@ return [ ], 'form' => [ 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', + 'username' => 'Användarnamn', + 'password' => 'Lösenord', + 'new_password' => 'Nytt lösenord', 'role' => 'Role', 'roles' => 'Roles', 'permissions' => 'Permissions', diff --git a/modules/PodcastImport/Language/sr-Latn/PodcastImport.php b/modules/PodcastImport/Language/sr-Latn/PodcastImport.php new file mode 100644 index 00000000..504175b7 --- /dev/null +++ b/modules/PodcastImport/Language/sr-Latn/PodcastImport.php @@ -0,0 +1,66 @@ + [ + 'disclaimer' => 'Uvoz', + 'text' => '{podcastTitle} se trenutno uvozi.', + 'cta' => 'Pogledaj status uvoza', + ], + 'old_podcast_section_title' => 'Podkast koji se uvozi', + 'old_podcast_legal_disclaimer_title' => 'Pravno odricanje od odgovornosti', + 'old_podcast_legal_disclaimer' => + 'Uverite se da posedujete prava za ovaj podkast pre nego što ga uvezete. Kopiranje i emitovanje podkasta bez odgovarajućih prava je piraterija i podložno je krivičnom gonjenju.', + 'imported_feed_url' => 'URL snabdevača', + 'imported_feed_url_hint' => 'Snabdevač mora biti u xml ili rss formatu.', + 'new_podcast_section_title' => 'Novi podkast', + 'lock_import' => + 'Ovaj snabdevač je zaštićen. Ne možete ga uvesti. Ukoliko ste vlasnik, otključajte snabdevač na originalnoj platformi na kojoj ste ga napravili.', + 'submit' => 'Dodaj uvoz na čekanje', + 'queue' => [ + 'status' => [ + 'label' => 'Status', + 'queued' => 'čekanje', + 'queued_hint' => 'Zadatak uvoza čeka na obradu.', + 'canceled' => 'otkazano', + 'canceled_hint' => 'Zadatak uvoza je otkazan.', + 'running' => 'u toku', + 'running_hint' => 'Zadatak uvoza se procesuira.', + 'failed' => 'nije uspеlo', + 'failed_hint' => 'Zadatak uvoza nije mogao da se završi: greška skripte.', + 'passed' => 'pauzirano', + 'passed_hint' => 'Zadatak uvoza uspešno obavljen!', + ], + 'feed' => 'Snabdevač', + 'duration' => 'Trajanje uvoza', + 'imported_episodes' => 'Uvežene epizode', + 'imported_episodes_hint' => '{newlyImportedCount} novo uvežena, {alreadyImportedCount} već uveženih.', + 'actions' => [ + 'cancel' => 'Otkaži', + 'retry' => 'Pokušaj ponovo', + 'delete' => 'Obriši', + ], + ], + 'syncForm' => [ + 'title' => 'Sinhronizuj snabdevače', + 'feed_url' => 'URL snabdevača', + 'feed_url_hint' => 'URL veza snabdevača koju želite da sinhronizujete sa trenutnim podkastom.', + 'submit' => 'Dodaj u redosled', + ], + 'messages' => [ + 'canceled' => 'Zadatak uvoza uspešno otkazan!', + 'notRunning' => 'Nije moguće otkazati zadatak uvoza jer isti nije u toku.', + 'alreadyRunning' => 'Zadatak uvoza je u toku. Možete ga otkazati pre ponovnog pokušaja.', + 'retried' => 'Zadatak uvoza je na čekanju, biće pokušan ponovo uskoro!', + 'deleted' => 'Zadatak uvoza uspešno obrisan!', + 'importTaskQueued' => 'Novi zadatak je na čekanju, uvoz će krenuti uskoro!', + 'syncTaskQueued' => 'Novi zadatak uvoza je na čekanju, sinhronizacija će početi uskoro!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/sr-Latn/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/sr-Latn/PremiumPodcasts.php new file mode 100644 index 00000000..6da5e74e --- /dev/null +++ b/modules/PremiumPodcasts/Language/sr-Latn/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Podcast sadrži premijerne epizode', + 'episode_is_premium' => 'Epizoda je premijum, dostupna je samo premijum pretplatnicima', + 'unlock_episode' => 'Ova epizoda je samo za premijum pretplatnike. Klikni da je otključaš!', + 'banner_unlock' => 'Ovaj podkast sadrži premijum epizode, dostupne samo premijum pretplatnicima.', + 'banner_lock' => 'Podkast je otključan, uživajte u premijum epizodama!', + 'subscribe' => 'Pretplatite se', + 'lock' => 'Zaključaj', + 'unlock' => 'Otključaj', + 'unlock_form' => [ + 'title' => 'Premijum sadržaj', + 'subtitle' => 'Ovaj podkat sadrži zaključane premijum epizode! Da li imate ključ?', + 'token' => 'Unesite ključ', + 'token_hint' => 'Ako ste pretplaćeni na {podcastTitle}, možete kopirati ključ koji vam je poslat na E poštu i zalepiti ga ovde.', + 'submit' => 'Otključaj sve epizode!', + 'call_to_action' => 'Otključaj sve epizode {podcastTitle}:', + 'subscribe_cta' => 'Pretplati se sada!', + ], + 'messages' => [ + 'unlockSuccess' => 'Podkast je uspešno otključan, uživajte u premijum epizodama!', + 'unlockBadAttempt' => 'Izgleda da vaš ključ ne radi…', + 'lockSuccess' => 'Podkast je uspešno zaključan!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/sr-Latn/Subscription.php b/modules/PremiumPodcasts/Language/sr-Latn/Subscription.php new file mode 100644 index 00000000..0fbeb3aa --- /dev/null +++ b/modules/PremiumPodcasts/Language/sr-Latn/Subscription.php @@ -0,0 +1,100 @@ + 'Podkast pretplate', + 'add' => 'Nova pretplata', + 'view' => 'Pogledaj pretplatu', + 'edit' => 'Uredi pretplatu', + 'regenerate_token' => 'Regeneriši token', + 'suspend' => 'Ukini pretplatu', + 'resume' => 'Nastavi pretplatu', + 'delete' => 'Obriši pretplatu', + 'status' => [ + 'active' => 'Aktivno', + 'suspended' => 'Ukinuto', + 'expired' => 'Isteklo', + ], + 'list' => [ + 'number' => 'Broj', + 'email' => 'E-pošta', + 'expiration_date' => 'Datum Isteka', + 'unlimited' => 'Neograničeno', + 'downloads' => 'Preuzimanja', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'E-pošta', + 'expiration_date' => 'Datum Isteka', + 'expiration_date_hint' => 'Datum i vreme kada pretplata ističe. Ostavite prazno za neograničenu pretplatu.', + 'submit_create' => 'Napravi pretplatu', + 'submit_edit' => 'Uredi pretplatu', + ], + 'form_link_add' => [ + 'link' => 'Veza strane za pretplate', + 'link_hint' => 'Ovo će dodati poziv na akciju na veb lokaciji koji poziva slušaoce da se pretplate na podkast.', + 'submit' => 'Sačuvaj vezu', + ], + 'suspend_form' => [ + 'disclaimer' => 'Obustavljanje pretplate će ograničiti pretplatniku pristup premijum sadržaju. I dalje ćete moći da uklonite obustavu nakon toga.', + 'reason' => 'Razlog', + 'reason_placeholder' => 'Zašto ukidate pretplatu?', + "submit" => 'Ukini pretplatu', + ], + 'delete_form' => [ + 'disclaimer' => 'Brisanje {subscriber} pretplate će ukloniti svu analitiku vezanu za tog pretplatnika.', + 'understand' => 'Razumem, želim da trajno ukinem pretplatu', + 'submit' => 'Ukloni pretplatu', + ], + 'messages' => [ + 'addSuccess' => 'Nova pretplata dodata! Poruka dobrodođlice je poslata {subscriber} putem E-pošte.', + 'addError' => 'Nije moguće dodati pretplatu.', + 'editSuccess' => 'Datum isteka pretplate je ažuriran! Poruka je poslata {subscriber} putem E-pošte.', + 'editError' => 'Nije moguće urediti pretplatu.', + 'regenerateTokenSuccess' => 'Token regenerisan! Novi token je poslat {subscriber} putem E-pošte.', + 'regenerateTokenError' => 'Token nije moguće regenerisati.', + 'deleteSuccess' => 'Pretplata je uklonjena! Poruka je poslata {subscriber} putem E-pošte.', + 'deleteError' => 'Nije moguće ukloniti pretplatu.', + 'suspendSuccess' => 'Pretplata je ukinuta! Poruka je poslata {subscriber} putem E-pošte.', + 'suspendError' => 'Nije moguće prekinuti pretplatu.', + 'resumeSuccess' => 'Pretplana je obnovljena! Poruka je poslata {subscriber} putem E-pošte.', + 'resumeError' => 'Nije moguće obnoviti pretplatu.', + 'linkSaveSuccess' => 'Veza za pretplatu je uspešno sačuvana! Pojaviće se na Veb strani kao poziv na akciju!', + 'linkRemoveSuccess' => 'Veza za pretplatu je uspešno uklonjena!', + ], + 'emails' => [ + 'greeting' => 'Hej,', + 'token' => 'Vaš token: {0}', + 'unique_feed_link' => 'Vaša jedinstvena veza sa fidom: {0}', + 'how_to_use' => 'Kako se koristi?', + 'two_ways' => 'Imate dva načina kako možete otključati premijum epizode:', + 'import_into_app' => 'Kopirajte svoj jedinstveni url fid u svoju omiljenu aplikaciju za podkaste (uvezite ga kao privatni fid da biste sprečili otkrivanje vaših akreditiva).', + 'go_to_website' => 'Idite na {podcastWebsite} veb stranicu i otključajte podkast koristeći vaš token.', + 'welcome_subject' => 'Dobrodošli na {podcastTitle}', + 'welcome' => 'Pretplatili ste se na {podcastTitle}, hvala vam i dobrodošli!', + 'welcome_token_title' => 'Evo vaših akreditiva kojima otključavate premijum epizode ovog podkasta:', + 'welcome_expires' => 'Vaša pretplata ističe {0}.', + 'welcome_never_expires' => 'Vaša pretplata je podešena tako da ne može da istekne.', + 'reset_subject' => 'Vaš token je resetovan!', + 'reset_token' => 'Vaš pristup {podcastTitle} je resetovan!', + 'reset_token_title' => 'Nove akreditive su kreirane kako bi ste pristupili premijum epizodama podkasta:', + 'edited_subject' => 'Vaša pretplata je ažurirana!', + 'edited_expires' => 'Vaša pretplata na {podcastTitle} ističe {expiresAt}.', + 'edited_never_expires' => 'Vaša pretplata na {podcastTitle} je podešena tako da nikad ne istekne!', + 'suspended_subject' => 'Vaša pretplata je ukinuta!', + 'suspended' => 'Vaša pretplata na {podcastTitle} je ukinuta! Više ne možete pristupiti premijum epizodama ovog podkasta.', + 'suspended_reason' => 'Razlog: {0}', + 'resumed_subject' => 'Vaša pretplata je ponovo pokrenuta!', + 'resumed' => 'Vaša pretplata na {podcastTitle} je ponovo pokrenuta! Sada ponovo možete pristupiti premijum epizodama ovog podkasta.', + 'deleted_subject' => 'Vaša pretplata je uklonjena!', + 'deleted' => 'Vaša pretplata na {podcastTitle} je uklonjena! Vipe ne možete pristupiti premijum epizodama ovog podkasta.', + 'footer' => '{castopod} hostovan na {host}', + ], +]; From 523b2c610e3608fe5fb47493239a7d5f1555314a Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 11 Mar 2024 17:18:22 +0000 Subject: [PATCH 317/477] chore: add bluesky as social media platform --- app/Database/Seeds/PlatformSeeder.php | 7 +++++++ app/Resources/icons/social/bluesky.svg | 1 + 2 files changed, 8 insertions(+) create mode 100644 app/Resources/icons/social/bluesky.svg diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index fb322041..d9c398df 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -487,6 +487,13 @@ class PlatformSeeder extends Seeder ]; $socialData = [ + [ + 'slug' => 'bluesky', + 'type' => 'social', + 'label' => 'Bluesky', + 'home_url' => 'https://bsky.app/', + 'submit_url' => 'https://bsky.app/', + ], [ 'slug' => 'discord', 'type' => 'social', diff --git a/app/Resources/icons/social/bluesky.svg b/app/Resources/icons/social/bluesky.svg new file mode 100644 index 00000000..3f1b2757 --- /dev/null +++ b/app/Resources/icons/social/bluesky.svg @@ -0,0 +1 @@ + \ No newline at end of file From bec4f93837a2e94464e3f78a74d04bd386fa29bb Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Tue, 12 Mar 2024 11:08:18 +0000 Subject: [PATCH 318/477] docs(docker): add redis password to docker-compose example closes #408 --- docs/src/getting-started/docker.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/getting-started/docker.md b/docs/src/getting-started/docker.md index dbb6179f..efa8424f 100644 --- a/docs/src/getting-started/docker.md +++ b/docs/src/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: From 9d7d11cefa68b829c88a9d9558804b5e1969b588 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 12 Mar 2024 11:28:38 +0000 Subject: [PATCH 319/477] chore(release): 1.10.5 [skip ci] ## [1.10.5](https://code.castopod.org/adaures/castopod/compare/v1.10.4...v1.10.5) (3/12/2024) ### Bug Fixes * **file-uploads:** validate chapters json content + remove permit_empty rule to uploaded files ([6289c42](https://code.castopod.org/adaures/castopod/commit/6289c42b1189f074c7e4e4cd9fbfd73bf26625c9)), closes [#445](https://code.castopod.org/adaures/castopod/issues/445) --- CHANGELOG.md | 9 +++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2eeb0b76..83cc3f50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [1.10.5](https://code.castopod.org/adaures/castopod/compare/v1.10.4...v1.10.5) (3/12/2024) + +### Bug Fixes + +- **file-uploads:** validate chapters json content + remove permit_empty rule to + uploaded files + ([6289c42](https://code.castopod.org/adaures/castopod/commit/6289c42b1189f074c7e4e4cd9fbfd73bf26625c9)), + closes [#445](https://code.castopod.org/adaures/castopod/issues/445) + ## [1.10.4](https://code.castopod.org/adaures/castopod/compare/v1.10.3...v1.10.4) (2/26/2024) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 86b88e77..9c5f559f 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.10.4'); +defined('CP_VERSION') || define('CP_VERSION', '1.10.5'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 189bcbed..59fc732b 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.10.4", + "version": "1.10.5", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 87e86edc..4c677b86 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.10.4", + "version": "1.10.5", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From 13db54ccce45ea0c90771af680273f738a2c68d8 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 28 Mar 2024 12:04:12 +0000 Subject: [PATCH 320/477] build(devcontainer): move dev docker files to .devcontainer and set dev environment in app service - add mailpit service to debug email - remove s3 service --- .../development => .devcontainer}/Dockerfile | 3 - .devcontainer/crontab | 1 + .devcontainer/devcontainer.json | 10 +-- .devcontainer/docker-compose.yml | 84 +++++++++++++++-- {initdb => .devcontainer/initdb}/01.sql | 0 crontab | 1 - docker-compose.yml | 90 ------------------- 7 files changed, 85 insertions(+), 104 deletions(-) rename {docker/development => .devcontainer}/Dockerfile (98%) create mode 100644 .devcontainer/crontab rename {initdb => .devcontainer/initdb}/01.sql (100%) delete mode 100644 crontab delete mode 100644 docker-compose.yml diff --git a/docker/development/Dockerfile b/.devcontainer/Dockerfile similarity index 98% rename from docker/development/Dockerfile rename to .devcontainer/Dockerfile index edb0ac01..c14f1bbf 100644 --- a/docker/development/Dockerfile +++ b/.devcontainer/Dockerfile @@ -8,9 +8,6 @@ FROM php:8.1-fpm LABEL maintainer="Yassine Doghri " -COPY . /castopod -WORKDIR /castopod - # Install composer COPY --from=composer:2 /usr/bin/composer /usr/bin/composer diff --git a/.devcontainer/crontab b/.devcontainer/crontab new file mode 100644 index 00000000..8cef165a --- /dev/null +++ b/.devcontainer/crontab @@ -0,0 +1 @@ +* * * * * /usr/local/bin/php /workspaces/castopod/spark tasks:run >> /dev/null 2>&1 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a48dc081..70877355 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,13 +1,13 @@ // For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: // https://github.com/microsoft/vscode-dev-containers/tree/v0.117.1/containers/docker-existing-dockerfile { - "name": "Castopod dev", - "dockerComposeFile": ["../docker-compose.yml", "./docker-compose.yml"], + "name": "castopod.local", + "dockerComposeFile": ["./docker-compose.yml"], "service": "app", - "workspaceFolder": "/castopod", + "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", "postCreateCommand": "composer install && pnpm install && pnpm run build:static && php spark migrate --all && php spark db:seed DevSeeder", - "postStartCommand": "crontab ./crontab && cron && php spark serve --host 0.0.0.0", - "postAttachCommand": "crontab ./crontab && service cron reload", + "postStartCommand": "git config --global --add safe.directory ${containerWorkspaceFolder} && crontab .devcontainer/crontab && cron && php spark serve --host 0.0.0.0", + "postAttachCommand": "crontab .devcontainer/crontab && service cron reload", "shutdownAction": "stopCompose", "features": { "ghcr.io/devcontainers/features/git:1": {}, diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index ec3827cf..73110337 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,10 +1,84 @@ version: "3" + services: app: + build: + context: . + dockerfile: Dockerfile + ports: + - 8080:8080 volumes: - # Mounts the project folder to '/workspace'. While this file is in .devcontainer, - # mounts are relative to the first file in the list, which is a level up. - - .:/castopod:cached + - ../..:/workspaces:cached + environment: + CI_ENVIRONMENT: development + vite_environment: development + app_forceGlobalSecureRequests: false + app_baseURL: http://localhost:8080/ + media_baseURL: http://localhost:8080/ + admin_gateway: cp-admin + auth_gateway: cp-auth + analytics_salt: dev_analytics_salt + database_default_hostname: mariadb + database_default_database: castopod + database_default_username: castopod + database_default_password: castopod + database_default_DBPrefix: cp_ + restapi_enabled: true + email_fromEmail: hello@castopod.local + email_SMTPCrypto: "" + email_SMTPHost: mailpit + email_SMTPUser: castopod + email_SMTPPass: castopod + email_SMTPPort: 1025 + depends_on: + - redis + - mariadb - # Overrides default command so things don't shut down after the process ends. - command: /bin/sh -c "while sleep 1000; do :; done" + redis: + image: redis:alpine + volumes: + - redis:/data + + mariadb: + image: mariadb:10.2 + volumes: + - ./initdb:/docker-entrypoint-initdb.d + - mariadb:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: castopod + + phpmyadmin: + image: phpmyadmin/phpmyadmin:latest + environment: + PMA_HOST: mariadb + PMA_PORT: 3306 + UPLOAD_LIMIT: 300M + ports: + - 8888:80 + volumes: + - phpmyadmin:/sessions + depends_on: + - mariadb + + mailpit: + image: axllent/mailpit + restart: always + volumes: + - mailpit:/data + ports: + - 8025:8025 + - 1025:1025 + environment: + MP_MAX_MESSAGES: 5000 + MP_DATA_FILE: /data/mailpit.db + MP_SMTP_AUTH_ACCEPT_ANY: 1 + MP_SMTP_AUTH_ALLOW_INSECURE: 1 + +volumes: + redis: + mariadb: + phpmyadmin: + mailpit: diff --git a/initdb/01.sql b/.devcontainer/initdb/01.sql similarity index 100% rename from initdb/01.sql rename to .devcontainer/initdb/01.sql diff --git a/crontab b/crontab deleted file mode 100644 index 660baa55..00000000 --- a/crontab +++ /dev/null @@ -1 +0,0 @@ -* * * * * /usr/local/bin/php /castopod/spark tasks:run >> /dev/null 2>&1 diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index f9cbabab..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,90 +0,0 @@ -version: "3.8" - -networks: - castopod: - ipam: - config: - - subnet: 172.31.0.0/24 - -services: - app: - build: - context: . - dockerfile: docker/development/Dockerfile - container_name: app - command: /bin/sh -c "crontab ./crontab && cron && service cron reload && php spark serve --host 0.0.0.0" - ports: - - 8080:8080 - volumes: - - .:/castopod - depends_on: - - redis - - mariadb - networks: - castopod: - ipv4_address: 172.31.0.2 - - redis: - image: redis:alpine - container_name: castopod_redis - ports: - - 6379:6379 - volumes: - - redis:/data - networks: - castopod: - ipv4_address: 172.31.0.3 - - mariadb: - image: mariadb:10.2 - container_name: castopod_mariadb - ports: - - 3306:3306 - volumes: - - ./initdb:/docker-entrypoint-initdb.d - - mariadb:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: castopod - networks: - castopod: - ipv4_address: 172.31.0.4 - - phpmyadmin: - image: phpmyadmin/phpmyadmin:latest - container_name: castopod_phpmyadmin - environment: - PMA_HOST: mariadb - PMA_PORT: 3306 - UPLOAD_LIMIT: 300M - ports: - - 8888:80 - volumes: - - phpmyadmin:/sessions - depends_on: - - mariadb - networks: - castopod: - ipv4_address: 172.31.0.5 - - s3: - image: adobe/s3mock:latest - container_name: castopod_s3 - environment: - - initialBuckets=castopod - - debug=true - - root=/data - ports: - - 9090:9090 - volumes: - - ./data/s3:/data:cached - networks: - castopod: - ipv4_address: 172.31.0.6 - -volumes: - redis: - mariadb: - phpmyadmin: From a5aef2a63e464632f3941649d455672835989e6c Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Sat, 6 Apr 2024 11:47:49 +0000 Subject: [PATCH 321/477] fix(rss): generate podcast guid if empty closes #450 --- app/Helpers/rss_helper.php | 11 +++++++++++ app/Models/PodcastModel.php | 6 +++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index a063b5c7..8e378eb9 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -11,6 +11,7 @@ use App\Entities\Category; use App\Entities\Location; use App\Entities\Podcast; use App\Libraries\SimpleRSSElement; +use App\Models\PodcastModel; use CodeIgniter\I18n\Time; use Config\Mimes; use Modules\Media\Entities\Chapters; @@ -69,6 +70,16 @@ if (! function_exists('get_rss_feed')) { $channel->addChild('generator', 'Castopod - https://castopod.org/'); $channel->addChild('docs', 'https://cyber.harvard.edu/rss/rss.html'); + if ($podcast->guid === '') { + // FIXME: guid shouldn't be empty here as it should be filled upon Podcast creation + $uuid = service('uuid'); + // 'ead4c236-bf58-58c6-a2c6-a6b28d128cb6' is the uuid of the podcast namespace + $podcast->guid = $uuid->uuid5('ead4c236-bf58-58c6-a2c6-a6b28d128cb6', $podcast->feed_url) + ->toString(); + + (new PodcastModel())->save($podcast); + } + $channel->addChild('guid', $podcast->guid, $podcastNamespace); $channel->addChild('title', $podcast->title, null, false); $channel->addChildWithCDATA('description', $podcast->description_html); diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 9dd3763a..4372b1f4 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -351,7 +351,7 @@ class PodcastModel extends Model */ public function clearCache(array $data): array { - $podcast = (new self())->getPodcastById(is_array($data['id']) ? $data['id'][0] : $data['id']); + $podcast = (new self())->getPodcastById((int) (is_array($data['id']) ? $data['id'][0] : $data['id'])); // delete cache for users' podcasts cache() @@ -443,7 +443,7 @@ class PodcastModel extends Model */ protected function setActorAvatar(array $data): array { - $podcast = (new self())->getPodcastById(is_array($data['id']) ? $data['id'][0] : $data['id']); + $podcast = (new self())->getPodcastById((int) (is_array($data['id']) ? $data['id'][0] : $data['id'])); if ($podcast instanceof Podcast) { $podcastActor = (new ActorModel())->find($podcast->actor_id); @@ -468,7 +468,7 @@ class PodcastModel extends Model */ protected function updatePodcastActor(array $data): array { - $podcast = (new self())->getPodcastById(is_array($data['id']) ? $data['id'][0] : $data['id']); + $podcast = (new self())->getPodcastById((int) (is_array($data['id']) ? $data['id'][0] : $data['id'])); if ($podcast instanceof Podcast) { $actorModel = new ActorModel(); From 004f804045cd8e884361bb4318109fbdd7afc9a8 Mon Sep 17 00:00:00 2001 From: "Guy Martin (Dwev)" Date: Fri, 12 Apr 2024 10:26:54 +0000 Subject: [PATCH 322/477] feat(platforms): add telegram to socials --- app/Database/Seeds/PlatformSeeder.php | 7 +++++++ app/Resources/icons/social/telegram.svg | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 app/Resources/icons/social/telegram.svg diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index d9c398df..49d6c79b 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -592,6 +592,13 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://slack.com/', 'submit_url' => 'https://slack.com/get-started#/create', ], + [ + 'slug' => 'telegram', + 'type' => 'social', + 'label' => 'Telegram', + 'home_url' => 'https://www.telegram.org/', + 'submit_url' => '', + ], [ 'slug' => 'threads', 'type' => 'social', diff --git a/app/Resources/icons/social/telegram.svg b/app/Resources/icons/social/telegram.svg new file mode 100644 index 00000000..3fa6cb61 --- /dev/null +++ b/app/Resources/icons/social/telegram.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 80fdd9cfb4a95feac6ed0000435a013fc83e6892 Mon Sep 17 00:00:00 2001 From: Dwev <46626050+Dwev@users.noreply.github.com> Date: Wed, 10 Apr 2024 15:10:14 +0000 Subject: [PATCH 323/477] feat: add trailer tags to rss if trailer episodes are present --- app/Helpers/rss_helper.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 8e378eb9..29c6d676 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -348,6 +348,21 @@ if (! function_exists('get_rss_feed')) { $item->addChild('season', (string) $episode->season_number, $itunesNamespace); $item->addChild('episodeType', $episode->type, $itunesNamespace); + // If episode is of type trailer, add podcast:trailer tag on channel level + if ($episode->type == 'trailer') { + $trailer = $channel->addChild('trailer', $episode->title, $podcastNamespace); + $trailer->addAttribute('pubdate', $episode->published_at->format(DATE_RFC2822)); + $trailer->addAttribute( + 'url', + $episode->audio_url . ($enclosureParams === '' ? '' : '?' . $enclosureParams), + ); + $trailer->addAttribute('length', (string) $episode->audio->file_size); + $trailer->addAttribute('type', $episode->audio->file_mimetype); + if ($episode->season_number !== null) { + $trailer->addAttribute('season', (string) $episode->season_number); + } + } + // add podcast namespace tags for season and episode $episode->season_number && $item->addChild('season', (string) $episode->season_number, $podcastNamespace); From d046ecc52f6ccd41d09f6de48e00d2c61d25d7f0 Mon Sep 17 00:00:00 2001 From: "Guy Martin (Dwev)" Date: Fri, 12 Apr 2024 11:16:33 +0000 Subject: [PATCH 324/477] feat(platforms): add truefans.fm and episodes.fm closes #458, #459 --- app/Database/Seeds/PlatformSeeder.php | 14 ++++++++++++++ app/Resources/icons/podcasting/episodes-fm.svg | 1 + app/Resources/icons/podcasting/truefans.svg | 1 + 3 files changed, 16 insertions(+) create mode 100644 app/Resources/icons/podcasting/episodes-fm.svg create mode 100644 app/Resources/icons/podcasting/truefans.svg diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index 49d6c79b..de8b04be 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -271,6 +271,13 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://curiocaster.com/', 'submit_url' => '', ], + [ + 'slug' => 'episodes-fm', + 'type' => 'podcasting', + 'label' => 'Episodes.fm', + 'home_url' => 'https://episodes.fm/', + 'submit_url' => 'https://podcastindex.org/add', + ], [ 'slug' => 'escapepod', 'type' => 'podcasting', @@ -376,6 +383,13 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://sphinx.chat/', 'submit_url' => '', ], + [ + 'slug' => 'truefans', + 'type' => 'podcasting', + 'label' => 'Truefans', + 'home_url' => 'https://truefans.fm/', + 'submit_url' => 'https://podcastindex.org/add', + ], [ 'slug' => 'tsacdop', 'type' => 'podcasting', diff --git a/app/Resources/icons/podcasting/episodes-fm.svg b/app/Resources/icons/podcasting/episodes-fm.svg new file mode 100644 index 00000000..ec3b9572 --- /dev/null +++ b/app/Resources/icons/podcasting/episodes-fm.svg @@ -0,0 +1 @@ + diff --git a/app/Resources/icons/podcasting/truefans.svg b/app/Resources/icons/podcasting/truefans.svg new file mode 100644 index 00000000..63ad8fc7 --- /dev/null +++ b/app/Resources/icons/podcasting/truefans.svg @@ -0,0 +1 @@ + \ No newline at end of file From 88851b022663d575a816f0e2f33f0353767dd52d Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Fri, 12 Apr 2024 13:07:23 +0000 Subject: [PATCH 325/477] fix(premium): set itunes:block on premium feeds to prevent indexing --- app/Helpers/rss_helper.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 29c6d676..3f85b053 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -17,7 +17,6 @@ use Config\Mimes; use Modules\Media\Entities\Chapters; use Modules\Media\Entities\Transcript; use Modules\PremiumPodcasts\Entities\Subscription; -use Modules\WebSub\Config\WebSub; if (! function_exists('get_rss_feed')) { /** @@ -274,7 +273,7 @@ if (! function_exists('get_rss_feed')) { $channel->addChild('type', $podcast->type, $itunesNamespace); $podcast->copyright && $channel->addChild('copyright', $podcast->copyright); - if ($podcast->is_blocked) { + if ($podcast->is_blocked || $subscription instanceof Subscription) { $channel->addChild('block', 'Yes', $itunesNamespace); } From 4d141fceae56fa9e666b42c32a830ff9c68989db Mon Sep 17 00:00:00 2001 From: "Guy Martin (Dwev)" Date: Wed, 17 Apr 2024 09:13:07 +0000 Subject: [PATCH 326/477] feat: add transcript display to episode page + fix transcript parser closes #411 --- app/Config/Routes.php | 6 ++ app/Controllers/EpisodeController.php | 68 ++++++++++++++++++- app/Controllers/EpisodePreviewController.php | 33 +++++++-- app/Language/en/Episode.php | 3 + modules/Media/TranscriptParser.php | 48 ++++++++----- .../cp_app/episode/_partials/navigation.php | 10 +++ .../cp_app/episode/_partials/transcript.php | 9 +++ themes/cp_app/episode/preview-transcript.php | 60 ++++++++++++++++ themes/cp_app/episode/transcript.php | 60 ++++++++++++++++ 9 files changed, 274 insertions(+), 23 deletions(-) create mode 100644 themes/cp_app/episode/_partials/transcript.php create mode 100644 themes/cp_app/episode/preview-transcript.php create mode 100644 themes/cp_app/episode/transcript.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 66644b83..9635b8b6 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -128,6 +128,9 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { $routes->get('chapters', 'EpisodeController::chapters/$1/$2', [ 'as' => 'episode-chapters', ]); + $routes->get('transcript', 'EpisodeController::transcript/$1/$2', [ + 'as' => 'episode-transcript', + ]); $routes->options('comments', 'ActivityPubController::preflight'); $routes->get('comments', 'EpisodeController::comments/$1/$2', [ 'as' => 'episode-comments', @@ -205,6 +208,9 @@ $routes->get('/p/(:uuid)/activity', 'EpisodePreviewController::activity/$1', [ $routes->get('/p/(:uuid)/chapters', 'EpisodePreviewController::chapters/$1', [ 'as' => 'episode-preview-chapters', ]); +$routes->get('/p/(:uuid)/transcript', 'EpisodePreviewController::transcript/$1', [ + 'as' => 'episode-preview-transcript', +]); // Other pages $routes->get('/credits', 'CreditsController', [ diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index 9c99a01d..ae76e96b 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -167,7 +167,7 @@ class EpisodeController extends BaseController return $cachedView; } - public function chapters(): String + public function chapters(): string { // Prevent analytics hit when authenticated if (! auth()->loggedIn()) { @@ -228,6 +228,72 @@ class EpisodeController extends BaseController return $cachedView; } + public function transcript(): string + { + // Prevent analytics hit when authenticated + if (! auth()->loggedIn()) { + $this->registerPodcastWebpageHit($this->episode->podcast_id); + } + + $cacheName = implode( + '_', + array_filter([ + 'page', + "podcast#{$this->podcast->id}", + "episode#{$this->episode->id}", + 'transcript', + service('request') + ->getLocale(), + is_unlocked($this->podcast->handle) ? 'unlocked' : null, + auth() + ->loggedIn() ? 'authenticated' : null, + ]), + ); + + if (! ($cachedView = cache($cacheName))) { + // get transcript from json file + $data = [ + 'metatags' => get_episode_metatags($this->episode), + 'podcast' => $this->podcast, + 'episode' => $this->episode, + ]; + + if ($this->episode->transcript !== null) { + $data['transcript'] = $this->episode->transcript; + + if ($this->episode->transcript->json_key !== null) { + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); + $transcriptJsonString = (string) $fileManager->getFileContents( + $this->episode->transcript->json_key + ); + + $data['captions'] = json_decode($transcriptJsonString, true); + } + } + + $secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode( + $this->podcast->id, + ); + + if (auth()->loggedIn()) { + helper('form'); + + return view('episode/transcript', $data); + } + + // The page cache is set to a decade so it is deleted manually upon podcast update + return view('episode/transcript', $data, [ + 'cache' => $secondsToNextUnpublishedEpisode + ? $secondsToNextUnpublishedEpisode + : DECADE, + 'cache_name' => $cacheName, + ]); + } + + return $cachedView; + } + public function embed(string $theme = 'light-transparent'): string { header('Content-Security-Policy: frame-ancestors http://*:* https://*:*'); diff --git a/app/Controllers/EpisodePreviewController.php b/app/Controllers/EpisodePreviewController.php index 583fae9a..2640a538 100644 --- a/app/Controllers/EpisodePreviewController.php +++ b/app/Controllers/EpisodePreviewController.php @@ -13,7 +13,6 @@ namespace App\Controllers; use App\Entities\Episode; use App\Models\EpisodeModel; use CodeIgniter\Exceptions\PageNotFoundException; -use CodeIgniter\HTTP\RedirectResponse; use Modules\Media\FileManagers\FileManagerInterface; class EpisodePreviewController extends BaseController @@ -45,7 +44,7 @@ class EpisodePreviewController extends BaseController return $this->{$method}(...$params); } - public function index(): RedirectResponse | string + public function index(): string { helper('form'); @@ -55,7 +54,7 @@ class EpisodePreviewController extends BaseController ]); } - public function activity(): RedirectResponse | string + public function activity(): string { helper('form'); @@ -65,7 +64,7 @@ class EpisodePreviewController extends BaseController ]); } - public function chapters(): RedirectResponse | string + public function chapters(): string { $data = [ 'podcast' => $this->episode->podcast, @@ -84,4 +83,30 @@ class EpisodePreviewController extends BaseController helper('form'); return view('episode/preview-chapters', $data); } + + public function transcript(): string + { + // get transcript from json file + $data = [ + 'podcast' => $this->episode->podcast, + 'episode' => $this->episode, + ]; + + if ($this->episode->transcript !== null) { + $data['transcript'] = $this->episode->transcript; + + if ($this->episode->transcript->json_key !== null) { + /** @var FileManagerInterface $fileManager */ + $fileManager = service('file_manager'); + $transcriptJsonString = (string) $fileManager->getFileContents( + $this->episode->transcript->json_key + ); + + $data['captions'] = json_decode($transcriptJsonString, true); + } + } + + helper('form'); + return view('episode/preview-transcript', $data); + } } diff --git a/app/Language/en/Episode.php b/app/Language/en/Episode.php index 7536120d..c2ed2b80 100644 --- a/app/Language/en/Episode.php +++ b/app/Language/en/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comments', 'activity' => 'Activity', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Episode description', 'number_of_comments' => '{numberOfComments, plural, one {# comment} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/modules/Media/TranscriptParser.php b/modules/Media/TranscriptParser.php index 90167d0a..06b11465 100644 --- a/modules/Media/TranscriptParser.php +++ b/modules/Media/TranscriptParser.php @@ -144,6 +144,7 @@ class TranscriptParser break; case VTT_STATE_BLANK: + $speakercount = 0; $state = VTT_STATE_TIME; break; @@ -154,20 +155,8 @@ class TranscriptParser case VTT_STATE_TEXT: if (trim($line) === '') { - $sub = new stdClass(); - $sub->number = $subNum; - [$startTime, $endTime] = explode(' --> ', $subTime); - $sub->startTime = $this->getSecondsFromVTTTimeString($startTime); - $sub->endTime = $this->getSecondsFromVTTTimeString($endTime); - $sub->text = trim($subText); - if ($subSpeaker !== '') { - $sub->speaker = trim((string) $subSpeaker); - } - - $subText = ''; $state = VTT_STATE_TIME; - $subs[] = $sub; - ++$subNum; + //$subs[] = $sub; } elseif ($subText !== '') { $subText .= PHP_EOL . $line; } else { @@ -179,18 +168,36 @@ class TranscriptParser * 2. Who is speaking * 3. Any styling cues encoded in the VTT (which we dump) * More information: https://www.w3.org/TR/webvtt1/ - */ - $vtt_speaker_pattern = '/^<.*>/'; - $removethese = ['<', '>']; + * + * If there is more than one speaker in a cue, we also need + * to handle this, to repeat the start and end times for + * the second cue. + * */ + + $vtt_speaker_pattern = '/^<.*>/U'; + $removethese = ['', '<', '>']; preg_match($vtt_speaker_pattern, $line, $matches); if (isset($matches[0])) { - $subVoiceCue = explode(' ', str_replace($removethese, '', $matches[0])); - $subSpeaker = $subVoiceCue[1]; + $subVoiceCue = str_replace($removethese, '', $matches[0]); + $subSpeaker = substr($subVoiceCue, strpos($subVoiceCue, ' ')); } else { $subSpeaker = ''; } $subText .= preg_replace($vtt_speaker_pattern, '', $line); + $sub = new stdClass(); + $sub->number = $subNum; + [$startTime, $endTime] = explode(' --> ', $subTime); + $sub->startTime = $this->getSecondsFromVTTTimeString($startTime); + $sub->endTime = $this->getSecondsFromVTTTimeString($endTime); + $sub->text = trim($subText); + if ($subSpeaker !== '') { + $sub->speaker = trim($subSpeaker); + } + + $subText = ''; + $subs[] = $sub; + ++$subNum; } break; @@ -215,6 +222,11 @@ class TranscriptParser private function getSecondsFromVTTTimeString(string $timeString): float { $timeString = explode('.', $timeString); + if (substr_count($timeString[0], ':') === 1) { + // add hours if only MM:SS.mmm format + $timeString[0] = '00:' . $timeString[0]; + } + return (strtotime($timeString[0]) - strtotime('TODAY')) + (float) "0.{$timeString[1]}"; } } diff --git a/themes/cp_app/episode/_partials/navigation.php b/themes/cp_app/episode/_partials/navigation.php index beabf102..790dcaa2 100644 --- a/themes/cp_app/episode/_partials/navigation.php +++ b/themes/cp_app/episode/_partials/navigation.php @@ -17,6 +17,11 @@ if ($episode->publication_status === 'published') { 'label' => lang('Episode.chapters'), 'labelInfo' => $episode->chapters === null ? 0 : $episode->chapters->chapter_count, ], + [ + 'uri' => route_to('episode-transcript', esc($podcast->handle), esc($episode->slug)), + 'label' => lang('Episode.transcript'), + 'labelInfo' => $episode->transcript === null ? '–' : '✓', + ], ]; } else { $navigationItems = [ @@ -35,6 +40,11 @@ if ($episode->publication_status === 'published') { 'label' => lang('Episode.chapters'), 'labelInfo' => $episode->chapters === null ? 0 : $episode->chapters->chapter_count, ], + [ + 'uri' => route_to('episode-preview-transcript', $episode->preview_id), + 'label' => lang('Episode.transcript'), + 'labelInfo' => $episode->transcript === null ? '–' : '✓', + ], ]; } diff --git a/themes/cp_app/episode/_partials/transcript.php b/themes/cp_app/episode/_partials/transcript.php new file mode 100644 index 00000000..af6826ab --- /dev/null +++ b/themes/cp_app/episode/_partials/transcript.php @@ -0,0 +1,9 @@ +
    + +

    + + + + +

    +
    diff --git a/themes/cp_app/episode/preview-transcript.php b/themes/cp_app/episode/preview-transcript.php new file mode 100644 index 00000000..90953788 --- /dev/null +++ b/themes/cp_app/episode/preview-transcript.php @@ -0,0 +1,60 @@ +extend('episode/_layout-preview') ?> + +section('content') ?> + + +
    + + $startTimeFormatted ?? '', + 'speaker' => $speakerLabel ?? '', + 'text' => $captionTextBlock ?? '', + ]); + $captionTextBlock = ''; + } + $startTimeFormatted = format_duration($caption['startTime']); + $speakerLabel = $caption['speaker']; + $captionTextBlock .= $captionText; + $previousSpeaker = $speakerLabel; + $renderCue = true; + } else { + // concatenate cues with the same speaker + $captionTextBlock .= ' ' . $captionText; + } + } else { + $startTimeFormatted = isset($caption['startTime']) ? format_duration($caption['startTime']) : ''; + echo view('episode/_partials/transcript', [ + 'startTime' => $startTimeFormatted, + 'speaker' => $caption['speaker'] ?? '', + 'text' => $captionText ?? '', + ]); + } + } +// render last cue if not already rendered +if ($captionTextBlock !== '') { + echo view('episode/_partials/transcript', [ + 'startTime' => $startTimeFormatted ?? '', + 'speaker' => $speakerLabel ?? '', + 'text' => $captionTextBlock ?? '', + ]); +} +?> +
    + +
    + +endSection() ?> diff --git a/themes/cp_app/episode/transcript.php b/themes/cp_app/episode/transcript.php new file mode 100644 index 00000000..5a183d65 --- /dev/null +++ b/themes/cp_app/episode/transcript.php @@ -0,0 +1,60 @@ +extend('episode/_layout') ?> + +section('content') ?> + + +
    + + $startTimeFormatted ?? '', + 'speaker' => $speakerLabel ?? '', + 'text' => $captionTextBlock ?? '', + ]); + $captionTextBlock = ''; + } + $startTimeFormatted = format_duration($caption['startTime']); + $speakerLabel = $caption['speaker']; + $captionTextBlock .= $captionText; + $previousSpeaker = $speakerLabel; + $renderCue = true; + } else { + // concatenate cues with the same speaker + $captionTextBlock .= ' ' . $captionText; + } + } else { + $startTimeFormatted = isset($caption['startTime']) ? format_duration($caption['startTime']) : ''; + echo view('episode/_partials/transcript', [ + 'startTime' => $startTimeFormatted, + 'speaker' => $caption['speaker'] ?? '', + 'text' => $captionText ?? '', + ]); + } + } +// render last cue if not already rendered +if ($captionTextBlock !== '') { + echo view('episode/_partials/transcript', [ + 'startTime' => $startTimeFormatted ?? '', + 'speaker' => $speakerLabel ?? '', + 'text' => $captionTextBlock ?? '', + ]); +} +?> +
    + +
    + +endSection() ?> From 499005d7984e9ae9f60498086b7be84c0c94e96f Mon Sep 17 00:00:00 2001 From: crowdin Date: Wed, 17 Apr 2024 09:57:14 +0000 Subject: [PATCH 327/477] chore(i18n): new Crowdin updates --- app/Language/ar/Episode.php | 3 + app/Language/br/Episode.php | 3 + app/Language/ca/Episode.php | 3 + app/Language/da/Episode.php | 3 + app/Language/de/Episode.php | 7 +- app/Language/de/Podcast.php | 2 +- app/Language/el/Episode.php | 3 + app/Language/es/Episode.php | 3 + app/Language/eu/Comment.php | 34 ++ app/Language/eu/Common.php | 30 ++ app/Language/eu/Episode.php | 50 +++ app/Language/eu/Fediverse.php | 37 ++ app/Language/eu/Home.php | 20 ++ app/Language/eu/Page.php | 17 + app/Language/eu/Podcast.php | 55 +++ app/Language/eu/Post.php | 40 +++ app/Language/fa/Episode.php | 3 + app/Language/fr/Episode.php | 3 + app/Language/fr2/Episode.php | 3 + app/Language/fr_CA/Episode.php | 3 + app/Language/gd/Episode.php | 3 + app/Language/gl/Episode.php | 3 + app/Language/id/Episode.php | 3 + app/Language/it/Episode.php | 3 + app/Language/ja/Comment.php | 6 +- app/Language/ja/Common.php | 12 +- app/Language/ja/Episode.php | 32 +- app/Language/ja/Fediverse.php | 14 +- app/Language/ja/Page.php | 6 +- app/Language/ja/Podcast.php | 32 +- app/Language/kk/Episode.php | 3 + app/Language/ko/Episode.php | 3 + app/Language/nl/Episode.php | 3 + app/Language/nn-NO/Episode.php | 3 + app/Language/oc/Episode.php | 3 + app/Language/pl/Episode.php | 3 + app/Language/pt-BR/Episode.php | 3 + app/Language/pt/Episode.php | 3 + app/Language/ro/Episode.php | 3 + app/Language/ru/Episode.php | 3 + app/Language/sk/Episode.php | 3 + app/Language/sr-Latn/Episode.php | 3 + app/Language/sv/Episode.php | 3 + app/Language/uk/Episode.php | 3 + app/Language/zh-Hans/Episode.php | 3 + app/Language/zh-Hant/Comment.php | 32 ++ app/Language/zh-Hant/Common.php | 30 ++ app/Language/zh-Hant/Episode.php | 50 +++ app/Language/zh-Hant/Fediverse.php | 37 ++ app/Language/zh-Hant/Home.php | 20 ++ app/Language/zh-Hant/Page.php | 17 + app/Language/zh-Hant/Podcast.php | 55 +++ app/Language/zh-Hant/Post.php | 40 +++ docs/src/ar/getting-started/docker.md | 2 + docs/src/br/getting-started/docker.md | 2 + docs/src/ca/getting-started/docker.md | 6 +- docs/src/da/getting-started/docker.md | 2 + docs/src/de/getting-started/docker.md | 2 + docs/src/el/getting-started/docker.md | 2 + docs/src/es/getting-started/docker.md | 2 + docs/src/eu/getting-started/auth.md | 87 +++++ docs/src/eu/getting-started/docker.md | 160 +++++++++ docs/src/eu/getting-started/install.md | 238 +++++++++++++ docs/src/eu/getting-started/security.md | 26 ++ docs/src/eu/getting-started/update.md | 109 ++++++ docs/src/eu/index.md | 300 ++++++++++++++++ docs/src/fa/getting-started/docker.md | 2 + docs/src/fr/getting-started/docker.md | 26 +- docs/src/fr2/getting-started/docker.md | 2 + docs/src/fr_CA/getting-started/docker.md | 2 + docs/src/gd/getting-started/docker.md | 2 + docs/src/gl/getting-started/docker.md | 2 + docs/src/id/getting-started/docker.md | 2 + docs/src/it/getting-started/docker.md | 2 + docs/src/ja/getting-started/docker.md | 2 + docs/src/kk/getting-started/docker.md | 2 + docs/src/ko/getting-started/docker.md | 2 + docs/src/nl/getting-started/docker.md | 2 + docs/src/nn-NO/getting-started/docker.md | 50 +-- docs/src/oc/getting-started/docker.md | 2 + docs/src/pl/getting-started/docker.md | 2 + docs/src/pt-BR/getting-started/docker.md | 2 + docs/src/pt/getting-started/docker.md | 2 + docs/src/ro/getting-started/docker.md | 2 + docs/src/ru/getting-started/docker.md | 2 + docs/src/sk/getting-started/docker.md | 2 + docs/src/sr-Latn/getting-started/docker.md | 2 + docs/src/sv/getting-started/docker.md | 2 + docs/src/uk/getting-started/docker.md | 2 + docs/src/zh-Hans/getting-started/docker.md | 2 + docs/src/zh-Hant/getting-started/auth.md | 87 +++++ docs/src/zh-Hant/getting-started/docker.md | 160 +++++++++ docs/src/zh-Hant/getting-started/install.md | 238 +++++++++++++ docs/src/zh-Hant/getting-started/security.md | 26 ++ docs/src/zh-Hant/getting-started/update.md | 109 ++++++ docs/src/zh-Hant/index.md | 300 ++++++++++++++++ modules/Admin/Language/de/Breadcrumb.php | 4 +- modules/Admin/Language/de/Common.php | 2 +- modules/Admin/Language/de/Episode.php | 4 +- modules/Admin/Language/de/Navigation.php | 4 +- modules/Admin/Language/de/Platforms.php | 20 +- modules/Admin/Language/de/Podcast.php | 20 +- .../Admin/Language/de/PodcastNavigation.php | 14 +- modules/Admin/Language/de/Validation.php | 2 +- modules/Admin/Language/eu/AboutCastopod.php | 22 ++ modules/Admin/Language/eu/Breadcrumb.php | 59 ++++ modules/Admin/Language/eu/Charts.php | 41 +++ modules/Admin/Language/eu/Common.php | 52 +++ modules/Admin/Language/eu/Countries.php | 264 ++++++++++++++ modules/Admin/Language/eu/Dashboard.php | 28 ++ modules/Admin/Language/eu/Episode.php | 225 ++++++++++++ .../Admin/Language/eu/EpisodeNavigation.php | 23 ++ modules/Admin/Language/eu/Fediverse.php | 32 ++ modules/Admin/Language/eu/Home.php | 14 + modules/Admin/Language/eu/Install.php | 61 ++++ modules/Admin/Language/eu/Navigation.php | 44 +++ modules/Admin/Language/eu/Notifications.php | 19 + modules/Admin/Language/eu/Page.php | 30 ++ modules/Admin/Language/eu/Pager.php | 21 ++ modules/Admin/Language/eu/Person.php | 65 ++++ modules/Admin/Language/eu/Platforms.php | 43 +++ modules/Admin/Language/eu/Podcast.php | 327 ++++++++++++++++++ .../Admin/Language/eu/PodcastNavigation.php | 42 +++ modules/Admin/Language/eu/Settings.php | 58 ++++ modules/Admin/Language/eu/Soundbite.php | 31 ++ modules/Admin/Language/eu/Validation.php | 17 + modules/Admin/Language/eu/VideoClip.php | 72 ++++ modules/Admin/Language/ja/AboutCastopod.php | 16 +- modules/Admin/Language/pt-BR/Podcast.php | 2 +- .../Admin/Language/zh-Hant/AboutCastopod.php | 22 ++ modules/Admin/Language/zh-Hant/Breadcrumb.php | 59 ++++ modules/Admin/Language/zh-Hant/Charts.php | 41 +++ modules/Admin/Language/zh-Hant/Common.php | 52 +++ modules/Admin/Language/zh-Hant/Countries.php | 264 ++++++++++++++ modules/Admin/Language/zh-Hant/Dashboard.php | 28 ++ modules/Admin/Language/zh-Hant/Episode.php | 225 ++++++++++++ .../Language/zh-Hant/EpisodeNavigation.php | 23 ++ modules/Admin/Language/zh-Hant/Fediverse.php | 32 ++ modules/Admin/Language/zh-Hant/Home.php | 14 + modules/Admin/Language/zh-Hant/Install.php | 61 ++++ modules/Admin/Language/zh-Hant/Navigation.php | 44 +++ .../Admin/Language/zh-Hant/Notifications.php | 19 + modules/Admin/Language/zh-Hant/Page.php | 30 ++ modules/Admin/Language/zh-Hant/Pager.php | 21 ++ modules/Admin/Language/zh-Hant/Person.php | 65 ++++ modules/Admin/Language/zh-Hant/Platforms.php | 43 +++ modules/Admin/Language/zh-Hant/Podcast.php | 327 ++++++++++++++++++ .../Language/zh-Hant/PodcastNavigation.php | 42 +++ modules/Admin/Language/zh-Hant/Settings.php | 58 ++++ modules/Admin/Language/zh-Hant/Soundbite.php | 31 ++ modules/Admin/Language/zh-Hant/Validation.php | 17 + modules/Admin/Language/zh-Hant/VideoClip.php | 72 ++++ modules/Auth/Language/eu/Auth.php | 93 +++++ modules/Auth/Language/eu/Contributor.php | 47 +++ modules/Auth/Language/eu/MyAccount.php | 18 + modules/Auth/Language/eu/User.php | 60 ++++ modules/Auth/Language/zh-Hant/Auth.php | 93 +++++ modules/Auth/Language/zh-Hant/Contributor.php | 47 +++ modules/Auth/Language/zh-Hant/MyAccount.php | 18 + modules/Auth/Language/zh-Hant/User.php | 60 ++++ modules/Install/Language/eu/Install.php | 62 ++++ modules/Install/Language/zh-Hant/Install.php | 62 ++++ .../Language/de/PodcastImport.php | 22 +- .../Language/eu/PodcastImport.php | 66 ++++ .../Language/zh-Hant/PodcastImport.php | 66 ++++ .../Language/de/Subscription.php | 2 +- .../Language/eu/PremiumPodcasts.php | 34 ++ .../Language/eu/Subscription.php | 100 ++++++ .../Language/zh-Hant/PremiumPodcasts.php | 34 ++ .../Language/zh-Hant/Subscription.php | 100 ++++++ 170 files changed, 6844 insertions(+), 148 deletions(-) create mode 100644 app/Language/eu/Comment.php create mode 100644 app/Language/eu/Common.php create mode 100644 app/Language/eu/Episode.php create mode 100644 app/Language/eu/Fediverse.php create mode 100644 app/Language/eu/Home.php create mode 100644 app/Language/eu/Page.php create mode 100644 app/Language/eu/Podcast.php create mode 100644 app/Language/eu/Post.php create mode 100644 app/Language/zh-Hant/Comment.php create mode 100644 app/Language/zh-Hant/Common.php create mode 100644 app/Language/zh-Hant/Episode.php create mode 100644 app/Language/zh-Hant/Fediverse.php create mode 100644 app/Language/zh-Hant/Home.php create mode 100644 app/Language/zh-Hant/Page.php create mode 100644 app/Language/zh-Hant/Podcast.php create mode 100644 app/Language/zh-Hant/Post.php create mode 100644 docs/src/eu/getting-started/auth.md create mode 100644 docs/src/eu/getting-started/docker.md create mode 100644 docs/src/eu/getting-started/install.md create mode 100644 docs/src/eu/getting-started/security.md create mode 100644 docs/src/eu/getting-started/update.md create mode 100644 docs/src/eu/index.md create mode 100644 docs/src/zh-Hant/getting-started/auth.md create mode 100644 docs/src/zh-Hant/getting-started/docker.md create mode 100644 docs/src/zh-Hant/getting-started/install.md create mode 100644 docs/src/zh-Hant/getting-started/security.md create mode 100644 docs/src/zh-Hant/getting-started/update.md create mode 100644 docs/src/zh-Hant/index.md create mode 100644 modules/Admin/Language/eu/AboutCastopod.php create mode 100644 modules/Admin/Language/eu/Breadcrumb.php create mode 100644 modules/Admin/Language/eu/Charts.php create mode 100644 modules/Admin/Language/eu/Common.php create mode 100644 modules/Admin/Language/eu/Countries.php create mode 100644 modules/Admin/Language/eu/Dashboard.php create mode 100644 modules/Admin/Language/eu/Episode.php create mode 100644 modules/Admin/Language/eu/EpisodeNavigation.php create mode 100644 modules/Admin/Language/eu/Fediverse.php create mode 100644 modules/Admin/Language/eu/Home.php create mode 100644 modules/Admin/Language/eu/Install.php create mode 100644 modules/Admin/Language/eu/Navigation.php create mode 100644 modules/Admin/Language/eu/Notifications.php create mode 100644 modules/Admin/Language/eu/Page.php create mode 100644 modules/Admin/Language/eu/Pager.php create mode 100644 modules/Admin/Language/eu/Person.php create mode 100644 modules/Admin/Language/eu/Platforms.php create mode 100644 modules/Admin/Language/eu/Podcast.php create mode 100644 modules/Admin/Language/eu/PodcastNavigation.php create mode 100644 modules/Admin/Language/eu/Settings.php create mode 100644 modules/Admin/Language/eu/Soundbite.php create mode 100644 modules/Admin/Language/eu/Validation.php create mode 100644 modules/Admin/Language/eu/VideoClip.php create mode 100644 modules/Admin/Language/zh-Hant/AboutCastopod.php create mode 100644 modules/Admin/Language/zh-Hant/Breadcrumb.php create mode 100644 modules/Admin/Language/zh-Hant/Charts.php create mode 100644 modules/Admin/Language/zh-Hant/Common.php create mode 100644 modules/Admin/Language/zh-Hant/Countries.php create mode 100644 modules/Admin/Language/zh-Hant/Dashboard.php create mode 100644 modules/Admin/Language/zh-Hant/Episode.php create mode 100644 modules/Admin/Language/zh-Hant/EpisodeNavigation.php create mode 100644 modules/Admin/Language/zh-Hant/Fediverse.php create mode 100644 modules/Admin/Language/zh-Hant/Home.php create mode 100644 modules/Admin/Language/zh-Hant/Install.php create mode 100644 modules/Admin/Language/zh-Hant/Navigation.php create mode 100644 modules/Admin/Language/zh-Hant/Notifications.php create mode 100644 modules/Admin/Language/zh-Hant/Page.php create mode 100644 modules/Admin/Language/zh-Hant/Pager.php create mode 100644 modules/Admin/Language/zh-Hant/Person.php create mode 100644 modules/Admin/Language/zh-Hant/Platforms.php create mode 100644 modules/Admin/Language/zh-Hant/Podcast.php create mode 100644 modules/Admin/Language/zh-Hant/PodcastNavigation.php create mode 100644 modules/Admin/Language/zh-Hant/Settings.php create mode 100644 modules/Admin/Language/zh-Hant/Soundbite.php create mode 100644 modules/Admin/Language/zh-Hant/Validation.php create mode 100644 modules/Admin/Language/zh-Hant/VideoClip.php create mode 100644 modules/Auth/Language/eu/Auth.php create mode 100644 modules/Auth/Language/eu/Contributor.php create mode 100644 modules/Auth/Language/eu/MyAccount.php create mode 100644 modules/Auth/Language/eu/User.php create mode 100644 modules/Auth/Language/zh-Hant/Auth.php create mode 100644 modules/Auth/Language/zh-Hant/Contributor.php create mode 100644 modules/Auth/Language/zh-Hant/MyAccount.php create mode 100644 modules/Auth/Language/zh-Hant/User.php create mode 100644 modules/Install/Language/eu/Install.php create mode 100644 modules/Install/Language/zh-Hant/Install.php create mode 100644 modules/PodcastImport/Language/eu/PodcastImport.php create mode 100644 modules/PodcastImport/Language/zh-Hant/PodcastImport.php create mode 100644 modules/PremiumPodcasts/Language/eu/PremiumPodcasts.php create mode 100644 modules/PremiumPodcasts/Language/eu/Subscription.php create mode 100644 modules/PremiumPodcasts/Language/zh-Hant/PremiumPodcasts.php create mode 100644 modules/PremiumPodcasts/Language/zh-Hant/Subscription.php diff --git a/app/Language/ar/Episode.php b/app/Language/ar/Episode.php index 926c9237..bbe4c785 100644 --- a/app/Language/ar/Episode.php +++ b/app/Language/ar/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'التعليقات', 'activity' => 'النشاط', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'وصف الحلقة', 'number_of_comments' => '{numberOfComments, plural, one {# comment} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/br/Episode.php b/app/Language/br/Episode.php index 319aafbd..604aa11e 100644 --- a/app/Language/br/Episode.php +++ b/app/Language/br/Episode.php @@ -27,6 +27,7 @@ return [ 'comments' => 'Evezhiadennoù', 'activity' => 'Oberiantiz', 'chapters' => 'Chabistroù', + 'transcript' => 'Transcript', 'description' => 'Deskrivadur ar rann', 'number_of_comments' => '{numberOfComments, plural, one {# evezhiadenn} @@ -50,4 +51,6 @@ return [ 'publish_edit' => 'Kemmañ an embannadur', ], 'no_chapters' => 'N\'eus chabistr ebet evit ar rann.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/ca/Episode.php b/app/Language/ca/Episode.php index 24bd1869..88af06d2 100644 --- a/app/Language/ca/Episode.php +++ b/app/Language/ca/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comentaris', 'activity' => 'Activitat', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Descripció de l\'episodi', 'number_of_comments' => '{numberOfComments, plural, one {# comentari} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/da/Episode.php b/app/Language/da/Episode.php index 71af978f..7e518721 100644 --- a/app/Language/da/Episode.php +++ b/app/Language/da/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Kommentarer', 'activity' => 'Aktivitet', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Episodebeskrivelse', 'number_of_comments' => '{numberOfComments, plural, one {# kommentar} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/de/Episode.php b/app/Language/de/Episode.php index de381a82..dba15335 100644 --- a/app/Language/de/Episode.php +++ b/app/Language/de/Episode.php @@ -23,7 +23,8 @@ return [ 'back_to_episodes' => 'Zurück zu Episoden von {podcast}', 'comments' => 'Kommentare', 'activity' => 'Aktivitäten', - 'chapters' => 'Chapters', + 'chapters' => 'Kapitel', + 'transcript' => 'Transcript', 'description' => 'Beschreibung der Episode', 'number_of_comments' => '{numberOfComments, plural, one {# Kommentar} @@ -43,5 +44,7 @@ return [ 'publish' => 'Veröffentlichen', 'publish_edit' => 'Veröffentlichung bearbeiten', ], - 'no_chapters' => 'No chapters are available for this episode.', + 'no_chapters' => 'Für diese Episode sind keine Kapitel verfügbar.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/de/Podcast.php b/app/Language/de/Podcast.php index 10f71485..63a83d60 100644 --- a/app/Language/de/Podcast.php +++ b/app/Language/de/Podcast.php @@ -51,5 +51,5 @@ return [ other {# Personen} }', 'persons_list' => 'Mitwirkende', - 'castopod_website' => 'Castopod (website)', + 'castopod_website' => 'Castopod (Webseite)', ]; diff --git a/app/Language/el/Episode.php b/app/Language/el/Episode.php index 1c1f84ce..8cdaf3fc 100644 --- a/app/Language/el/Episode.php +++ b/app/Language/el/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Σχόλια', 'activity' => 'Δραστηριότητα', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Περιγραφή επεισοδίου', 'number_of_comments' => '{numberOfComments, plural, one {# σχόλιο} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/es/Episode.php b/app/Language/es/Episode.php index 7283d79e..df9fadc4 100644 --- a/app/Language/es/Episode.php +++ b/app/Language/es/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comentarios', 'activity' => 'Actividad', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Descripción del episodio', 'number_of_comments' => '{numberOfComments, plural, one {# comentario} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/eu/Comment.php b/app/Language/eu/Comment.php new file mode 100644 index 00000000..1dd8f5ea --- /dev/null +++ b/app/Language/eu/Comment.php @@ -0,0 +1,34 @@ + "{actorDisplayName}'s comment for {episodeTitle}", + 'back_to_comments' => 'Back to comments', + 'form' => [ + 'episode_message_placeholder' => 'Write a comment…', + 'reply_to_placeholder' => 'Reply to @{actorUsername}', + 'submit' => 'Send', + 'submit_reply' => 'Reply', + ], + 'likes' => '{numberOfLikes, plural, + one {# like} + other {# likes} + }', + 'replies' => '{numberOfReplies, plural, + one {# reply} + other {# replies} + }', + 'like' => 'Like', + 'reply' => 'Reply', + 'view_replies' => 'View replies ({numberOfReplies})', + 'block_actor' => 'Block user @{actorUsername}', + 'block_domain' => 'Block domain @{actorDomain}', + 'delete' => 'Delete comment', +]; diff --git a/app/Language/eu/Common.php b/app/Language/eu/Common.php new file mode 100644 index 00000000..1258afcc --- /dev/null +++ b/app/Language/eu/Common.php @@ -0,0 +1,30 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'close' => 'Close', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'go_back' => 'Go back', + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'read_more' => 'Read more', + 'read_less' => 'Read less', + 'see_more' => 'See more', + 'see_less' => 'See less', + 'legal_notice' => 'Legal notice', +]; diff --git a/app/Language/eu/Episode.php b/app/Language/eu/Episode.php new file mode 100644 index 00000000..c2ed2b80 --- /dev/null +++ b/app/Language/eu/Episode.php @@ -0,0 +1,50 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', + 'persons' => '{personsCount, plural, + one {# person} + other {# persons} + }', + 'persons_list' => 'Persons', + 'back_to_episodes' => 'Back to episodes of {podcast}', + 'comments' => 'Comments', + 'activity' => 'Activity', + 'chapters' => 'Chapters', + 'transcript' => 'Transcript', + 'description' => 'Episode description', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'preview' => [ + 'title' => 'Preview', + 'not_published' => 'Not published', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + ], + 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', +]; diff --git a/app/Language/eu/Fediverse.php b/app/Language/eu/Fediverse.php new file mode 100644 index 00000000..32f54c07 --- /dev/null +++ b/app/Language/eu/Fediverse.php @@ -0,0 +1,37 @@ + 'Your handle', + 'your_handle_hint' => 'Enter the @username@domain you want to act from.', + 'follow' => [ + 'label' => 'Follow', + 'title' => 'Follow {actorDisplayName}', + 'subtitle' => 'You are going to follow:', + 'accountNotFound' => 'The account could not be found.', + 'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…', + 'submit' => 'Proceed to follow', + ], + 'favourite' => [ + 'title' => "Favourite {actorDisplayName}'s post", + 'subtitle' => 'You are going to favourite:', + 'submit' => 'Proceed to favourite', + ], + 'reblog' => [ + 'title' => "Share {actorDisplayName}'s post", + 'subtitle' => 'You are going to share:', + 'submit' => 'Proceed to share', + ], + 'reply' => [ + 'title' => "Reply to {actorDisplayName}'s post", + 'subtitle' => 'You are going to reply to:', + 'submit' => 'Proceed to reply', + ], +]; diff --git a/app/Language/eu/Home.php b/app/Language/eu/Home.php new file mode 100644 index 00000000..1518239b --- /dev/null +++ b/app/Language/eu/Home.php @@ -0,0 +1,20 @@ + 'All podcasts', + 'sort_by' => 'Sort by', + 'sort_options' => [ + 'activity' => 'Recent activity', + 'created_desc' => 'Newest first', + 'created_asc' => 'Oldest first', + ], + 'no_podcast' => 'No podcast found', +]; diff --git a/app/Language/eu/Page.php b/app/Language/eu/Page.php new file mode 100644 index 00000000..7cd60669 --- /dev/null +++ b/app/Language/eu/Page.php @@ -0,0 +1,17 @@ + 'Back to home', + 'map' => [ + 'title' => 'Map', + 'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.', + ], +]; diff --git a/app/Language/eu/Podcast.php b/app/Language/eu/Podcast.php new file mode 100644 index 00000000..2798fcdd --- /dev/null +++ b/app/Language/eu/Podcast.php @@ -0,0 +1,55 @@ + 'RSS Podcast feed', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followTitle' => 'Follow {actorDisplayName} on the fediverse!', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'links' => 'Links', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'episodes_title' => 'Episodes of {podcastTitle}', + 'about' => 'About', + 'stats' => [ + 'title' => 'Stats', + 'number_of_seasons' => '{0, plural, + one {# season} + other {# seasons} + }', + 'number_of_episodes' => '{0, plural, + one {# episode} + other {# episodes} + }', + 'first_published_at' => 'First episode published on {0, date, medium}', + ], + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', + 'persons' => '{personsCount, plural, + one {# person} + other {# persons} + }', + 'persons_list' => 'Persons', + 'castopod_website' => 'Castopod (website)', +]; diff --git a/app/Language/eu/Post.php b/app/Language/eu/Post.php new file mode 100644 index 00000000..58d1cf80 --- /dev/null +++ b/app/Language/eu/Post.php @@ -0,0 +1,40 @@ + "{actorDisplayName}'s post", + 'back_to_actor_posts' => 'Back to {actor} posts', + 'actor_shared' => '{actor} shared', + 'reply_to' => 'Reply to @{actorUsername}', + 'form' => [ + 'message_placeholder' => 'Write a message…', + 'episode_message_placeholder' => 'Write a message for the episode…', + 'episode_url_placeholder' => 'Episode URL', + 'reply_to_placeholder' => 'Reply to @{actorUsername}', + 'submit' => 'Send', + 'submit_reply' => 'Reply', + ], + 'favourites' => '{numberOfFavourites, plural, + one {# favourite} + other {# favourites} + }', + 'reblogs' => '{numberOfReblogs, plural, + one {# share} + other {# shares} + }', + 'replies' => '{numberOfReplies, plural, + one {# reply} + other {# replies} + }', + 'expand' => 'Expand post', + 'block_actor' => 'Block user @{actorUsername}', + 'block_domain' => 'Block domain @{actorDomain}', + 'delete' => 'Delete post', +]; diff --git a/app/Language/fa/Episode.php b/app/Language/fa/Episode.php index e3718380..f7ae1f56 100644 --- a/app/Language/fa/Episode.php +++ b/app/Language/fa/Episode.php @@ -23,6 +23,7 @@ return [ 'comments' => 'دیدگاه‌ها', 'activity' => 'فعّالیت', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'شرح قسمت', 'number_of_comments' => '{numberOfComments, plural, other {# نظر} @@ -42,4 +43,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/fr/Episode.php b/app/Language/fr/Episode.php index 46b30597..60afbea4 100644 --- a/app/Language/fr/Episode.php +++ b/app/Language/fr/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Commentaires', 'activity' => 'Activité', 'chapters' => 'Chapitres', + 'transcript' => 'Transcript', 'description' => 'Description de l’épisode', 'number_of_comments' => '{numberOfComments, plural, one {# commentaire} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Modifier la publication', ], 'no_chapters' => 'Aucun chapitre n’est disponible pour cet épisode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/fr2/Episode.php b/app/Language/fr2/Episode.php index e4e40600..3a386179 100644 --- a/app/Language/fr2/Episode.php +++ b/app/Language/fr2/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Commentaires', 'activity' => 'Activité', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Description de l’épisode', 'number_of_comments' => '{numberOfComments, plural, one {# commentaire} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/fr_CA/Episode.php b/app/Language/fr_CA/Episode.php index 7536120d..c2ed2b80 100644 --- a/app/Language/fr_CA/Episode.php +++ b/app/Language/fr_CA/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comments', 'activity' => 'Activity', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Episode description', 'number_of_comments' => '{numberOfComments, plural, one {# comment} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/gd/Episode.php b/app/Language/gd/Episode.php index 0ac90de2..ab7a059b 100644 --- a/app/Language/gd/Episode.php +++ b/app/Language/gd/Episode.php @@ -26,6 +26,7 @@ return [ 'comments' => 'Beachdan', 'activity' => 'Gnìomhachd', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Tuairisgeul an eapasoid', 'number_of_comments' => '{numberOfComments, plural, one {# bheachd} @@ -48,4 +49,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/gl/Episode.php b/app/Language/gl/Episode.php index 43c16681..4ec2b27a 100644 --- a/app/Language/gl/Episode.php +++ b/app/Language/gl/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comentarios', 'activity' => 'Actividade', 'chapters' => 'Capítulos', + 'transcript' => 'Transcript', 'description' => 'Descrición do episodio', 'number_of_comments' => '{numberOfComments, plural, one {# comentario} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Editar publicación', ], 'no_chapters' => 'Non hai capítulos dispoñibles para este episodio.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/id/Episode.php b/app/Language/id/Episode.php index da29ac94..6b945267 100644 --- a/app/Language/id/Episode.php +++ b/app/Language/id/Episode.php @@ -23,6 +23,7 @@ return [ 'comments' => 'Komentar', 'activity' => 'Aktivitas', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Keterangan episode', 'number_of_comments' => '{numberOfComments, plural, other {# komentar} @@ -42,4 +43,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/it/Episode.php b/app/Language/it/Episode.php index 6c1a8fe5..9ef6f615 100644 --- a/app/Language/it/Episode.php +++ b/app/Language/it/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Commenti', 'activity' => 'Attività', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Descrizione dell\'episodio', 'number_of_comments' => '{numberOfComments, plural, one {# comment} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Modifica pubblicazione', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/ja/Comment.php b/app/Language/ja/Comment.php index 48080eeb..a59e462b 100644 --- a/app/Language/ja/Comment.php +++ b/app/Language/ja/Comment.php @@ -27,8 +27,8 @@ return [ }', 'like' => 'いいね', 'reply' => '返信する', - 'view_replies' => 'View replies ({numberOfReplies})', - 'block_actor' => 'Block user @{actorUsername}', - 'block_domain' => 'Block domain @{actorDomain}', + 'view_replies' => '返信を見る ({numberOfReplies})', + 'block_actor' => 'ユーザー @{actorUsername} をブロック', + 'block_domain' => 'ドメイン @{actorDomain} をブロック', 'delete' => 'コメントを削除する', ]; diff --git a/app/Language/ja/Common.php b/app/Language/ja/Common.php index 9e862c12..43b0af51 100644 --- a/app/Language/ja/Common.php +++ b/app/Language/ja/Common.php @@ -13,10 +13,10 @@ return [ 'no' => 'いいえ', 'cancel' => 'キャンセル', 'optional' => 'Optional', - 'close' => 'Close', + 'close' => '閉じる', 'home' => 'ホーム', - 'explicit' => 'Explicit', - 'powered_by' => 'Powered by {castopod}', + 'explicit' => '過激な内容を含む', + 'powered_by' => '提供: {castopod}', 'go_back' => '戻る', 'play_episode_button' => [ 'play' => '再生', @@ -24,7 +24,7 @@ return [ ], 'read_more' => '続きを読む', 'read_less' => '閉じる', - 'see_more' => 'See more', - 'see_less' => 'See less', - 'legal_notice' => 'Legal notice', + 'see_more' => 'もっと見る', + 'see_less' => '表示を減らす', + 'legal_notice' => '法的事項', ]; diff --git a/app/Language/ja/Episode.php b/app/Language/ja/Episode.php index 9af4cb7b..40b21d39 100644 --- a/app/Language/ja/Episode.php +++ b/app/Language/ja/Episode.php @@ -10,38 +10,40 @@ declare(strict_types=1); return [ 'season' => 'シーズン {seasonNumber}', - 'season_abbr' => 'S{seasonNumber}', + 'season_abbr' => 'シーズン {seasonNumber}', 'number' => 'エピソード {episodeNumber}', - 'number_abbr' => 'Ep. {episodeNumber}', + 'number_abbr' => 'エピソード {episodeNumber}', 'season_episode' => 'シーズン {seasonNumber} エピソード {episodeNumber}', - 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', + 'season_episode_abbr' => 'シーズン{seasonNumber}エピソード{episodeNumber}', 'persons' => '{personsCount, plural, - one {# person} - other {# persons} + other {# 人} }', - 'persons_list' => 'Persons', + 'persons_list' => '人物', 'back_to_episodes' => '{podcast} のエピソードに戻る', 'comments' => 'コメント', 'activity' => 'アクティビティ', - 'chapters' => 'Chapters', - 'description' => 'Episode description', + 'chapters' => '章', + 'transcript' => 'Transcript', + 'description' => 'エピソードの詳細', 'number_of_comments' => '{numberOfComments, plural, one {# comment} other {# comments} }', - 'all_podcast_episodes' => 'All podcast episodes', + 'all_podcast_episodes' => 'すべての Podcast エピソード', 'back_to_podcast' => 'ポッドキャストへ戻る', 'preview' => [ 'title' => 'プレビュー', - 'not_published' => 'Not published', + 'not_published' => '未公開', 'text' => '{publication_status, select, - published {This episode is not yet published.} - scheduled {This episode is scheduled for publication on {publication_date}.} - with_podcast {This episode will be published at the same time as the podcast.} - other {This episode is not yet published.} + published {このエピソードはまだ公開されていません} + scheduled {このエピソードは {publication_date} に公開される予定です} + with_podcast {このエピソードはPodCastと同時に公開されます} + other {このエピソードはまだ公開されていません。} }', 'publish' => '公開する', - 'publish_edit' => 'Edit publication', + 'publish_edit' => '出版物を編集', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/ja/Fediverse.php b/app/Language/ja/Fediverse.php index c94e62f3..c86f8313 100644 --- a/app/Language/ja/Fediverse.php +++ b/app/Language/ja/Fediverse.php @@ -9,29 +9,29 @@ declare(strict_types=1); */ return [ - 'your_handle' => 'Your handle', + 'your_handle' => 'あなたのユーザー ID', 'your_handle_hint' => 'Enter the @username@domain you want to act from.', 'follow' => [ 'label' => 'フォロー', 'title' => '{actorDisplayName} をフォロー', 'subtitle' => 'You are going to follow:', 'accountNotFound' => 'アカウントが見つかりませんでした', - 'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…', - 'submit' => 'Proceed to follow', + 'remoteFollowNotAllowed' => 'このアカウントサーバーはリモートフォローを許可しておりません', + 'submit' => 'フォローする', ], 'favourite' => [ - 'title' => "Favourite {actorDisplayName}'s post", + 'title' => "お気に入りの {actorDisplayName}の投稿", 'subtitle' => 'You are going to favourite:', - 'submit' => 'Proceed to favourite', + 'submit' => 'お気に入り登録する', ], 'reblog' => [ 'title' => "Share {actorDisplayName}'s post", 'subtitle' => 'You are going to share:', - 'submit' => 'Proceed to share', + 'submit' => '共有する', ], 'reply' => [ 'title' => "Reply to {actorDisplayName}'s post", 'subtitle' => 'You are going to reply to:', - 'submit' => 'Proceed to reply', + 'submit' => '返信する', ], ]; diff --git a/app/Language/ja/Page.php b/app/Language/ja/Page.php index 7cd60669..b961b40b 100644 --- a/app/Language/ja/Page.php +++ b/app/Language/ja/Page.php @@ -9,9 +9,9 @@ declare(strict_types=1); */ return [ - 'back_to_home' => 'Back to home', + 'back_to_home' => 'ホームへ戻る', 'map' => [ - 'title' => 'Map', - 'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.', + 'title' => 'マップ', + 'description' => '{siteName} でpodcastのエピソードを見つけましょう!マップを旅して、特定の場所について話すエピソードを聞きましょう。', ], ]; diff --git a/app/Language/ja/Podcast.php b/app/Language/ja/Podcast.php index 2798fcdd..43d67e5d 100644 --- a/app/Language/ja/Podcast.php +++ b/app/Language/ja/Podcast.php @@ -9,29 +9,27 @@ declare(strict_types=1); */ return [ - 'feed' => 'RSS Podcast feed', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'feed' => 'RSS PodCastフィード', + 'season' => 'シーズン {seasonNumber}', + 'list_of_episodes_year' => '{year} エピソード ({episodeCount})', 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', - 'followTitle' => 'Follow {actorDisplayName} on the fediverse!', + 'シーズン {seasonNumber} エピソード({episodeCount})', + 'no_episode' => 'エピソードが見つかりませんでした', + 'follow' => 'フォロー', + 'followTitle' => 'Fediverseで {actorDisplayName} をフォロー!', 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} + other {# 人のフォロワー} }', 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} + other {#件の投稿} }', - 'links' => 'Links', - 'activity' => 'Activity', - 'episodes' => 'Episodes', - 'episodes_title' => 'Episodes of {podcastTitle}', - 'about' => 'About', + 'links' => 'リンク', + 'activity' => 'アクティビティー', + 'episodes' => 'エピソード', + 'episodes_title' => '{podcastTitle} のエピソード', + 'about' => '概要', 'stats' => [ - 'title' => 'Stats', + 'title' => '統計', 'number_of_seasons' => '{0, plural, one {# season} other {# seasons} diff --git a/app/Language/kk/Episode.php b/app/Language/kk/Episode.php index 7536120d..c2ed2b80 100644 --- a/app/Language/kk/Episode.php +++ b/app/Language/kk/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comments', 'activity' => 'Activity', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Episode description', 'number_of_comments' => '{numberOfComments, plural, one {# comment} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/ko/Episode.php b/app/Language/ko/Episode.php index 7536120d..c2ed2b80 100644 --- a/app/Language/ko/Episode.php +++ b/app/Language/ko/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comments', 'activity' => 'Activity', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Episode description', 'number_of_comments' => '{numberOfComments, plural, one {# comment} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/nl/Episode.php b/app/Language/nl/Episode.php index 81069be9..4acd9a29 100644 --- a/app/Language/nl/Episode.php +++ b/app/Language/nl/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Reacties', 'activity' => 'Activiteiten', 'chapters' => 'Hoofdstukken', + 'transcript' => 'Transcript', 'description' => 'Omschrijving aflevering', 'number_of_comments' => '{numberOfComments, plural, one {# reactie} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Publicatie bewerken', ], 'no_chapters' => 'Voor deze aflevering zijn geen hoofdstukken beschikbaar.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/nn-NO/Episode.php b/app/Language/nn-NO/Episode.php index 75ce64f3..c2bd60a3 100644 --- a/app/Language/nn-NO/Episode.php +++ b/app/Language/nn-NO/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Kommentarar', 'activity' => 'Aktivitet', 'chapters' => 'Kapittel', + 'transcript' => 'Transcript', 'description' => 'Skildring av episoden', 'number_of_comments' => '{numberOfComments, plural, one {# kommentar} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Rediger publiseringa', ], 'no_chapters' => 'Det finst ingen kapittel for denne episoden.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/oc/Episode.php b/app/Language/oc/Episode.php index 544dc054..de49b6f3 100644 --- a/app/Language/oc/Episode.php +++ b/app/Language/oc/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comentaris', 'activity' => 'Activitat', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Descripcion de l’episòdi', 'number_of_comments' => '{numberOfComments, plural, one {# comentari} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Modificar la publicacion', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/pl/Episode.php b/app/Language/pl/Episode.php index dbbc3a15..3c744879 100644 --- a/app/Language/pl/Episode.php +++ b/app/Language/pl/Episode.php @@ -25,6 +25,7 @@ return [ 'comments' => 'Komentarze', 'activity' => 'Aktywność', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Opis odcinka', 'number_of_comments' => '{numberOfComments, plural, one {# komentarz} @@ -46,4 +47,6 @@ return [ 'publish_edit' => 'Edytuj publikację', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/pt-BR/Episode.php b/app/Language/pt-BR/Episode.php index f67265dc..dddddbe9 100644 --- a/app/Language/pt-BR/Episode.php +++ b/app/Language/pt-BR/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comentários', 'activity' => 'Atividade', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Descrição do episódio', 'number_of_comments' => '{numberOfComments, plural, one {# comentário} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Editar Publicação', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/pt/Episode.php b/app/Language/pt/Episode.php index 7536120d..c2ed2b80 100644 --- a/app/Language/pt/Episode.php +++ b/app/Language/pt/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Comments', 'activity' => 'Activity', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Episode description', 'number_of_comments' => '{numberOfComments, plural, one {# comment} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/ro/Episode.php b/app/Language/ro/Episode.php index 9067ecad..cbfb226d 100644 --- a/app/Language/ro/Episode.php +++ b/app/Language/ro/Episode.php @@ -25,6 +25,7 @@ return [ 'comments' => 'Comentarii', 'activity' => 'Activitate', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Descrierea episodului', 'number_of_comments' => '{numberOfComments, plural, one {# răspuns} @@ -46,4 +47,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/ru/Episode.php b/app/Language/ru/Episode.php index fae4d2b6..0bd8850b 100644 --- a/app/Language/ru/Episode.php +++ b/app/Language/ru/Episode.php @@ -26,6 +26,7 @@ return [ 'comments' => 'Комментарии', 'activity' => 'Активность', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Описание серии', 'number_of_comments' => '{numberOfComments, plural, one {# комментарий} @@ -48,4 +49,6 @@ return [ 'publish_edit' => 'Редактировать публикацию', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/sk/Episode.php b/app/Language/sk/Episode.php index 3fd4b03b..e72bf8c0 100644 --- a/app/Language/sk/Episode.php +++ b/app/Language/sk/Episode.php @@ -26,6 +26,7 @@ return [ 'comments' => 'Komentáre', 'activity' => 'Aktivita', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Popis epizódy', 'number_of_comments' => '{numberOfComments, plural, one {# komentár} @@ -48,4 +49,6 @@ return [ 'publish_edit' => 'Upraviť zverejnené', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/sr-Latn/Episode.php b/app/Language/sr-Latn/Episode.php index 77a21c9c..b780a66c 100644 --- a/app/Language/sr-Latn/Episode.php +++ b/app/Language/sr-Latn/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Komentari', 'activity' => 'Aktivnosti', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Opis epizode', 'number_of_comments' => '{numberOfComments, plural, one {# komentar} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Uredi objavu', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/sv/Episode.php b/app/Language/sv/Episode.php index 12f94e21..b9ecb34a 100644 --- a/app/Language/sv/Episode.php +++ b/app/Language/sv/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => 'Kommentarer', 'activity' => 'Aktivitet', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Beskrivning av avsnitt', 'number_of_comments' => '{numberOfComments, plural, one {# kommentar} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/uk/Episode.php b/app/Language/uk/Episode.php index 15dc1f49..34343563 100644 --- a/app/Language/uk/Episode.php +++ b/app/Language/uk/Episode.php @@ -26,6 +26,7 @@ return [ 'comments' => 'Коментарі', 'activity' => 'Активність', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => 'Опис Серії', 'number_of_comments' => '{numberOfComments, plural, one {# коментар} @@ -48,4 +49,6 @@ return [ 'publish_edit' => 'Редагувати публікацію', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/zh-Hans/Episode.php b/app/Language/zh-Hans/Episode.php index e57ed248..316b90b7 100644 --- a/app/Language/zh-Hans/Episode.php +++ b/app/Language/zh-Hans/Episode.php @@ -24,6 +24,7 @@ return [ 'comments' => '评论', 'activity' => '活动', 'chapters' => 'Chapters', + 'transcript' => 'Transcript', 'description' => '剧集描述', 'number_of_comments' => '{numberOfComments, plural, other {# 评论} @@ -44,4 +45,6 @@ return [ 'publish_edit' => 'Edit publication', ], 'no_chapters' => 'No chapters are available for this episode.', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', ]; diff --git a/app/Language/zh-Hant/Comment.php b/app/Language/zh-Hant/Comment.php new file mode 100644 index 00000000..c12c8419 --- /dev/null +++ b/app/Language/zh-Hant/Comment.php @@ -0,0 +1,32 @@ + "{actorDisplayName}' 對於 {episodeTitle} 之評論", + 'back_to_comments' => '返回到評論', + 'form' => [ + 'episode_message_placeholder' => '發表留言...', + 'reply_to_placeholder' => '回覆 @{actorUsername}', + 'submit' => '送出', + 'submit_reply' => '回覆', + ], + 'likes' => '{numberOfLikes, plural, + other {# 讚} + }', + 'replies' => '{numberOfReplies, plural, + other {# 回覆} + }', + 'like' => '讚', + 'reply' => '回覆', + 'view_replies' => '檢視回覆 ({numberOfReplies})', + 'block_actor' => '封鎖使用者 @{actorUsername}', + 'block_domain' => '封鎖網域 @{actorDomain}', + 'delete' => '刪除評論', +]; diff --git a/app/Language/zh-Hant/Common.php b/app/Language/zh-Hant/Common.php new file mode 100644 index 00000000..24b56e1a --- /dev/null +++ b/app/Language/zh-Hant/Common.php @@ -0,0 +1,30 @@ + '是', + 'no' => '否', + 'cancel' => '取消', + 'optional' => '選用項', + 'close' => '關閉', + 'home' => '首頁', + 'explicit' => '露骨內容', + 'powered_by' => '由 {castopod} 提供支援', + 'go_back' => '返回', + 'play_episode_button' => [ + 'play' => '播放', + 'playing' => '播放中', + ], + 'read_more' => '閱讀更多', + 'read_less' => '顯示更少', + 'see_more' => '顯示更多', + 'see_less' => '顯示較少', + 'legal_notice' => '法律聲明', +]; diff --git a/app/Language/zh-Hant/Episode.php b/app/Language/zh-Hant/Episode.php new file mode 100644 index 00000000..659207d1 --- /dev/null +++ b/app/Language/zh-Hant/Episode.php @@ -0,0 +1,50 @@ + '第{seasonNumber} 季', + 'season_abbr' => 'S{seasonNumber}', + 'number' => '第 {episodeNumber} 集', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => '第{seasonNumber} 季第{episodeNumber} 集', + 'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', + 'persons' => '{personsCount, plural, + one {# person} + other {# persons} + }', + 'persons_list' => '人物', + 'back_to_episodes' => '回到劇集 {podcast} 中', + 'comments' => '註釋', + 'activity' => '活動', + 'chapters' => '章', + 'transcript' => 'Transcript', + 'description' => '節目介紹', + 'number_of_comments' => '{numberOfComments, plural, + one {# 評論} + other {# 評論} + }', + 'all_podcast_episodes' => '所有播客劇集', + 'back_to_podcast' => '返回至播客', + 'preview' => [ + 'title' => '預覽', + 'not_published' => '未發佈', + 'text' => '{publication_status, select, + published {本集尚未發佈。} + scheduled {本集排程於 {publication_date} 發佈} + with_podcast {本集將會與此播客同時發佈。} + other {本集尚未發佈。} + }', + 'publish' => '發佈', + 'publish_edit' => '編輯公開程度', + ], + 'no_chapters' => '本劇集未有章節', + 'download_transcript' => 'Download transcript ({extension})', + 'no_transcript' => 'No transcript available for this episode.', +]; diff --git a/app/Language/zh-Hant/Fediverse.php b/app/Language/zh-Hant/Fediverse.php new file mode 100644 index 00000000..21ffff8e --- /dev/null +++ b/app/Language/zh-Hant/Fediverse.php @@ -0,0 +1,37 @@ + '你的帳號', + 'your_handle_hint' => '輸入 @username@domain 您想要執行的操作。', + 'follow' => [ + 'label' => '追蹤', + 'title' => '追蹤 {actorDisplayName}', + 'subtitle' => '您將會追蹤:', + 'accountNotFound' => '找不到此帳號。', + 'remoteFollowNotAllowed' => '似乎此帳號伺服器不允许遠端追蹤…', + 'submit' => '繼續追蹤', + ], + 'favourite' => [ + 'title' => "喜歡 {actorDisplayName} 的貼文", + 'subtitle' => '您將會喜歡:', + 'submit' => '加入最愛', + ], + 'reblog' => [ + 'title' => "分享 {actorDisplayName} 的貼文", + 'subtitle' => '您將要分享:', + 'submit' => '繼續分享', + ], + 'reply' => [ + 'title' => "回覆 {actorDisplayName} 的貼文", + 'subtitle' => '您將要回覆:', + 'submit' => '繼續回覆', + ], +]; diff --git a/app/Language/zh-Hant/Home.php b/app/Language/zh-Hant/Home.php new file mode 100644 index 00000000..05e464d8 --- /dev/null +++ b/app/Language/zh-Hant/Home.php @@ -0,0 +1,20 @@ + '全部的播客', + 'sort_by' => '排序方式', + 'sort_options' => [ + 'activity' => '最近活動', + 'created_desc' => '最新的優先', + 'created_asc' => '最舊的優先', + ], + 'no_podcast' => '没有找到播客', +]; diff --git a/app/Language/zh-Hant/Page.php b/app/Language/zh-Hant/Page.php new file mode 100644 index 00000000..9d683dcf --- /dev/null +++ b/app/Language/zh-Hant/Page.php @@ -0,0 +1,17 @@ + '回到首頁', + 'map' => [ + 'title' => '地圖', + 'description' => '在地圖上探索 {siteName} 的播客節目!優遊穿梭於地圖並收聽各地的節目。', + ], +]; diff --git a/app/Language/zh-Hant/Podcast.php b/app/Language/zh-Hant/Podcast.php new file mode 100644 index 00000000..86f2914a --- /dev/null +++ b/app/Language/zh-Hant/Podcast.php @@ -0,0 +1,55 @@ + '播客 RSS 摘要', + 'season' => '第 {seasonNumber} 季', + 'list_of_episodes_year' => '{year} 集數 ({episodeCount})', + 'list_of_episodes_season' => + '第 {seasonNumber} 季(第 {episodeCount} 集)', + 'no_episode' => '没有找到節目!', + 'follow' => '追蹤', + 'followTitle' => '在聯邦宇宙中追蹤 {actorDisplayName} !', + 'followers' => '{numberOfFollowers, plural, + one {# 追蹤者} + other {# 追蹤者} + }', + 'posts' => '{numberOfPosts, plural, + one {# 貼文} + other {# 貼文} + }}', + 'links' => '連結', + 'activity' => '活動', + 'episodes' => '劇集', + 'episodes_title' => '{podcastTitle} 的劇集', + 'about' => '關於', + 'stats' => [ + 'title' => '統計', + 'number_of_seasons' => '{0, plural, + one {# 季} + other {# 季} + }', + 'number_of_episodes' => '{0, plural, + one {# 劇集} + other {# 劇集} + }', + 'first_published_at' => '首集發佈於 {0, date, medium}', + ], + 'sponsor' => '贊助者', + 'funding_links' => '{podcastTitle} 的贊助連結', + 'find_on' => '查找 {podcastTitle} 於', + 'listen_on' => '收聽', + 'persons' => '{personsCount, plural, + one {# 人} + other {# 人} + }', + 'persons_list' => '人物', + 'castopod_website' => 'Castopod (網站)', +]; diff --git a/app/Language/zh-Hant/Post.php b/app/Language/zh-Hant/Post.php new file mode 100644 index 00000000..76f88627 --- /dev/null +++ b/app/Language/zh-Hant/Post.php @@ -0,0 +1,40 @@ + "{actorDisplayName} 的貼文", + 'back_to_actor_posts' => '回到 {actor} 的貼文', + 'actor_shared' => '{actor} 已分享', + 'reply_to' => '回覆 @{actorUsername}', + 'form' => [ + 'message_placeholder' => '輸入訊息…', + 'episode_message_placeholder' => '替劇集寫一則訊息…', + 'episode_url_placeholder' => '劇集網址', + 'reply_to_placeholder' => '回覆給 @{actorUsername}', + 'submit' => '送出', + 'submit_reply' => '回覆', + ], + 'favourites' => '{numberOfFavourites, plural, + one {# 喜歡} + other {# 喜歡} + }', + 'reblogs' => '{numberOfReblogs, plural, + one {# 分享} + other {# 分享} + }', + 'replies' => '{numberOfReplies, plural, + one {# 回覆} + other {# 回覆} + }', + 'expand' => '展開貼文', + 'block_actor' => '封鎖使用者 @{actorUsername}', + 'block_domain' => '封鎖網域 @{actorDomain}', + 'delete' => '刪除貼文', +]; diff --git a/docs/src/ar/getting-started/docker.md b/docs/src/ar/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/ar/getting-started/docker.md +++ b/docs/src/ar/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/br/getting-started/docker.md b/docs/src/br/getting-started/docker.md index b6842152..ec96d3dc 100644 --- a/docs/src/br/getting-started/docker.md +++ b/docs/src/br/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/ca/getting-started/docker.md b/docs/src/ca/getting-started/docker.md index d8a6e91b..fe231b96 100644 --- a/docs/src/ca/getting-started/docker.md +++ b/docs/src/ca/getting-started/docker.md @@ -10,8 +10,8 @@ process: - [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all in one castopod image using nginx unit -- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el paquet - incloent Castopod i totes les dependències +- [** code>castopod/app**](https://hub.docker.com/r/castopod/app): el + paquet incloent Castopod i totes les dependències - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una configuració de Nginx per a Castopod @@ -48,6 +48,7 @@ una base de dades Redis com a gestor de memòria cau. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ una base de dades Redis com a gestor de memòria cau. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/da/getting-started/docker.md b/docs/src/da/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/da/getting-started/docker.md +++ b/docs/src/da/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/de/getting-started/docker.md b/docs/src/de/getting-started/docker.md index 814d0177..20713090 100644 --- a/docs/src/de/getting-started/docker.md +++ b/docs/src/de/getting-started/docker.md @@ -48,6 +48,7 @@ kann als Cache-Handler hinzugefügt werden. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ kann als Cache-Handler hinzugefügt werden. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/el/getting-started/docker.md b/docs/src/el/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/el/getting-started/docker.md +++ b/docs/src/el/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/es/getting-started/docker.md b/docs/src/es/getting-started/docker.md index 84331cab..63c2cf95 100644 --- a/docs/src/es/getting-started/docker.md +++ b/docs/src/es/getting-started/docker.md @@ -48,6 +48,7 @@ También se puede añadir una base de datos Redis como gestor de caché. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ También se puede añadir una base de datos Redis como gestor de caché. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/eu/getting-started/auth.md b/docs/src/eu/getting-started/auth.md new file mode 100644 index 00000000..ff5d59c0 --- /dev/null +++ b/docs/src/eu/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: Authentication & Authorization +sidebarDepth: 3 +--- + +# Authentication & Authorization + +Castopod handles authentication and authorization using `codeigniter/shield` +coupled with custom rules. Roles and permissions are defined at two levels: + +1. [instance wide](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instance wide roles and permissions + +### Instance roles + + + +| role | description | permissions | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### Instance permissions + + + +| permission | description | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. Per podcast roles and permissions + +### Per podcast roles + + + +| role | description | permissions | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### Per podcast permissions + + + +| permission | description | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/eu/getting-started/docker.md b/docs/src/eu/getting-started/docker.md new file mode 100644 index 00000000..12f01619 --- /dev/null +++ b/docs/src/eu/getting-started/docker.md @@ -0,0 +1,160 @@ +--- +title: Official Docker images +sidebarDepth: 3 +--- + +# Official Docker images + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle + with all of Castopod dependencies +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an + Nginx configuration for Castopod + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +1. Install [docker](https://docs.docker.com/get-docker/) and + [docker-compose](https://docs.docker.com/compose/install/) +2. Create a `docker-compose.yml` file with the following: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for TLS (SSL/HTTPS) + + TLS is mandatory for ActivityPub to work. This job can easily be handled by + a reverse proxy, for example with [Caddy](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +4. Run `docker-compose up -d`, wait for it to initialize and head on to + `https://castopod.example.com/cp-install` to finish setting up Castopod! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + | **`CP_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/eu/getting-started/install.md b/docs/src/eu/getting-started/install.md new file mode 100644 index 00000000..cdea18ec --- /dev/null +++ b/docs/src/eu/getting-started/install.md @@ -0,0 +1,238 @@ +--- +title: Installation +sidebarDepth: 3 +--- + +# How to install Castopod? + +Castopod was thought-out to be easy to install. Whether using dedicated or +shared hosting, you can install it on most PHP-MySQL compatible web servers. + +::: tip Note + +We've released official Docker images for Castopod! + +If you prefer using Docker, you may skip this and go straight to the +[docker documentation](./docker.md) for Castopod. + +::: + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +PHP version 8.1 or higher is required, with the following extensions installed: + +- [intl](https://php.net/manual/en/intl.requirements.php) +- [libcurl](https://php.net/manual/en/curl.requirements.php) +- [mbstring](https://php.net/manual/en/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, + **PNG** and **WEBP** libraries. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +::: warning Warning + +Castopod only works with supported MySQL 5.7 or higher compatible databases. It +will break with the previous MySQL v5.6 for example as its end of life was on +February 5, 2021. + +::: + +You will need the server hostname, database name, username and password to +complete the installation process. If you do not have these, please contact your +server administrator. + +#### Privileges + +User must have at least these privileges on the database for Castopod to work: +`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, +`REFERENCES`, `CREATE VIEW`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you +want to generate Video Clips. The following extensions must be installed: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +0. Get a Web Server with [requirements](#requirements) installed +1. Create a MySQL database for Castopod with a user having access and + modification privileges (for more info, see + [MySQL compatible database](#mysql-compatible-database)). +2. Activate HTTPS on your domain with an _SSL certificate_. +3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto + the web server if you haven’t already. + - ⚠️ Set the web server document root to the `public/` sub-folder within the + `castopod` folder. +4. Add **cron tasks** on your web server for various background processes + (replace the paths accordingly): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +1. Run the Castopod install script by going to the install wizard page + (`https://your_domain_name.com/cp-install`) in your favorite web browser. +2. Follow the instructions on your screen. +3. Start podcasting! + +::: info Note + +The install script writes a `.env` file in the package root. If you cannot go +through the install wizard, you can create and edit the `.env` file manually +based on the `.env.example` file. + +::: + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +You may add your email configuration in your instance's `.env` like so: + +```ini +# […] + +email.fromEmail="your_email_address" +email.SMTPHost="your_smtp_host" +email.SMTPUser="your_smtp_user" +email.SMTPPass="your_smtp_password" +``` + +#### Email config options + +| Variable name | Type | Default | +| ---------------- | -------------------- | ------------ | +| **`fromEmail`** | string | `undefined` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `undefined` | +| **`SMTPUser`** | string | `undefined` | +| **`SMTPPass`** | string | `undefined` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. + +### Install with YunoHost + +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you. + +
    + + + Install Castopod with YunoHost + + +Github +Repo + +
    diff --git a/docs/src/eu/getting-started/security.md b/docs/src/eu/getting-started/security.md new file mode 100644 index 00000000..e205698d --- /dev/null +++ b/docs/src/eu/getting-started/security.md @@ -0,0 +1,26 @@ +--- +title: Security +--- + +# Security concerns + +Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP +framework that encourages +[good security practices](https://codeigniter.com/user_guide/concepts/security.html). + +To maximize your instance's safety and prevent any malicious attack, we +recommend you update all your Castopod files permissions after installation or +updates (to avoid any prior permission error): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/eu/getting-started/update.md b/docs/src/eu/getting-started/update.md new file mode 100644 index 00000000..98e019fb --- /dev/null +++ b/docs/src/eu/getting-started/update.md @@ -0,0 +1,109 @@ +--- +title: Update +sidebarDepth: 3 +--- + +# How to update Castopod? + +After installing Castopod, you may want to update your instance to the latest +version in order to enjoy the latest features ✨, bug fixes 🐛 and performance +improvements ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version + + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives + + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). + + ::: + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```bash + php spark castopod:database-update + ``` + +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `public/media`. + +2. Go through each release update instructions sequentially (from oldest to + newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +We advise you do, so you don't lose everything if anything goes wrong! + +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/eu/index.md b/docs/src/eu/index.md new file mode 100644 index 00000000..b63ff645 --- /dev/null +++ b/docs/src/eu/index.md @@ -0,0 +1,300 @@ +--- +sidebarDepth: 2 +--- + +# Welcome 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + +
    + Install +
    + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivation + +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. + +It is in fact one of the only media to have stayed this way for a long time. + +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. + +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. + +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. + +## Comparison with other solutions + +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. + +### Castopod vs Wordpress + +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. + +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. + +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. + +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. + +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwhale + +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. + +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod can be self-hosted and is the only solution that allows you to keep + full control over what you produce. Also, as it is open-source, you can even + customize it as you wish. + +- Castopod is the only solution that currently integrates both a decentralized + social network with ActivityPub as well as many of the podcasting 2.0 + features, hoping to bridge the gap between the two. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. + +### Contributing guide + +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔
    Ewen
    Ewen

    🌍 🤔 💻
    Bastien Luneteau
    Bastien Luneteau

    💻 🐛
    Cécile Ricordeau
    Cécile Ricordeau

    🎨
    Patryk Miś
    Patryk Miś

    🌍
    Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔
    Sebastian Janik
    Sebastian Janik

    💻
    Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻
    denis d
    denis d

    🐛 🤔
    Douglas Kastle
    Douglas Kastle

    🐛 🤔
    cExplorer
    cExplorer

    🐛 🌍
    ImaCrea
    ImaCrea

    🐛 🤔
    Jonas S
    Jonas S

    💻
    LEFEBVRE Yann
    LEFEBVRE Yann

    🐛
    Sebastian Späth
    Sebastian Späth

    🐛 🤔
    rocky III
    rocky III

    🐛
    Hermann Josef Eckl
    Hermann Josef Eckl

    🐛
    Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔
    João Leandro
    João Leandro

    🌍 🤔
    Angelos Chouvardas
    Angelos Chouvardas

    🌍
    Eivind
    Eivind

    🌍
    forght
    forght

    🌍
    glottis0q
    glottis0q

    🌍
    ButterflyOfFire
    ButterflyOfFire

    🌍
    Lucian I. Last
    Lucian I. Last

    🌍
    LuuzViir
    LuuzViir

    🌍
    CTHTC
    CTHTC

    🌍
    Russian Retro
    Russian Retro

    🌍
    Marek L'ach
    Marek L'ach

    🌍
    GunChleoc
    GunChleoc

    🌍
    GabiSnow
    GabiSnow

    🌍
    bendaha
    bendaha

    🌍
    Samuel Roland
    Samuel Roland

    🌍
    Dimitri Regnier
    Dimitri Regnier

    🤔
    irithys
    irithys

    🌍
    Sergi
    Sergi

    🌍
    ghose (XoseM)
    ghose (XoseM)

    🌍
    Andreas Olsson
    Andreas Olsson

    🌍
    leonfrom
    leonfrom

    🌍
    agentcobra
    agentcobra

    🌍
    Alessandro
    Alessandro

    🌍
    liimee
    liimee

    🌍
    Ahmed Sabouni
    Ahmed Sabouni

    🌍
    KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻
    Guy Martin
    Guy Martin

    🐛 💻
    + + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
    + Ad Aures Logo + NLnet Logo +
    + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/fa/getting-started/docker.md b/docs/src/fa/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/fa/getting-started/docker.md +++ b/docs/src/fa/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/fr/getting-started/docker.md b/docs/src/fr/getting-started/docker.md index b8d58bf0..6419825e 100644 --- a/docs/src/fr/getting-started/docker.md +++ b/docs/src/fr/getting-started/docker.md @@ -32,31 +32,32 @@ de données Redis peut être ajoutée en tant que gestionnaire de cache. 2. Créez un fichier `docker-compose.yml` avec les éléments suivants : ```yml - version: "3. + version: "3.7" - services : + services: app: image: castopod/castopod:latest container_name: "castopod-app" volumes: - castopod-media:/var/www/castopod/public/media - environnement: + environment: MYSQL_DATABASE: castopod MYSQL_USER: castopod MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod. xample. om" - CP_ANALYTICS_SALT : changer + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis - réseaux : + CP_REDIS_PASSWORD: changeme + networks: - castopod-app - castopod-db - ports : + ports: - 8000:8000 - redémarrage : + restart: unless-stopped mariadb: - image: mariadb:10. + image: mariadb:10.5 container_name: "castopod-mariadb" networks: - castopod-db @@ -66,15 +67,16 @@ de données Redis peut être ajoutée en tant que gestionnaire de cache. MYSQL_ROOT_PASSWORD: changeme MYSQL_DATABASE: castopod MYSQL_USER: castopod - MYSQL_PASSWORD: changez + MYSQL_PASSWORD: changeme restart: unless-stopped redis: - image: redis:redis:7. -alpine + image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data - réseaux: + networks: - castopod-app volumes: diff --git a/docs/src/fr2/getting-started/docker.md b/docs/src/fr2/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/fr2/getting-started/docker.md +++ b/docs/src/fr2/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/fr_CA/getting-started/docker.md b/docs/src/fr_CA/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/fr_CA/getting-started/docker.md +++ b/docs/src/fr_CA/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/gd/getting-started/docker.md b/docs/src/gd/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/gd/getting-started/docker.md +++ b/docs/src/gd/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/gl/getting-started/docker.md b/docs/src/gl/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/gl/getting-started/docker.md +++ b/docs/src/gl/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/id/getting-started/docker.md b/docs/src/id/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/id/getting-started/docker.md +++ b/docs/src/id/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/it/getting-started/docker.md b/docs/src/it/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/it/getting-started/docker.md +++ b/docs/src/it/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/ja/getting-started/docker.md b/docs/src/ja/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/ja/getting-started/docker.md +++ b/docs/src/ja/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/kk/getting-started/docker.md b/docs/src/kk/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/kk/getting-started/docker.md +++ b/docs/src/kk/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/ko/getting-started/docker.md b/docs/src/ko/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/ko/getting-started/docker.md +++ b/docs/src/ko/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/nl/getting-started/docker.md b/docs/src/nl/getting-started/docker.md index 23cc9eb9..eb9549d2 100644 --- a/docs/src/nl/getting-started/docker.md +++ b/docs/src/nl/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/nn-NO/getting-started/docker.md index f23732e0..09af9d61 100644 --- a/docs/src/nn-NO/getting-started/docker.md +++ b/docs/src/nn-NO/getting-started/docker.md @@ -32,57 +32,59 @@ Redis-database for å handtera mellomlagring. 2. Lag ei `docker-compose.yml`-fil som inneheld dette: ```yml - version: "3.7" + versjon: "3.7" - services: + tenester: app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: + bilete: castopod/castopod:latest + container_namn: "castopod-app" + lagringsvolum: - castopod-media:/var/www/castopod/public/media - environment: + miljø: MYSQL_DATABASE: castopod MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme + MYSQL_PASSWORD: endremeg + CP_BASEURL: "https://castopod.domene.no" + CP_ANALYTICS_SALT: endremeg CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis - networks: + CP_REDIS_PASSWORD: endremeg + nettverk: - castopod-app - castopod-db - ports: + portar: - 8000:8000 restart: unless-stopped mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: + bilete: mariadb:10.5 + container_namn: "castopod-mariadb" + nettverk: - castopod-db - volumes: + lagringsvolum: - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme + miljø: + MYSQL_ROOT_PASSWORD: endremeg MYSQL_DATABASE: castopod MYSQL_USER: castopod - MYSQL_PASSWORD: changeme + MYSQL_PASSWORD: endremeg restart: unless-stopped redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - volumes: + bilete: redis:7.0-alpine + container_namn: "castopod-redis" + kommando: --requirepass changeme + lagringsvolum: - castopod-cache:/data - networks: + nettverk: - castopod-app - volumes: + lagringsvolum: castopod-media: castopod-db: castopod-cache: - networks: + nettverk: castopod-app: castopod-db: ``` diff --git a/docs/src/oc/getting-started/docker.md b/docs/src/oc/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/oc/getting-started/docker.md +++ b/docs/src/oc/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/pl/getting-started/docker.md b/docs/src/pl/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/pl/getting-started/docker.md +++ b/docs/src/pl/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/pt-BR/getting-started/docker.md b/docs/src/pt-BR/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/pt-BR/getting-started/docker.md +++ b/docs/src/pt-BR/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/pt/getting-started/docker.md b/docs/src/pt/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/pt/getting-started/docker.md +++ b/docs/src/pt/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/ro/getting-started/docker.md b/docs/src/ro/getting-started/docker.md index 4de0f4f3..48bb4a19 100644 --- a/docs/src/ro/getting-started/docker.md +++ b/docs/src/ro/getting-started/docker.md @@ -48,6 +48,7 @@ Redis poate fi adăugată pentru cache. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ Redis poate fi adăugată pentru cache. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/ru/getting-started/docker.md b/docs/src/ru/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/ru/getting-started/docker.md +++ b/docs/src/ru/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/sk/getting-started/docker.md b/docs/src/sk/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/sk/getting-started/docker.md +++ b/docs/src/sk/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/sr-Latn/getting-started/docker.md b/docs/src/sr-Latn/getting-started/docker.md index b73daca5..edb10c1d 100644 --- a/docs/src/sr-Latn/getting-started/docker.md +++ b/docs/src/sr-Latn/getting-started/docker.md @@ -48,6 +48,7 @@ podataka može se dodati kao obrađivač keša. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ podataka može se dodati kao obrađivač keša. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/sv/getting-started/docker.md b/docs/src/sv/getting-started/docker.md index 762465fb..cb478cf8 100644 --- a/docs/src/sv/getting-started/docker.md +++ b/docs/src/sv/getting-started/docker.md @@ -48,6 +48,7 @@ läggas till som cachehanterare. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ läggas till som cachehanterare. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/uk/getting-started/docker.md b/docs/src/uk/getting-started/docker.md index 75158bd6..12f01619 100644 --- a/docs/src/uk/getting-started/docker.md +++ b/docs/src/uk/getting-started/docker.md @@ -48,6 +48,7 @@ can be added as a cache handler. CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -72,6 +73,7 @@ can be added as a cache handler. redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/zh-Hans/getting-started/docker.md b/docs/src/zh-Hans/getting-started/docker.md index 4e20f7fd..2ffa2369 100644 --- a/docs/src/zh-Hans/getting-started/docker.md +++ b/docs/src/zh-Hans/getting-started/docker.md @@ -47,6 +47,7 @@ Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub CP_ANALYTICS_SALT: changeme CP_CACHE_HANDLER: redis CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme networks: - castopod-app - castopod-db @@ -71,6 +72,7 @@ Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub redis: image: redis:7.0-alpine container_name: "castopod-redis" + command: --requirepass changeme volumes: - castopod-cache:/data networks: diff --git a/docs/src/zh-Hant/getting-started/auth.md b/docs/src/zh-Hant/getting-started/auth.md new file mode 100644 index 00000000..90e50e53 --- /dev/null +++ b/docs/src/zh-Hant/getting-started/auth.md @@ -0,0 +1,87 @@ +--- +title: 認證 & 授權 +sidebarDepth: 3 +--- + +# 認證 & 授權 + +Castopod 使用 `codeigniter/shield` 處理身分認證和授權 與自定義規則。 腳色和權限 +在定義為兩個層級: + +1. [實例範圍](#1-instance-wide-roles-and-permissions) +2. [每個播客](#2-per-podcast-roles-and-permissions) + +## 1. 實例範圍的腳色和權限 + +### 實例腳色 + + + +| 腳色 | 說明 | 權限 | +| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | General users of Castopod. | admin.access | + + + +### 實例權限 + + + +| 權限 | 說明 | +| ----------------------- | ------------------------------------------------------------------ | +| admin.access | Can access the Castopod admin area. | +| admin.settings | Can access the Castopod settings. | +| users.manage | Can manage Castopod users. | +| persons.manage | Can manage persons. | +| pages.manage | Can manage pages. | +| podcasts.view | Can view all podcasts. | +| podcasts.create | Can create new podcasts. | +| podcasts.import | Can import podcasts. | +| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | + + + +## 2. 每個播客腳色與權限 + +### 每個播客腳色 + + + +| 腳色 | 說明 | 權限 | +| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Admin | Has complete control of podcast #{id}. | \* | +| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Guest | General contributor of the podcast #{id}. | view, episodes.view | + + + +### 每個播客權限 + + + +| 權限 | 說明 | +| ---------------------------- | ------------------------------------------------------------------------ | +| view | Can view dashboard and analytics of podcast #{id}. | +| edit | Can edit podcast #{id}. | +| delete | Can delete podcast #{id}. | +| manage-import | Can synchronize imported podcast #{id}. | +| manage-persons | Can manage subscriptions of podcast #{id}. | +| manage-subscriptions | Can manage subscriptions of podcast #{id}. | +| manage-contributors | Can manage contributors of podcast #{id}. | +| manage-platforms | Can set/remove platform links of podcast #{id}. | +| manage-publications | Can publish podcast #{id}. | +| manage-notifications | Can view and mark notifications as read for podcast #{id}. | +| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. | +| episodes.view | Can view dashboard and analytics of podcast #{id}. | +| episodes.create | Can create episodes for podcast #{id}. | +| episodes.edit | Can edit podcast #{id}. | +| episodes.delete | Can delete podcast #{id}. | +| episodes.manage-persons | Can manage subscriptions of podcast #{id}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. | +| episodes.manage-publications | Can publish podcast #{id}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. | + + diff --git a/docs/src/zh-Hant/getting-started/docker.md b/docs/src/zh-Hant/getting-started/docker.md new file mode 100644 index 00000000..12f01619 --- /dev/null +++ b/docs/src/zh-Hant/getting-started/docker.md @@ -0,0 +1,160 @@ +--- +title: Official Docker images +sidebarDepth: 3 +--- + +# Official Docker images + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle + with all of Castopod dependencies +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an + Nginx configuration for Castopod + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +1. Install [docker](https://docs.docker.com/get-docker/) and + [docker-compose](https://docs.docker.com/compose/install/) +2. Create a `docker-compose.yml` file with the following: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for TLS (SSL/HTTPS) + + TLS is mandatory for ActivityPub to work. This job can easily be handled by + a reverse proxy, for example with [Caddy](https://caddyserver.com/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +4. Run `docker-compose up -d`, wait for it to initialize and head on to + `https://castopod.example.com/cp-install` to finish setting up Castopod! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | + | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | + | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | + | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | + | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | + | **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | + | **`CP_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | + | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | + | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | + | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | + | **`CP_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/zh-Hant/getting-started/install.md b/docs/src/zh-Hant/getting-started/install.md new file mode 100644 index 00000000..cdea18ec --- /dev/null +++ b/docs/src/zh-Hant/getting-started/install.md @@ -0,0 +1,238 @@ +--- +title: Installation +sidebarDepth: 3 +--- + +# How to install Castopod? + +Castopod was thought-out to be easy to install. Whether using dedicated or +shared hosting, you can install it on most PHP-MySQL compatible web servers. + +::: tip Note + +We've released official Docker images for Castopod! + +If you prefer using Docker, you may skip this and go straight to the +[docker documentation](./docker.md) for Castopod. + +::: + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +PHP version 8.1 or higher is required, with the following extensions installed: + +- [intl](https://php.net/manual/en/intl.requirements.php) +- [libcurl](https://php.net/manual/en/curl.requirements.php) +- [mbstring](https://php.net/manual/en/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, + **PNG** and **WEBP** libraries. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +::: warning Warning + +Castopod only works with supported MySQL 5.7 or higher compatible databases. It +will break with the previous MySQL v5.6 for example as its end of life was on +February 5, 2021. + +::: + +You will need the server hostname, database name, username and password to +complete the installation process. If you do not have these, please contact your +server administrator. + +#### Privileges + +User must have at least these privileges on the database for Castopod to work: +`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, +`REFERENCES`, `CREATE VIEW`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you +want to generate Video Clips. The following extensions must be installed: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +0. Get a Web Server with [requirements](#requirements) installed +1. Create a MySQL database for Castopod with a user having access and + modification privileges (for more info, see + [MySQL compatible database](#mysql-compatible-database)). +2. Activate HTTPS on your domain with an _SSL certificate_. +3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto + the web server if you haven’t already. + - ⚠️ Set the web server document root to the `public/` sub-folder within the + `castopod` folder. +4. Add **cron tasks** on your web server for various background processes + (replace the paths accordingly): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +1. Run the Castopod install script by going to the install wizard page + (`https://your_domain_name.com/cp-install`) in your favorite web browser. +2. Follow the instructions on your screen. +3. Start podcasting! + +::: info Note + +The install script writes a `.env` file in the package root. If you cannot go +through the install wizard, you can create and edit the `.env` file manually +based on the `.env.example` file. + +::: + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +You may add your email configuration in your instance's `.env` like so: + +```ini +# […] + +email.fromEmail="your_email_address" +email.SMTPHost="your_smtp_host" +email.SMTPUser="your_smtp_user" +email.SMTPPass="your_smtp_password" +``` + +#### Email config options + +| Variable name | Type | Default | +| ---------------- | -------------------- | ------------ | +| **`fromEmail`** | string | `undefined` | +| **`fromName`** | string | `"Castopod"` | +| **`SMTPHost`** | string | `undefined` | +| **`SMTPUser`** | string | `undefined` | +| **`SMTPPass`** | string | `undefined` | +| **`SMTPPort`** | number | `25` | +| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +If you don't want to bother with installing Castopod manually, you may use one +of the packages created and maintained by the open-source community. + +### Install with YunoHost + +[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux +made up of free and open-source software packages. It manages the hardships of +self-hosting for you. + +
    + + + Install Castopod with YunoHost + + +Github +Repo + +
    diff --git a/docs/src/zh-Hant/getting-started/security.md b/docs/src/zh-Hant/getting-started/security.md new file mode 100644 index 00000000..e205698d --- /dev/null +++ b/docs/src/zh-Hant/getting-started/security.md @@ -0,0 +1,26 @@ +--- +title: Security +--- + +# Security concerns + +Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP +framework that encourages +[good security practices](https://codeigniter.com/user_guide/concepts/security.html). + +To maximize your instance's safety and prevent any malicious attack, we +recommend you update all your Castopod files permissions after installation or +updates (to avoid any prior permission error): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/zh-Hant/getting-started/update.md b/docs/src/zh-Hant/getting-started/update.md new file mode 100644 index 00000000..98e019fb --- /dev/null +++ b/docs/src/zh-Hant/getting-started/update.md @@ -0,0 +1,109 @@ +--- +title: Update +sidebarDepth: 3 +--- + +# How to update Castopod? + +After installing Castopod, you may want to update your instance to the latest +version in order to enjoy the latest features ✨, bug fixes 🐛 and performance +improvements ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [Should I make a backup before updating?](#should-i-make-a-backup-before-updating) + +1. Go to the + [releases page](https://code.castopod.org/adaures/castopod/-/releases) and + see if your instance is up to date with the latest Castopod version + + - cf. + [Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) + +2. Download the latest release package named `Castopod Package`, you may choose + between the `zip` or `tar.gz` archives + + - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code + - Note that you can also download the latest package from + [castopod.org](https://castopod.org/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + ::: info Note + + You may need to reset files permissions as during the install process. + Check [Security Concerns](./security.md). + + ::: + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```bash + php spark castopod:database-update + ``` + +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨ Enjoy your fresh instance, you're all done! + +::: info Note + +Releases may come with additional update instructions (see +[releases page](https://code.castopod.org/adaures/castopod/-/releases)). + +- cf. + [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +::: + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +No problem! Just get the latest release as described above. Only, when going +through the release instructions (4), perform them sequentially, from the oldest +to the newest. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `public/media`. + +2. Go through each release update instructions sequentially (from oldest to + newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +We advise you do, so you don't lose everything if anything goes wrong! + +More generally, we advise you make regular backups of your Castopod files and +database to prevent you from losing it all… diff --git a/docs/src/zh-Hant/index.md b/docs/src/zh-Hant/index.md new file mode 100644 index 00000000..b63ff645 --- /dev/null +++ b/docs/src/zh-Hant/index.md @@ -0,0 +1,300 @@ +--- +sidebarDepth: 2 +--- + +# Welcome 👋 + +[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + +
    + Install +
    + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivation + +The podcasting ecosystem is decentralized by nature: you can create your podcast +as an RSS file, publish it on the web and have it shared everywhere online. + +It is in fact one of the only media to have stayed this way for a long time. + +As usages are evolving, more and more people are getting into podcasts: whether +it is creators finding new ways to share their ideas, or listeners in the search +for better content. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized medium. + +Castopod was created in an effort to provide an open and sustainable alternative +to hosting your podcasts, promoting decentralization to ensure that podcasters +creativity can express itself. + +This project is pushed by the open-source community, and specifically by the +[Fediverse](https://fediverse.party/en/fediverse/) and +[Podcasting 2.0](https://podcastindex.org/) movements. + +## Comparison with other solutions + +We believe that a solution is not necessarily right for everyone, it highly +depends on your needs. So, here are comparisons with other tools to help you to +gauge whether Castopod is the right fit for you. + +### Castopod vs Wordpress + +Castopod is often referred to as "the Wordpress for podcasts" because of the +similarities between the two. In some ways this is true. And actually, Castopod +was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption +from the community and the number of websites running it. + +Just like Wordpress, Castopod is free & open source, built using PHP with a +MySQL database and is packaged in a way that you can easily install on most web +servers. + +Wordpress is a great way to create your website and extend it with plugins to +get what you want. It is a full fledged CMS that helps you get any type of +website online. + +On the other hand, Castopod is meant to address the podcasters needs +specifically, focusing on podcasting, and nothing else. You don't need any +plugin to get you started on your podcasting journey. + +This allows optimizing the processes specific to podcasting: ranging from the +creation of your podcasts and the publication of new episodes all the way to +broadcasting, marketing and analytics. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwhale + +Funkwhale is a self-hosted, modern free and open-source music server. Just as +Castopod, Funkwhale is on the fediverse, a decentralized social network allowing +interoperability between the two. + +Funkwhale was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +Unlike Funkwhale, Castopod has been designed and built around podcasting +exclusively. This allows easier implementation for features related to the +podcasting ecosystem, such as the podcasting 2.0 features (transcripts, +chapters, locations, persons, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +There are many solutions for you to host your podcasts, some of which are really +great and [a lot of them](https://podcastindex.org/apps) are jumping into the +Podcasting 2.0 wagon just like Castopod! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod can be self-hosted and is the only solution that allows you to keep + full control over what you produce. Also, as it is open-source, you can even + customize it as you wish. + +- Castopod is the only solution that currently integrates both a decentralized + social network with ActivityPub as well as many of the podcasting 2.0 + features, hoping to bridge the gap between the two. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +Castopod has adopted a Code of Conduct that we expect project participants to +adhere to. Please read the +[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +so that you can understand what actions will and will not be tolerated. + +### Contributing guide + +Read our [contributing guide](./contributing/guidelines.md) to learn about our +development process, how to propose bugfixes and improvements, and how to build +and test your changes to Castopod. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Yassine Doghri
    Yassine Doghri

    💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
    Benjamin Bellamy
    Benjamin Bellamy

    💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
    Ola Hneini
    Ola Hneini

    💻 👀 📖 🚧 💬 🤔
    Romain de Laage
    Romain de Laage

    💻 🚇 📖 🌍 🤔
    Lyonel Bernard
    Lyonel Bernard

    🐛 💬 🔊 🤔
    Christopher Lagonick-Weitzel
    Christopher Lagonick-Weitzel

    🐛 💬 🔊 🤔
    Ernesto Acosta
    Ernesto Acosta

    🐛 🔊 🌍 💬 🤔
    Ewen
    Ewen

    🌍 🤔 💻
    Bastien Luneteau
    Bastien Luneteau

    💻 🐛
    Cécile Ricordeau
    Cécile Ricordeau

    🎨
    Patryk Miś
    Patryk Miś

    🌍
    Marcin Lewandowski
    Marcin Lewandowski

    🐛 🤔
    Sebastian Janik
    Sebastian Janik

    💻
    Patryk Karczmarczyk
    Patryk Karczmarczyk

    💻
    denis d
    denis d

    🐛 🤔
    Douglas Kastle
    Douglas Kastle

    🐛 🤔
    cExplorer
    cExplorer

    🐛 🌍
    ImaCrea
    ImaCrea

    🐛 🤔
    Jonas S
    Jonas S

    💻
    LEFEBVRE Yann
    LEFEBVRE Yann

    🐛
    Sebastian Späth
    Sebastian Späth

    🐛 🤔
    rocky III
    rocky III

    🐛
    Hermann Josef Eckl
    Hermann Josef Eckl

    🐛
    Delhaye Cyrille
    Delhaye Cyrille

    🐛 🤔
    João Leandro
    João Leandro

    🌍 🤔
    Angelos Chouvardas
    Angelos Chouvardas

    🌍
    Eivind
    Eivind

    🌍
    forght
    forght

    🌍
    glottis0q
    glottis0q

    🌍
    ButterflyOfFire
    ButterflyOfFire

    🌍
    Lucian I. Last
    Lucian I. Last

    🌍
    LuuzViir
    LuuzViir

    🌍
    CTHTC
    CTHTC

    🌍
    Russian Retro
    Russian Retro

    🌍
    Marek L'ach
    Marek L'ach

    🌍
    GunChleoc
    GunChleoc

    🌍
    GabiSnow
    GabiSnow

    🌍
    bendaha
    bendaha

    🌍
    Samuel Roland
    Samuel Roland

    🌍
    Dimitri Regnier
    Dimitri Regnier

    🤔
    irithys
    irithys

    🌍
    Sergi
    Sergi

    🌍
    ghose (XoseM)
    ghose (XoseM)

    🌍
    Andreas Olsson
    Andreas Olsson

    🌍
    leonfrom
    leonfrom

    🌍
    agentcobra
    agentcobra

    🌍
    Alessandro
    Alessandro

    🌍
    liimee
    liimee

    🌍
    Ahmed Sabouni
    Ahmed Sabouni

    🌍
    KrzysztofDomanczyk
    KrzysztofDomanczyk

    💻
    Guy Martin
    Guy Martin

    🐛 💻
    + + + + + + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (for direct interaction with + developers and the community) +- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for + feature requests & bug reports) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +The ongoing development of Castopod is made possible with the support of its +backers. If you'd like to help, please consider +[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). + +
    + Ad Aures Logo + NLnet Logo +
    + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). +https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +https://img.shields.io/github/license/ad-aures/castopod?color=blue +https://img.shields.io/badge/contributions-welcome-brightgreen.svg +https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +https://img.shields.io/github/stars/ad-aures/castopod?style=social + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[semantic-release]: https://github.com/semantic-release/semantic-release +[discord]: https://castopod.org/discord +[stars]: https://github.com/ad-aures/castopod/stargazers +[crowdin]: https://translate.castopod.org/project/castopod diff --git a/modules/Admin/Language/de/Breadcrumb.php b/modules/Admin/Language/de/Breadcrumb.php index c271fd31..89fc585d 100644 --- a/modules/Admin/Language/de/Breadcrumb.php +++ b/modules/Admin/Language/de/Breadcrumb.php @@ -39,11 +39,11 @@ return [ 'my-account' => 'Mein Konto', 'change-password' => 'Passwort ändern', 'imports' => 'Importe', - 'sync-feeds' => 'synchronize feeds', + 'sync-feeds' => 'Feeds synchronisieren', 'platforms' => 'Plattformen', 'social' => 'soziale Netzwerke', 'funding' => 'Finanzierung', - 'monetization-other' => 'other monetization', + 'monetization-other' => 'sonstige Monetarisierung', 'analytics' => 'Statistiken', 'locations' => 'Orte', 'webpages' => 'Webseiten', diff --git a/modules/Admin/Language/de/Common.php b/modules/Admin/Language/de/Common.php index c4ff79bf..cc668a33 100644 --- a/modules/Admin/Language/de/Common.php +++ b/modules/Admin/Language/de/Common.php @@ -40,7 +40,7 @@ return [ ], 'upload_file' => 'Eine Datei hochladen', 'remote_url' => 'Externe URL', - 'save' => 'Save', + 'save' => 'Speichern', ], 'play_episode_button' => [ 'play' => 'Abspielen', diff --git a/modules/Admin/Language/de/Episode.php b/modules/Admin/Language/de/Episode.php index fd8f84f3..15009e31 100644 --- a/modules/Admin/Language/de/Episode.php +++ b/modules/Admin/Language/de/Episode.php @@ -139,9 +139,9 @@ return [ 'location_name' => 'Standortname oder Adresse', 'location_name_hint' => 'Dies kann ein realer oder fiktiver Ort sein', 'transcript' => 'Transkript (Untertitel)', - 'transcript_hint' => 'Only .srt or .vtt are allowed.', + 'transcript_hint' => 'Nur .srt oder .vtt sind erlaubt.', 'transcript_download' => 'Transkript herunterladen', - 'transcript_file' => 'Transcript file (.srt or .vtt)', + 'transcript_file' => 'Transkriptdatei (.srt oder .vtt)', 'transcript_remote_url' => 'Remote-URL für Transkript', 'transcript_file_delete' => 'Transkriptionsdatei löschen', 'chapters' => 'Kapitel', diff --git a/modules/Admin/Language/de/Navigation.php b/modules/Admin/Language/de/Navigation.php index 752c2186..f7b7b0ba 100644 --- a/modules/Admin/Language/de/Navigation.php +++ b/modules/Admin/Language/de/Navigation.php @@ -12,7 +12,7 @@ return [ 'toggle_sidebar' => 'Seitenleiste ein/aus', 'go_to_website' => 'Gehe zur Webseite', 'go_to_admin' => 'Gehe zu Admin', - 'not-authorized' => 'Not authorized', + 'not-authorized' => 'Nicht berechtigt', 'dashboard' => 'Übersicht', 'admin' => 'Startseite', 'podcasts' => 'Podcasts', @@ -35,7 +35,7 @@ return [ 'settings' => 'Einstellungen', 'settings-general' => 'Allgemein', 'settings-theme' => 'Erscheinungsbild', - 'admin-about' => 'About', + 'admin-about' => 'Über', 'account' => [ 'my-account' => 'Mein Konto', 'change-password' => 'Passwort ändern', diff --git a/modules/Admin/Language/de/Platforms.php b/modules/Admin/Language/de/Platforms.php index 48b5c747..41751316 100644 --- a/modules/Admin/Language/de/Platforms.php +++ b/modules/Admin/Language/de/Platforms.php @@ -10,21 +10,21 @@ declare(strict_types=1); return [ 'title' => [ - 'podcasting' => 'Podcasting platforms', - 'social' => 'Social networks', - 'funding' => 'Funding links', + 'podcasting' => 'Podcast-Plattformen', + 'social' => 'Soziale Medien', + 'funding' => 'Finanzierungslinks', ], - 'website' => 'Website', + 'website' => 'Webseite', 'home_url' => 'Gehe zu {platformName} Webseite', - 'register' => 'Register', + 'register' => 'Registrieren', 'submit_url' => 'Sende deinen Podcast an {platformName}', - 'your_link' => 'Your link', + 'your_link' => 'Dein Link', 'your_id' => [ - 'podcasting' => 'Your ID', - 'social' => 'Your ID', - 'funding' => 'Your CTA', + 'podcasting' => 'Deine ID', + 'social' => 'Deine ID', + 'funding' => 'Deine CTA', ], - 'your_cta' => 'Your call to action', + 'your_cta' => 'Dein Aufruf zur Aktion', 'visible' => 'Auf Podcast-Homepage anzeigen?', 'on_embed' => 'Auf einbettbarem Player anzeigen?', 'remove' => 'Entferne {platformName}', diff --git a/modules/Admin/Language/de/Podcast.php b/modules/Admin/Language/de/Podcast.php index 5cffc366..cc83786e 100644 --- a/modules/Admin/Language/de/Podcast.php +++ b/modules/Admin/Language/de/Podcast.php @@ -22,7 +22,7 @@ return [ 'delete' => 'Podcast löschen', 'see_episodes' => 'Episoden ansehen', 'see_contributors' => 'Mitwirkende anzeigen', - 'monetization_other' => 'Other monetization', + 'monetization_other' => 'Sonstige Monetarisierung', 'go_to_page' => 'Gehe zur Seite', 'latest_episodes' => 'Neueste Folgen', 'see_all_episodes' => 'Alle Folgen anzeigen', @@ -58,7 +58,7 @@ return [ 'form' => [ 'identity_section_title' => 'Podcast-Identität', 'identity_section_subtitle' => 'Diese Felder erlauben es dir, Aufmerksamkeit zu bekommen.', - 'fediverse_section_title' => 'Fediverse identity', + 'fediverse_section_title' => 'Fediverse-Identität', 'cover' => 'Podcast-Cover', 'cover_size_hint' => 'Das Cover muss quadratisch und mindestens 1400px breit und hoch sein.', @@ -74,17 +74,17 @@ return [ 'episodic' => 'Episodisch', 'episodic_hint' => 'Wenn Folgen ohne bestimmte Reihenfolge abgespielt werden sollen. Neueste Folgen werden zuerst angezeigt.', 'serial' => 'Seriell', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. Episodes will be presented in numeric order.', + 'serial_hint' => 'Wenn Episoden in sequenzieller Reihenfolge konsumiert werden sollen. Episoden werden in numerischer Reihenfolge angezeigt.', ], 'medium' => [ 'label' => 'Medium', 'hint' => 'Medium as represented by podcast:medium tag in RSS. Changing this may change how players present your feed.', 'podcast' => 'Podcast', - 'podcast_hint' => 'Describes a feed for a podcast show.', - 'music' => 'Music', + 'podcast_hint' => 'Beschreibt einen Feed für eine Podcast-Show.', + 'music' => 'Musik', 'music_hint' => 'A feed of music organized into an "album" with each item a song within the album.', - 'audiobook' => 'Audiobook', - 'audiobook_hint' => 'Specific types of audio with one item per feed, or where items represent chapters within the book.', + 'audiobook' => 'Hörbuch', + 'audiobook_hint' => 'Spezifische Arten von Audio mit einem Eintrag pro Feed, oder wenn Elemente Kapitel innerhalb des Buches darstellen.', ], 'description' => 'Beschreibung', 'classification_section_title' => 'Klassifikation', @@ -109,8 +109,8 @@ return [ 'owner_email' => 'E-Mail des Eigentümers', 'owner_email_hint' => 'Wird von den meisten Plattformen verwendet werden, um den Podcast-Besitz zu überprüfen. Sichtbar im öffentlichen RSS-Feed.', - 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', - 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', + 'is_owner_email_removed_from_feed' => 'Entferne die Eigentümer-E-Mail aus dem öffentlichen RSS-Feed', + 'is_owner_email_removed_from_feed_hint' => 'Möglicherweise müssen Sie die E-Mail vorübergehend freigeben, damit ein Verzeichnis Ihren Podcast-Besitz verifizieren kann.', 'publisher' => 'Herausgeber', 'publisher_hint' => 'Die Gruppe, die für die Erstellung des Podcasts verantwortlich ist. Oft bezogen auf die Muttergesellschaft oder das Netzwerk eines Podcasts. Dieses Feld wird manchmal als \'Autor\' bezeichnet.', @@ -126,7 +126,7 @@ return [ 'premium_by_default' => 'Episoden müssen standardmäßig als Premium festgelegt werden', 'premium_by_default_hint' => 'Podcast-Episoden werden standardmäßig als Premium markiert. Sie können dennoch einzelne Episoden, Trailer oder Boni als öffentlich festlegen.', 'op3' => 'Open Podcast Prefix Project (OP3)', - 'op3_link' => 'Visit your OP3 dashboard (external link)', + 'op3_link' => 'Besuche dein OP3-Dashboard (externer Link)', 'op3_hint' => 'Werten Sie Ihre Analysedaten mit OP3 auf, einem quelloffenen und vertrauenswürdigen Analysedienst eines Drittanbieters. Teilen, validieren und vergleichen Sie Ihre Analysedaten in dem offenen Podcast-Ökosystem.', 'op3_enable' => 'OP3-Analysedienst aktivieren', 'op3_enable_hint' => 'Aus Sicherheitsgründen werden die Analysedaten von Premium-Episoden nicht mit OP3 geteilt.', diff --git a/modules/Admin/Language/de/PodcastNavigation.php b/modules/Admin/Language/de/PodcastNavigation.php index 6512d570..6fa2e17d 100644 --- a/modules/Admin/Language/de/PodcastNavigation.php +++ b/modules/Admin/Language/de/PodcastNavigation.php @@ -10,13 +10,13 @@ declare(strict_types=1); return [ 'go_to_page' => 'Zur Podcast-Seite gehen', - 'rss_feed' => 'RSS feed', + 'rss_feed' => 'RSS-Feed', 'dashboard' => 'Podcast-Dashboard', 'podcast-view' => 'Startseite', 'podcast-edit' => 'Podcast bearbeiten', 'podcast-persons-manage' => 'Mitwirkende verwalten', 'podcast-imports' => 'Podcast-Importe', - 'podcast-imports-sync' => 'Sync feeds', + 'podcast-imports-sync' => 'Feeds synchronisieren', 'episodes' => 'Folgen', 'episode-list' => 'Alle Episoden', 'episode-create' => 'Neue Episoden', @@ -28,15 +28,15 @@ return [ 'podcast-analytics-players' => 'Podcast-Player', 'podcast-analytics-listening-time' => 'Hörzeit', 'podcast-analytics-time-periods' => 'Zeiträume', - 'monetization' => 'Monetization', + 'monetization' => 'Monetarisierung', 'subscription-list' => 'Alle Abonnements', - 'subscription-create' => 'Add subscription', + 'subscription-create' => 'Abonnement hinzufügen', 'contributors' => 'Mitwirkende', 'contributor-list' => 'Alle Unterstützer', 'contributor-add' => 'Mitwirkenden hinzufügen', 'broadcast' => 'Broadcast', - 'platforms-podcasting' => 'Podcasting apps', + 'platforms-podcasting' => 'Podcast-Apps', 'platforms-social' => 'Soziale Netzwerke', - 'platforms-funding' => 'Funding links', - 'podcast-monetization-other' => 'Other', + 'platforms-funding' => 'Finanzierungslinks', + 'podcast-monetization-other' => 'Andere', ]; diff --git a/modules/Admin/Language/de/Validation.php b/modules/Admin/Language/de/Validation.php index 212cfb73..bae6668c 100644 --- a/modules/Admin/Language/de/Validation.php +++ b/modules/Admin/Language/de/Validation.php @@ -13,5 +13,5 @@ return [ '{field} ist entweder kein Bild, oder es ist nicht breit oder hoch genug.', 'is_image_ratio' => '{field} ist entweder kein Bild oder nicht das richtige Verhältnis.', - 'is_json' => '{field} contains invalid JSON.', + 'is_json' => '{field} enthält ungültiges JSON.', ]; diff --git a/modules/Admin/Language/eu/AboutCastopod.php b/modules/Admin/Language/eu/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/eu/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/eu/Breadcrumb.php b/modules/Admin/Language/eu/Breadcrumb.php new file mode 100644 index 00000000..6a678d4e --- /dev/null +++ b/modules/Admin/Language/eu/Breadcrumb.php @@ -0,0 +1,59 @@ + 'breadcrumb', + config(Admin::class) + ->gateway => 'Home', + 'podcasts' => 'podcasts', + 'episodes' => 'episodes', + 'subscriptions' => 'subscriptions', + 'contributors' => 'contributors', + 'pages' => 'pages', + 'settings' => 'settings', + 'theme' => 'theme', + 'about' => 'about', + 'add' => 'add', + 'new' => 'new', + 'edit' => 'edit', + 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'publish-date-edit' => 'edit publication date', + 'unpublish' => 'unpublish', + 'delete' => 'delete', + 'remove' => 'remove', + 'fediverse' => 'fediverse', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', + 'users' => 'users', + 'my-account' => 'my account', + 'change-password' => 'change password', + 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', + 'platforms' => 'platforms', + 'social' => 'social networks', + 'funding' => 'funding', + 'monetization-other' => 'other monetization', + 'analytics' => 'analytics', + 'locations' => 'locations', + 'webpages' => 'web pages', + 'unique-listeners' => 'unique listeners', + 'players' => 'players', + 'listening-time' => 'listening time', + 'time-periods' => 'time periods', + 'soundbites' => 'soundbites', + 'video-clips' => 'video clips', + 'embed' => 'embeddable player', + 'notifications' => 'notifications', + 'suspend' => 'suspend', +]; diff --git a/modules/Admin/Language/eu/Charts.php b/modules/Admin/Language/eu/Charts.php new file mode 100644 index 00000000..6ede2510 --- /dev/null +++ b/modules/Admin/Language/eu/Charts.php @@ -0,0 +1,41 @@ + 'Episode downloads by service (for the past week)', + 'by_player_weekly' => 'Episode downloads by player (for the past week)', + 'by_player_yearly' => 'Episode downloads by player (for the past year)', + 'by_device_weekly' => 'Episode downloads by device (for the past week)', + 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', + 'podcast_by_region' => 'Episode downloads by region (for the past week)', + 'unique_daily_listeners' => 'Daily unique listeners', + 'unique_monthly_listeners' => 'Monthly unique listeners', + 'by_browser' => 'Web pages usage by browser (for the past week)', + 'podcast_by_day' => 'Episode daily downloads', + 'podcast_by_month' => 'Episode monthly downloads', + 'episode_by_day' => 'Episode daily downloads (first 60 days)', + 'episode_by_month' => 'Episode monthly downloads', + 'episodes_by_day' => + '5 latest episodes downloads (during their first 60 days)', + 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_yearly' => 'Episode downloads by country (for the past year)', + 'by_domain_weekly' => 'Web pages visits by source (for the past week)', + 'by_domain_yearly' => 'Web pages visits by source (for the past year)', + 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + 'podcast_bots' => 'Bots (crawlers)', + 'daily_listening_time' => 'Daily cumulative listening time', + 'monthly_listening_time' => 'Monthly cumulative listening time', + 'by_weekday' => 'By week day (for the past 60 days)', + 'by_hour' => 'By time of day (for the past 60 days)', + 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', + 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', +]; diff --git a/modules/Admin/Language/eu/Common.php b/modules/Admin/Language/eu/Common.php new file mode 100644 index 00000000..74addcf2 --- /dev/null +++ b/modules/Admin/Language/eu/Common.php @@ -0,0 +1,52 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'more' => 'More', + 'no_data' => 'No data found!', + 'close' => 'Close', + 'edit' => 'Edit', + 'copy' => 'Copy', + 'copied' => 'Copied!', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', + 'forms' => [ + 'editor' => [ + 'write' => 'Write', + 'preview' => 'Preview', + 'help' => 'Powered by markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Press to select', + 'loadingText' => 'Loading…', + 'noResultsText' => 'No results found', + 'noChoicesText' => 'No choices to choose from', + 'maxItemText' => 'Cannot add more items', + ], + 'upload_file' => 'Upload a file', + 'remote_url' => 'Remote URL', + 'save' => 'Save', + ], + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'size_limit' => 'Size limit: {0}.', + 'choose_interact' => 'Choose how to interact', + 'view' => 'View', +]; diff --git a/modules/Admin/Language/eu/Countries.php b/modules/Admin/Language/eu/Countries.php new file mode 100644 index 00000000..4cd5d9c8 --- /dev/null +++ b/modules/Admin/Language/eu/Countries.php @@ -0,0 +1,264 @@ + 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia, Plurinational State of', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, the Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => "Côte d'Ivoire", + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cape Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia, Federated States of', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran, Islamic Republic of', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao People's Democratic Republic", + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'N/A' => 'Not Applicable (local IP…)', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Swaziland', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See (Vatican City State)', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/eu/Dashboard.php b/modules/Admin/Language/eu/Dashboard.php new file mode 100644 index 00000000..881073fd --- /dev/null +++ b/modules/Admin/Language/eu/Dashboard.php @@ -0,0 +1,28 @@ + 'Admin dashboard', + 'welcome_message' => 'Welcome to the admin area!', + 'podcasts' => [ + 'title' => 'Podcasts', + 'not_found' => 'No published podcast', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'episodes' => [ + 'title' => 'Episodes', + 'not_found' => 'No published episode', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'storage' => [ + 'title' => 'Storage', + 'subtitle' => '{totalUploaded} out of {totalStorage}', + ], +]; diff --git a/modules/Admin/Language/eu/Episode.php b/modules/Admin/Language/eu/Episode.php new file mode 100644 index 00000000..4fa846e3 --- /dev/null +++ b/modules/Admin/Language/eu/Episode.php @@ -0,0 +1,225 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'edit' => 'Edit', + 'preview' => 'Preview', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'publish_date_edit' => 'Edit publication date', + 'unpublish' => 'Unpublish', + 'publish_error' => 'Episode is already published.', + 'publish_edit_error' => 'Episode is already published.', + 'publish_cancel_error' => 'Episode is already published.', + 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', + 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', + 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'unpublish_error' => 'Episode is not published.', + 'delete' => 'Delete', + 'go_to_page' => 'Go to page', + 'create' => 'Add an episode', + 'publication_status' => [ + 'published' => 'Published', + 'with_podcast' => 'Published', + 'scheduled' => 'Scheduled', + 'not_published' => 'Not published', + ], + 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Search for an episode', + 'clear' => 'Clear search', + 'submit' => 'Search', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# episode} + other {# episodes} + }', + 'episode' => 'Episode', + 'visibility' => 'Visibility', + 'downloads' => 'Downloads', + 'comments' => 'Comments', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'Episode has been successfully created!', + 'editSuccess' => 'Episode has been successfully updated!', + 'publishSuccess' => '{publication_status, select, + published {Episode successfully published!} + scheduled {Episode publication successfully scheduled!} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not published.} + }', + 'publishCancelSuccess' => 'Episode publication successfully cancelled!', + 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', + 'scheduleDateError' => 'Schedule date must be set!', + 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'deleteSuccess' => 'Episode successfully deleted!', + 'deleteError' => 'Failed to delete episode {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', + 'sameSlugError' => 'An episode with the chosen slug already exists.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt or .vtt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt or .vtt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapters', + 'chapters_hint' => 'File must be in JSON Chapters format.', + 'chapters_download' => 'Download chapters', + 'chapters_file' => 'Chapters file', + 'chapters_remote_url' => 'Remote url for chapters file', + 'chapters_file_delete' => 'Delete chapters file', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the episode', + 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', + 'block' => 'Episode should be hidden from public catalogues', + 'block_hint' => + 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'submit_create' => 'Create episode', + 'submit_edit' => 'Save episode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Back to episode dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + 'with_podcast' => 'Publish alongside podcast', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', + 'message_warning_submit' => 'Publish anyways', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'New publication date', + 'new_publication_date_hint' => 'Must be set to a past date.', + 'submit' => 'Edit publication date', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + 'understand' => 'I understand, I want to delete the episode', + 'submit' => 'Delete', + ], + 'embed' => [ + 'title' => 'Embeddable player', + 'label' => + 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', + 'clipboard_iframe' => 'Copy embeddable player to clipboard', + 'clipboard_url' => 'Copy address to clipboard', + 'dark' => 'Dark', + 'dark-transparent' => 'Dark transparent', + 'light' => 'Light', + 'light-transparent' => 'Light transparent', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], +]; diff --git a/modules/Admin/Language/eu/EpisodeNavigation.php b/modules/Admin/Language/eu/EpisodeNavigation.php new file mode 100644 index 00000000..1406e301 --- /dev/null +++ b/modules/Admin/Language/eu/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'View episode page', + 'dashboard' => 'Episode dashboard', + 'episode-view' => 'Home', + 'episode-edit' => 'Edit episode', + 'episode-persons-manage' => 'Manage persons', + 'embed-add' => 'Embeddable player', + 'clips' => 'Clips', + 'video-clips-list' => 'Video clips', + 'video-clips-create' => 'New video clip', + 'soundbites-list' => 'Soundbites', + 'soundbites-create' => 'New soundbite', +]; diff --git a/modules/Admin/Language/eu/Fediverse.php b/modules/Admin/Language/eu/Fediverse.php new file mode 100644 index 00000000..0e4ca66d --- /dev/null +++ b/modules/Admin/Language/eu/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'The account could not be found!', + 'blockActorSuccess' => '{actor} has been blocked!', + 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockDomainSuccess' => '{domain} has been blocked!', + 'unblockDomainSuccess' => '{domain} has been unblocked!', + ], + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/modules/Admin/Language/eu/Home.php b/modules/Admin/Language/eu/Home.php new file mode 100644 index 00000000..3ff4c04d --- /dev/null +++ b/modules/Admin/Language/eu/Home.php @@ -0,0 +1,14 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found', +]; diff --git a/modules/Admin/Language/eu/Install.php b/modules/Admin/Language/eu/Install.php new file mode 100644 index 00000000..36e373a2 --- /dev/null +++ b/modules/Admin/Language/eu/Install.php @@ -0,0 +1,61 @@ + 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Admin/Language/eu/Navigation.php b/modules/Admin/Language/eu/Navigation.php new file mode 100644 index 00000000..f3ffb129 --- /dev/null +++ b/modules/Admin/Language/eu/Navigation.php @@ -0,0 +1,44 @@ + 'Toggle sidebar', + 'go_to_website' => 'Go to website', + 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', + 'dashboard' => 'Dashboard', + 'admin' => 'Home', + 'podcasts' => 'Podcasts', + 'podcast-list' => 'All podcasts', + 'podcast-create' => 'New podcast', + 'all-podcast-imports' => 'All Podcast imports', + 'podcast-imports-add' => 'Import a podcast', + 'persons' => 'Persons', + 'person-list' => 'All persons', + 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', + 'users' => 'Users', + 'user-list' => 'All users', + 'user-create' => 'New user', + 'pages' => 'Pages', + 'page-list' => 'All pages', + 'page-create' => 'New Page', + 'settings' => 'Settings', + 'settings-general' => 'General', + 'settings-theme' => 'Theme', + 'admin-about' => 'About', + 'account' => [ + 'my-account' => 'My account', + 'change-password' => 'Change password', + 'logout' => 'Logout', + ], +]; diff --git a/modules/Admin/Language/eu/Notifications.php b/modules/Admin/Language/eu/Notifications.php new file mode 100644 index 00000000..2b139d51 --- /dev/null +++ b/modules/Admin/Language/eu/Notifications.php @@ -0,0 +1,19 @@ + 'Notifications', + 'reply' => '{actor_username} replied to your post', + 'favourite' => '{actor_username} favourited your post', + 'reblog' => '{actor_username} shared your post', + 'follow' => '{actor_username} started following you', + 'no_notifications' => 'No notifications', + 'mark_all_as_read' => 'Mark all as read', +]; diff --git a/modules/Admin/Language/eu/Page.php b/modules/Admin/Language/eu/Page.php new file mode 100644 index 00000000..b6f49de5 --- /dev/null +++ b/modules/Admin/Language/eu/Page.php @@ -0,0 +1,30 @@ + 'Back to home', + 'page' => 'Page', + 'all_pages' => 'All pages', + 'create' => 'New page', + 'go_to_page' => 'Go to page', + 'edit' => 'Edit page', + 'delete' => 'Delete page', + 'form' => [ + 'title' => 'Title', + 'permalink' => 'Permalink', + 'content' => 'Content', + 'submit_create' => 'Create page', + 'submit_edit' => 'Save', + ], + 'messages' => [ + 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'editSuccess' => 'The page was successfully updated!', + ], +]; diff --git a/modules/Admin/Language/eu/Pager.php b/modules/Admin/Language/eu/Pager.php new file mode 100644 index 00000000..e25ee638 --- /dev/null +++ b/modules/Admin/Language/eu/Pager.php @@ -0,0 +1,21 @@ + 'Page navigation', + 'first' => 'First', + 'previous' => 'Previous', + 'next' => 'Next', + 'last' => 'Last', + 'older' => 'Older', + 'newer' => 'Newer', + 'invalidTemplate' => '{0} is not a valid Pager template.', + 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', +]; diff --git a/modules/Admin/Language/eu/Person.php b/modules/Admin/Language/eu/Person.php new file mode 100644 index 00000000..a652be9f --- /dev/null +++ b/modules/Admin/Language/eu/Person.php @@ -0,0 +1,65 @@ + 'Persons', + 'all_persons' => 'All persons', + 'no_person' => 'Nobody found!', + 'create' => 'Create a person', + 'view' => 'View person', + 'edit' => 'Edit person', + 'delete' => 'Delete person', + 'messages' => [ + 'createSuccess' => 'Person has been successfully created!', + 'editSuccess' => 'Person has been successfully updated!', + 'deleteSuccess' => 'Person has been removed!', + ], + 'form' => [ + 'avatar' => 'Avatar', + 'avatar_size_hint' => + 'Avatar must be squared and at least 400px wide and tall.', + 'full_name' => 'Full name', + 'full_name_hint' => 'This is the full name or alias of the person.', + 'unique_name' => 'Unique name', + 'unique_name_hint' => 'Used for URLs', + 'information_url' => 'Information URL', + 'information_url_hint' => + 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', + 'submit_create' => 'Create person', + 'submit_edit' => 'Save person', + ], + 'podcast_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this podcast', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'episode_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this episode', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'credits' => 'Credits', +]; diff --git a/modules/Admin/Language/eu/Platforms.php b/modules/Admin/Language/eu/Platforms.php new file mode 100644 index 00000000..e161181c --- /dev/null +++ b/modules/Admin/Language/eu/Platforms.php @@ -0,0 +1,43 @@ + [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', + 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', + 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', + 'visible' => 'Display in podcast homepage?', + 'on_embed' => 'Display on embeddable player?', + 'remove' => 'Remove {platformName}', + 'submit' => 'Save', + 'messages' => [ + 'updateSuccess' => 'Platform links have been successfully updated!', + 'removeLinkSuccess' => 'The platform link has been removed.', + 'removeLinkError' => + 'The platform link could not be removed. Try again.', + ], + 'description' => [ + 'podcasting' => 'The podcast ID on this platform', + 'social' => 'The podcast account ID on this platform', + 'funding' => 'Call to action message', + ], +]; diff --git a/modules/Admin/Language/eu/Podcast.php b/modules/Admin/Language/eu/Podcast.php new file mode 100644 index 00000000..d02b6cf4 --- /dev/null +++ b/modules/Admin/Language/eu/Podcast.php @@ -0,0 +1,327 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found!', + 'create' => 'Create podcast', + 'import' => 'Import podcast', + 'all_imports' => 'Podcast imports', + 'new_episode' => 'New Episode', + 'view' => 'View podcast', + 'edit' => 'Edit podcast', + 'publish' => 'Publish podcast', + 'publish_edit' => 'Edit publication', + 'delete' => 'Delete podcast', + 'see_episodes' => 'See episodes', + 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', + 'go_to_page' => 'Go to page', + 'latest_episodes' => 'Latest episodes', + 'see_all_episodes' => 'See all episodes', + 'draft' => 'Draft', + 'messages' => [ + 'createSuccess' => 'Podcast successfully created!', + 'editSuccess' => 'Podcast has been successfully updated!', + 'importSuccess' => 'Podcast has been successfully imported!', + 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, + cover {cover} + banner {banner} + other {media} + }.', + 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, + one {# episode was} + other {# episodes were} + } added to the podcast!', + 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'publishError' => 'This podcast is either already published or scheduled for publication.', + 'publishEditError' => 'This podcast is not scheduled for publication.', + 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', + 'scheduleDateError' => 'Schedule date must be set!', + ], + 'form' => [ + 'identity_section_title' => 'Podcast identity', + 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + + 'cover' => 'Podcast cover', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'banner' => 'Podcast banner', + 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_delete' => 'Delete podcast banner', + 'title' => 'Title', + 'handle' => 'Handle', + 'handle_hint' => + 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'type' => [ + 'label' => 'Type', + 'episodic' => 'Episodic', + 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', + 'serial' => 'Serial', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. Episodes will be presented in numeric order.', + ], + 'medium' => [ + 'label' => 'Medium', + 'hint' => 'Medium as represented by podcast:medium tag in RSS. Changing this may change how players present your feed.', + 'podcast' => 'Podcast', + 'podcast_hint' => 'Describes a feed for a podcast show.', + 'music' => 'Music', + 'music_hint' => 'A feed of music organized into an "album" with each item a song within the album.', + 'audiobook' => 'Audiobook', + 'audiobook_hint' => 'Specific types of audio with one item per feed, or where items represent chapters within the book.', + ], + 'description' => 'Description', + 'classification_section_title' => 'Classification', + 'classification_section_subtitle' => + 'These fields will impact your audience and competition.', + 'language' => 'Language', + 'category' => 'Category', + 'category_placeholder' => 'Select a category…', + 'other_categories' => 'Other categories', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does it contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'author_section_title' => 'Author', + 'author_section_subtitle' => 'Who is managing the podcast?', + 'owner_name' => 'Owner name', + 'owner_name_hint' => + 'For administrative use only. Visible in the public RSS feed.', + 'owner_email' => 'Owner email', + 'owner_email_hint' => + 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', + 'publisher' => 'Publisher', + 'publisher_hint' => + 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'copyright' => 'Copyright', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this podcast about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real place or fictional', + 'monetization_section_title' => 'Monetization', + 'monetization_section_subtitle' => + 'Earn money thanks to your audience.', + 'premium' => 'Premium', + 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', + 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_enable' => 'Enable OP3 analytics service', + 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'payment_pointer_hint' => + 'This is your where you will receive money thanks to Web Monetization', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the podcast', + 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'new_feed_url' => 'New feed URL', + 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', + 'old_feed_url' => 'Old feed URL', + 'partnership' => 'Partnership', + 'partner_id' => 'ID', + 'partner_link_url' => 'Link URL', + 'partner_image_url' => 'Image URL', + 'partner_id_hint' => 'Your own partner ID', + 'partner_link_url_hint' => 'The generic partner link address', + 'partner_image_url_hint' => 'The generic partner image address', + 'block' => 'Podcast should be hidden from public catalogues', + 'block_hint' => + 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'complete' => 'Podcast will not be having new episodes', + 'lock' => 'Prevent podcast from being copied', + 'lock_hint' => + 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', + 'submit_create' => 'Create podcast', + 'submit_edit' => 'Save podcast', + ], + 'category_options' => [ + 'uncategorized' => 'uncategorized', + 'arts' => 'Arts', + 'business' => 'Business', + 'comedy' => 'Comedy', + 'education' => 'Education', + 'fiction' => 'Fiction', + 'government' => 'Government', + 'health_and_fitness' => 'Health & Fitness', + 'history' => 'History', + 'kids_and_family' => 'Kids & Family', + 'leisure' => 'Leisure', + 'music' => 'Music', + 'news' => 'News', + 'religion_and_spirituality' => 'Religion & Spirituality', + 'science' => 'Science', + 'society_and_culture' => 'Society & Culture', + 'sports' => 'Sports', + 'technology' => 'Technology', + 'true_crime' => 'True Crime', + 'tv_and_film' => 'TV & Film', + 'books' => 'Books', + 'design' => 'Design', + 'fashion_and_beauty' => 'Fashion & Beauty', + 'food' => 'Food', + 'performing_arts' => 'Performing Arts', + 'visual_arts' => 'Visual Arts', + 'careers' => 'Careers', + 'entrepreneurship' => 'Entrepreneurship', + 'investing' => 'Investing', + 'management' => 'Management', + 'marketing' => 'Marketing', + 'non_profit' => 'Non-Profit', + 'comedy_interviews' => 'Comedy Interviews', + 'improv' => 'Improv', + 'stand_up' => 'Stand-Up', + 'courses' => 'Courses', + 'how_to' => 'How To', + 'language_learning' => 'Language Learning', + 'self_improvement' => 'Self-Improvement', + 'comedy_fiction' => 'Comedy Fiction', + 'drama' => 'Drama', + 'science_fiction' => 'Science Fiction', + 'alternative_health' => 'Alternative Health', + 'fitness' => 'Fitness', + 'medicine' => 'Medicine', + 'mental_health' => 'Mental Health', + 'nutrition' => 'Nutrition', + 'sexuality' => 'Sexuality', + 'education_for_kids' => 'Education for Kids', + 'parenting' => 'Parenting', + 'pets_and_animals' => 'Pets & Animals', + 'stories_for_kids' => 'Stories for Kids', + 'animation_and_manga' => 'Animation & Manga', + 'automotive' => 'Automotive', + 'aviation' => 'Aviation', + 'crafts' => 'Crafts', + 'games' => 'Games', + 'hobbies' => 'Hobbies', + 'home_and_garden' => 'Home & Garden', + 'video_games' => 'Video Games', + 'music_commentary' => 'Music Commentary', + 'music_history' => 'Music History', + 'music_interviews' => 'Music Interviews', + 'business_news' => 'Business News', + 'daily_news' => 'Daily News', + 'entertainment_news' => 'Entertainment News', + 'news_commentary' => 'News Commentary', + 'politics' => 'Politics', + 'sports_news' => 'Sports News', + 'tech_news' => 'Tech News', + 'buddhism' => 'Buddhism', + 'christianity' => 'Christianity', + 'hinduism' => 'Hinduism', + 'islam' => 'Islam', + 'judaism' => 'Judaism', + 'religion' => 'Religion', + 'spirituality' => 'Spirituality', + 'astronomy' => 'Astronomy', + 'chemistry' => 'Chemistry', + 'earth_sciences' => 'Earth Sciences', + 'life_sciences' => 'Life Sciences', + 'mathematics' => 'Mathematics', + 'natural_sciences' => 'Natural Sciences', + 'nature' => 'Nature', + 'physics' => 'Physics', + 'social_sciences' => 'Social Sciences', + 'documentary' => 'Documentary', + 'personal_journals' => 'Personal Journals', + 'philosophy' => 'Philosophy', + 'places_and_travel' => 'Places & Travel', + 'relationships' => 'Relationships', + 'baseball' => 'Baseball', + 'basketball' => 'Basketball', + 'cricket' => 'Cricket', + 'fantasy_sports' => 'Fantasy Sports', + 'football' => 'Football', + 'golf' => 'Golf', + 'hockey' => 'Hockey', + 'rugby' => 'Rugby', + 'running' => 'Running', + 'soccer' => 'Soccer', + 'swimming' => 'Swimming', + 'tennis' => 'Tennis', + 'volleyball' => 'Volleyball', + 'wilderness' => 'Wilderness', + 'wrestling' => 'Wrestling', + 'after_shows' => 'After Shows', + 'film_history' => 'Film History', + 'film_interviews' => 'Film Interviews', + 'film_reviews' => 'Film Reviews', + 'tv_reviews' => 'TV Reviews', + ], + 'publish_form' => [ + 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'submit' => 'Publish', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', + 'message_warning_submit' => 'Publish anyway', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'not_published' => 'This podcast is not yet published.', + 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", + 'understand' => 'I understand, I want the podcast to be permanently deleted', + 'submit' => 'Delete', + ], + 'by' => 'By {publisher}', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', +]; diff --git a/modules/Admin/Language/eu/PodcastNavigation.php b/modules/Admin/Language/eu/PodcastNavigation.php new file mode 100644 index 00000000..bb777707 --- /dev/null +++ b/modules/Admin/Language/eu/PodcastNavigation.php @@ -0,0 +1,42 @@ + 'Go to podcast page', + 'rss_feed' => 'RSS feed', + 'dashboard' => 'Podcast dashboard', + 'podcast-view' => 'Home', + 'podcast-edit' => 'Edit podcast', + 'podcast-persons-manage' => 'Manage persons', + 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', + 'episodes' => 'Episodes', + 'episode-list' => 'All episodes', + 'episode-create' => 'New episode', + 'analytics' => 'Analytics', + 'podcast-analytics' => 'Audience overview', + 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-players' => 'Players', + 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-time-periods' => 'Time periods', + 'monetization' => 'Monetization', + 'subscription-list' => 'All subscriptions', + 'subscription-create' => 'Add subscription', + 'contributors' => 'Contributors', + 'contributor-list' => 'All contributors', + 'contributor-add' => 'Add contributor', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', + 'platforms-social' => 'Social networks', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', +]; diff --git a/modules/Admin/Language/eu/Settings.php b/modules/Admin/Language/eu/Settings.php new file mode 100644 index 00000000..4a70dcba --- /dev/null +++ b/modules/Admin/Language/eu/Settings.php @@ -0,0 +1,58 @@ + 'General settings', + 'instance' => [ + 'title' => 'Instance', + 'site_icon' => 'Site icon', + 'site_icon_delete' => 'Delete site icon', + 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_name' => 'Site name', + 'site_description' => 'Site description', + 'submit' => 'Save', + 'editSuccess' => 'Instance has been updated successfully!', + 'deleteIconSuccess' => 'Site icon has been remove successfully!', + ], + 'images' => [ + 'title' => 'Images', + 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'regenerate' => 'Regenerate images', + 'regenerationSuccess' => 'All images have been regenerated successfully!', + ], + 'housekeeping' => [ + 'title' => 'Housekeeping', + 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', + 'reset_counts' => 'Reset counts', + 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', + 'rewrite_media' => 'Rewrite media metadata', + 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', + 'rename_episodes_files' => 'Rename episode audio files', + 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'clear_cache' => 'Clear all cache', + 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'run' => 'Run housekeeping', + 'runSuccess' => 'Housekeeping has been run successfully!', + ], + 'theme' => [ + 'title' => 'Theme', + 'accent_section_title' => 'Accent color', + 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', + 'pine' => 'Pine', + 'crimson' => 'Crimson', + 'amber' => 'Amber', + 'lake' => 'Lake', + 'jacaranda' => 'Jacaranda', + 'onyx' => 'Onyx', + 'submit' => 'Save', + 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + ], +]; diff --git a/modules/Admin/Language/eu/Soundbite.php b/modules/Admin/Language/eu/Soundbite.php new file mode 100644 index 00000000..a3f828fe --- /dev/null +++ b/modules/Admin/Language/eu/Soundbite.php @@ -0,0 +1,31 @@ + [ + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', + ], + 'messages' => [ + 'createSuccess' => 'Soundbite has been successfully created!', + 'deleteSuccess' => 'Soundbite has been successfully removed!', + ], + 'form' => [ + 'title' => 'New soundbite', + 'soundbite_title' => 'Soundbite title', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'submit' => 'Create soundbite', + ], + 'play' => 'Play soundbite', + 'stop' => 'Stop soundbite', + 'create' => 'New soundbite', + 'delete' => 'Delete soundbite', +]; diff --git a/modules/Admin/Language/eu/Validation.php b/modules/Admin/Language/eu/Validation.php new file mode 100644 index 00000000..f76c3163 --- /dev/null +++ b/modules/Admin/Language/eu/Validation.php @@ -0,0 +1,17 @@ + + '{field} is either not an image, or it is not wide or tall enough.', + 'is_image_ratio' => + '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', +]; diff --git a/modules/Admin/Language/eu/VideoClip.php b/modules/Admin/Language/eu/VideoClip.php new file mode 100644 index 00000000..638de697 --- /dev/null +++ b/modules/Admin/Language/eu/VideoClip.php @@ -0,0 +1,72 @@ + [ + 'title' => 'Video clips', + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Clip is waiting to be processed.', + 'pending' => 'pending', + 'pending_hint' => 'Clip will be generated shortly.', + 'running' => 'running', + 'running_hint' => 'Clip is being generated.', + 'failed' => 'failed', + 'failed_hint' => 'Clip could not be generated: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Clip was generated successfully!', + ], + 'clip' => 'Clip', + 'duration' => 'Job duration', + ], + 'title' => 'Video clip: {videoClipLabel}', + 'download_clip' => 'Download clip', + 'create' => 'New video clip', + 'go_to_page' => 'Go to clip page', + 'retry' => 'Retry clip generation', + 'delete' => 'Delete clip', + 'logs' => 'Job logs', + 'messages' => [ + 'alreadyExistingError' => 'The video clip you are trying to create already exists!', + 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', + 'deleteSuccess' => 'Video clip has been successfully removed!', + ], + 'format' => [ + 'landscape' => 'Landscape', + 'portrait' => 'Portrait', + 'squared' => 'Squared', + ], + 'form' => [ + 'title' => 'New video clip', + 'params_section_title' => 'Video clip parameters', + 'clip_title' => 'Clip title', + 'format' => [ + 'label' => 'Choose a format', + 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', + 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', + 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + ], + 'theme' => 'Select a theme', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'trim_start' => 'Trim start', + 'trim_end' => 'Trim end', + 'submit' => 'Create video clip', + ], + 'requirements' => [ + 'title' => 'Missing requirements', + 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'ffmpeg' => 'FFmpeg', + 'gd' => 'Graphics Draw (GD)', + 'freetype' => 'Freetype library for GD', + 'transcript' => 'Transcript file (.srt)', + ], +]; diff --git a/modules/Admin/Language/ja/AboutCastopod.php b/modules/Admin/Language/ja/AboutCastopod.php index 3fb62aff..16c3c2b2 100644 --- a/modules/Admin/Language/ja/AboutCastopod.php +++ b/modules/Admin/Language/ja/AboutCastopod.php @@ -9,14 +9,14 @@ declare(strict_types=1); */ return [ - 'title' => 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', + 'title' => 'Castopodについて', + 'host_name' => 'ホスト名', + 'version' => 'Castopodバージョン', + 'php_version' => 'PHPバージョン', + 'os' => '(OS) オペレーティング システム', + 'languages' => '言語', + 'update_database' => 'データベースを更新', 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', + 'databaseUpdateSuccess' => 'データベースは最新です', ], ]; diff --git a/modules/Admin/Language/pt-BR/Podcast.php b/modules/Admin/Language/pt-BR/Podcast.php index 496313c3..67e889d6 100644 --- a/modules/Admin/Language/pt-BR/Podcast.php +++ b/modules/Admin/Language/pt-BR/Podcast.php @@ -74,7 +74,7 @@ return [ 'episodic' => 'Episódico', 'episodic_hint' => 'Se os episódios são destinados a serem consumidos sem qualquer ordem específica. Os episódios mais recentes serão apresentados primeiro.', 'serial' => 'Serial', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. Episodes will be presented in numeric order.', + 'serial_hint' => 'Se a intenção é que os episódios sejam consumidos em uma ordem sequencial. Episódios vão ser apresentados em uma ordem numérica.', ], 'medium' => [ 'label' => 'Medium', diff --git a/modules/Admin/Language/zh-Hant/AboutCastopod.php b/modules/Admin/Language/zh-Hant/AboutCastopod.php new file mode 100644 index 00000000..3fb62aff --- /dev/null +++ b/modules/Admin/Language/zh-Hant/AboutCastopod.php @@ -0,0 +1,22 @@ + 'About Castopod', + 'host_name' => 'Host name', + 'version' => 'Castopod version', + 'php_version' => 'PHP version', + 'os' => 'Operating System', + 'languages' => 'Languages', + 'update_database' => 'Update database', + 'messages' => [ + 'databaseUpdateSuccess' => 'Database is up to date!', + ], +]; diff --git a/modules/Admin/Language/zh-Hant/Breadcrumb.php b/modules/Admin/Language/zh-Hant/Breadcrumb.php new file mode 100644 index 00000000..6a678d4e --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Breadcrumb.php @@ -0,0 +1,59 @@ + 'breadcrumb', + config(Admin::class) + ->gateway => 'Home', + 'podcasts' => 'podcasts', + 'episodes' => 'episodes', + 'subscriptions' => 'subscriptions', + 'contributors' => 'contributors', + 'pages' => 'pages', + 'settings' => 'settings', + 'theme' => 'theme', + 'about' => 'about', + 'add' => 'add', + 'new' => 'new', + 'edit' => 'edit', + 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'publish-date-edit' => 'edit publication date', + 'unpublish' => 'unpublish', + 'delete' => 'delete', + 'remove' => 'remove', + 'fediverse' => 'fediverse', + 'blocked-actors' => 'blocked actors', + 'blocked-domains' => 'blocked domains', + 'users' => 'users', + 'my-account' => 'my account', + 'change-password' => 'change password', + 'imports' => 'imports', + 'sync-feeds' => 'synchronize feeds', + 'platforms' => 'platforms', + 'social' => 'social networks', + 'funding' => 'funding', + 'monetization-other' => 'other monetization', + 'analytics' => 'analytics', + 'locations' => 'locations', + 'webpages' => 'web pages', + 'unique-listeners' => 'unique listeners', + 'players' => 'players', + 'listening-time' => 'listening time', + 'time-periods' => 'time periods', + 'soundbites' => 'soundbites', + 'video-clips' => 'video clips', + 'embed' => 'embeddable player', + 'notifications' => 'notifications', + 'suspend' => 'suspend', +]; diff --git a/modules/Admin/Language/zh-Hant/Charts.php b/modules/Admin/Language/zh-Hant/Charts.php new file mode 100644 index 00000000..6ede2510 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Charts.php @@ -0,0 +1,41 @@ + 'Episode downloads by service (for the past week)', + 'by_player_weekly' => 'Episode downloads by player (for the past week)', + 'by_player_yearly' => 'Episode downloads by player (for the past year)', + 'by_device_weekly' => 'Episode downloads by device (for the past week)', + 'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', + 'podcast_by_region' => 'Episode downloads by region (for the past week)', + 'unique_daily_listeners' => 'Daily unique listeners', + 'unique_monthly_listeners' => 'Monthly unique listeners', + 'by_browser' => 'Web pages usage by browser (for the past week)', + 'podcast_by_day' => 'Episode daily downloads', + 'podcast_by_month' => 'Episode monthly downloads', + 'episode_by_day' => 'Episode daily downloads (first 60 days)', + 'episode_by_month' => 'Episode monthly downloads', + 'episodes_by_day' => + '5 latest episodes downloads (during their first 60 days)', + 'by_country_weekly' => 'Episode downloads by country (for the past week)', + 'by_country_yearly' => 'Episode downloads by country (for the past year)', + 'by_domain_weekly' => 'Web pages visits by source (for the past week)', + 'by_domain_yearly' => 'Web pages visits by source (for the past year)', + 'by_entry_page' => 'Web pages visits by landing page (for the past week)', + 'podcast_bots' => 'Bots (crawlers)', + 'daily_listening_time' => 'Daily cumulative listening time', + 'monthly_listening_time' => 'Monthly cumulative listening time', + 'by_weekday' => 'By week day (for the past 60 days)', + 'by_hour' => 'By time of day (for the past 60 days)', + 'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', + 'total_storage_by_month' => 'Monthly storage (in MB)', + 'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', + 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', +]; diff --git a/modules/Admin/Language/zh-Hant/Common.php b/modules/Admin/Language/zh-Hant/Common.php new file mode 100644 index 00000000..74addcf2 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Common.php @@ -0,0 +1,52 @@ + 'Yes', + 'no' => 'No', + 'cancel' => 'Cancel', + 'optional' => 'Optional', + 'more' => 'More', + 'no_data' => 'No data found!', + 'close' => 'Close', + 'edit' => 'Edit', + 'copy' => 'Copy', + 'copied' => 'Copied!', + 'home' => 'Home', + 'explicit' => 'Explicit', + 'powered_by' => 'Powered by {castopod}', + 'actions' => 'Actions', + 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', + 'forms' => [ + 'editor' => [ + 'write' => 'Write', + 'preview' => 'Preview', + 'help' => 'Powered by markdown', + ], + 'multiSelect' => [ + 'selectText' => 'Press to select', + 'loadingText' => 'Loading…', + 'noResultsText' => 'No results found', + 'noChoicesText' => 'No choices to choose from', + 'maxItemText' => 'Cannot add more items', + ], + 'upload_file' => 'Upload a file', + 'remote_url' => 'Remote URL', + 'save' => 'Save', + ], + 'play_episode_button' => [ + 'play' => 'Play', + 'playing' => 'Playing', + ], + 'size_limit' => 'Size limit: {0}.', + 'choose_interact' => 'Choose how to interact', + 'view' => 'View', +]; diff --git a/modules/Admin/Language/zh-Hant/Countries.php b/modules/Admin/Language/zh-Hant/Countries.php new file mode 100644 index 00000000..4cd5d9c8 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Countries.php @@ -0,0 +1,264 @@ + 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia, Plurinational State of', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, the Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => "Côte d'Ivoire", + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cape Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia, Federated States of', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran, Islamic Republic of', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => "Korea, Democratic People's Republic of", + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => "Lao People's Democratic Republic", + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the Former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'N/A' => 'Not Applicable (local IP…)', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Swaziland', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See (Vatican City State)', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela, Bolivarian Republic of', + 'VG' => 'Virgin Islands, British', + 'VI' => 'Virgin Islands, U.S.', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/modules/Admin/Language/zh-Hant/Dashboard.php b/modules/Admin/Language/zh-Hant/Dashboard.php new file mode 100644 index 00000000..881073fd --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Dashboard.php @@ -0,0 +1,28 @@ + 'Admin dashboard', + 'welcome_message' => 'Welcome to the admin area!', + 'podcasts' => [ + 'title' => 'Podcasts', + 'not_found' => 'No published podcast', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'episodes' => [ + 'title' => 'Episodes', + 'not_found' => 'No published episode', + 'last_published' => 'Last published on {lastPublicationDate}', + ], + 'storage' => [ + 'title' => 'Storage', + 'subtitle' => '{totalUploaded} out of {totalStorage}', + ], +]; diff --git a/modules/Admin/Language/zh-Hant/Episode.php b/modules/Admin/Language/zh-Hant/Episode.php new file mode 100644 index 00000000..4fa846e3 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Episode.php @@ -0,0 +1,225 @@ + 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', + 'number' => 'Episode {episodeNumber}', + 'number_abbr' => 'Ep. {episodeNumber}', + 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', + 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'number_of_comments' => '{numberOfComments, plural, + one {# comment} + other {# comments} + }', + 'all_podcast_episodes' => 'All podcast episodes', + 'back_to_podcast' => 'Go back to podcast', + 'edit' => 'Edit', + 'preview' => 'Preview', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'publish_date_edit' => 'Edit publication date', + 'unpublish' => 'Unpublish', + 'publish_error' => 'Episode is already published.', + 'publish_edit_error' => 'Episode is already published.', + 'publish_cancel_error' => 'Episode is already published.', + 'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', + 'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', + 'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', + 'unpublish_error' => 'Episode is not published.', + 'delete' => 'Delete', + 'go_to_page' => 'Go to page', + 'create' => 'Add an episode', + 'publication_status' => [ + 'published' => 'Published', + 'with_podcast' => 'Published', + 'scheduled' => 'Scheduled', + 'not_published' => 'Not published', + ], + 'with_podcast_hint' => 'To be published at the same time as the podcast', + 'list' => [ + 'search' => [ + 'placeholder' => 'Search for an episode', + 'clear' => 'Clear search', + 'submit' => 'Search', + ], + 'number_of_episodes' => '{numberOfEpisodes, plural, + one {# episode} + other {# episodes} + }', + 'episode' => 'Episode', + 'visibility' => 'Visibility', + 'downloads' => 'Downloads', + 'comments' => 'Comments', + 'actions' => 'Actions', + ], + 'messages' => [ + 'createSuccess' => 'Episode has been successfully created!', + 'editSuccess' => 'Episode has been successfully updated!', + 'publishSuccess' => '{publication_status, select, + published {Episode successfully published!} + scheduled {Episode publication successfully scheduled!} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not published.} + }', + 'publishCancelSuccess' => 'Episode publication successfully cancelled!', + 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', + 'scheduleDateError' => 'Schedule date must be set!', + 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', + 'deleteSuccess' => 'Episode successfully deleted!', + 'deleteError' => 'Failed to delete episode {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deleteFileError' => 'Failed to delete {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + } file {file_key}. You may manually remove it from your disk.', + 'sameSlugError' => 'An episode with the chosen slug already exists.', + ], + 'form' => [ + 'file_size_error' => + 'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', + 'audio_file' => 'Audio file', + 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', + 'info_section_title' => 'Episode info', + 'cover' => 'Episode cover', + 'cover_hint' => + 'If you do not set a cover, the podcast cover will be used instead.', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'title' => 'Title', + 'title_hint' => + 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', + 'permalink' => 'Permalink', + 'season_number' => 'Season', + 'episode_number' => 'Episode', + 'type' => [ + 'label' => 'Type', + 'full' => 'Full', + 'full_hint' => 'Complete content (the episode)', + 'trailer' => 'Trailer', + 'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', + 'bonus' => 'Bonus', + 'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', + ], + 'premium_title' => 'Premium', + 'premium' => 'Episode must be accessible to premium subscribers only', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does the episode contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', + 'additional_files_section_title' => 'Additional files', + 'additional_files_section_subtitle' => + 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', + 'transcript' => 'Transcript (subtitles / closed captions)', + 'transcript_hint' => 'Only .srt or .vtt are allowed.', + 'transcript_download' => 'Download transcript', + 'transcript_file' => 'Transcript file (.srt or .vtt)', + 'transcript_remote_url' => 'Remote url for transcript', + 'transcript_file_delete' => 'Delete transcript file', + 'chapters' => 'Chapters', + 'chapters_hint' => 'File must be in JSON Chapters format.', + 'chapters_download' => 'Download chapters', + 'chapters_file' => 'Chapters file', + 'chapters_remote_url' => 'Remote url for chapters file', + 'chapters_file_delete' => 'Delete chapters file', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the episode', + 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', + 'block' => 'Episode should be hidden from public catalogues', + 'block_hint' => + 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'submit_create' => 'Create episode', + 'submit_edit' => 'Save episode', + ], + 'publish_form' => [ + 'back_to_episode_dashboard' => 'Back to episode dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + 'with_podcast' => 'Publish alongside podcast', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your episode.', + 'message_warning_submit' => 'Publish anyways', + ], + 'publish_date_edit_form' => [ + 'new_publication_date' => 'New publication date', + 'new_publication_date_hint' => 'Must be set to a past date.', + 'submit' => 'Edit publication date', + ], + 'unpublish_form' => [ + 'disclaimer' => + "Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", + 'understand' => 'I understand, I want to delete the episode', + 'submit' => 'Delete', + ], + 'embed' => [ + 'title' => 'Embeddable player', + 'label' => + 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', + 'clipboard_iframe' => 'Copy embeddable player to clipboard', + 'clipboard_url' => 'Copy address to clipboard', + 'dark' => 'Dark', + 'dark-transparent' => 'Dark transparent', + 'light' => 'Light', + 'light-transparent' => 'Light transparent', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'text' => '{publication_status, select, + published {This episode is not yet published.} + scheduled {This episode is scheduled for publication on {publication_date}.} + with_podcast {This episode will be published at the same time as the podcast.} + other {This episode is not yet published.} + }', + 'preview' => 'Preview', + ], +]; diff --git a/modules/Admin/Language/zh-Hant/EpisodeNavigation.php b/modules/Admin/Language/zh-Hant/EpisodeNavigation.php new file mode 100644 index 00000000..1406e301 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/EpisodeNavigation.php @@ -0,0 +1,23 @@ + 'View episode page', + 'dashboard' => 'Episode dashboard', + 'episode-view' => 'Home', + 'episode-edit' => 'Edit episode', + 'episode-persons-manage' => 'Manage persons', + 'embed-add' => 'Embeddable player', + 'clips' => 'Clips', + 'video-clips-list' => 'Video clips', + 'video-clips-create' => 'New video clip', + 'soundbites-list' => 'Soundbites', + 'soundbites-create' => 'New soundbite', +]; diff --git a/modules/Admin/Language/zh-Hant/Fediverse.php b/modules/Admin/Language/zh-Hant/Fediverse.php new file mode 100644 index 00000000..0e4ca66d --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Fediverse.php @@ -0,0 +1,32 @@ + [ + 'actorNotFound' => 'The account could not be found!', + 'blockActorSuccess' => '{actor} has been blocked!', + 'unblockActorSuccess' => 'Actor has been unblocked!', + 'blockDomainSuccess' => '{domain} has been blocked!', + 'unblockDomainSuccess' => '{domain} has been unblocked!', + ], + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/modules/Admin/Language/zh-Hant/Home.php b/modules/Admin/Language/zh-Hant/Home.php new file mode 100644 index 00000000..3ff4c04d --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Home.php @@ -0,0 +1,14 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found', +]; diff --git a/modules/Admin/Language/zh-Hant/Install.php b/modules/Admin/Language/zh-Hant/Install.php new file mode 100644 index 00000000..36e373a2 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Install.php @@ -0,0 +1,61 @@ + 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your superadmin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Admin/Language/zh-Hant/Navigation.php b/modules/Admin/Language/zh-Hant/Navigation.php new file mode 100644 index 00000000..f3ffb129 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Navigation.php @@ -0,0 +1,44 @@ + 'Toggle sidebar', + 'go_to_website' => 'Go to website', + 'go_to_admin' => 'Go to admin', + 'not-authorized' => 'Not authorized', + 'dashboard' => 'Dashboard', + 'admin' => 'Home', + 'podcasts' => 'Podcasts', + 'podcast-list' => 'All podcasts', + 'podcast-create' => 'New podcast', + 'all-podcast-imports' => 'All Podcast imports', + 'podcast-imports-add' => 'Import a podcast', + 'persons' => 'Persons', + 'person-list' => 'All persons', + 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', + 'users' => 'Users', + 'user-list' => 'All users', + 'user-create' => 'New user', + 'pages' => 'Pages', + 'page-list' => 'All pages', + 'page-create' => 'New Page', + 'settings' => 'Settings', + 'settings-general' => 'General', + 'settings-theme' => 'Theme', + 'admin-about' => 'About', + 'account' => [ + 'my-account' => 'My account', + 'change-password' => 'Change password', + 'logout' => 'Logout', + ], +]; diff --git a/modules/Admin/Language/zh-Hant/Notifications.php b/modules/Admin/Language/zh-Hant/Notifications.php new file mode 100644 index 00000000..2b139d51 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Notifications.php @@ -0,0 +1,19 @@ + 'Notifications', + 'reply' => '{actor_username} replied to your post', + 'favourite' => '{actor_username} favourited your post', + 'reblog' => '{actor_username} shared your post', + 'follow' => '{actor_username} started following you', + 'no_notifications' => 'No notifications', + 'mark_all_as_read' => 'Mark all as read', +]; diff --git a/modules/Admin/Language/zh-Hant/Page.php b/modules/Admin/Language/zh-Hant/Page.php new file mode 100644 index 00000000..b6f49de5 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Page.php @@ -0,0 +1,30 @@ + 'Back to home', + 'page' => 'Page', + 'all_pages' => 'All pages', + 'create' => 'New page', + 'go_to_page' => 'Go to page', + 'edit' => 'Edit page', + 'delete' => 'Delete page', + 'form' => [ + 'title' => 'Title', + 'permalink' => 'Permalink', + 'content' => 'Content', + 'submit_create' => 'Create page', + 'submit_edit' => 'Save', + ], + 'messages' => [ + 'createSuccess' => 'The page “{pageTitle}” was created successfully!', + 'editSuccess' => 'The page was successfully updated!', + ], +]; diff --git a/modules/Admin/Language/zh-Hant/Pager.php b/modules/Admin/Language/zh-Hant/Pager.php new file mode 100644 index 00000000..e25ee638 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Pager.php @@ -0,0 +1,21 @@ + 'Page navigation', + 'first' => 'First', + 'previous' => 'Previous', + 'next' => 'Next', + 'last' => 'Last', + 'older' => 'Older', + 'newer' => 'Newer', + 'invalidTemplate' => '{0} is not a valid Pager template.', + 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', +]; diff --git a/modules/Admin/Language/zh-Hant/Person.php b/modules/Admin/Language/zh-Hant/Person.php new file mode 100644 index 00000000..a652be9f --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Person.php @@ -0,0 +1,65 @@ + 'Persons', + 'all_persons' => 'All persons', + 'no_person' => 'Nobody found!', + 'create' => 'Create a person', + 'view' => 'View person', + 'edit' => 'Edit person', + 'delete' => 'Delete person', + 'messages' => [ + 'createSuccess' => 'Person has been successfully created!', + 'editSuccess' => 'Person has been successfully updated!', + 'deleteSuccess' => 'Person has been removed!', + ], + 'form' => [ + 'avatar' => 'Avatar', + 'avatar_size_hint' => + 'Avatar must be squared and at least 400px wide and tall.', + 'full_name' => 'Full name', + 'full_name_hint' => 'This is the full name or alias of the person.', + 'unique_name' => 'Unique name', + 'unique_name_hint' => 'Used for URLs', + 'information_url' => 'Information URL', + 'information_url_hint' => + 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', + 'submit_create' => 'Create person', + 'submit_edit' => 'Save person', + ], + 'podcast_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this podcast', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'episode_form' => [ + 'title' => 'Manage persons', + 'add_section_title' => 'Add persons to this episode', + 'add_section_subtitle' => 'You may pick several persons and roles.', + 'persons' => 'Persons', + 'persons_hint' => + 'You may select one or several persons with the same roles. You need to create the persons first.', + 'roles' => 'Roles', + 'roles_hint' => + 'You may select none, one or several roles for a person.', + 'submit_add' => 'Add person(s)', + 'remove' => 'Remove', + ], + 'credits' => 'Credits', +]; diff --git a/modules/Admin/Language/zh-Hant/Platforms.php b/modules/Admin/Language/zh-Hant/Platforms.php new file mode 100644 index 00000000..e161181c --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Platforms.php @@ -0,0 +1,43 @@ + [ + 'podcasting' => 'Podcasting platforms', + 'social' => 'Social networks', + 'funding' => 'Funding links', + ], + 'website' => 'Website', + 'home_url' => 'Go to {platformName} website', + 'register' => 'Register', + 'submit_url' => 'Submit your podcast on {platformName}', + 'your_link' => 'Your link', + 'your_id' => [ + 'podcasting' => 'Your ID', + 'social' => 'Your ID', + 'funding' => 'Your CTA', + ], + 'your_cta' => 'Your call to action', + 'visible' => 'Display in podcast homepage?', + 'on_embed' => 'Display on embeddable player?', + 'remove' => 'Remove {platformName}', + 'submit' => 'Save', + 'messages' => [ + 'updateSuccess' => 'Platform links have been successfully updated!', + 'removeLinkSuccess' => 'The platform link has been removed.', + 'removeLinkError' => + 'The platform link could not be removed. Try again.', + ], + 'description' => [ + 'podcasting' => 'The podcast ID on this platform', + 'social' => 'The podcast account ID on this platform', + 'funding' => 'Call to action message', + ], +]; diff --git a/modules/Admin/Language/zh-Hant/Podcast.php b/modules/Admin/Language/zh-Hant/Podcast.php new file mode 100644 index 00000000..d02b6cf4 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Podcast.php @@ -0,0 +1,327 @@ + 'All podcasts', + 'no_podcast' => 'No podcast found!', + 'create' => 'Create podcast', + 'import' => 'Import podcast', + 'all_imports' => 'Podcast imports', + 'new_episode' => 'New Episode', + 'view' => 'View podcast', + 'edit' => 'Edit podcast', + 'publish' => 'Publish podcast', + 'publish_edit' => 'Edit publication', + 'delete' => 'Delete podcast', + 'see_episodes' => 'See episodes', + 'see_contributors' => 'See contributors', + 'monetization_other' => 'Other monetization', + 'go_to_page' => 'Go to page', + 'latest_episodes' => 'Latest episodes', + 'see_all_episodes' => 'See all episodes', + 'draft' => 'Draft', + 'messages' => [ + 'createSuccess' => 'Podcast successfully created!', + 'editSuccess' => 'Podcast has been successfully updated!', + 'importSuccess' => 'Podcast has been successfully imported!', + 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', + 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, + cover {cover} + banner {banner} + other {media} + }.', + 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, + transcript {transcript} + chapters {chapters} + image {cover} + audio {audio} + other {media} + }.', + 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', + 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, + one {# episode was} + other {# episodes were} + } added to the podcast!', + 'podcastFeedUpToDate' => 'Podcast is already up to date.', + 'publishError' => 'This podcast is either already published or scheduled for publication.', + 'publishEditError' => 'This podcast is not scheduled for publication.', + 'publishCancelSuccess' => 'Podcast publication successfully cancelled!', + 'scheduleDateError' => 'Schedule date must be set!', + ], + 'form' => [ + 'identity_section_title' => 'Podcast identity', + 'identity_section_subtitle' => 'These fields allow you to get noticed.', + 'fediverse_section_title' => 'Fediverse identity', + + 'cover' => 'Podcast cover', + 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', + 'banner' => 'Podcast banner', + 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', + 'banner_delete' => 'Delete podcast banner', + 'title' => 'Title', + 'handle' => 'Handle', + 'handle_hint' => + 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', + 'type' => [ + 'label' => 'Type', + 'episodic' => 'Episodic', + 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', + 'serial' => 'Serial', + 'serial_hint' => 'If episodes are intended to be consumed in sequential order. Episodes will be presented in numeric order.', + ], + 'medium' => [ + 'label' => 'Medium', + 'hint' => 'Medium as represented by podcast:medium tag in RSS. Changing this may change how players present your feed.', + 'podcast' => 'Podcast', + 'podcast_hint' => 'Describes a feed for a podcast show.', + 'music' => 'Music', + 'music_hint' => 'A feed of music organized into an "album" with each item a song within the album.', + 'audiobook' => 'Audiobook', + 'audiobook_hint' => 'Specific types of audio with one item per feed, or where items represent chapters within the book.', + ], + 'description' => 'Description', + 'classification_section_title' => 'Classification', + 'classification_section_subtitle' => + 'These fields will impact your audience and competition.', + 'language' => 'Language', + 'category' => 'Category', + 'category_placeholder' => 'Select a category…', + 'other_categories' => 'Other categories', + 'parental_advisory' => [ + 'label' => 'Parental advisory', + 'hint' => 'Does it contain explicit content?', + 'undefined' => 'undefined', + 'clean' => 'Clean', + 'explicit' => 'Explicit', + ], + 'author_section_title' => 'Author', + 'author_section_subtitle' => 'Who is managing the podcast?', + 'owner_name' => 'Owner name', + 'owner_name_hint' => + 'For administrative use only. Visible in the public RSS feed.', + 'owner_email' => 'Owner email', + 'owner_email_hint' => + 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', + 'is_owner_email_removed_from_feed' => 'Remove the owner email from the public RSS feed', + 'is_owner_email_removed_from_feed_hint' => 'You may need to temporarily unhide the email so that a directory can verify your podcast ownership.', + 'publisher' => 'Publisher', + 'publisher_hint' => + 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', + 'copyright' => 'Copyright', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this podcast about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real place or fictional', + 'monetization_section_title' => 'Monetization', + 'monetization_section_subtitle' => + 'Earn money thanks to your audience.', + 'premium' => 'Premium', + 'premium_by_default' => 'Episodes must be set as premium by default', + 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', + 'op3' => 'Open Podcast Prefix Project (OP3)', + 'op3_link' => 'Visit your OP3 dashboard (external link)', + 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', + 'op3_enable' => 'Enable OP3 analytics service', + 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', + 'payment_pointer' => 'Payment Pointer for Web Monetization', + 'payment_pointer_hint' => + 'This is your where you will receive money thanks to Web Monetization', + 'advanced_section_title' => 'Advanced Parameters', + 'advanced_section_subtitle' => + 'If you need RSS tags that Castopod does not handle, set them here.', + 'custom_rss' => 'Custom RSS tags for the podcast', + 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'new_feed_url' => 'New feed URL', + 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', + 'old_feed_url' => 'Old feed URL', + 'partnership' => 'Partnership', + 'partner_id' => 'ID', + 'partner_link_url' => 'Link URL', + 'partner_image_url' => 'Image URL', + 'partner_id_hint' => 'Your own partner ID', + 'partner_link_url_hint' => 'The generic partner link address', + 'partner_image_url_hint' => 'The generic partner image address', + 'block' => 'Podcast should be hidden from public catalogues', + 'block_hint' => + 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', + 'complete' => 'Podcast will not be having new episodes', + 'lock' => 'Prevent podcast from being copied', + 'lock_hint' => + 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', + 'submit_create' => 'Create podcast', + 'submit_edit' => 'Save podcast', + ], + 'category_options' => [ + 'uncategorized' => 'uncategorized', + 'arts' => 'Arts', + 'business' => 'Business', + 'comedy' => 'Comedy', + 'education' => 'Education', + 'fiction' => 'Fiction', + 'government' => 'Government', + 'health_and_fitness' => 'Health & Fitness', + 'history' => 'History', + 'kids_and_family' => 'Kids & Family', + 'leisure' => 'Leisure', + 'music' => 'Music', + 'news' => 'News', + 'religion_and_spirituality' => 'Religion & Spirituality', + 'science' => 'Science', + 'society_and_culture' => 'Society & Culture', + 'sports' => 'Sports', + 'technology' => 'Technology', + 'true_crime' => 'True Crime', + 'tv_and_film' => 'TV & Film', + 'books' => 'Books', + 'design' => 'Design', + 'fashion_and_beauty' => 'Fashion & Beauty', + 'food' => 'Food', + 'performing_arts' => 'Performing Arts', + 'visual_arts' => 'Visual Arts', + 'careers' => 'Careers', + 'entrepreneurship' => 'Entrepreneurship', + 'investing' => 'Investing', + 'management' => 'Management', + 'marketing' => 'Marketing', + 'non_profit' => 'Non-Profit', + 'comedy_interviews' => 'Comedy Interviews', + 'improv' => 'Improv', + 'stand_up' => 'Stand-Up', + 'courses' => 'Courses', + 'how_to' => 'How To', + 'language_learning' => 'Language Learning', + 'self_improvement' => 'Self-Improvement', + 'comedy_fiction' => 'Comedy Fiction', + 'drama' => 'Drama', + 'science_fiction' => 'Science Fiction', + 'alternative_health' => 'Alternative Health', + 'fitness' => 'Fitness', + 'medicine' => 'Medicine', + 'mental_health' => 'Mental Health', + 'nutrition' => 'Nutrition', + 'sexuality' => 'Sexuality', + 'education_for_kids' => 'Education for Kids', + 'parenting' => 'Parenting', + 'pets_and_animals' => 'Pets & Animals', + 'stories_for_kids' => 'Stories for Kids', + 'animation_and_manga' => 'Animation & Manga', + 'automotive' => 'Automotive', + 'aviation' => 'Aviation', + 'crafts' => 'Crafts', + 'games' => 'Games', + 'hobbies' => 'Hobbies', + 'home_and_garden' => 'Home & Garden', + 'video_games' => 'Video Games', + 'music_commentary' => 'Music Commentary', + 'music_history' => 'Music History', + 'music_interviews' => 'Music Interviews', + 'business_news' => 'Business News', + 'daily_news' => 'Daily News', + 'entertainment_news' => 'Entertainment News', + 'news_commentary' => 'News Commentary', + 'politics' => 'Politics', + 'sports_news' => 'Sports News', + 'tech_news' => 'Tech News', + 'buddhism' => 'Buddhism', + 'christianity' => 'Christianity', + 'hinduism' => 'Hinduism', + 'islam' => 'Islam', + 'judaism' => 'Judaism', + 'religion' => 'Religion', + 'spirituality' => 'Spirituality', + 'astronomy' => 'Astronomy', + 'chemistry' => 'Chemistry', + 'earth_sciences' => 'Earth Sciences', + 'life_sciences' => 'Life Sciences', + 'mathematics' => 'Mathematics', + 'natural_sciences' => 'Natural Sciences', + 'nature' => 'Nature', + 'physics' => 'Physics', + 'social_sciences' => 'Social Sciences', + 'documentary' => 'Documentary', + 'personal_journals' => 'Personal Journals', + 'philosophy' => 'Philosophy', + 'places_and_travel' => 'Places & Travel', + 'relationships' => 'Relationships', + 'baseball' => 'Baseball', + 'basketball' => 'Basketball', + 'cricket' => 'Cricket', + 'fantasy_sports' => 'Fantasy Sports', + 'football' => 'Football', + 'golf' => 'Golf', + 'hockey' => 'Hockey', + 'rugby' => 'Rugby', + 'running' => 'Running', + 'soccer' => 'Soccer', + 'swimming' => 'Swimming', + 'tennis' => 'Tennis', + 'volleyball' => 'Volleyball', + 'wilderness' => 'Wilderness', + 'wrestling' => 'Wrestling', + 'after_shows' => 'After Shows', + 'film_history' => 'Film History', + 'film_interviews' => 'Film Interviews', + 'film_reviews' => 'Film Reviews', + 'tv_reviews' => 'TV Reviews', + ], + 'publish_form' => [ + 'back_to_podcast_dashboard' => 'Back to podcast dashboard', + 'post' => 'Your announcement post', + 'post_hint' => + "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", + 'message_placeholder' => 'Write your message…', + 'submit' => 'Publish', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit_edit' => 'Edit publication', + 'cancel_publication' => 'Cancel publication', + 'message_warning' => 'You did not write a message for your announcement post!', + 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', + 'message_warning_submit' => 'Publish anyway', + ], + 'publication_status_banner' => [ + 'draft_mode' => 'draft mode', + 'not_published' => 'This podcast is not yet published.', + 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', + ], + 'delete_form' => [ + 'disclaimer' => + "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", + 'understand' => 'I understand, I want the podcast to be permanently deleted', + 'submit' => 'Delete', + ], + 'by' => 'By {publisher}', + 'season' => 'Season {seasonNumber}', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', + 'no_episode' => 'No episode found!', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {# follower} + other {# followers} + }', + 'posts' => '{numberOfPosts, plural, + one {# post} + other {# posts} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', +]; diff --git a/modules/Admin/Language/zh-Hant/PodcastNavigation.php b/modules/Admin/Language/zh-Hant/PodcastNavigation.php new file mode 100644 index 00000000..bb777707 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/PodcastNavigation.php @@ -0,0 +1,42 @@ + 'Go to podcast page', + 'rss_feed' => 'RSS feed', + 'dashboard' => 'Podcast dashboard', + 'podcast-view' => 'Home', + 'podcast-edit' => 'Edit podcast', + 'podcast-persons-manage' => 'Manage persons', + 'podcast-imports' => 'Podcast imports', + 'podcast-imports-sync' => 'Sync feeds', + 'episodes' => 'Episodes', + 'episode-list' => 'All episodes', + 'episode-create' => 'New episode', + 'analytics' => 'Analytics', + 'podcast-analytics' => 'Audience overview', + 'podcast-analytics-webpages' => 'Web pages visits', + 'podcast-analytics-locations' => 'Locations', + 'podcast-analytics-unique-listeners' => 'Unique listeners', + 'podcast-analytics-players' => 'Players', + 'podcast-analytics-listening-time' => 'Listening time', + 'podcast-analytics-time-periods' => 'Time periods', + 'monetization' => 'Monetization', + 'subscription-list' => 'All subscriptions', + 'subscription-create' => 'Add subscription', + 'contributors' => 'Contributors', + 'contributor-list' => 'All contributors', + 'contributor-add' => 'Add contributor', + 'broadcast' => 'Broadcast', + 'platforms-podcasting' => 'Podcasting apps', + 'platforms-social' => 'Social networks', + 'platforms-funding' => 'Funding links', + 'podcast-monetization-other' => 'Other', +]; diff --git a/modules/Admin/Language/zh-Hant/Settings.php b/modules/Admin/Language/zh-Hant/Settings.php new file mode 100644 index 00000000..4a70dcba --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Settings.php @@ -0,0 +1,58 @@ + 'General settings', + 'instance' => [ + 'title' => 'Instance', + 'site_icon' => 'Site icon', + 'site_icon_delete' => 'Delete site icon', + 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', + 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', + 'site_name' => 'Site name', + 'site_description' => 'Site description', + 'submit' => 'Save', + 'editSuccess' => 'Instance has been updated successfully!', + 'deleteIconSuccess' => 'Site icon has been remove successfully!', + ], + 'images' => [ + 'title' => 'Images', + 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', + 'regenerate' => 'Regenerate images', + 'regenerationSuccess' => 'All images have been regenerated successfully!', + ], + 'housekeeping' => [ + 'title' => 'Housekeeping', + 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', + 'reset_counts' => 'Reset counts', + 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', + 'rewrite_media' => 'Rewrite media metadata', + 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', + 'rename_episodes_files' => 'Rename episode audio files', + 'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', + 'clear_cache' => 'Clear all cache', + 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', + 'run' => 'Run housekeeping', + 'runSuccess' => 'Housekeeping has been run successfully!', + ], + 'theme' => [ + 'title' => 'Theme', + 'accent_section_title' => 'Accent color', + 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', + 'pine' => 'Pine', + 'crimson' => 'Crimson', + 'amber' => 'Amber', + 'lake' => 'Lake', + 'jacaranda' => 'Jacaranda', + 'onyx' => 'Onyx', + 'submit' => 'Save', + 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', + ], +]; diff --git a/modules/Admin/Language/zh-Hant/Soundbite.php b/modules/Admin/Language/zh-Hant/Soundbite.php new file mode 100644 index 00000000..a3f828fe --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Soundbite.php @@ -0,0 +1,31 @@ + [ + 'title' => 'Soundbites', + 'soundbite' => 'Soundbite', + ], + 'messages' => [ + 'createSuccess' => 'Soundbite has been successfully created!', + 'deleteSuccess' => 'Soundbite has been successfully removed!', + ], + 'form' => [ + 'title' => 'New soundbite', + 'soundbite_title' => 'Soundbite title', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'submit' => 'Create soundbite', + ], + 'play' => 'Play soundbite', + 'stop' => 'Stop soundbite', + 'create' => 'New soundbite', + 'delete' => 'Delete soundbite', +]; diff --git a/modules/Admin/Language/zh-Hant/Validation.php b/modules/Admin/Language/zh-Hant/Validation.php new file mode 100644 index 00000000..f76c3163 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/Validation.php @@ -0,0 +1,17 @@ + + '{field} is either not an image, or it is not wide or tall enough.', + 'is_image_ratio' => + '{field} is either not an image or not of the right ratio.', + 'is_json' => '{field} contains invalid JSON.', +]; diff --git a/modules/Admin/Language/zh-Hant/VideoClip.php b/modules/Admin/Language/zh-Hant/VideoClip.php new file mode 100644 index 00000000..638de697 --- /dev/null +++ b/modules/Admin/Language/zh-Hant/VideoClip.php @@ -0,0 +1,72 @@ + [ + 'title' => 'Video clips', + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Clip is waiting to be processed.', + 'pending' => 'pending', + 'pending_hint' => 'Clip will be generated shortly.', + 'running' => 'running', + 'running_hint' => 'Clip is being generated.', + 'failed' => 'failed', + 'failed_hint' => 'Clip could not be generated: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Clip was generated successfully!', + ], + 'clip' => 'Clip', + 'duration' => 'Job duration', + ], + 'title' => 'Video clip: {videoClipLabel}', + 'download_clip' => 'Download clip', + 'create' => 'New video clip', + 'go_to_page' => 'Go to clip page', + 'retry' => 'Retry clip generation', + 'delete' => 'Delete clip', + 'logs' => 'Job logs', + 'messages' => [ + 'alreadyExistingError' => 'The video clip you are trying to create already exists!', + 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', + 'deleteSuccess' => 'Video clip has been successfully removed!', + ], + 'format' => [ + 'landscape' => 'Landscape', + 'portrait' => 'Portrait', + 'squared' => 'Squared', + ], + 'form' => [ + 'title' => 'New video clip', + 'params_section_title' => 'Video clip parameters', + 'clip_title' => 'Clip title', + 'format' => [ + 'label' => 'Choose a format', + 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', + 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', + 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', + ], + 'theme' => 'Select a theme', + 'start_time' => 'Start at', + 'duration' => 'Duration', + 'trim_start' => 'Trim start', + 'trim_end' => 'Trim end', + 'submit' => 'Create video clip', + ], + 'requirements' => [ + 'title' => 'Missing requirements', + 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', + 'ffmpeg' => 'FFmpeg', + 'gd' => 'Graphics Draw (GD)', + 'freetype' => 'Freetype library for GD', + 'transcript' => 'Transcript file (.srt)', + ], +]; diff --git a/modules/Auth/Language/eu/Auth.php b/modules/Auth/Language/eu/Auth.php new file mode 100644 index 00000000..725b760b --- /dev/null +++ b/modules/Auth/Language/eu/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/eu/Contributor.php b/modules/Auth/Language/eu/Contributor.php new file mode 100644 index 00000000..c70badc0 --- /dev/null +++ b/modules/Auth/Language/eu/Contributor.php @@ -0,0 +1,47 @@ + 'Podcast contributors', + 'view' => "{username}'s contribution to {podcastTitle}", + 'add' => 'Add contributor', + 'add_contributor' => 'Add a contributor for {0}', + 'edit_role' => 'Update role for {0}', + 'edit' => 'Edit', + 'remove' => 'Remove', + 'list' => [ + 'username' => 'Username', + 'role' => 'Role', + ], + 'form' => [ + 'user' => 'User', + 'user_placeholder' => 'Select a user…', + 'role' => 'Role', + 'role_placeholder' => 'Select its role…', + 'submit_add' => 'Add contributor', + 'submit_edit' => 'Update role', + ], + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', + ], + 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", + 'removeOwnerError' => "You can't remove the podcast owner!", + 'removeSuccess' => + 'You have successfully removed {username} from {podcastTitle}', + 'alreadyAddedError' => + "The contributor you're trying to add has already been added!", + ], +]; diff --git a/modules/Auth/Language/eu/MyAccount.php b/modules/Auth/Language/eu/MyAccount.php new file mode 100644 index 00000000..6ebbb30e --- /dev/null +++ b/modules/Auth/Language/eu/MyAccount.php @@ -0,0 +1,18 @@ + 'My account info', + 'changePassword' => 'Change my password', + 'messages' => [ + 'wrongPasswordError' => "You've entered the wrong password, try again.", + 'passwordChangeSuccess' => 'Password has been successfully changed!', + ], +]; diff --git a/modules/Auth/Language/eu/User.php b/modules/Auth/Language/eu/User.php new file mode 100644 index 00000000..32ec560c --- /dev/null +++ b/modules/Auth/Language/eu/User.php @@ -0,0 +1,60 @@ + "Edit {username}'s role", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'role' => 'Role', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'role' => 'Role', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Auth/Language/zh-Hant/Auth.php b/modules/Auth/Language/zh-Hant/Auth.php new file mode 100644 index 00000000..725b760b --- /dev/null +++ b/modules/Auth/Language/zh-Hant/Auth.php @@ -0,0 +1,93 @@ + [ + 'owner' => [ + 'title' => 'Instance Owner', + 'description' => 'The Castopod owner.', + ], + 'superadmin' => [ + 'title' => 'Super admin', + 'description' => 'Has complete control over Castopod.', + ], + 'manager' => [ + 'title' => 'Manager', + 'description' => 'Manages Castopod\'s content.', + ], + 'podcaster' => [ + 'title' => 'Podcaster', + 'description' => 'General users of Castopod.', + ], + ], + 'instance_permissions' => [ + 'admin.access' => 'Can access the Castopod admin area.', + 'admin.settings' => 'Can access the Castopod settings.', + 'users.manage' => 'Can manage Castopod users.', + 'persons.manage' => 'Can manage persons.', + 'pages.manage' => 'Can manage pages.', + 'podcasts.view' => 'Can view all podcasts.', + 'podcasts.create' => 'Can create new podcasts.', + 'podcasts.import' => 'Can import podcasts.', + 'fediverse.manage-blocks' => 'Can block fediverse actors/domains from interacting with Castopod.', + ], + 'podcast_groups' => [ + 'owner' => [ + 'title' => 'Podcast Owner', + 'description' => 'The podcast owner.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Has complete control of podcast #{id}.', + ], + 'editor' => [ + 'title' => 'Editor', + 'description' => 'Manages content and publications of podcast #{id}.', + ], + 'author' => [ + 'title' => 'Author', + 'description' => 'Manages content of podcast #{id} but cannot publish them.', + ], + 'guest' => [ + 'title' => 'Guest', + 'description' => 'General contributor of the podcast #{id}.', + ], + ], + 'podcast_permissions' => [ + 'view' => 'Can view dashboard and analytics of podcast #{id}.', + 'edit' => 'Can edit podcast #{id}.', + 'delete' => 'Can delete podcast #{id}.', + 'manage-import' => 'Can synchronize imported podcast #{id}.', + 'manage-persons' => 'Can manage subscriptions of podcast #{id}.', + 'manage-subscriptions' => 'Can manage subscriptions of podcast #{id}.', + 'manage-contributors' => 'Can manage contributors of podcast #{id}.', + 'manage-platforms' => 'Can set/remove platform links of podcast #{id}.', + 'manage-publications' => 'Can publish podcast #{id}.', + 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', + 'interact-as' => 'Can interact as the podcast #{id} to favourite, share or reply to posts.', + 'episodes.view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'episodes.create' => 'Can create episodes for podcast #{id}.', + 'episodes.edit' => 'Can edit episodes of podcast #{id}.', + 'episodes.delete' => 'Can delete episodes of podcast #{id}.', + 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], + + // missing keys + 'code' => 'Your 6-digit code', + + 'set_password' => 'Set your password', + + // Welcome email + 'welcomeSubject' => 'You\'ve been invited to {siteName}', + 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', +]; diff --git a/modules/Auth/Language/zh-Hant/Contributor.php b/modules/Auth/Language/zh-Hant/Contributor.php new file mode 100644 index 00000000..c70badc0 --- /dev/null +++ b/modules/Auth/Language/zh-Hant/Contributor.php @@ -0,0 +1,47 @@ + 'Podcast contributors', + 'view' => "{username}'s contribution to {podcastTitle}", + 'add' => 'Add contributor', + 'add_contributor' => 'Add a contributor for {0}', + 'edit_role' => 'Update role for {0}', + 'edit' => 'Edit', + 'remove' => 'Remove', + 'list' => [ + 'username' => 'Username', + 'role' => 'Role', + ], + 'form' => [ + 'user' => 'User', + 'user_placeholder' => 'Select a user…', + 'role' => 'Role', + 'role_placeholder' => 'Select its role…', + 'submit_add' => 'Add contributor', + 'submit_edit' => 'Update role', + ], + 'delete_form' => [ + 'title' => 'Remove {contributor}', + 'disclaimer' => + 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', + 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', + 'submit' => 'Remove', + ], + 'messages' => [ + 'editSuccess' => 'Role successfully changed!', + 'editOwnerError' => "You can't edit the podcast owner!", + 'removeOwnerError' => "You can't remove the podcast owner!", + 'removeSuccess' => + 'You have successfully removed {username} from {podcastTitle}', + 'alreadyAddedError' => + "The contributor you're trying to add has already been added!", + ], +]; diff --git a/modules/Auth/Language/zh-Hant/MyAccount.php b/modules/Auth/Language/zh-Hant/MyAccount.php new file mode 100644 index 00000000..6ebbb30e --- /dev/null +++ b/modules/Auth/Language/zh-Hant/MyAccount.php @@ -0,0 +1,18 @@ + 'My account info', + 'changePassword' => 'Change my password', + 'messages' => [ + 'wrongPasswordError' => "You've entered the wrong password, try again.", + 'passwordChangeSuccess' => 'Password has been successfully changed!', + ], +]; diff --git a/modules/Auth/Language/zh-Hant/User.php b/modules/Auth/Language/zh-Hant/User.php new file mode 100644 index 00000000..32ec560c --- /dev/null +++ b/modules/Auth/Language/zh-Hant/User.php @@ -0,0 +1,60 @@ + "Edit {username}'s role", + 'ban' => 'Ban', + 'unban' => 'Unban', + 'delete' => 'Delete', + 'create' => 'New user', + 'view' => "{username}'s info", + 'all_users' => 'All users', + 'list' => [ + 'user' => 'User', + 'role' => 'Role', + 'banned' => 'Banned?', + ], + 'form' => [ + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + 'new_password' => 'New Password', + 'role' => 'Role', + 'roles' => 'Roles', + 'permissions' => 'Permissions', + 'submit_create' => 'Create user', + 'submit_edit' => 'Save', + 'submit_password_change' => 'Change!', + ], + 'delete_form' => [ + 'title' => 'Delete {user}', + 'disclaimer' => + "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", + 'understand' => 'I understand, I want to delete {user} permanently', + 'submit' => 'Delete', + ], + 'messages' => [ + 'createSuccess' => + 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', + 'roleEditSuccess' => + "{username}'s roles have been successfully updated.", + 'banSuccess' => '{username} has been banned.', + 'unbanSuccess' => '{username} has been unbanned.', + 'editOwnerError' => + '{username} is the instance owner, one does not simply touch the owner…', + 'banSuperAdminError' => + '{username} is a superadmin, one does not simply ban a superadmin…', + 'deleteOwnerError' => + '{username} is the instance owner, one does not simply delete the owner…', + 'deleteSuperAdminError' => + '{username} is a superadmin, one does not simply delete a superadmin…', + 'deleteSuccess' => '{username} has been deleted.', + ], +]; diff --git a/modules/Install/Language/eu/Install.php b/modules/Install/Language/eu/Install.php new file mode 100644 index 00000000..45d26085 --- /dev/null +++ b/modules/Install/Language/eu/Install.php @@ -0,0 +1,62 @@ + 'Castopod installer', + 'manual_config' => 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your Super Admin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/Install/Language/zh-Hant/Install.php b/modules/Install/Language/zh-Hant/Install.php new file mode 100644 index 00000000..45d26085 --- /dev/null +++ b/modules/Install/Language/zh-Hant/Install.php @@ -0,0 +1,62 @@ + 'Castopod installer', + 'manual_config' => 'Manual configuration', + 'manual_config_subtitle' => + 'Create a `.env` file with your settings and refresh the page to continue installation.', + 'form' => [ + 'instance_config' => 'Instance configuration', + 'hostname' => 'Hostname', + 'media_base_url' => 'Media base URL', + 'media_base_url_hint' => + 'If you use a CDN and/or an external analytics service, you may set them here.', + 'admin_gateway' => 'Admin gateway', + 'admin_gateway_hint' => + 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', + 'auth_gateway' => 'Auth gateway', + 'auth_gateway_hint' => + 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', + 'database_config' => 'Database configuration', + 'database_config_hint' => + 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', + 'db_hostname' => 'Database hostname', + 'db_name' => 'Database name', + 'db_username' => 'Database username', + 'db_password' => 'Database password', + 'db_prefix' => 'Database prefix', + 'db_prefix_hint' => + "The prefix of the Castopod table names, leave as is if you don't know what it means.", + 'cache_config' => 'Cache configuration', + 'cache_config_hint' => + 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', + 'cache_handler' => 'Cache handler', + 'cacheHandlerOptions' => [ + 'file' => 'File', + 'redis' => 'Redis', + 'predis' => 'Predis', + ], + 'next' => 'Next', + 'submit' => 'Finish install', + 'create_superadmin' => 'Create your Super Admin account', + 'email' => 'Email', + 'username' => 'Username', + 'password' => 'Password', + ], + 'messages' => [ + 'createSuperAdminSuccess' => + 'Your superadmin account has been created successfully. Login to start podcasting!', + 'databaseConnectError' => + 'Castopod could not connect to your database. Edit your database configuration and try again.', + 'writeError' => + "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", + ], +]; diff --git a/modules/PodcastImport/Language/de/PodcastImport.php b/modules/PodcastImport/Language/de/PodcastImport.php index 8bf494d3..0037a0c0 100644 --- a/modules/PodcastImport/Language/de/PodcastImport.php +++ b/modules/PodcastImport/Language/de/PodcastImport.php @@ -12,7 +12,7 @@ return [ 'banner' => [ 'disclaimer' => 'Importing', 'text' => '{podcastTitle} is currently being imported.', - 'cta' => 'See import status', + 'cta' => 'Importstatus anzeigen', ], 'old_podcast_section_title' => 'The podcast to import', 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', @@ -27,15 +27,15 @@ return [ 'queue' => [ 'status' => [ 'label' => 'Status', - 'queued' => 'queued', + 'queued' => 'in Warteschlangen', 'queued_hint' => 'Import task is awaiting to be processed.', - 'canceled' => 'canceled', + 'canceled' => 'abgebrochen', 'canceled_hint' => 'Import task was canceled.', - 'running' => 'running', + 'running' => 'läuft', 'running_hint' => 'Import task is being processed.', - 'failed' => 'failed', + 'failed' => 'fehlgeschlagen', 'failed_hint' => 'Import task could not complete: script failure.', - 'passed' => 'passed', + 'passed' => 'bestanden', 'passed_hint' => 'Import task was completed successfully!', ], 'feed' => 'Feed', @@ -43,16 +43,16 @@ return [ 'imported_episodes' => 'Imported episodes', 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', 'actions' => [ - 'cancel' => 'Cancel', - 'retry' => 'Retry', - 'delete' => 'Delete', + 'cancel' => 'Abbrechen', + 'retry' => 'Erneut versuchen', + 'delete' => 'Löschen', ], ], 'syncForm' => [ - 'title' => 'Synchronize feeds', + 'title' => 'Feeds synchronisieren', 'feed_url' => 'Feed URL', 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', - 'submit' => 'Add to queue', + 'submit' => 'Zur Warteschlange hinzufügen', ], 'messages' => [ 'canceled' => 'Import task has been successfully canceled!', diff --git a/modules/PodcastImport/Language/eu/PodcastImport.php b/modules/PodcastImport/Language/eu/PodcastImport.php new file mode 100644 index 00000000..8bf494d3 --- /dev/null +++ b/modules/PodcastImport/Language/eu/PodcastImport.php @@ -0,0 +1,66 @@ + [ + 'disclaimer' => 'Importing', + 'text' => '{podcastTitle} is currently being imported.', + 'cta' => 'See import status', + ], + 'old_podcast_section_title' => 'The podcast to import', + 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_legal_disclaimer' => + 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', + 'imported_feed_url' => 'Feed URL', + 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', + 'new_podcast_section_title' => 'The new podcast', + 'lock_import' => + 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', + 'submit' => 'Add import to queue', + 'queue' => [ + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Import task is awaiting to be processed.', + 'canceled' => 'canceled', + 'canceled_hint' => 'Import task was canceled.', + 'running' => 'running', + 'running_hint' => 'Import task is being processed.', + 'failed' => 'failed', + 'failed_hint' => 'Import task could not complete: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Import task was completed successfully!', + ], + 'feed' => 'Feed', + 'duration' => 'Import duration', + 'imported_episodes' => 'Imported episodes', + 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'actions' => [ + 'cancel' => 'Cancel', + 'retry' => 'Retry', + 'delete' => 'Delete', + ], + ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], + 'messages' => [ + 'canceled' => 'Import task has been successfully canceled!', + 'notRunning' => 'Cannot cancel Import Task as it is not running.', + 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', + 'retried' => 'Import task has been queued, it will be retried shortly!', + 'deleted' => 'Import task has been successfully deleted!', + 'importTaskQueued' => 'An new task has been queued, import will start shortly!', + 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + ], +]; diff --git a/modules/PodcastImport/Language/zh-Hant/PodcastImport.php b/modules/PodcastImport/Language/zh-Hant/PodcastImport.php new file mode 100644 index 00000000..8bf494d3 --- /dev/null +++ b/modules/PodcastImport/Language/zh-Hant/PodcastImport.php @@ -0,0 +1,66 @@ + [ + 'disclaimer' => 'Importing', + 'text' => '{podcastTitle} is currently being imported.', + 'cta' => 'See import status', + ], + 'old_podcast_section_title' => 'The podcast to import', + 'old_podcast_legal_disclaimer_title' => 'Legal disclaimer', + 'old_podcast_legal_disclaimer' => + 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', + 'imported_feed_url' => 'Feed URL', + 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', + 'new_podcast_section_title' => 'The new podcast', + 'lock_import' => + 'This feed is protected. You cannot import it. If you are the owner, unlock it on the origin platform.', + 'submit' => 'Add import to queue', + 'queue' => [ + 'status' => [ + 'label' => 'Status', + 'queued' => 'queued', + 'queued_hint' => 'Import task is awaiting to be processed.', + 'canceled' => 'canceled', + 'canceled_hint' => 'Import task was canceled.', + 'running' => 'running', + 'running_hint' => 'Import task is being processed.', + 'failed' => 'failed', + 'failed_hint' => 'Import task could not complete: script failure.', + 'passed' => 'passed', + 'passed_hint' => 'Import task was completed successfully!', + ], + 'feed' => 'Feed', + 'duration' => 'Import duration', + 'imported_episodes' => 'Imported episodes', + 'imported_episodes_hint' => '{newlyImportedCount} newly imported, {alreadyImportedCount} already imported.', + 'actions' => [ + 'cancel' => 'Cancel', + 'retry' => 'Retry', + 'delete' => 'Delete', + ], + ], + 'syncForm' => [ + 'title' => 'Synchronize feeds', + 'feed_url' => 'Feed URL', + 'feed_url_hint' => 'The feed URL you want to synchronize with the current podcast.', + 'submit' => 'Add to queue', + ], + 'messages' => [ + 'canceled' => 'Import task has been successfully canceled!', + 'notRunning' => 'Cannot cancel Import Task as it is not running.', + 'alreadyRunning' => 'Import Task is already running. You may cancel it before retrying.', + 'retried' => 'Import task has been queued, it will be retried shortly!', + 'deleted' => 'Import task has been successfully deleted!', + 'importTaskQueued' => 'An new task has been queued, import will start shortly!', + 'syncTaskQueued' => 'A new import task has been queued, synchronization will start shortly!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/de/Subscription.php b/modules/PremiumPodcasts/Language/de/Subscription.php index e57db5a2..67b91013 100644 --- a/modules/PremiumPodcasts/Language/de/Subscription.php +++ b/modules/PremiumPodcasts/Language/de/Subscription.php @@ -34,7 +34,7 @@ return [ 'email' => 'E-Mail', 'expiration_date' => 'Ablaufdatum', 'expiration_date_hint' => 'Das Datum und die Uhrzeit, zu der das Abonnement abläuft. Leer lassen für ein unbegrenztes Abonnement.', - 'submit_create' => 'Create subscription', + 'submit_create' => 'Abonnement einrichten', 'submit_edit' => 'Abonnement bearbeiten', ], 'form_link_add' => [ diff --git a/modules/PremiumPodcasts/Language/eu/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/eu/PremiumPodcasts.php new file mode 100644 index 00000000..18c0dd4e --- /dev/null +++ b/modules/PremiumPodcasts/Language/eu/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Podcast contains premium episodes', + 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', + 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', + 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', + 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'subscribe' => 'Subscribe', + 'lock' => 'Lock', + 'unlock' => 'Unlock', + 'unlock_form' => [ + 'title' => 'Premium content', + 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'token' => 'Enter your key', + 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'submit' => 'Unlock all episodes!', + 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'subscribe_cta' => 'Subscribe now!', + ], + 'messages' => [ + 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', + 'unlockBadAttempt' => 'Your key does not seem to be working…', + 'lockSuccess' => 'Podcast was successfully locked!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/eu/Subscription.php b/modules/PremiumPodcasts/Language/eu/Subscription.php new file mode 100644 index 00000000..e83f0cb2 --- /dev/null +++ b/modules/PremiumPodcasts/Language/eu/Subscription.php @@ -0,0 +1,100 @@ + 'Podcast subscriptions', + 'add' => 'New subscription', + 'view' => 'View subscription', + 'edit' => 'Edit subscription', + 'regenerate_token' => 'Regenerate token', + 'suspend' => 'Suspend subscription', + 'resume' => 'Resume subscription', + 'delete' => 'Delete subscription', + 'status' => [ + 'active' => 'Active', + 'suspended' => 'Suspended', + 'expired' => 'Expired', + ], + 'list' => [ + 'number' => 'Number', + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'unlimited' => 'Unlimited', + 'downloads' => 'Downloads', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'submit_create' => 'Create subscription', + 'submit_edit' => 'Edit subscription', + ], + 'form_link_add' => [ + 'link' => 'Subscription page link', + 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'submit' => 'Save link', + ], + 'suspend_form' => [ + 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'reason' => 'Reason', + 'reason_placeholder' => 'Why are you suspending the subscription?', + "submit" => 'Suspend subscription', + ], + 'delete_form' => [ + 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'understand' => 'I understand, remove the subscription permanently', + 'submit' => 'Remove subscription', + ], + 'messages' => [ + 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', + 'addError' => 'Subscription could not be added.', + 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'editError' => 'Subscription could not be edited.', + 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenError' => 'Token could not be regenerated.', + 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', + 'deleteError' => 'Subscription could not be removed.', + 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', + 'suspendError' => 'Subscription could not be suspended.', + 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', + 'resumeError' => 'Subscription could not be resumed.', + 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', + 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + ], + 'emails' => [ + 'greeting' => 'Hey,', + 'token' => 'Your token: {0}', + 'unique_feed_link' => 'Your unique feed link: {0}', + 'how_to_use' => 'How to use?', + 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', + 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'welcome_subject' => 'Welcome to {podcastTitle}', + 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', + 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', + 'welcome_expires' => 'Your subscription was set to expire on {0}.', + 'welcome_never_expires' => 'Your subscription was set to never expire.', + 'reset_subject' => 'Your token was reset!', + 'reset_token' => 'Your access to {podcastTitle} has been reset!', + 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'edited_subject' => 'Your subscription has been updated!', + 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', + 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'suspended_subject' => 'Your subscription has been suspended!', + 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended_reason' => 'That is for the following reason: {0}', + 'resumed_subject' => 'Your subscription has been resumed!', + 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'deleted_subject' => 'Your subscription has been removed!', + 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'footer' => '{castopod} hosted on {host}', + ], +]; diff --git a/modules/PremiumPodcasts/Language/zh-Hant/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/zh-Hant/PremiumPodcasts.php new file mode 100644 index 00000000..18c0dd4e --- /dev/null +++ b/modules/PremiumPodcasts/Language/zh-Hant/PremiumPodcasts.php @@ -0,0 +1,34 @@ + 'Podcast contains premium episodes', + 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', + 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', + 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', + 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', + 'subscribe' => 'Subscribe', + 'lock' => 'Lock', + 'unlock' => 'Unlock', + 'unlock_form' => [ + 'title' => 'Premium content', + 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', + 'token' => 'Enter your key', + 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', + 'submit' => 'Unlock all episodes!', + 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', + 'subscribe_cta' => 'Subscribe now!', + ], + 'messages' => [ + 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', + 'unlockBadAttempt' => 'Your key does not seem to be working…', + 'lockSuccess' => 'Podcast was successfully locked!', + ], +]; diff --git a/modules/PremiumPodcasts/Language/zh-Hant/Subscription.php b/modules/PremiumPodcasts/Language/zh-Hant/Subscription.php new file mode 100644 index 00000000..e83f0cb2 --- /dev/null +++ b/modules/PremiumPodcasts/Language/zh-Hant/Subscription.php @@ -0,0 +1,100 @@ + 'Podcast subscriptions', + 'add' => 'New subscription', + 'view' => 'View subscription', + 'edit' => 'Edit subscription', + 'regenerate_token' => 'Regenerate token', + 'suspend' => 'Suspend subscription', + 'resume' => 'Resume subscription', + 'delete' => 'Delete subscription', + 'status' => [ + 'active' => 'Active', + 'suspended' => 'Suspended', + 'expired' => 'Expired', + ], + 'list' => [ + 'number' => 'Number', + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'unlimited' => 'Unlimited', + 'downloads' => 'Downloads', + 'status' => 'Status', + ], + 'form' => [ + 'email' => 'Email', + 'expiration_date' => 'Expiration date', + 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', + 'submit_create' => 'Create subscription', + 'submit_edit' => 'Edit subscription', + ], + 'form_link_add' => [ + 'link' => 'Subscription page link', + 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', + 'submit' => 'Save link', + ], + 'suspend_form' => [ + 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', + 'reason' => 'Reason', + 'reason_placeholder' => 'Why are you suspending the subscription?', + "submit" => 'Suspend subscription', + ], + 'delete_form' => [ + 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', + 'understand' => 'I understand, remove the subscription permanently', + 'submit' => 'Remove subscription', + ], + 'messages' => [ + 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', + 'addError' => 'Subscription could not be added.', + 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', + 'editError' => 'Subscription could not be edited.', + 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', + 'regenerateTokenError' => 'Token could not be regenerated.', + 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', + 'deleteError' => 'Subscription could not be removed.', + 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', + 'suspendError' => 'Subscription could not be suspended.', + 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', + 'resumeError' => 'Subscription could not be resumed.', + 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', + 'linkRemoveSuccess' => 'Subscription link was removed successfully!', + ], + 'emails' => [ + 'greeting' => 'Hey,', + 'token' => 'Your token: {0}', + 'unique_feed_link' => 'Your unique feed link: {0}', + 'how_to_use' => 'How to use?', + 'two_ways' => 'You have two ways of unlocking the premium episodes:', + 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', + 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', + 'welcome_subject' => 'Welcome to {podcastTitle}', + 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', + 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', + 'welcome_expires' => 'Your subscription was set to expire on {0}.', + 'welcome_never_expires' => 'Your subscription was set to never expire.', + 'reset_subject' => 'Your token was reset!', + 'reset_token' => 'Your access to {podcastTitle} has been reset!', + 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', + 'edited_subject' => 'Your subscription has been updated!', + 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', + 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', + 'suspended_subject' => 'Your subscription has been suspended!', + 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', + 'suspended_reason' => 'That is for the following reason: {0}', + 'resumed_subject' => 'Your subscription has been resumed!', + 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', + 'deleted_subject' => 'Your subscription has been removed!', + 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', + 'footer' => '{castopod} hosted on {host}', + ], +]; From 30a56546d3b93a303bf51cb4444887bc4c5fae5b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 17 Apr 2024 11:05:38 +0000 Subject: [PATCH 328/477] chore(release): 1.11.0 [skip ci] # [1.11.0](https://code.castopod.org/adaures/castopod/compare/v1.10.5...v1.11.0) (4/17/2024) ### Bug Fixes * **premium:** set itunes:block on premium feeds to prevent indexing ([88851b0](https://code.castopod.org/adaures/castopod/commit/88851b022663d575a816f0e2f33f0353767dd52d)) * **rss:** generate podcast guid if empty ([a5aef2a](https://code.castopod.org/adaures/castopod/commit/a5aef2a63e464632f3941649d455672835989e6c)), closes [#450](https://code.castopod.org/adaures/castopod/issues/450) ### Features * add trailer tags to rss if trailer episodes are present ([80fdd9c](https://code.castopod.org/adaures/castopod/commit/80fdd9cfb4a95feac6ed0000435a013fc83e6892)) * add transcript display to episode page ([4d141fc](https://code.castopod.org/adaures/castopod/commit/4d141fceae56fa9e666b42c32a830ff9c68989db)), closes [#411](https://code.castopod.org/adaures/castopod/issues/411) * **platforms:** add telegram to socials ([004f804](https://code.castopod.org/adaures/castopod/commit/004f804045cd8e884361bb4318109fbdd7afc9a8)) * **platforms:** add truefans.fm and episodes.fm ([d046ecc](https://code.castopod.org/adaures/castopod/commit/d046ecc52f6ccd41d09f6de48e00d2c61d25d7f0)), closes [#458](https://code.castopod.org/adaures/castopod/issues/458) [#459](https://code.castopod.org/adaures/castopod/issues/459) --- CHANGELOG.md | 24 ++++++++++++++++++++++++ app/Config/Constants.php | 2 +- composer.json | 2 +- package.json | 2 +- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83cc3f50..c05874dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ +# [1.11.0](https://code.castopod.org/adaures/castopod/compare/v1.10.5...v1.11.0) (4/17/2024) + +### Bug Fixes + +- **premium:** set itunes:block on premium feeds to prevent indexing + ([88851b0](https://code.castopod.org/adaures/castopod/commit/88851b022663d575a816f0e2f33f0353767dd52d)) +- **rss:** generate podcast guid if empty + ([a5aef2a](https://code.castopod.org/adaures/castopod/commit/a5aef2a63e464632f3941649d455672835989e6c)), + closes [#450](https://code.castopod.org/adaures/castopod/issues/450) + +### Features + +- add trailer tags to rss if trailer episodes are present + ([80fdd9c](https://code.castopod.org/adaures/castopod/commit/80fdd9cfb4a95feac6ed0000435a013fc83e6892)) +- add transcript display to episode page + ([4d141fc](https://code.castopod.org/adaures/castopod/commit/4d141fceae56fa9e666b42c32a830ff9c68989db)), + closes [#411](https://code.castopod.org/adaures/castopod/issues/411) +- **platforms:** add telegram to socials + ([004f804](https://code.castopod.org/adaures/castopod/commit/004f804045cd8e884361bb4318109fbdd7afc9a8)) +- **platforms:** add truefans.fm and episodes.fm + ([d046ecc](https://code.castopod.org/adaures/castopod/commit/d046ecc52f6ccd41d09f6de48e00d2c61d25d7f0)), + closes [#458](https://code.castopod.org/adaures/castopod/issues/458) + [#459](https://code.castopod.org/adaures/castopod/issues/459) + ## [1.10.5](https://code.castopod.org/adaures/castopod/compare/v1.10.4...v1.10.5) (3/12/2024) ### Bug Fixes diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 9c5f559f..90eac0e4 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -11,7 +11,7 @@ declare(strict_types=1); | | NOTE: this constant is updated upon release with Continuous Integration. */ -defined('CP_VERSION') || define('CP_VERSION', '1.10.5'); +defined('CP_VERSION') || define('CP_VERSION', '1.11.0'); /* | -------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 59fc732b..e8e0c549 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "adaures/castopod", - "version": "1.10.5", + "version": "1.11.0", "type": "project", "description": "Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "homepage": "https://castopod.org", diff --git a/package.json b/package.json index 4c677b86..dbd6753f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "castopod", - "version": "1.10.5", + "version": "1.11.0", "description": "Castopod Host is an open-source hosting platform made for podcasters who want engage and interact with their audience.", "private": true, "license": "AGPL-3.0-or-later", From b554561c01db0f090a18e5db79ca18dc892ea14b Mon Sep 17 00:00:00 2001 From: Benjamin Bellamy Date: Thu, 18 Apr 2024 09:39:55 +0000 Subject: [PATCH 329/477] chore(platforms): remove stitcher --- app/Database/Seeds/PlatformSeeder.php | 7 ------- app/Resources/icons/podcasting/stitcher.svg | 4 ---- 2 files changed, 11 deletions(-) delete mode 100755 app/Resources/icons/podcasting/stitcher.svg diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index de8b04be..cac09048 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -222,13 +222,6 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://www.spreaker.com/', 'submit_url' => 'https://www.spreaker.com/cms/shows/rss-import', ], - [ - 'slug' => 'stitcher', - 'type' => 'podcasting', - 'label' => 'Stitcher', - 'home_url' => 'https://www.stitcher.com/', - 'submit_url' => 'https://partners.stitcher.com/join', - ], [ 'slug' => 'tunein', 'type' => 'podcasting', diff --git a/app/Resources/icons/podcasting/stitcher.svg b/app/Resources/icons/podcasting/stitcher.svg deleted file mode 100755 index 0d59cba8..00000000 --- a/app/Resources/icons/podcasting/stitcher.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From a67f4acb3dce9dd1ddc0df3135fe042ea375b367 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Thu, 18 Apr 2024 09:40:46 +0000 Subject: [PATCH 330/477] chore(platform): add donorbox as funding platform closes #467 --- app/Database/Seeds/PlatformSeeder.php | 7 +++++++ app/Resources/icons/funding/donorbox.svg | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 app/Resources/icons/funding/donorbox.svg diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index cac09048..9f94dd69 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -491,6 +491,13 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://www.ulule.com/', 'submit_url' => 'https://www.ulule.com/projects/create/#/', ], + [ + 'slug' => 'donorbox', + 'type' => 'funding', + 'label' => 'Donorbox', + 'home_url' => 'https://donorbox.org/', + 'submit_url' => 'https://donorbox.org/orgs/new', + ], ]; $socialData = [ diff --git a/app/Resources/icons/funding/donorbox.svg b/app/Resources/icons/funding/donorbox.svg new file mode 100644 index 00000000..364837eb --- /dev/null +++ b/app/Resources/icons/funding/donorbox.svg @@ -0,0 +1,4 @@ + + + + From 57e459e187ed048430f4137172e22396cd02bf81 Mon Sep 17 00:00:00 2001 From: "Guy Martin (Dwev)" Date: Wed, 24 Apr 2024 10:03:20 +0000 Subject: [PATCH 331/477] feat: support podcast:txt tag with verify use case closes #468 --- ...4-04-18-160000_add_podcasts_verify_txt.php | 34 ++++++++++++++ app/Helpers/rss_helper.php | 6 +++ app/Models/PodcastModel.php | 1 + .../Admin/Controllers/PodcastController.php | 4 ++ modules/Admin/Language/en/Podcast.php | 3 ++ themes/cp_admin/podcast/create.php | 11 ++++- themes/cp_admin/podcast/edit.php | 45 ++++++++++++------- 7 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 app/Database/Migrations/2024-04-18-160000_add_podcasts_verify_txt.php diff --git a/app/Database/Migrations/2024-04-18-160000_add_podcasts_verify_txt.php b/app/Database/Migrations/2024-04-18-160000_add_podcasts_verify_txt.php new file mode 100644 index 00000000..339d3ae7 --- /dev/null +++ b/app/Database/Migrations/2024-04-18-160000_add_podcasts_verify_txt.php @@ -0,0 +1,34 @@ + [ + 'type' => 'TEXT', + 'null' => true, + 'after' => 'location_osm', + ], + ]; + + $this->forge->addColumn('podcasts', $fields); + } + + public function down(): void + { + $this->forge->dropColumn('podcasts', 'verify_txt'); + } +} diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 3f85b053..dcfe4b2e 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -121,6 +121,12 @@ if (! function_exists('get_rss_feed')) { ->addAttribute('owner', $podcast->owner_email); } + if ($podcast->verify_txt !== null) { + $channel + ->addChild('txt', $podcast->verify_txt, $podcastNamespace) + ->addAttribute('purpose', 'verify'); + } + if ($podcast->imported_feed_url !== null) { $channel->addChild('previousUrl', $podcast->imported_feed_url, $podcastNamespace); } diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index 4372b1f4..6dae5b04 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -61,6 +61,7 @@ class PodcastModel extends Model 'location_name', 'location_geo', 'location_osm', + 'verify_txt', 'payment_pointer', 'custom_rss', 'is_published_on_hubs', diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index bc483235..bb6ff352 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -224,6 +224,7 @@ class PodcastController extends BaseController 'location' => $this->request->getPost('location_name') === '' ? null : new Location( $this->request->getPost('location_name') ), + 'verify_txt' => $this->request->getPost('verify_txt'), 'custom_rss_string' => $this->request->getPost('custom_rss'), 'is_blocked' => $this->request->getPost('block') === 'yes', 'is_completed' => $this->request->getPost('complete') === 'yes', @@ -320,6 +321,9 @@ class PodcastController extends BaseController $this->podcast->location = $this->request->getPost('location_name') === '' ? null : new Location( $this->request->getPost('location_name') ); + $this->podcast->verify_txt = $this->request->getPost('verify_txt') === '' ? null : $this->request->getPost( + 'verify_txt' + ); $this->podcast->custom_rss_string = $this->request->getPost('custom_rss'); $this->podcast->new_feed_url = $this->request->getPost('new_feed_url') === '' ? null : $this->request->getPost( 'new_feed_url' diff --git a/modules/Admin/Language/en/Podcast.php b/modules/Admin/Language/en/Podcast.php index d02b6cf4..ff0daebc 100644 --- a/modules/Admin/Language/en/Podcast.php +++ b/modules/Admin/Language/en/Podcast.php @@ -138,6 +138,9 @@ return [ 'If you need RSS tags that Castopod does not handle, set them here.', 'custom_rss' => 'Custom RSS tags for the podcast', 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', + 'verify_txt' => 'Ownership verification TXT', + 'verify_txt_hint' => 'Rather than relying on email, certain third-party services may confirm your podcast ownership by requesting you to embed a verification text within your feed.', + 'verify_txt_helper' => 'This text is injected into a tag.', 'new_feed_url' => 'New feed URL', 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', 'old_feed_url' => 'Old feed URL', diff --git a/themes/cp_admin/podcast/create.php b/themes/cp_admin/podcast/create.php index 7f09adf0..d1a483c2 100644 --- a/themes/cp_admin/podcast/create.php +++ b/themes/cp_admin/podcast/create.php @@ -205,7 +205,16 @@ as="XMLEditor" name="custom_rss" label="" - hint="" /> + hint="" + rows="8" /> + + diff --git a/themes/cp_admin/podcast/edit.php b/themes/cp_admin/podcast/edit.php index 9beafd09..488deadd 100644 --- a/themes/cp_admin/podcast/edit.php +++ b/themes/cp_admin/podcast/edit.php @@ -239,25 +239,36 @@ name="custom_rss" label="" hint="" - content="custom_rss_string) ?>" /> + content="custom_rss_string) ?>" + rows="8" /> - + + + + + + + + + + + + + - - - - - - - - -
    From 303a900f669cd43c14edc57f89821ec3e136e20e Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Wed, 24 Apr 2024 14:47:05 +0000 Subject: [PATCH 332/477] refactor(platforms): move platforms data in code instead of database refs #457 --- app/Config/Autoload.php | 1 + app/Config/Routes.php | 1 - app/Config/Routing.php | 1 + app/Controllers/PlatformController.php | 28 - .../2024-04-18-180000_refactor_platforms.php | 152 + app/Database/Seeds/AppSeeder.php | 1 - app/Database/Seeds/DevSeeder.php | 1 - app/Entities/Podcast.php | 9 +- app/Models/PlatformModel.php | 205 - app/Resources/icons/podcasting/breaker.svg | 4 - app/Resources/icons/podcasting/google.svg | 4 - app/Views/Components/Button.php | 19 +- docs/src/contributing/setup-development.md | 5 +- modules/Admin/Config/Routes.php | 42 - modules/Platforms/Config/Routes.php | 65 + .../Controllers/PlatformController.php} | 49 +- .../Platforms}/Entities/Platform.php | 28 +- modules/Platforms/Models/PlatformModel.php | 178 + .../Platforms/Platforms.php | 889 +- .../PodcastImport/Commands/PodcastImport.php | 33 +- pnpm-lock.yaml | 19514 ++++++++-------- tailwind.config.cjs | 1 + themes/cp_admin/podcast/platforms.php | 38 +- 23 files changed, 11201 insertions(+), 10067 deletions(-) delete mode 100644 app/Controllers/PlatformController.php create mode 100644 app/Database/Migrations/2024-04-18-180000_refactor_platforms.php delete mode 100644 app/Models/PlatformModel.php delete mode 100755 app/Resources/icons/podcasting/breaker.svg delete mode 100755 app/Resources/icons/podcasting/google.svg create mode 100644 modules/Platforms/Config/Routes.php rename modules/{Admin/Controllers/PodcastPlatformController.php => Platforms/Controllers/PlatformController.php} (59%) rename {app => modules/Platforms}/Entities/Platform.php (53%) create mode 100644 modules/Platforms/Models/PlatformModel.php rename app/Database/Seeds/PlatformSeeder.php => modules/Platforms/Platforms.php (55%) diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index 051f0529..57a2938a 100644 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -55,6 +55,7 @@ class Autoload extends AutoloadConfig 'Modules\Install' => ROOTPATH . 'modules/Install/', 'Modules\Media' => ROOTPATH . 'modules/Media/', 'Modules\MediaClipper' => ROOTPATH . 'modules/MediaClipper/', + 'Modules\Platforms' => ROOTPATH . 'modules/Platforms/', 'Modules\PodcastImport' => ROOTPATH . 'modules/PodcastImport/', 'Modules\PremiumPodcasts' => ROOTPATH . 'modules/PremiumPodcasts/', 'Modules\Update' => ROOTPATH . 'modules/Update/', diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 9635b8b6..f3871562 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -15,7 +15,6 @@ use CodeIgniter\Router\RouteCollection; $routes->addPlaceholder('podcastHandle', '[a-zA-Z0-9\_]{1,32}'); $routes->addPlaceholder('slug', '[a-zA-Z0-9\-]{1,128}'); $routes->addPlaceholder('base64', '[A-Za-z0-9\.\_]+\-{0,2}'); -$routes->addPlaceholder('platformType', '\bpodcasting|\bsocial|\bfunding'); $routes->addPlaceholder('postAction', '\bfavourite|\breblog|\breply'); $routes->addPlaceholder('embedTheme', '\blight|\bdark|\blight-transparent|\bdark-transparent'); $routes->addPlaceholder( diff --git a/app/Config/Routing.php b/app/Config/Routing.php index 0ed4be40..26f4aac8 100644 --- a/app/Config/Routing.php +++ b/app/Config/Routing.php @@ -28,6 +28,7 @@ class Routing extends BaseRouting ROOTPATH . 'modules/Auth/Config/Routes.php', ROOTPATH . 'modules/Fediverse/Config/Routes.php', ROOTPATH . 'modules/Install/Config/Routes.php', + ROOTPATH . 'modules/Platforms/Config/Routes.php', ROOTPATH . 'modules/PodcastImport/Config/Routes.php', ROOTPATH . 'modules/PremiumPodcasts/Config/Routes.php', ]; diff --git a/app/Controllers/PlatformController.php b/app/Controllers/PlatformController.php deleted file mode 100644 index 1f325efb..00000000 --- a/app/Controllers/PlatformController.php +++ /dev/null @@ -1,28 +0,0 @@ -response->setJSON($model->getPlatforms()); - } -} diff --git a/app/Database/Migrations/2024-04-18-180000_refactor_platforms.php b/app/Database/Migrations/2024-04-18-180000_refactor_platforms.php new file mode 100644 index 00000000..88958b37 --- /dev/null +++ b/app/Database/Migrations/2024-04-18-180000_refactor_platforms.php @@ -0,0 +1,152 @@ +forge->addField([ + 'id' => [ + 'type' => 'INT', + 'unsigned' => true, + 'auto_increment' => true, + ], + 'podcast_id' => [ + 'type' => 'INT', + 'unsigned' => true, + ], + 'type' => [ + 'type' => 'ENUM', + 'constraint' => ['podcasting', 'social', 'funding'], + 'after' => 'podcast_id', + ], + 'slug' => [ + 'type' => 'VARCHAR', + 'constraint' => 32, + ], + 'link_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 512, + ], + 'account_id' => [ + 'type' => 'VARCHAR', + 'constraint' => 128, + 'null' => true, + ], + 'is_visible' => [ + 'type' => 'TINYINT', + 'constraint' => 1, + 'default' => 0, + ], + ]); + + $this->forge->addPrimaryKey('id'); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id', '', 'CASCADE', 'platforms_podcast_id_foreign'); + $this->forge->addUniqueKey(['podcast_id', 'type', 'slug']); + $this->forge->createTable('platforms_temp'); + + $platformsData = $this->db->table('podcasts_platforms') + ->select('podcasts_platforms.*, type') + ->join('platforms', 'platforms.slug = podcasts_platforms.platform_slug') + ->get() + ->getResultArray(); + + $data = []; + foreach ($platformsData as $platformData) { + $data[] = [ + 'podcast_id' => $platformData['podcast_id'], + 'type' => $platformData['type'], + 'slug' => $platformData['platform_slug'], + 'link_url' => $platformData['link_url'], + 'account_id' => $platformData['account_id'], + 'is_visible' => $platformData['is_visible'], + ]; + } + + if ($data !== []) { + $this->db->table('platforms_temp') + ->insertBatch($data); + } + + $this->forge->dropTable('platforms'); + + $this->forge->dropTable('podcasts_platforms'); + + $this->forge->renameTable('platforms_temp', 'platforms'); + } + + public function down(): void + { + // delete platforms + $this->forge->dropTable('platforms'); + + // recreate platforms and podcasts_platforms tables + $this->forge->addField([ + 'slug' => [ + 'type' => 'VARCHAR', + 'constraint' => 32, + ], + 'type' => [ + 'type' => 'ENUM', + 'constraint' => ['podcasting', 'social', 'funding'], + ], + 'label' => [ + 'type' => 'VARCHAR', + 'constraint' => 32, + ], + 'home_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + 'submit_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 512, + 'null' => true, + ], + ]); + $this->forge->addField('`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP()'); + $this->forge->addField( + '`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP()' + ); + $this->forge->addPrimaryKey('slug'); + $this->forge->createTable('platforms'); + + $this->forge->addField([ + 'podcast_id' => [ + 'type' => 'INT', + 'unsigned' => true, + ], + 'platform_slug' => [ + 'type' => 'VARCHAR', + 'constraint' => 32, + ], + 'link_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 512, + ], + 'account_id' => [ + 'type' => 'VARCHAR', + 'constraint' => 128, + 'null' => true, + ], + 'is_visible' => [ + 'type' => 'TINYINT', + 'constraint' => 1, + 'default' => 0, + ], + 'is_on_embed' => [ + 'type' => 'TINYINT', + 'constraint' => 1, + 'default' => 0, + ], + ]); + + $this->forge->addPrimaryKey(['podcast_id', 'platform_slug']); + $this->forge->addForeignKey('podcast_id', 'podcasts', 'id', '', 'CASCADE'); + $this->forge->addForeignKey('platform_slug', 'platforms', 'slug', 'CASCADE'); + $this->forge->createTable('podcasts_platforms'); + } +} diff --git a/app/Database/Seeds/AppSeeder.php b/app/Database/Seeds/AppSeeder.php index 2c52a18d..30ee0f7d 100644 --- a/app/Database/Seeds/AppSeeder.php +++ b/app/Database/Seeds/AppSeeder.php @@ -20,6 +20,5 @@ class AppSeeder extends Seeder { $this->call('CategorySeeder'); $this->call('LanguageSeeder'); - $this->call('PlatformSeeder'); } } diff --git a/app/Database/Seeds/DevSeeder.php b/app/Database/Seeds/DevSeeder.php index 68feba40..810f6c04 100644 --- a/app/Database/Seeds/DevSeeder.php +++ b/app/Database/Seeds/DevSeeder.php @@ -20,7 +20,6 @@ class DevSeeder extends Seeder { $this->call('CategorySeeder'); $this->call('LanguageSeeder'); - $this->call('PlatformSeeder'); $this->call('DevSuperadminSeeder'); } } diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index eff4364b..4198b382 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -15,7 +15,6 @@ use App\Models\ActorModel; use App\Models\CategoryModel; use App\Models\EpisodeModel; use App\Models\PersonModel; -use App\Models\PlatformModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; @@ -32,6 +31,8 @@ use League\CommonMark\MarkdownConverter; use Modules\Auth\Models\UserModel; use Modules\Media\Entities\Image; use Modules\Media\Models\MediaModel; +use Modules\Platforms\Entities\Platform; +use Modules\Platforms\Models\PlatformModel; use Modules\PremiumPodcasts\Entities\Subscription; use Modules\PremiumPodcasts\Models\SubscriptionModel; use RuntimeException; @@ -528,7 +529,7 @@ class Podcast extends Entity } if ($this->podcasting_platforms === null) { - $this->podcasting_platforms = (new PlatformModel())->getPodcastPlatforms($this->id, 'podcasting'); + $this->podcasting_platforms = (new PlatformModel())->getPlatforms($this->id, 'podcasting'); } return $this->podcasting_platforms; @@ -546,7 +547,7 @@ class Podcast extends Entity } if ($this->social_platforms === null) { - $this->social_platforms = (new PlatformModel())->getPodcastPlatforms($this->id, 'social'); + $this->social_platforms = (new PlatformModel())->getPlatforms($this->id, 'social'); } return $this->social_platforms; @@ -564,7 +565,7 @@ class Podcast extends Entity } if ($this->funding_platforms === null) { - $this->funding_platforms = (new PlatformModel())->getPodcastPlatforms($this->id, 'funding'); + $this->funding_platforms = (new PlatformModel())->getPlatforms($this->id, 'funding'); } return $this->funding_platforms; diff --git a/app/Models/PlatformModel.php b/app/Models/PlatformModel.php deleted file mode 100644 index 98a20c2c..00000000 --- a/app/Models/PlatformModel.php +++ /dev/null @@ -1,205 +0,0 @@ -baseURL, '/'); - $found = $this->select( - "*, CONCAT('{$baseUrl}/assets/images/platforms/',`type`,'/',`slug`,'.svg') as icon", - )->findAll(); - cache() - ->save('platforms', $found, DECADE); - } - - return $found; - } - - public function getPlatform(string $slug): ?Platform - { - $cacheName = "platform-{$slug}"; - if (! ($found = cache($cacheName))) { - $found = $this->where('slug', $slug) - ->first(); - cache() - ->save($cacheName, $found, DECADE); - } - - return $found; - } - - public function createPlatform( - string $slug, - string $type, - string $label, - string $homeUrl, - string $submitUrl = null - ): bool { - $data = [ - 'slug' => $slug, - 'type' => $type, - 'label' => $label, - 'home_url' => $homeUrl, - 'submit_url' => $submitUrl, - ]; - - return $this->insert($data, false); - } - - /** - * @return Platform[] - */ - public function getPlatformsWithLinks(int $podcastId, string $platformType): array - { - if ( - ! ($found = cache("podcast#{$podcastId}_platforms_{$platformType}_withLinks")) - ) { - $found = $this->select( - 'platforms.*, podcasts_platforms.link_url, podcasts_platforms.account_id, podcasts_platforms.is_visible, podcasts_platforms.is_on_embed', - ) - ->join( - 'podcasts_platforms', - "podcasts_platforms.platform_slug = platforms.slug AND podcasts_platforms.podcast_id = {$podcastId}", - 'left', - ) - ->where('platforms.type', $platformType) - ->findAll(); - - cache() - ->save("podcast#{$podcastId}_platforms_{$platformType}_withLinks", $found, DECADE); - } - - return $found; - } - - /** - * @return Platform[] - */ - public function getPodcastPlatforms(int $podcastId, string $platformType): array - { - $cacheName = "podcast#{$podcastId}_platforms_{$platformType}"; - if (! ($found = cache($cacheName))) { - $found = $this->select( - 'platforms.*, podcasts_platforms.link_url, podcasts_platforms.account_id, podcasts_platforms.is_visible, podcasts_platforms.is_on_embed', - ) - ->join('podcasts_platforms', 'podcasts_platforms.platform_slug = platforms.slug') - ->where('podcasts_platforms.podcast_id', $podcastId) - ->where('platforms.type', $platformType) - ->findAll(); - - cache() - ->save($cacheName, $found, DECADE); - } - - return $found; - } - - /** - * @param mixed[] $podcastsPlatformsData - * - * @return int|false Number of rows inserted or FALSE on failure - */ - public function savePodcastPlatforms( - int $podcastId, - string $platformType, - array $podcastsPlatformsData - ): int | false { - $this->clearCache($podcastId); - - $podcastsPlatformsTable = $this->db->prefixTable('podcasts_platforms'); - $platformsTable = $this->db->prefixTable('platforms'); - - $deleteJoinQuery = <<db->query($deleteJoinQuery, [$podcastId, $platformType]); - - if ($podcastsPlatformsData === []) { - // no rows inserted - return 0; - } - - return $this->db - ->table('podcasts_platforms') - ->insertBatch($podcastsPlatformsData); - } - - public function removePodcastPlatform(int $podcastId, string $platformSlug): bool | string - { - $this->clearCache($podcastId); - - return $this->db->table('podcasts_platforms') - ->delete([ - 'podcast_id' => $podcastId, - 'platform_slug' => $platformSlug, - ]); - } - - public function clearCache(int $podcastId): void - { - cache()->deleteMatching("podcast#{$podcastId}_platforms_*"); - - // delete localized podcast page cache - cache() - ->deleteMatching("page_podcast#{$podcastId}*"); - // delete post and episode comments pages cache - cache() - ->deleteMatching('page_post*'); - cache() - ->deleteMatching('page_episode#*'); - } -} diff --git a/app/Resources/icons/podcasting/breaker.svg b/app/Resources/icons/podcasting/breaker.svg deleted file mode 100755 index 8de3e6e6..00000000 --- a/app/Resources/icons/podcasting/breaker.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/Resources/icons/podcasting/google.svg b/app/Resources/icons/podcasting/google.svg deleted file mode 100755 index e580789c..00000000 --- a/app/Resources/icons/podcasting/google.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/Views/Components/Button.php b/app/Views/Components/Button.php index 4f15bfe7..ad6e25a7 100644 --- a/app/Views/Components/Button.php +++ b/app/Views/Components/Button.php @@ -28,17 +28,18 @@ class Button extends Component public function render(): string { $baseClass = - 'gap-x-2 flex-shrink-0 inline-flex items-center justify-center font-semibold shadow-xs rounded-full focus:ring-accent'; + 'gap-x-2 flex-shrink-0 inline-flex items-center justify-center font-semibold rounded-full focus:ring-accent'; $variantClass = [ - 'default' => 'text-black bg-gray-300 hover:bg-gray-400', - 'primary' => 'text-accent-contrast bg-accent-base hover:bg-accent-hover', - 'secondary' => 'border-2 border-accent-base text-accent-base bg-white hover:border-accent-hover hover:text-accent-hover', - 'success' => 'text-white bg-pine-500 hover:bg-pine-800', - 'danger' => 'text-white bg-red-600 hover:bg-red-700', - 'warning' => 'text-black bg-yellow-500 hover:bg-yellow-600', - 'info' => 'text-white bg-blue-500 hover:bg-blue-600', - 'disabled' => 'text-black bg-gray-300 cursor-not-allowed', + 'default' => 'shadow-sm text-black bg-gray-300 hover:bg-gray-400', + 'primary' => 'shadow-sm text-accent-contrast bg-accent-base hover:bg-accent-hover', + 'secondary' => 'shadow-sm border-2 border-accent-base text-accent-base bg-white hover:border-accent-hover hover:text-accent-hover', + 'success' => 'shadow-sm text-white bg-pine-500 hover:bg-pine-800', + 'danger' => 'shadow-sm text-white bg-red-600 hover:bg-red-700', + 'warning' => 'shadow-sm text-black bg-yellow-500 hover:bg-yellow-600', + 'info' => 'shadow-sm text-white bg-blue-500 hover:bg-blue-600', + 'disabled' => 'shadow-sm text-black bg-gray-300 cursor-not-allowed', + 'link' => 'text-accent-base bg-transparent underline hover:no-underline', ]; $sizeClass = [ diff --git a/docs/src/contributing/setup-development.md b/docs/src/contributing/setup-development.md index b996bac7..f4deae3c 100644 --- a/docs/src/contributing/setup-development.md +++ b/docs/src/contributing/setup-development.md @@ -303,11 +303,8 @@ You may skip this section if you go through the install wizard (go to # Populates all Languages php spark db:seed LanguageSeeder - # Populates all podcasts platforms - php spark db:seed PlatformSeeder - # Adds a superadmin with [admin@castopod.local / castopod] credentials - php spark db:seed PlatformSeeder + php spark db:seed DevSuperadminSeeder ``` 3. (optionnal) Populate the database with test data: diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php index 126d4f13..24f451b2 100644 --- a/modules/Admin/Config/Routes.php +++ b/modules/Admin/Config/Routes.php @@ -511,48 +511,6 @@ $routes->group( }); }); }); - $routes->group('platforms', static function ($routes): void { - $routes->get( - '/', - 'PodcastPlatformController::platforms/$1/podcasting', - [ - 'as' => 'platforms-podcasting', - 'filter' => 'permission:podcast#.manage-platforms', - ], - ); - $routes->get( - 'social', - 'PodcastPlatformController::platforms/$1/social', - [ - 'as' => 'platforms-social', - 'filter' => 'permission:podcast#.manage-platforms', - ], - ); - $routes->get( - 'funding', - 'PodcastPlatformController::platforms/$1/funding', - [ - 'as' => 'platforms-funding', - 'filter' => 'permission:podcast#.manage-platforms', - ], - ); - $routes->post( - 'save/(:platformType)', - 'PodcastPlatformController::attemptPlatformsUpdate/$1/$2', - [ - 'as' => 'platforms-save', - 'filter' => 'permission:podcast#.manage-platforms', - ], - ); - $routes->get( - '(:slug)/podcast-platform-remove', - 'PodcastPlatformController::removePodcastPlatform/$1/$2', - [ - 'as' => 'podcast-platform-remove', - 'filter' => 'permission:podcast#.manage-platforms', - ], - ); - }); // Podcast notifications $routes->group('notifications', static function ($routes): void { $routes->get('/', 'NotificationController::list/$1', [ diff --git a/modules/Platforms/Config/Routes.php b/modules/Platforms/Config/Routes.php new file mode 100644 index 00000000..d4074cf1 --- /dev/null +++ b/modules/Platforms/Config/Routes.php @@ -0,0 +1,65 @@ +addPlaceholder('platformType', '\bpodcasting|\bsocial|\bfunding'); + +/** @var RouteCollection $routes */ + +// Admin routes for subscriptions +$routes->group( + config(Admin::class) + ->gateway, + [ + 'namespace' => 'Modules\Platforms\Controllers', + ], + static function ($routes): void { + $routes->group('podcasts/(:num)/platforms', static function ($routes): void { + $routes->get( + '/', + 'PlatformController::platforms/$1/podcasting', + [ + 'as' => 'platforms-podcasting', + 'filter' => 'permission:podcast#.manage-platforms', + ], + ); + $routes->get( + 'social', + 'PlatformController::platforms/$1/social', + [ + 'as' => 'platforms-social', + 'filter' => 'permission:podcast#.manage-platforms', + ], + ); + $routes->get( + 'funding', + 'PlatformController::platforms/$1/funding', + [ + 'as' => 'platforms-funding', + 'filter' => 'permission:podcast#.manage-platforms', + ], + ); + $routes->post( + 'save/(:platformType)', + 'PlatformController::attemptPlatformsUpdate/$1/$2', + [ + 'as' => 'platforms-save', + 'filter' => 'permission:podcast#.manage-platforms', + ], + ); + $routes->get( + '(:platformType)/(:slug)/podcast-platform-remove', + 'PlatformController::removePlatform/$1/$2/$3', + [ + 'as' => 'podcast-platform-remove', + 'filter' => 'permission:podcast#.manage-platforms', + ], + ); + }); + } +); diff --git a/modules/Admin/Controllers/PodcastPlatformController.php b/modules/Platforms/Controllers/PlatformController.php similarity index 59% rename from modules/Admin/Controllers/PodcastPlatformController.php rename to modules/Platforms/Controllers/PlatformController.php index 950faf79..a8118a4b 100644 --- a/modules/Admin/Controllers/PodcastPlatformController.php +++ b/modules/Platforms/Controllers/PlatformController.php @@ -8,18 +8,19 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace Modules\Admin\Controllers; +namespace Modules\Platforms\Controllers; use App\Entities\Podcast; -use App\Models\PlatformModel; use App\Models\PodcastModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; use Config\Services; +use Modules\Admin\Controllers\BaseController; +use Modules\Platforms\Models\PlatformModel; -class PodcastPlatformController extends BaseController +class PlatformController extends BaseController { - protected ?Podcast $podcast; + protected Podcast $podcast; public function _remap(string $method, string ...$params): mixed { @@ -28,18 +29,20 @@ class PodcastPlatformController extends BaseController } if ( - ($this->podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast + ! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast ) { - unset($params[0]); - return $this->{$method}(...$params); + throw PageNotFoundException::forPageNotFound(); } - throw PageNotFoundException::forPageNotFound(); + $this->podcast = $podcast; + + unset($params[0]); + return $this->{$method}(...$params); } public function index(): string { - return view('podcast/platforms\dashboard'); + return view('podcast/platforms/dashboard'); } public function platforms(string $platformType): string @@ -49,7 +52,7 @@ class PodcastPlatformController extends BaseController $data = [ 'podcast' => $this->podcast, 'platformType' => $platformType, - 'platforms' => (new PlatformModel())->getPlatformsWithLinks($this->podcast->id, $platformType), + 'platforms' => (new PlatformModel())->getPlatformsWithData($this->podcast->id, $platformType), ]; replace_breadcrumb_params([ @@ -64,8 +67,7 @@ class PodcastPlatformController extends BaseController $platformModel = new PlatformModel(); $validation = Services::validation(); - $podcastsPlatformsData = []; - + $platformsData = []; foreach ( $this->request->getPost('platforms') as $platformSlug => $podcastPlatform @@ -80,30 +82,27 @@ class PodcastPlatformController extends BaseController } $podcastPlatformAccountId = trim((string) $podcastPlatform['account_id']); - $podcastsPlatformsData[] = [ - 'platform_slug' => $platformSlug, - 'podcast_id' => $this->podcast->id, - 'link_url' => $podcastPlatformUrl, - 'account_id' => $podcastPlatformAccountId === '' ? null : $podcastPlatformAccountId, - 'is_visible' => array_key_exists('visible', $podcastPlatform) && + $platformsData[] = [ + 'podcast_id' => $this->podcast->id, + 'type' => $platformType, + 'slug' => $platformSlug, + 'link_url' => $podcastPlatformUrl, + 'account_id' => $podcastPlatformAccountId === '' ? null : $podcastPlatformAccountId, + 'is_visible' => array_key_exists('visible', $podcastPlatform) && $podcastPlatform['visible'] === 'yes', - 'is_on_embed' => array_key_exists( - 'on_embed', - $podcastPlatform - ) && $podcastPlatform['on_embed'] === 'yes', ]; } - $platformModel->savePodcastPlatforms($this->podcast->id, $platformType, $podcastsPlatformsData); + $platformModel->savePlatforms($this->podcast->id, $platformType, $platformsData); return redirect() ->back() ->with('message', lang('Platforms.messages.updateSuccess')); } - public function removePodcastPlatform(string $platformSlug): RedirectResponse + public function removePlatform(string $platformType, string $platformSlug): RedirectResponse { - (new PlatformModel())->removePodcastPlatform($this->podcast->id, $platformSlug); + (new PlatformModel())->removePlatform($this->podcast->id, $platformType, $platformSlug); return redirect() ->back() diff --git a/app/Entities/Platform.php b/modules/Platforms/Entities/Platform.php similarity index 53% rename from app/Entities/Platform.php rename to modules/Platforms/Entities/Platform.php index 31dca4ef..0f2a6710 100644 --- a/app/Entities/Platform.php +++ b/modules/Platforms/Entities/Platform.php @@ -8,20 +8,20 @@ declare(strict_types=1); * @link https://castopod.org/ */ -namespace App\Entities; +namespace Modules\Platforms\Entities; use CodeIgniter\Entity\Entity; /** + * @property int $podcast_id * @property string $slug * @property string $type * @property string $label + * @property string $link_url + * @property string|null $account_id + * @property bool $is_visible * @property string $home_url * @property string|null $submit_url - * @property string|null $link_url - * @property string|null $account_id - * @property bool|null $is_visible - * @property bool|null $is_on_embed */ class Platform extends Entity { @@ -29,14 +29,14 @@ class Platform extends Entity * @var array */ protected $casts = [ - 'slug' => 'string', - 'type' => 'string', - 'label' => 'string', - 'home_url' => 'string', - 'submit_url' => '?string', - 'link_url' => '?string', - 'account_id' => '?string', - 'is_visible' => '?boolean', - 'is_on_embed' => '?boolean', + 'podcast_id' => 'int', + 'slug' => 'string', + 'type' => 'string', + 'label' => 'string', + 'link_url' => 'string', + 'account_id' => '?string', + 'is_visible' => 'boolean', + 'home_url' => 'string', + 'submit_url' => '?string', ]; } diff --git a/modules/Platforms/Models/PlatformModel.php b/modules/Platforms/Models/PlatformModel.php new file mode 100644 index 00000000..668a77f2 --- /dev/null +++ b/modules/Platforms/Models/PlatformModel.php @@ -0,0 +1,178 @@ +getPlatforms($podcastId, $platformType); + $platformsData = $platforms->getPlatformsByType($platformType); + + $knownSlugs = []; + foreach ($found as $podcastPlatform) { + $knownSlugs[] = $podcastPlatform->slug; + } + + foreach ($platformsData as $slug => $platform) { + if (! in_array($slug, $knownSlugs)) { + $found[] = new Platform([ + 'podcast_id' => $podcastId, + 'slug' => $slug, + 'type' => $platformType, + 'label' => $platform['label'], + 'home_url' => $platform['home_url'], + 'submit_url' => $platform['submit_url'], + 'link_url' => '', + 'account_id' => null, + 'is_visible' => false, + ]); + } + } + + cache() + ->save($cacheName, $found, DECADE); + } + + return $found; + } + + /** + * @return Platform[] + */ + public function getPlatforms(int $podcastId, string $platformType): array + { + $cacheName = "podcast#{$podcastId}_platforms_{$platformType}"; + if (! ($found = cache($cacheName))) { + $platforms = new Platforms(); + + /** @var Platform[] $found */ + $found = $this + ->where('podcast_id', $podcastId) + ->where('type', $platformType) + ->orderBy('slug') + ->findAll(); + + foreach ($found as $platform) { + $platformData = $platforms->findPlatformBySlug($platformType, $platform->slug); + + if ($platformData === null) { + // delete platform, it does not correspond to any existing one + $this->delete($platform->id); + + continue; + } + + $platform->type = $platformType; + $platform->label = $platformData['label']; + $platform->home_url = $platformData['home_url']; + $platform->submit_url = $platformData['submit_url']; + } + + cache() + ->save($cacheName, $found, DECADE); + } + + return $found; + } + + /** + * @return int|false Number of rows inserted or FALSE on failure + */ + public function savePlatforms(int $podcastId, string $platformType, array $data): int | false + { + $this->clearCache($podcastId); + + $platforms = new Platforms(); + + $platformsData = $platforms->getPlatformsByType($platformType); + + $this->builder() + ->whereIn('slug', array_keys($platformsData)) + ->delete(); + + if ($data === []) { + // no rows inserted + return 0; + } + + return $this->insertBatch($data); + } + + public function removePlatform(int $podcastId, string $platformType, string $platformSlug): bool | string + { + $this->clearCache($podcastId); + + return $this->builder() + ->delete([ + 'podcast_id' => $podcastId, + 'type' => $platformType, + 'slug' => $platformSlug, + ]); + } + + public function clearCache(int $podcastId): void + { + cache()->deleteMatching("podcast#{$podcastId}_platforms_*"); + + // delete localized podcast page cache + cache() + ->deleteMatching("page_podcast#{$podcastId}*"); + // delete post and episode comments pages cache + cache() + ->deleteMatching('page_post*'); + cache() + ->deleteMatching('page_episode#*'); + } +} diff --git a/app/Database/Seeds/PlatformSeeder.php b/modules/Platforms/Platforms.php similarity index 55% rename from app/Database/Seeds/PlatformSeeder.php rename to modules/Platforms/Platforms.php index 9f94dd69..d5cd26e2 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/modules/Platforms/Platforms.php @@ -3,664 +3,471 @@ declare(strict_types=1); /** - * Class PlatformsSeeder Inserts values in platforms table in database - * - * @copyright 2020 Ad Aures + * @copyright 2024 Ad Aures * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ */ -namespace App\Database\Seeds; +namespace Modules\Platforms; -use CodeIgniter\Database\Seeder; - -class PlatformSeeder extends Seeder +class Platforms { - public function run(): void - { - $podcastingData = [ - [ - 'slug' => 'amazon', - 'type' => 'podcasting', - 'label' => 'Amazon Music & Audible', - 'home_url' => 'https://music.amazon.com/', - 'submit_url' => 'https://podcasters.amazon.com/', - ], - [ - 'slug' => 'antennapod', - 'type' => 'podcasting', - 'label' => 'AntennaPod', - 'home_url' => 'https://antennapod.org/', - 'submit_url' => 'https://antennapod.org/documentation/podcasters-hosters/add-on-antennapod', - ], - [ - 'slug' => 'apple', - 'type' => 'podcasting', - 'label' => 'Apple Podcasts', - 'home_url' => 'https://www.apple.com/itunes/podcasts/', - 'submit_url' => 'https://podcastsconnect.apple.com/my-podcasts/new-feed', - ], - [ - 'slug' => 'blubrry', - 'type' => 'podcasting', - 'label' => 'Blubrry', - 'home_url' => 'https://www.blubrry.com/', - 'submit_url' => 'https://www.blubrry.com/addpodcast.php', - ], - [ - 'slug' => 'breaker', - 'type' => 'podcasting', - 'label' => 'Breaker', - 'home_url' => 'https://www.breaker.audio/', - 'submit_url' => 'https://podcasters.breaker.audio/', - ], - [ - 'slug' => 'castbox', - 'type' => 'podcasting', - 'label' => 'Castbox', - 'home_url' => 'https://castbox.fm/', - 'submit_url' => 'https://helpcenter.castbox.fm/portal/kb/articles/submit-my-podcast', - ], - [ - 'slug' => 'castopod', - 'type' => 'podcasting', - 'label' => 'Castopod', - 'home_url' => 'https://castopod.org/', - 'submit_url' => 'https://castopod.org/instances', - ], - [ - 'slug' => 'castro', - 'type' => 'podcasting', - 'label' => 'Castro', - 'home_url' => 'http://castro.fm/', - 'submit_url' => 'https://castro.fm/support/link-to-your-podcast-in-castro', - ], - [ - 'slug' => 'deezer', - 'type' => 'podcasting', - 'label' => 'Deezer', - 'home_url' => 'https://www.deezer.com/', - 'submit_url' => 'https://podcasters.deezer.com/submission', - ], - [ - 'slug' => 'fyyd', - 'type' => 'podcasting', - 'label' => 'fyyd', - 'home_url' => 'https://fyyd.de/', - 'submit_url' => 'https://fyyd.de/add-feed', - ], - [ - 'slug' => 'google', - 'type' => 'podcasting', - 'label' => 'Google Podcasts', - 'home_url' => 'https://podcasts.google.com/about', - 'submit_url' => 'https://search.google.com/search-console/about', - ], - [ - 'slug' => 'ivoox', - 'type' => 'podcasting', - 'label' => 'Ivoox', - 'home_url' => 'https://www.ivoox.com/', - 'submit_url' => 'http://www.ivoox.com/upload-podcast_u.html', - ], - [ - 'slug' => 'listennotes', - 'type' => 'podcasting', - 'label' => 'ListenNotes', - 'home_url' => 'https://www.listennotes.com/', - 'submit_url' => 'https://www.listennotes.com/submit/', - ], - [ - 'slug' => 'overcast', - 'type' => 'podcasting', - 'label' => 'Overcast', - 'home_url' => 'https://overcast.fm/', - 'submit_url' => 'https://overcast.fm/podcasterinfo', - ], - [ - 'slug' => 'playerfm', - 'type' => 'podcasting', - 'label' => 'Player.Fm', - 'home_url' => 'https://player.fm/', - 'submit_url' => 'https://player.fm/importer/feed', - ], - [ - 'slug' => 'pocketcasts', - 'type' => 'podcasting', - 'label' => 'Pocketcasts', - 'home_url' => 'https://www.pocketcasts.com/', - 'submit_url' => 'https://www.pocketcasts.com/submit/', - ], - [ - 'slug' => 'podbean', - 'type' => 'podcasting', - 'label' => 'Podbean', - 'home_url' => 'https://www.podbean.com/', - 'submit_url' => 'https://www.podbean.com/site/submitPodcast', - ], - [ - 'slug' => 'podcastaddict', - 'type' => 'podcasting', - 'label' => 'Podcast Addict', - 'home_url' => 'https://podcastaddict.com/', - 'submit_url' => 'https://podcastaddict.com/submit', - ], - [ - 'slug' => 'podcastindex', - 'type' => 'podcasting', + /** + * @var array> + */ + public const DATA = [ + 'podcasting' => [ + 'podcastindex' => [ 'label' => 'Podcast Index', 'home_url' => 'https://podcastindex.org/', 'submit_url' => 'https://podcastindex.org/add', ], - [ - 'slug' => 'podchaser', - 'type' => 'podcasting', - 'label' => 'Podchaser', - 'home_url' => 'https://www.podchaser.com/', - 'submit_url' => 'https://www.podchaser.com/creators/edit', + 'apple' => [ + 'label' => 'Apple Podcasts', + 'home_url' => 'https://www.apple.com/itunes/podcasts/', + 'submit_url' => 'https://podcastsconnect.apple.com/my-podcasts/new-feed', ], - [ - 'slug' => 'podcloud', - 'type' => 'podcasting', - 'label' => 'podCloud', - 'home_url' => 'https://podcloud.fr/', - 'submit_url' => 'https://podcloud.fr/studio/podcasts/new', - ], - [ - 'slug' => 'podinstall', - 'type' => 'podcasting', - 'label' => 'Podinstall', - 'home_url' => 'https://www.podinstall.com/', - 'submit_url' => 'https://www.podinstall.com/claim.html', - ], - [ - 'slug' => 'podlink', - 'type' => 'podcasting', - 'label' => 'pod.link', - 'home_url' => 'https://pod.link/', - 'submit_url' => 'https://pod.link', - ], - [ - 'slug' => 'podtail', - 'type' => 'podcasting', - 'label' => 'Podtail', - 'home_url' => 'https://podtail.com/', - 'submit_url' => 'https://podtail.com/about/faq/', - ], - [ - 'slug' => 'podfriend', - 'type' => 'podcasting', - 'label' => 'Podfriend', - 'home_url' => 'https://www.podfriend.com/', - 'submit_url' => 'https://podcastindex.org/add', - ], - [ - 'slug' => 'podverse', - 'type' => 'podcasting', - 'label' => 'Podverse', - 'home_url' => 'https://podverse.fm/', - 'submit_url' => 'https://docs.google.com/forms/d/e/1FAIpQLSdewKP-YrE8zGjDPrkmoJEwCxPl_gizEkmzAlTYsiWAuAk1Ng/viewform', - ], - [ - 'slug' => 'radiopublic', - 'type' => 'podcasting', - 'label' => 'RadioPublic', - 'home_url' => 'https://radiopublic.com/', - 'submit_url' => 'https://podcasters.radiopublic.com/signup', - ], - [ - 'slug' => 'spotify', - 'type' => 'podcasting', + 'spotify' => [ 'label' => 'Spotify', 'home_url' => 'https://www.spotify.com/', - 'submit_url' => 'https://podcasters.spotify.com/submit', + 'submit_url' => 'https://podcasters.spotify.com/dash/submit', ], - [ - 'slug' => 'spreaker', - 'type' => 'podcasting', - 'label' => 'Spreaker', - 'home_url' => 'https://www.spreaker.com/', - 'submit_url' => 'https://www.spreaker.com/cms/shows/rss-import', - ], - [ - 'slug' => 'tunein', - 'type' => 'podcasting', - 'label' => 'TuneIn', - 'home_url' => 'https://tunein.com/', - 'submit_url' => 'https://help.tunein.com/contact/add-podcast-S19TR3Sdf', - ], - [ - 'slug' => 'anytime', - 'type' => 'podcasting', - 'label' => 'Anytime Podcast Player', - 'home_url' => 'https://anytimeplayer.app/', - 'submit_url' => '', - ], - [ - 'slug' => 'breez', - 'type' => 'podcasting', - 'label' => 'Breez', - 'home_url' => 'https://breez.technology/', - 'submit_url' => '', - ], - [ - 'slug' => 'castamatic', - 'type' => 'podcasting', - 'label' => 'Castamatic', - 'home_url' => 'https://castamatic.com/', - 'submit_url' => '', - ], - [ - 'slug' => 'castcoverage', - 'type' => 'podcasting', - 'label' => 'CastCoverage', - 'home_url' => 'http://castcoverage.com/', - 'submit_url' => '', - ], - [ - 'slug' => 'curiocaster', - 'type' => 'podcasting', - 'label' => 'CurioCaster', - 'home_url' => 'https://curiocaster.com/', - 'submit_url' => '', - ], - [ - 'slug' => 'episodes-fm', - 'type' => 'podcasting', - 'label' => 'Episodes.fm', - 'home_url' => 'https://episodes.fm/', - 'submit_url' => 'https://podcastindex.org/add', - ], - [ - 'slug' => 'escapepod', - 'type' => 'podcasting', - 'label' => 'Escapepod', - 'home_url' => 'http://y20k.org/escapepod/', - 'submit_url' => '', - ], - [ - 'slug' => 'fountain', - 'type' => 'podcasting', - 'label' => 'Fountain', - 'home_url' => 'https://www.fountain.fm/', - 'submit_url' => '', - ], - [ - 'slug' => 'gpodder', - 'type' => 'podcasting', - 'label' => 'gPodder', - 'home_url' => 'https://gpodder.org/', - 'submit_url' => '', - ], - [ - 'slug' => 'hypercatcher', - 'type' => 'podcasting', - 'label' => 'HyperCatcher', - 'home_url' => 'https://hypercatcher.com/', - 'submit_url' => '', - ], - [ - 'slug' => 'ivyfm', - 'type' => 'podcasting', - 'label' => 'Ivy Podcast Discovery', - 'home_url' => 'https://ivy.fm/', - 'submit_url' => '', - ], - [ - 'slug' => 'jumplink', - 'type' => 'podcasting', - 'label' => 'JumpLink', - 'home_url' => 'https://jump.link/', - 'submit_url' => 'https://jump.link/a/accounts/signup/', - ], - [ - 'slug' => 'kasts', - 'type' => 'podcasting', - 'label' => 'Kasts', - 'home_url' => 'https://apps.kde.org/kasts/', - 'submit_url' => '', - ], - [ - 'slug' => 'playapod', - 'type' => 'podcasting', - 'label' => 'Playapod', - 'home_url' => 'https://playapod.com/', - 'submit_url' => '', - ], - [ - 'slug' => 'plink', - 'type' => 'podcasting', - 'label' => 'Plink', - 'home_url' => 'https://plinkhq.com/', - 'submit_url' => '', - ], - [ - 'slug' => 'podcastchapters', - 'type' => 'podcasting', - 'label' => 'Podcast Chapters', - 'home_url' => 'https://chaptersapp.com/', - 'submit_url' => '', - ], - [ - 'slug' => 'podcastguru', - 'type' => 'podcasting', - 'label' => 'Podcast Guru', - 'home_url' => 'https://podcastguru.io/', - 'submit_url' => 'https://podcastguru.io/promote-your-podcast/', - ], - [ - 'slug' => 'podlp', - 'type' => 'podcasting', - 'label' => 'PodLP', - 'home_url' => 'https://podlp.com/', - 'submit_url' => 'https://podlp.com/submit.html', - ], - [ - 'slug' => 'podnews', - 'type' => 'podcasting', - 'label' => 'Podnews', - 'home_url' => 'https://podnews.net/podcast/subscribe-pages', - 'submit_url' => '', - ], - [ - 'slug' => 'podstation', - 'type' => 'podcasting', - 'label' => 'podStation', - 'home_url' => 'https://podstation.github.io/', - 'submit_url' => '', - ], - [ - 'slug' => 'sphinxchat', - 'type' => 'podcasting', - 'label' => 'Sphinx', - 'home_url' => 'https://sphinx.chat/', - 'submit_url' => '', - ], - [ - 'slug' => 'truefans', - 'type' => 'podcasting', - 'label' => 'Truefans', - 'home_url' => 'https://truefans.fm/', - 'submit_url' => 'https://podcastindex.org/add', - ], - [ - 'slug' => 'tsacdop', - 'type' => 'podcasting', - 'label' => 'Tsacdop', - 'home_url' => 'https://www.tsacdop.app/', - 'submit_url' => '', - ], - [ - 'slug' => 'youtube-music', - 'type' => 'podcasting', + 'youtube-music' => [ 'label' => 'YouTube Music', 'home_url' => 'https://www.youtube.com/creators/podcasts/', 'submit_url' => 'https://studio.youtube.com/channel/content/podcasts', ], - ]; - - $fundingData = [ - [ - 'slug' => 'buymeacoffee', - 'type' => 'funding', - 'label' => 'Buy Me a Coffee', - 'home_url' => 'https://www.buymeacoffee.com/', - 'submit_url' => 'https://www.buymeacoffee.com/signup', + 'amazon' => [ + 'label' => 'Amazon Music', + 'home_url' => 'https://music.amazon.com/', + 'submit_url' => 'https://podcasters.amazon.com/', ], - [ - 'slug' => 'paypal', - 'type' => 'funding', - 'label' => 'PayPal', - 'home_url' => 'https://www.paypal.com/', - 'submit_url' => 'https://www.paypal.com/paypalme/my/grab', + 'antennapod' => [ + 'label' => 'AntennaPod', + 'home_url' => 'https://antennapod.org/', + 'submit_url' => 'https://antennapod.org/documentation/podcasters-hosters/add-on-antennapod', ], - [ - 'slug' => 'fosspay', - 'type' => 'funding', - 'label' => 'fosspay', - 'home_url' => 'https://git.sr.ht/~sircmpwn/fosspay', - 'submit_url' => '', + 'blubrry' => [ + 'label' => 'Blubrry', + 'home_url' => 'https://www.blubrry.com/', + 'submit_url' => 'https://www.blubrry.com/addpodcast.php', ], - [ - 'slug' => 'gofundme', - 'type' => 'funding', - 'label' => 'GoFundMe', - 'home_url' => 'https://www.gofundme.com/', - 'submit_url' => 'https://www.gofundme.com/sign-up', + 'castbox' => [ + 'label' => 'Castbox', + 'home_url' => 'https://castbox.fm/', + 'submit_url' => 'https://helpcenter.castbox.fm/portal/kb/articles/submit-my-podcast', ], - [ - 'slug' => 'helloasso', - 'type' => 'funding', - 'label' => 'HelloAsso', - 'home_url' => 'https://www.helloasso.com/', - 'submit_url' => 'https://auth.helloasso.com/inscription', + 'castopod' => [ + 'label' => 'Castopod', + 'home_url' => 'https://castopod.org/', + 'submit_url' => 'https://castopod.org/instances', ], - [ - 'slug' => 'indiegogo', - 'type' => 'funding', - 'label' => 'Indiegogo', - 'home_url' => 'https://www.indiegogo.com/', - 'submit_url' => 'https://www.indiegogo.com/start-a-campaign#/', + 'castro' => [ + 'label' => 'Castro', + 'home_url' => 'http://castro.fm/', + 'submit_url' => 'https://castro.fm/support/link-to-your-podcast-in-castro', ], - [ - 'slug' => 'kickstarter', - 'type' => 'funding', - 'label' => 'Kickstarter', - 'home_url' => 'https://www.kickstarter.com/', - 'submit_url' => 'https://www.kickstarter.com/learn', + 'deezer' => [ + 'label' => 'Deezer', + 'home_url' => 'https://www.deezer.com/', + 'submit_url' => 'https://podcasters.deezer.com/submission', ], - [ - 'slug' => 'kisskissbankbank', - 'type' => 'funding', - 'label' => 'KissKissBankBank', - 'home_url' => 'https://www.kisskissbankbank.com/', - 'submit_url' => 'https://www.kisskissbankbank.com/en/financer-mon-projet', + 'fyyd' => [ + 'label' => 'fyyd', + 'home_url' => 'https://fyyd.de/', + 'submit_url' => 'https://fyyd.de/add-feed', ], - [ - 'slug' => 'kofi', - 'type' => 'funding', - 'label' => 'Ko-fi', - 'home_url' => 'https://ko-fi.com/', - 'submit_url' => 'https://ko-fi.com/account/register', + 'ivoox' => [ + 'label' => 'Ivoox', + 'home_url' => 'https://www.ivoox.com/', + 'submit_url' => null, ], - [ - 'slug' => 'liberapay', - 'type' => 'funding', - 'label' => 'Liberapay', - 'home_url' => 'https://liberapay.com/', - 'submit_url' => 'https://liberapay.com/sign-up', + 'listennotes' => [ + 'label' => 'ListenNotes', + 'home_url' => 'https://www.listennotes.com/', + 'submit_url' => 'https://www.listennotes.com/submit/', ], - [ - 'slug' => 'patreon', - 'type' => 'funding', - 'label' => 'Patreon', - 'home_url' => 'https://www.patreon.com/', - 'submit_url' => 'https://www.patreon.com/create', + 'overcast' => [ + 'label' => 'Overcast', + 'home_url' => 'https://overcast.fm/', + 'submit_url' => 'https://overcast.fm/podcasterinfo', ], - [ - 'slug' => 'tipeee', - 'type' => 'funding', - 'label' => 'Tipeee', - 'home_url' => 'https://tipeee.com/', - 'submit_url' => 'https://tipeee.com/register/', + 'playerfm' => [ + 'label' => 'Player.Fm', + 'home_url' => 'https://player.fm/', + 'submit_url' => 'https://player.fm/importer/feed', ], - [ - 'slug' => 'ulule', - 'type' => 'funding', - 'label' => 'Ulule', - 'home_url' => 'https://www.ulule.com/', - 'submit_url' => 'https://www.ulule.com/projects/create/#/', + 'pocketcasts' => [ + 'label' => 'Pocketcasts', + 'home_url' => 'https://www.pocketcasts.com/', + 'submit_url' => 'https://www.pocketcasts.com/submit/', ], - [ - 'slug' => 'donorbox', - 'type' => 'funding', - 'label' => 'Donorbox', - 'home_url' => 'https://donorbox.org/', - 'submit_url' => 'https://donorbox.org/orgs/new', + 'podbean' => [ + 'label' => 'Podbean', + 'home_url' => 'https://www.podbean.com/', + 'submit_url' => 'https://www.podbean.com/site/submitPodcast', ], - ]; - - $socialData = [ - [ - 'slug' => 'bluesky', - 'type' => 'social', + 'podcastaddict' => [ + 'label' => 'Podcast Addict', + 'home_url' => 'https://podcastaddict.com/', + 'submit_url' => 'https://podcastaddict.com/submit', + ], + 'podchaser' => [ + 'label' => 'Podchaser', + 'home_url' => 'https://www.podchaser.com/', + 'submit_url' => 'https://www.podchaser.com/add', + ], + 'podcloud' => [ + 'label' => 'podCloud', + 'home_url' => 'https://podcloud.fr/', + 'submit_url' => 'https://podcloud.fr/studio/podcasts/new', + ], + 'podlink' => [ + 'label' => 'pod.link', + 'home_url' => 'https://pod.link/', + 'submit_url' => null, + ], + 'podtail' => [ + 'label' => 'Podtail', + 'home_url' => 'https://podtail.com/', + 'submit_url' => 'https://podtail.com/about/faq/', + ], + 'podfriend' => [ + 'label' => 'Podfriend', + 'home_url' => 'https://www.podfriend.com/', + 'submit_url' => 'https://podcastindex.org/add', + ], + 'podverse' => [ + 'label' => 'Podverse', + 'home_url' => 'https://podverse.fm/', + 'submit_url' => 'https://docs.google.com/forms/d/e/1FAIpQLSdewKP-YrE8zGjDPrkmoJEwCxPl_gizEkmzAlTYsiWAuAk1Ng/viewform', + ], + 'radiopublic' => [ + 'label' => 'RadioPublic', + 'home_url' => 'https://radiopublic.com/', + 'submit_url' => 'https://podcasters.radiopublic.com/signup', + ], + 'spreaker' => [ + 'label' => 'Spreaker', + 'home_url' => 'https://www.spreaker.com/', + 'submit_url' => 'https://www.spreaker.com/cms/shows/rss-import', + ], + 'tunein' => [ + 'label' => 'TuneIn', + 'home_url' => 'https://tunein.com/', + 'submit_url' => 'https://help.tunein.com/contact/add-podcast-S19TR3Sdf', + ], + 'anytime' => [ + 'label' => 'Anytime Podcast Player', + 'home_url' => 'https://anytimeplayer.app/', + 'submit_url' => null, + ], + 'breez' => [ + 'label' => 'Breez', + 'home_url' => 'https://breez.technology/', + 'submit_url' => null, + ], + 'castamatic' => [ + 'label' => 'Castamatic', + 'home_url' => 'https://castamatic.com/', + 'submit_url' => null, + ], + 'curiocaster' => [ + 'label' => 'CurioCaster', + 'home_url' => 'https://curiocaster.com/', + 'submit_url' => null, + ], + 'episodes-fm' => [ + 'label' => 'Episodes.fm', + 'home_url' => 'https://episodes.fm/', + 'submit_url' => 'https://podcastindex.org/add', + ], + 'fountain' => [ + 'label' => 'Fountain', + 'home_url' => 'https://www.fountain.fm/', + 'submit_url' => 'https://support.fountain.fm/article/56-how-to-claim-your-show-on-fountain', + ], + 'gpodder' => [ + 'label' => 'gPodder', + 'home_url' => 'https://gpodder.org/', + 'submit_url' => null, + ], + 'hypercatcher' => [ + 'label' => 'HyperCatcher', + 'home_url' => 'https://hypercatcher.com/', + 'submit_url' => null, + ], + 'ivyfm' => [ + 'label' => 'Ivy.fm', + 'home_url' => 'https://ivy.fm/', + 'submit_url' => null, + ], + 'jumplink' => [ + 'label' => 'JumpLink', + 'home_url' => 'https://jump.link/', + 'submit_url' => 'https://jump.link/a/accounts/signup/', + ], + 'kasts' => [ + 'label' => 'Kasts', + 'home_url' => 'https://apps.kde.org/kasts/', + 'submit_url' => null, + ], + 'playapod' => [ + 'label' => 'Playapod', + 'home_url' => 'https://playapod.com/', + 'submit_url' => null, + ], + 'plink' => [ + 'label' => 'Plink', + 'home_url' => 'https://plinkhq.com/', + 'submit_url' => null, + ], + 'podcastchapters' => [ + 'label' => 'Podcast Chapters', + 'home_url' => 'https://chaptersapp.com/', + 'submit_url' => null, + ], + 'podcastguru' => [ + 'label' => 'Podcast Guru', + 'home_url' => 'https://podcastguru.io/', + 'submit_url' => 'https://podcastguru.io/promote-your-podcast/', + ], + 'podlp' => [ + 'label' => 'PodLP', + 'home_url' => 'https://podlp.com/', + 'submit_url' => 'https://podlp.com/submit.html', + ], + 'podnews' => [ + 'label' => 'Podnews', + 'home_url' => 'https://podnews.net/', + 'submit_url' => 'https://podnews.net/podcast/subscribe-pages', + ], + 'podstation' => [ + 'label' => 'podStation', + 'home_url' => 'https://podstation.github.io/', + 'submit_url' => null, + ], + 'sphinxchat' => [ + 'label' => 'Sphinx', + 'home_url' => 'https://sphinx.chat/', + 'submit_url' => null, + ], + 'truefans' => [ + 'label' => 'Truefans', + 'home_url' => 'https://truefans.fm/', + 'submit_url' => 'https://podcastindex.org/add', + ], + 'tsacdop' => [ + 'label' => 'Tsacdop', + 'home_url' => 'https://www.tsacdop.app/', + 'submit_url' => null, + ], + ], + 'social' => [ + 'bluesky' => [ 'label' => 'Bluesky', 'home_url' => 'https://bsky.app/', 'submit_url' => 'https://bsky.app/', ], - [ - 'slug' => 'discord', - 'type' => 'social', + 'discord' => [ 'label' => 'Discord', 'home_url' => 'https://discord.com/', 'submit_url' => 'https://discord.com/register', ], - [ - 'slug' => 'facebook', - 'type' => 'social', + 'facebook' => [ 'label' => 'Facebook', 'home_url' => 'https://www.facebook.com/', - 'submit_url' => 'https://www.facebook.com/pages/creation/?ref_type=comet_home', + 'submit_url' => 'https://www.facebook.com/pages/creation/', ], - [ - 'slug' => 'funkwhale', - 'type' => 'social', + 'funkwhale' => [ 'label' => 'Funkwhale', 'home_url' => 'https://funkwhale.audio/', 'submit_url' => 'https://network.funkwhale.audio/dashboards/', ], - [ - 'slug' => 'instagram', - 'type' => 'social', + 'instagram' => [ 'label' => 'Instagram', 'home_url' => 'https://www.instagram.com/', 'submit_url' => 'https://www.instagram.com/accounts/emailsignup/', ], - [ - 'slug' => 'linkedin', - 'type' => 'social', + 'linkedin' => [ 'label' => 'LinkedIn', 'home_url' => 'https://www.linkedin.com/', 'submit_url' => 'https://www.linkedin.com/company/setup/new/', ], - [ - 'slug' => 'mastodon', - 'type' => 'social', + 'mastodon' => [ 'label' => 'Mastodon', 'home_url' => 'https://joinmastodon.org/', 'submit_url' => 'https://joinmastodon.org/communities', ], - [ - 'slug' => 'matrix', - 'type' => 'social', + 'matrix' => [ 'label' => 'Matrix', 'home_url' => 'https://matrix.org/', 'submit_url' => 'https://matrix.org/try-matrix/', ], - [ - 'slug' => 'misskey', - 'type' => 'social', + 'misskey' => [ 'label' => 'Misskey', 'home_url' => 'https://join.misskey.page/', 'submit_url' => 'https://join.misskey.page/en-US/instances', ], - [ - 'slug' => 'mobilizon', - 'type' => 'social', + 'mobilizon' => [ 'label' => 'Mobilizon', 'home_url' => 'https://joinmobilizon.org/', 'submit_url' => 'https://instances.joinmobilizon.org/instances', ], - [ - 'slug' => 'peertube', - 'type' => 'social', + 'peertube' => [ 'label' => 'PeerTube', 'home_url' => 'https://joinpeertube.org/', 'submit_url' => 'https://joinpeertube.org/instances', ], - [ - 'slug' => 'pixelfed', - 'type' => 'social', + 'pixelfed' => [ 'label' => 'Pixelfed', 'home_url' => 'https://pixelfed.org/', 'submit_url' => 'https://beta.joinpixelfed.org/', ], - [ - 'slug' => 'pleroma', - 'type' => 'social', + 'pleroma' => [ 'label' => 'Pleroma', 'home_url' => 'https://pleroma.social/', 'submit_url' => 'https://pleroma.social/#featured-instances', ], - [ - 'slug' => 'plume', - 'type' => 'social', + 'plume' => [ 'label' => 'Plume', 'home_url' => 'https://joinplu.me/', 'submit_url' => 'https://joinplu.me/#instances', ], - [ - 'slug' => 'slack', - 'type' => 'social', + 'slack' => [ 'label' => 'Slack', 'home_url' => 'https://slack.com/', 'submit_url' => 'https://slack.com/get-started#/create', ], - [ - 'slug' => 'telegram', - 'type' => 'social', + 'telegram' => [ 'label' => 'Telegram', 'home_url' => 'https://www.telegram.org/', - 'submit_url' => '', + 'submit_url' => null, ], - [ - 'slug' => 'threads', - 'type' => 'social', + 'threads' => [ 'label' => 'Threads', 'home_url' => 'https://www.threads.net/', 'submit_url' => 'https://www.threads.net/login', ], - [ - 'slug' => 'tiktok', - 'type' => 'social', + 'tiktok' => [ 'label' => 'TikTok', 'home_url' => 'https://www.tiktok.com/', 'submit_url' => 'https://www.tiktok.com/signup', ], - [ - 'slug' => 'twitch', - 'type' => 'social', + 'twitch' => [ 'label' => 'Twitch', 'home_url' => 'https://www.twitch.tv/', 'submit_url' => 'https://www.twitch.tv/signup', ], - [ - 'slug' => 'writefreely', - 'type' => 'social', + 'writefreely' => [ 'label' => 'WriteFreely', 'home_url' => 'https://writefreely.org/', 'submit_url' => 'https://writefreely.org/instances', ], - [ - 'slug' => 'youtube', - 'type' => 'social', + 'youtube' => [ 'label' => 'YouTube', 'home_url' => 'https://www.youtube.com/', 'submit_url' => 'https://studio.youtube.com/', ], - [ - 'slug' => 'x', - 'type' => 'social', - 'label' => 'X', + 'x' => [ + 'label' => 'Twitter / X', 'home_url' => 'https://x.com/', 'submit_url' => 'https://x.com/i/flow/signup', ], - ]; + ], + 'funding' => [ + 'buymeacoffee' => [ + 'label' => 'Buy Me a Coffee', + 'home_url' => 'https://www.buymeacoffee.com/', + 'submit_url' => 'https://www.buymeacoffee.com/signup', + ], + 'paypal' => [ + 'label' => 'PayPal', + 'home_url' => 'https://www.paypal.com/', + 'submit_url' => 'https://www.paypal.com/paypalme/my/grab', + ], + 'fosspay' => [ + 'label' => 'fosspay', + 'home_url' => 'https://git.sr.ht/~sircmpwn/fosspay', + 'submit_url' => null, + ], + 'gofundme' => [ + 'label' => 'GoFundMe', + 'home_url' => 'https://www.gofundme.com/', + 'submit_url' => 'https://www.gofundme.com/sign-up', + ], + 'helloasso' => [ + 'label' => 'HelloAsso', + 'home_url' => 'https://www.helloasso.com/', + 'submit_url' => 'https://auth.helloasso.com/inscription', + ], + 'indiegogo' => [ + 'label' => 'Indiegogo', + 'home_url' => 'https://www.indiegogo.com/', + 'submit_url' => 'https://www.indiegogo.com/start-a-campaign#/', + ], + 'kickstarter' => [ + 'label' => 'Kickstarter', + 'home_url' => 'https://www.kickstarter.com/', + 'submit_url' => 'https://www.kickstarter.com/learn', + ], + 'kisskissbankbank' => [ + 'label' => 'KissKissBankBank', + 'home_url' => 'https://www.kisskissbankbank.com/', + 'submit_url' => 'https://www.kisskissbankbank.com/en/financer-mon-projet', + ], + 'kofi' => [ + 'label' => 'Ko-fi', + 'home_url' => 'https://ko-fi.com/', + 'submit_url' => 'https://ko-fi.com/account/register', + ], + 'liberapay' => [ + 'label' => 'Liberapay', + 'home_url' => 'https://liberapay.com/', + 'submit_url' => 'https://liberapay.com/sign-up', + ], + 'patreon' => [ + 'label' => 'Patreon', + 'home_url' => 'https://www.patreon.com/', + 'submit_url' => 'https://www.patreon.com/create', + ], + 'tipeee' => [ + 'label' => 'Tipeee', + 'home_url' => 'https://tipeee.com/', + 'submit_url' => 'https://tipeee.com/register/', + ], + 'ulule' => [ + 'label' => 'Ulule', + 'home_url' => 'https://www.ulule.com/', + 'submit_url' => 'https://www.ulule.com/projects/create/#/', + ], + 'donorbox' => [ + 'label' => 'Donorbox', + 'home_url' => 'https://donorbox.org/', + 'submit_url' => 'https://donorbox.org/orgs/new', + ], + ], + ]; - $data = [...$podcastingData, ...$fundingData, ...$socialData]; - $this->db - ->table('platforms') - ->ignore(true) - ->insertBatch($data); + /** + * @return array + */ + public function getPlatformsByType(string $type): array + { + return self::DATA[$type] ?? []; + } + + /** + * @return null|array{label:string,home_url:string,submit_url:?string}> + */ + public function findPlatformBySlug(string $type, string $slug): ?array + { + $data = self::DATA[$type] ?? []; + + if (! array_key_exists($slug, $data)) { + return null; + } + + return $data[$slug]; } } diff --git a/modules/PodcastImport/Commands/PodcastImport.php b/modules/PodcastImport/Commands/PodcastImport.php index 36c3d0bb..a71334f6 100644 --- a/modules/PodcastImport/Commands/PodcastImport.php +++ b/modules/PodcastImport/Commands/PodcastImport.php @@ -8,11 +8,9 @@ use AdAures\PodcastPersonsTaxonomy\ReversedTaxonomy; use App\Entities\Episode; use App\Entities\Location; use App\Entities\Person; -use App\Entities\Platform; use App\Entities\Podcast; use App\Models\EpisodeModel; use App\Models\PersonModel; -use App\Models\PlatformModel; use App\Models\PodcastModel; use CodeIgniter\CLI\BaseCommand; use CodeIgniter\CLI\CLI; @@ -23,6 +21,8 @@ use Exception; use League\HTMLToMarkdown\HtmlConverter; use Modules\Auth\Config\AuthGroups; use Modules\Auth\Models\UserModel; +use Modules\Platforms\Models\PlatformModel; +use Modules\Platforms\Platforms; use Modules\PodcastImport\Entities\PodcastImportTask; use Modules\PodcastImport\Entities\TaskStatus; use PodcastFeed\PodcastFeed; @@ -392,27 +392,32 @@ class PodcastImport extends BaseCommand ], ]; + $platforms = new Platforms(); $platformModel = new PlatformModel(); foreach ($platformTypes as $platformType) { - $podcastsPlatformsData = []; + $platformsData = []; $currPlatformStep = 1; // for progress CLI::write($platformType['name'] . ' - ' . $platformType['count'] . ' elements'); foreach ($platformType['elements'] as $platform) { CLI::showProgress($currPlatformStep++, $platformType['count']); - $platformLabel = $platform->getAttribute('platform'); - $platformSlug = slugify((string) $platformLabel); - if ($platformModel->getPlatform($platformSlug) instanceof Platform) { - $podcastsPlatformsData[] = [ - 'platform_slug' => $platformSlug, - 'podcast_id' => $this->podcast->id, - 'link_url' => $platform->getAttribute($platformType['account_url_key']), - 'account_id' => $platform->getAttribute($platformType['account_id_key']), - 'is_visible' => false, - ]; + $platformSlug = $platform->getAttribute('platform'); + $platformData = $platforms->findPlatformBySlug($platformType['name'], $platformSlug); + + if ($platformData === null) { + continue; } + + $platformsData[] = [ + 'podcast_id' => $this->podcast->id, + 'type' => $platformType['name'], + 'slug' => $platformSlug, + 'link_url' => $platform->getAttribute($platformType['account_url_key']), + 'account_id' => $platform->getAttribute($platformType['account_id_key']), + 'is_visible' => false, + ]; } - $platformModel->savePodcastPlatforms($this->podcast->id, $platformType['name'], $podcastsPlatformsData); + $platformModel->savePlatforms($this->podcast->id, $platformType['name'], $platformsData); CLI::showProgress(false); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c66247b..4687f72d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,237 +1,9169 @@ -lockfileVersion: "6.0" +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - "@amcharts/amcharts4": - specifier: ^4.10.38 - version: 4.10.38 - "@amcharts/amcharts4-geodata": - specifier: ^4.1.28 - version: 4.1.28 - "@codemirror/commands": - specifier: ^6.3.3 - version: 6.3.3 - "@codemirror/lang-xml": - specifier: ^6.0.2 - version: 6.0.2(@codemirror/view@6.24.1) - "@codemirror/language": - specifier: ^6.10.1 - version: 6.10.1 - "@codemirror/state": - specifier: ^6.4.1 - version: 6.4.1 - "@codemirror/view": - specifier: ^6.24.1 - version: 6.24.1 - "@floating-ui/dom": - specifier: ^1.6.3 - version: 1.6.3 - "@github/clipboard-copy-element": - specifier: ^1.3.0 - version: 1.3.0 - "@github/hotkey": - specifier: ^3.1.0 - version: 3.1.0 - "@github/markdown-toolbar-element": - specifier: ^2.2.1 - version: 2.2.1 - "@github/relative-time-element": - specifier: ^4.3.1 - version: 4.3.1 - "@tailwindcss/nesting": - specifier: 0.0.0-insiders.565cd3e - version: 0.0.0-insiders.565cd3e(postcss@8.4.35) - "@vime/core": - specifier: ^5.4.1 - version: 5.4.1 - choices.js: - specifier: ^10.2.0 - version: 10.2.0 - codemirror: - specifier: ^6.0.1 - version: 6.0.1(@lezer/common@1.2.0) - flatpickr: - specifier: ^4.6.13 - version: 4.6.13 - leaflet: - specifier: ^1.9.4 - version: 1.9.4 - leaflet.markercluster: - specifier: ^1.5.3 - version: 1.5.3(leaflet@1.9.4) - lit: - specifier: ^3.1.2 - version: 3.1.2 - marked: - specifier: ^12.0.0 - version: 12.0.0 - wavesurfer.js: - specifier: ^7.7.3 - version: 7.7.3 - xml-formatter: - specifier: ^3.6.2 - version: 3.6.2 - -devDependencies: - "@commitlint/cli": - specifier: ^19.0.3 - version: 19.0.3(@types/node@20.10.5)(typescript@5.3.3) - "@commitlint/config-conventional": - specifier: ^19.0.3 - version: 19.0.3 - "@csstools/css-tokenizer": - specifier: ^2.2.3 - version: 2.2.3 - "@semantic-release/changelog": - specifier: ^6.0.3 - version: 6.0.3(semantic-release@23.0.2) - "@semantic-release/exec": - specifier: ^6.0.3 - version: 6.0.3(semantic-release@23.0.2) - "@semantic-release/git": - specifier: ^10.0.1 - version: 10.0.1(semantic-release@23.0.2) - "@semantic-release/gitlab": - specifier: ^13.0.3 - version: 13.0.3(semantic-release@23.0.2) - "@tailwindcss/forms": - specifier: ^0.5.7 - version: 0.5.7(tailwindcss@3.4.1) - "@tailwindcss/typography": - specifier: ^0.5.10 - version: 0.5.10(tailwindcss@3.4.1) - "@types/leaflet": - specifier: ^1.9.8 - version: 1.9.8 - "@typescript-eslint/eslint-plugin": - specifier: ^7.1.0 - version: 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) - "@typescript-eslint/parser": - specifier: ^7.1.0 - version: 7.1.0(eslint@8.57.0)(typescript@5.3.3) - all-contributors-cli: - specifier: ^6.26.1 - version: 6.26.1 - commitizen: - specifier: ^4.3.0 - version: 4.3.0(@types/node@20.10.5)(typescript@5.3.3) - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - cssnano: - specifier: ^6.0.3 - version: 6.0.3(postcss@8.4.35) - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@20.10.5)(typescript@5.3.3) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-prettier: - specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) - husky: - specifier: ^9.0.11 - version: 9.0.11 - is-ci: - specifier: ^3.0.1 - version: 3.0.1 - lint-staged: - specifier: ^15.2.2 - version: 15.2.2 - postcss: - specifier: ^8.4.35 - version: 8.4.35 - postcss-import: - specifier: ^16.0.1 - version: 16.0.1(postcss@8.4.35) - postcss-nesting: - specifier: ^12.0.4 - version: 12.0.4(postcss@8.4.35) - postcss-preset-env: - specifier: ^9.4.0 - version: 9.4.0(postcss@8.4.35) - postcss-reporter: - specifier: ^7.1.0 - version: 7.1.0(postcss@8.4.35) - prettier: - specifier: 3.2.5 - version: 3.2.5 - prettier-plugin-organize-imports: - specifier: ^3.2.4 - version: 3.2.4(prettier@3.2.5)(typescript@5.3.3) - semantic-release: - specifier: ^23.0.2 - version: 23.0.2(typescript@5.3.3) - stylelint: - specifier: ^16.2.1 - version: 16.2.1(typescript@5.3.3) - stylelint-config-standard: - specifier: ^36.0.0 - version: 36.0.0(stylelint@16.2.1) - svgo: - specifier: ^3.2.0 - version: 3.2.0 - tailwindcss: - specifier: ^3.4.1 - version: 3.4.1 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - vite: - specifier: ^5.1.4 - version: 5.1.4(@types/node@20.10.5) - vite-plugin-pwa: - specifier: ^0.19.2 - version: 0.19.2(vite@5.1.4)(workbox-build@7.0.0)(workbox-window@7.0.0) - workbox-build: - specifier: ^7.0.0 - version: 7.0.0 - workbox-core: - specifier: ^7.0.0 - version: 7.0.0 - workbox-routing: - specifier: ^7.0.0 - version: 7.0.0 - workbox-strategies: - specifier: ^7.0.0 - version: 7.0.0 +importers: + .: + dependencies: + "@amcharts/amcharts4": + specifier: ^4.10.38 + version: 4.10.38 + "@amcharts/amcharts4-geodata": + specifier: ^4.1.28 + version: 4.1.28 + "@codemirror/commands": + specifier: ^6.3.3 + version: 6.3.3 + "@codemirror/lang-xml": + specifier: ^6.0.2 + version: 6.0.2(@codemirror/view@6.24.1) + "@codemirror/language": + specifier: ^6.10.1 + version: 6.10.1 + "@codemirror/state": + specifier: ^6.4.1 + version: 6.4.1 + "@codemirror/view": + specifier: ^6.24.1 + version: 6.24.1 + "@floating-ui/dom": + specifier: ^1.6.3 + version: 1.6.3 + "@github/clipboard-copy-element": + specifier: ^1.3.0 + version: 1.3.0 + "@github/hotkey": + specifier: ^3.1.0 + version: 3.1.0 + "@github/markdown-toolbar-element": + specifier: ^2.2.1 + version: 2.2.1 + "@github/relative-time-element": + specifier: ^4.3.1 + version: 4.3.1 + "@tailwindcss/nesting": + specifier: 0.0.0-insiders.565cd3e + version: 0.0.0-insiders.565cd3e(postcss@8.4.35) + "@vime/core": + specifier: ^5.4.1 + version: 5.4.1 + choices.js: + specifier: ^10.2.0 + version: 10.2.0 + codemirror: + specifier: ^6.0.1 + version: 6.0.1(@lezer/common@1.2.0) + flatpickr: + specifier: ^4.6.13 + version: 4.6.13 + leaflet: + specifier: ^1.9.4 + version: 1.9.4 + leaflet.markercluster: + specifier: ^1.5.3 + version: 1.5.3(leaflet@1.9.4) + lit: + specifier: ^3.1.2 + version: 3.1.2 + marked: + specifier: ^12.0.0 + version: 12.0.0 + wavesurfer.js: + specifier: ^7.7.3 + version: 7.7.3 + xml-formatter: + specifier: ^3.6.2 + version: 3.6.2 + devDependencies: + "@commitlint/cli": + specifier: ^19.0.3 + version: 19.0.3(@types/node@20.10.5)(typescript@5.3.3) + "@commitlint/config-conventional": + specifier: ^19.0.3 + version: 19.0.3 + "@csstools/css-tokenizer": + specifier: ^2.2.3 + version: 2.2.3 + "@semantic-release/changelog": + specifier: ^6.0.3 + version: 6.0.3(semantic-release@23.0.2) + "@semantic-release/exec": + specifier: ^6.0.3 + version: 6.0.3(semantic-release@23.0.2) + "@semantic-release/git": + specifier: ^10.0.1 + version: 10.0.1(semantic-release@23.0.2) + "@semantic-release/gitlab": + specifier: ^13.0.3 + version: 13.0.3(semantic-release@23.0.2) + "@tailwindcss/forms": + specifier: ^0.5.7 + version: 0.5.7(tailwindcss@3.4.1) + "@tailwindcss/typography": + specifier: ^0.5.10 + version: 0.5.10(tailwindcss@3.4.1) + "@types/leaflet": + specifier: ^1.9.8 + version: 1.9.8 + "@typescript-eslint/eslint-plugin": + specifier: ^7.1.0 + version: 7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3) + "@typescript-eslint/parser": + specifier: ^7.1.0 + version: 7.1.0(eslint@8.57.0)(typescript@5.3.3) + all-contributors-cli: + specifier: ^6.26.1 + version: 6.26.1 + commitizen: + specifier: ^4.3.0 + version: 4.3.0(@types/node@20.10.5)(typescript@5.3.3) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cssnano: + specifier: ^6.0.3 + version: 6.0.3(postcss@8.4.35) + cz-conventional-changelog: + specifier: ^3.3.0 + version: 3.3.0(@types/node@20.10.5)(typescript@5.3.3) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) + husky: + specifier: ^9.0.11 + version: 9.0.11 + is-ci: + specifier: ^3.0.1 + version: 3.0.1 + lint-staged: + specifier: ^15.2.2 + version: 15.2.2 + postcss: + specifier: ^8.4.35 + version: 8.4.35 + postcss-import: + specifier: ^16.0.1 + version: 16.0.1(postcss@8.4.35) + postcss-nesting: + specifier: ^12.0.4 + version: 12.0.4(postcss@8.4.35) + postcss-preset-env: + specifier: ^9.4.0 + version: 9.4.0(postcss@8.4.35) + postcss-reporter: + specifier: ^7.1.0 + version: 7.1.0(postcss@8.4.35) + prettier: + specifier: 3.2.5 + version: 3.2.5 + prettier-plugin-organize-imports: + specifier: ^3.2.4 + version: 3.2.4(prettier@3.2.5)(typescript@5.3.3) + semantic-release: + specifier: ^23.0.2 + version: 23.0.2(typescript@5.3.3) + stylelint: + specifier: ^16.2.1 + version: 16.2.1(typescript@5.3.3) + stylelint-config-standard: + specifier: ^36.0.0 + version: 36.0.0(stylelint@16.2.1) + svgo: + specifier: ^3.2.0 + version: 3.2.0 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.1 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + vite: + specifier: ^5.1.4 + version: 5.1.4(@types/node@20.10.5) + vite-plugin-pwa: + specifier: ^0.19.2 + version: 0.19.2(vite@5.1.4)(workbox-build@7.0.0)(workbox-window@7.0.0) + workbox-build: + specifier: ^7.0.0 + version: 7.0.0 + workbox-core: + specifier: ^7.0.0 + version: 7.0.0 + workbox-routing: + specifier: ^7.0.0 + version: 7.0.0 + workbox-strategies: + specifier: ^7.0.0 + version: 7.0.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: + "@aashutoshrathi/word-wrap@1.2.6": resolution: { integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, } engines: { node: ">=0.10.0" } - dev: true - /@alloc/quick-lru@5.2.0: + "@alloc/quick-lru@5.2.0": resolution: { integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, } engines: { node: ">=10" } - dev: true - /@amcharts/amcharts4-geodata@4.1.28: + "@amcharts/amcharts4-geodata@4.1.28": resolution: { integrity: sha512-qJ113Zlxava1lyL+F5G+PRDRqF4clA+oUKcBS1jvtU0oqUgAKsdg3sanfO1mwsJyM1xeBuRnkMr+mM6uoMD3wQ==, } - dev: false - /@amcharts/amcharts4@4.10.38: + "@amcharts/amcharts4@4.10.38": resolution: { integrity: sha512-mX1MYvXCU/wMr6q1WQRVRS1qAbxyiYBfkkdC2ZpT+0uKYIWVUHo+phtbRgAE9t/3ymfWiDEZ813lcAtbokMf3w==, } + + "@ampproject/remapping@2.2.1": + resolution: + { + integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, + } + engines: { node: ">=6.0.0" } + + "@apideck/better-ajv-errors@0.3.6": + resolution: + { + integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==, + } + engines: { node: ">=10" } + peerDependencies: + ajv: ">=8" + + "@babel/code-frame@7.23.5": + resolution: + { + integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==, + } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.23.5": + resolution: + { + integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==, + } + engines: { node: ">=6.9.0" } + + "@babel/core@7.23.6": + resolution: + { + integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==, + } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.23.6": + resolution: + { + integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-annotate-as-pure@7.22.5": + resolution: + { + integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-builder-binary-assignment-operator-visitor@7.22.15": + resolution: + { + integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.23.6": + resolution: + { + integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-create-class-features-plugin@7.23.6": + resolution: + { + integrity: sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-create-regexp-features-plugin@7.22.15": + resolution: + { + integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-define-polyfill-provider@0.4.4": + resolution: + { + integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==, + } + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + + "@babel/helper-environment-visitor@7.22.20": + resolution: + { + integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-function-name@7.23.0": + resolution: + { + integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-hoist-variables@7.22.5": + resolution: + { + integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-member-expression-to-functions@7.23.0": + resolution: + { + integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.22.15": + resolution: + { + integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.23.3": + resolution: + { + integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-optimise-call-expression@7.22.5": + resolution: + { + integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-plugin-utils@7.22.5": + resolution: + { + integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-remap-async-to-generator@7.22.20": + resolution: + { + integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-replace-supers@7.22.20": + resolution: + { + integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-simple-access@7.22.5": + resolution: + { + integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-skip-transparent-expression-wrappers@7.22.5": + resolution: + { + integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-split-export-declaration@7.22.6": + resolution: + { + integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.23.4": + resolution: + { + integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.22.20": + resolution: + { + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.23.5": + resolution: + { + integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-wrap-function@7.22.20": + resolution: + { + integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.23.6": + resolution: + { + integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==, + } + engines: { node: ">=6.9.0" } + + "@babel/highlight@7.23.4": + resolution: + { + integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.23.6": + resolution: + { + integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, + } + engines: { node: ">=6.0.0" } + hasBin: true + + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3": + resolution: + { + integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3": + resolution: + { + integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.13.0 + + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3": + resolution: + { + integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + resolution: + { + integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-async-generators@7.8.4": + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-class-properties@7.12.13": + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-class-static-block@7.14.5": + resolution: + { + integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-dynamic-import@7.8.3": + resolution: + { + integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-export-namespace-from@7.8.3": + resolution: + { + integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-import-assertions@7.23.3": + resolution: + { + integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-import-attributes@7.23.3": + resolution: + { + integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-import-meta@7.10.4": + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-json-strings@7.8.3": + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-logical-assignment-operators@7.10.4": + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3": + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-numeric-separator@7.10.4": + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-object-rest-spread@7.8.3": + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-optional-catch-binding@7.8.3": + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-optional-chaining@7.8.3": + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-private-property-in-object@7.14.5": + resolution: + { + integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-top-level-await@7.14.5": + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-unicode-sets-regex@7.18.6": + resolution: + { + integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/plugin-transform-arrow-functions@7.23.3": + resolution: + { + integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-async-generator-functions@7.23.4": + resolution: + { + integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-async-to-generator@7.23.3": + resolution: + { + integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-block-scoped-functions@7.23.3": + resolution: + { + integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-block-scoping@7.23.4": + resolution: + { + integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-class-properties@7.23.3": + resolution: + { + integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-class-static-block@7.23.4": + resolution: + { + integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.12.0 + + "@babel/plugin-transform-classes@7.23.5": + resolution: + { + integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-computed-properties@7.23.3": + resolution: + { + integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-destructuring@7.23.3": + resolution: + { + integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-dotall-regex@7.23.3": + resolution: + { + integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-duplicate-keys@7.23.3": + resolution: + { + integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-dynamic-import@7.23.4": + resolution: + { + integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-exponentiation-operator@7.23.3": + resolution: + { + integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-export-namespace-from@7.23.4": + resolution: + { + integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-for-of@7.23.6": + resolution: + { + integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-function-name@7.23.3": + resolution: + { + integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-json-strings@7.23.4": + resolution: + { + integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-literals@7.23.3": + resolution: + { + integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-logical-assignment-operators@7.23.4": + resolution: + { + integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-member-expression-literals@7.23.3": + resolution: + { + integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-modules-amd@7.23.3": + resolution: + { + integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-modules-commonjs@7.23.3": + resolution: + { + integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-modules-systemjs@7.23.3": + resolution: + { + integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-modules-umd@7.23.3": + resolution: + { + integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-named-capturing-groups-regex@7.22.5": + resolution: + { + integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/plugin-transform-new-target@7.23.3": + resolution: + { + integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-nullish-coalescing-operator@7.23.4": + resolution: + { + integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-numeric-separator@7.23.4": + resolution: + { + integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-object-rest-spread@7.23.4": + resolution: + { + integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-object-super@7.23.3": + resolution: + { + integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-optional-catch-binding@7.23.4": + resolution: + { + integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-optional-chaining@7.23.4": + resolution: + { + integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-parameters@7.23.3": + resolution: + { + integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-private-methods@7.23.3": + resolution: + { + integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-private-property-in-object@7.23.4": + resolution: + { + integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-property-literals@7.23.3": + resolution: + { + integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-regenerator@7.23.3": + resolution: + { + integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-reserved-words@7.23.3": + resolution: + { + integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-shorthand-properties@7.23.3": + resolution: + { + integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-spread@7.23.3": + resolution: + { + integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-sticky-regex@7.23.3": + resolution: + { + integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-template-literals@7.23.3": + resolution: + { + integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-typeof-symbol@7.23.3": + resolution: + { + integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-unicode-escapes@7.23.3": + resolution: + { + integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-unicode-property-regex@7.23.3": + resolution: + { + integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-unicode-regex@7.23.3": + resolution: + { + integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-unicode-sets-regex@7.23.3": + resolution: + { + integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/preset-env@7.23.6": + resolution: + { + integrity: sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/preset-modules@0.1.6-no-external-plugins": + resolution: + { + integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + "@babel/regjsgen@0.8.0": + resolution: + { + integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==, + } + + "@babel/runtime@7.23.6": + resolution: + { + integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/template@7.22.15": + resolution: + { + integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, + } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.23.6": + resolution: + { + integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.23.6": + resolution: + { + integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, + } + engines: { node: ">=6.9.0" } + + "@codemirror/autocomplete@6.11.1": + resolution: + { + integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==, + } + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + + "@codemirror/commands@6.3.3": + resolution: + { + integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, + } + + "@codemirror/lang-xml@6.0.2": + resolution: + { + integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, + } + + "@codemirror/language@6.10.1": + resolution: + { + integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==, + } + + "@codemirror/lint@6.4.2": + resolution: + { + integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, + } + + "@codemirror/search@6.5.5": + resolution: + { + integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, + } + + "@codemirror/state@6.4.1": + resolution: + { + integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==, + } + + "@codemirror/view@6.24.1": + resolution: + { + integrity: sha512-sBfP4rniPBRQzNakwuQEqjEuiJDWJyF2kqLLqij4WXRoVwPPJfjx966Eq3F7+OPQxDtMt/Q9MWLoZLWjeveBlg==, + } + + "@colors/colors@1.5.0": + resolution: + { + integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, + } + engines: { node: ">=0.1.90" } + + "@commitlint/cli@19.0.3": + resolution: + { + integrity: sha512-mGhh/aYPib4Vy4h+AGRloMY+CqkmtdeKPV9poMcZeImF5e3knQ5VYaSeAM0mEzps1dbKsHvABwaDpafLUuM96g==, + } + engines: { node: ">=v18" } + hasBin: true + + "@commitlint/config-conventional@19.0.3": + resolution: + { + integrity: sha512-vh0L8XeLaEzTe8VCxSd0gAFvfTK0RFolrzw4o431bIuWJfi/yRCHJlsDwus7wW2eJaFFDR0VFXJyjGyDQhi4vA==, + } + engines: { node: ">=v18" } + + "@commitlint/config-validator@18.6.1": + resolution: + { + integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==, + } + engines: { node: ">=v18" } + + "@commitlint/config-validator@19.0.3": + resolution: + { + integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==, + } + engines: { node: ">=v18" } + + "@commitlint/ensure@19.0.3": + resolution: + { + integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==, + } + engines: { node: ">=v18" } + + "@commitlint/execute-rule@18.6.1": + resolution: + { + integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==, + } + engines: { node: ">=v18" } + + "@commitlint/execute-rule@19.0.0": + resolution: + { + integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==, + } + engines: { node: ">=v18" } + + "@commitlint/format@19.0.3": + resolution: + { + integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==, + } + engines: { node: ">=v18" } + + "@commitlint/is-ignored@19.0.3": + resolution: + { + integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==, + } + engines: { node: ">=v18" } + + "@commitlint/lint@19.0.3": + resolution: + { + integrity: sha512-uHPyRqIn57iIplYa5xBr6oNu5aPXKGC4WLeuHfqQHclwIqbJ33g3yA5fIA+/NYnp5ZM2EFiujqHFaVUYj6HlKA==, + } + engines: { node: ">=v18" } + + "@commitlint/load@18.6.1": + resolution: + { + integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==, + } + engines: { node: ">=v18" } + + "@commitlint/load@19.0.3": + resolution: + { + integrity: sha512-18Tk/ZcDFRKIoKfEcl7kC+bYkEQ055iyKmGsYDoYWpKf6FUvBrP9bIWapuy/MB+kYiltmP9ITiUx6UXtqC9IRw==, + } + engines: { node: ">=v18" } + + "@commitlint/message@19.0.0": + resolution: + { + integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==, + } + engines: { node: ">=v18" } + + "@commitlint/parse@19.0.3": + resolution: + { + integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==, + } + engines: { node: ">=v18" } + + "@commitlint/read@19.0.3": + resolution: + { + integrity: sha512-b5AflTyAXkUx5qKw4TkjjcOccXZHql3JqMi522knTQktq2AubKXFz60Sws+K4FsefwPws6fGz9mqiI/NvsvxFA==, + } + engines: { node: ">=v18" } + + "@commitlint/resolve-extends@18.6.1": + resolution: + { + integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==, + } + engines: { node: ">=v18" } + + "@commitlint/resolve-extends@19.0.3": + resolution: + { + integrity: sha512-18BKmta8OC8+Ub+Q3QGM9l27VjQaXobloVXOrMvu8CpEwJYv62vC/t7Ka5kJnsW0tU9q1eMqJFZ/nN9T/cOaIA==, + } + engines: { node: ">=v18" } + + "@commitlint/rules@19.0.3": + resolution: + { + integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==, + } + engines: { node: ">=v18" } + + "@commitlint/to-lines@19.0.0": + resolution: + { + integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==, + } + engines: { node: ">=v18" } + + "@commitlint/top-level@19.0.0": + resolution: + { + integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==, + } + engines: { node: ">=v18" } + + "@commitlint/types@18.6.1": + resolution: + { + integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==, + } + engines: { node: ">=v18" } + + "@commitlint/types@19.0.3": + resolution: + { + integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==, + } + engines: { node: ">=v18" } + + "@csstools/cascade-layer-name-parser@1.0.8": + resolution: + { + integrity: sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.0 + "@csstools/css-tokenizer": ^2.2.3 + + "@csstools/color-helpers@4.0.0": + resolution: + { + integrity: sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w==, + } + engines: { node: ^14 || ^16 || >=18 } + + "@csstools/css-calc@1.1.7": + resolution: + { + integrity: sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.0 + "@csstools/css-tokenizer": ^2.2.3 + + "@csstools/css-color-parser@1.5.2": + resolution: + { + integrity: sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.0 + "@csstools/css-tokenizer": ^2.2.3 + + "@csstools/css-parser-algorithms@2.5.0": + resolution: + { + integrity: sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-tokenizer": ^2.2.3 + + "@csstools/css-parser-algorithms@2.6.0": + resolution: + { + integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-tokenizer": ^2.2.3 + + "@csstools/css-tokenizer@2.2.3": + resolution: + { + integrity: sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==, + } + engines: { node: ^14 || ^16 || >=18 } + + "@csstools/media-query-list-parser@2.1.7": + resolution: + { + integrity: sha512-lHPKJDkPUECsyAvD60joYfDmp8UERYxHGkFfyLJFTVK/ERJe0sVlIFLXU5XFxdjNDTerp5L4KeaKG+Z5S94qxQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.5.0 + "@csstools/css-tokenizer": ^2.2.3 + + "@csstools/media-query-list-parser@2.1.8": + resolution: + { + integrity: sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.0 + "@csstools/css-tokenizer": ^2.2.3 + + "@csstools/postcss-cascade-layers@4.0.3": + resolution: + { + integrity: sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-color-function@3.0.10": + resolution: + { + integrity: sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-color-mix-function@2.0.10": + resolution: + { + integrity: sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-exponential-functions@1.0.4": + resolution: + { + integrity: sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-font-format-keywords@3.0.2": + resolution: + { + integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-gamut-mapping@1.0.3": + resolution: + { + integrity: sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-gradients-interpolation-method@4.0.11": + resolution: + { + integrity: sha512-LFom5jCVUfzF+iuiOZvhvX7RRN8vc+tKpcKo9s4keEBAU2mPwV5/Fgz5iylEfXP/DZbEdq2C0At20urMi/lupw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-hwb-function@3.0.9": + resolution: + { + integrity: sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-ic-unit@3.0.4": + resolution: + { + integrity: sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-initial@1.0.1": + resolution: + { + integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-is-pseudo-class@4.0.5": + resolution: + { + integrity: sha512-qG3MI7IN3KY9UwdaE9E7G7sFydscVW7nAj5OGwaBP9tQPEEVdxXTGI+l1ZW5EUpZFSj+u3q/22fH5+8HI72+Bg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-light-dark-function@1.0.0": + resolution: + { + integrity: sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-float-and-clear@2.0.1": + resolution: + { + integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-overflow@1.0.1": + resolution: + { + integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-overscroll-behavior@1.0.1": + resolution: + { + integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-resize@2.0.1": + resolution: + { + integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-viewport-units@2.0.6": + resolution: + { + integrity: sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-media-minmax@1.1.3": + resolution: + { + integrity: sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.6": + resolution: + { + integrity: sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-nested-calc@3.0.2": + resolution: + { + integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-normalize-display-values@3.0.2": + resolution: + { + integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-oklab-function@3.0.10": + resolution: + { + integrity: sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-progressive-custom-properties@3.1.0": + resolution: + { + integrity: sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-relative-color-syntax@2.0.10": + resolution: + { + integrity: sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-scope-pseudo-class@3.0.1": + resolution: + { + integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-stepped-value-functions@3.0.5": + resolution: + { + integrity: sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-text-decoration-shorthand@3.0.4": + resolution: + { + integrity: sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-trigonometric-functions@3.0.5": + resolution: + { + integrity: sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-unset-value@3.0.1": + resolution: + { + integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/selector-specificity@3.0.1": + resolution: + { + integrity: sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss-selector-parser: ^6.0.13 + + "@csstools/selector-specificity@3.0.2": + resolution: + { + integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss-selector-parser: ^6.0.13 + + "@csstools/utilities@1.0.0": + resolution: + { + integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@esbuild/aix-ppc64@0.19.10": + resolution: + { + integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + + "@esbuild/android-arm64@0.19.10": + resolution: + { + integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm@0.19.10": + resolution: + { + integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + + "@esbuild/android-x64@0.19.10": + resolution: + { + integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + + "@esbuild/darwin-arm64@0.19.10": + resolution: + { + integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-x64@0.19.10": + resolution: + { + integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + + "@esbuild/freebsd-arm64@0.19.10": + resolution: + { + integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.19.10": + resolution: + { + integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + + "@esbuild/linux-arm64@0.19.10": + resolution: + { + integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm@0.19.10": + resolution: + { + integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-ia32@0.19.10": + resolution: + { + integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-loong64@0.19.10": + resolution: + { + integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-mips64el@0.19.10": + resolution: + { + integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-ppc64@0.19.10": + resolution: + { + integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-riscv64@0.19.10": + resolution: + { + integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-s390x@0.19.10": + resolution: + { + integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-x64@0.19.10": + resolution: + { + integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + + "@esbuild/netbsd-x64@0.19.10": + resolution: + { + integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + + "@esbuild/openbsd-x64@0.19.10": + resolution: + { + integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + + "@esbuild/sunos-x64@0.19.10": + resolution: + { + integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + + "@esbuild/win32-arm64@0.19.10": + resolution: + { + integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-ia32@0.19.10": + resolution: + { + integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-x64@0.19.10": + resolution: + { + integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + + "@eslint-community/eslint-utils@4.4.0": + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + "@eslint-community/regexpp@4.10.0": + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + "@eslint/eslintrc@2.1.4": + resolution: + { + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + "@eslint/js@8.57.0": + resolution: + { + integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + "@floating-ui/core@1.5.2": + resolution: + { + integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==, + } + + "@floating-ui/dom@1.6.3": + resolution: + { + integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==, + } + + "@floating-ui/utils@0.1.6": + resolution: + { + integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==, + } + + "@floating-ui/utils@0.2.1": + resolution: + { + integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==, + } + + "@foliojs-fork/fontkit@1.9.1": + resolution: + { + integrity: sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==, + } + + "@foliojs-fork/linebreak@1.1.1": + resolution: + { + integrity: sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==, + } + + "@foliojs-fork/pdfkit@0.14.0": + resolution: + { + integrity: sha512-nMOiQAv6id89MT3tVTCgc7HxD5ZMANwio2o5yvs5sexQkC0KI3BLaLakpsrHmFfeGFAhqPmZATZGbJGXTUebpg==, + } + + "@foliojs-fork/restructure@2.0.2": + resolution: + { + integrity: sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==, + } + + "@github/clipboard-copy-element@1.3.0": + resolution: + { + integrity: sha512-wyntkQkwoLbLo+Hqg2LIVMXDIzcvUb9bSDz+clX6nVJItwzh103rHxdXFRZD+DmxVbuEW5xSznYQXkz1jZT+xg==, + } + + "@github/hotkey@3.1.0": + resolution: + { + integrity: sha512-Lj9QjYa+b+Nk5U1nZtlXLdx3HI8/EeM6ZNwBjpYcGVYqpwHdM2ScRH0p7+5zh28JG6SPbTM9+Rb1dFd742qMTw==, + } + + "@github/markdown-toolbar-element@2.2.1": + resolution: + { + integrity: sha512-ap+ulyqzG3aVqwKsKjbDdYwM75TQXZpPtmIuPwm+54OTgcC96267oX3cEqd1wSqGsH7O5PonZ//fE9jH7Q4JkA==, + } + + "@github/relative-time-element@4.3.1": + resolution: + { + integrity: sha512-zL79nlhZVCg7x2Pf/HT5MB0mowmErE71VXpF10/3Wy8dQwkninNO1M9aOizh2wKC5LkSpDXqNYjDZwbH0/bcSg==, + } + + "@humanwhocodes/config-array@0.11.14": + resolution: + { + integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, + } + engines: { node: ">=10.10.0" } + + "@humanwhocodes/module-importer@1.0.1": + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + "@humanwhocodes/object-schema@2.0.2": + resolution: + { + integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, + } + + "@isaacs/cliui@8.0.2": + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + + "@jridgewell/gen-mapping@0.3.3": + resolution: + { + integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/resolve-uri@3.1.1": + resolution: + { + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.1.2": + resolution: + { + integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/source-map@0.3.5": + resolution: + { + integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==, + } + + "@jridgewell/sourcemap-codec@1.4.15": + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + + "@jridgewell/trace-mapping@0.3.20": + resolution: + { + integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, + } + + "@lezer/common@1.2.0": + resolution: + { + integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==, + } + + "@lezer/highlight@1.2.0": + resolution: + { + integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, + } + + "@lezer/lr@1.3.14": + resolution: + { + integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==, + } + + "@lezer/xml@1.0.4": + resolution: + { + integrity: sha512-WmXKb5eX8+rRfZYSNRR5TPee/ZoDgBdVS/rj1VCJGDKa5gNldIctQYibCoFVyNhvZsyL/8nHbZJZPM4gnXN2Vw==, + } + + "@lit-labs/ssr-dom-shim@1.2.0": + resolution: + { + integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==, + } + + "@lit/reactive-element@2.0.4": + resolution: + { + integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==, + } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + + "@octokit/auth-token@4.0.0": + resolution: + { + integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==, + } + engines: { node: ">= 18" } + + "@octokit/core@5.0.2": + resolution: + { + integrity: sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==, + } + engines: { node: ">= 18" } + + "@octokit/endpoint@9.0.4": + resolution: + { + integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==, + } + engines: { node: ">= 18" } + + "@octokit/graphql@7.0.2": + resolution: + { + integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==, + } + engines: { node: ">= 18" } + + "@octokit/openapi-types@19.1.0": + resolution: + { + integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==, + } + + "@octokit/plugin-paginate-rest@9.1.5": + resolution: + { + integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==, + } + engines: { node: ">= 18" } + peerDependencies: + "@octokit/core": ">=5" + + "@octokit/plugin-retry@6.0.1": + resolution: + { + integrity: sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==, + } + engines: { node: ">= 18" } + peerDependencies: + "@octokit/core": ">=5" + + "@octokit/plugin-throttling@8.1.3": + resolution: + { + integrity: sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==, + } + engines: { node: ">= 18" } + peerDependencies: + "@octokit/core": ^5.0.0 + + "@octokit/request-error@5.0.1": + resolution: + { + integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==, + } + engines: { node: ">= 18" } + + "@octokit/request@8.1.6": + resolution: + { + integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==, + } + engines: { node: ">= 18" } + + "@octokit/types@12.4.0": + resolution: + { + integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==, + } + + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + + "@pkgr/core@0.1.1": + resolution: + { + integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==, + } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + + "@pnpm/config.env-replace@1.1.0": + resolution: + { + integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==, + } + engines: { node: ">=12.22.0" } + + "@pnpm/network.ca-file@1.0.2": + resolution: + { + integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==, + } + engines: { node: ">=12.22.0" } + + "@pnpm/npm-conf@2.2.2": + resolution: + { + integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==, + } + engines: { node: ">=12" } + + "@rollup/plugin-babel@5.3.1": + resolution: + { + integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, + } + engines: { node: ">= 10.0.0" } + peerDependencies: + "@babel/core": ^7.0.0 + "@types/babel__core": ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + "@types/babel__core": + optional: true + + "@rollup/plugin-node-resolve@11.2.1": + resolution: + { + integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==, + } + engines: { node: ">= 10.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + "@rollup/plugin-replace@2.4.2": + resolution: + { + integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, + } + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + "@rollup/pluginutils@3.1.0": + resolution: + { + integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, + } + engines: { node: ">= 8.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + "@rollup/rollup-android-arm-eabi@4.9.1": + resolution: + { + integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==, + } + cpu: [arm] + os: [android] + + "@rollup/rollup-android-arm64@4.9.1": + resolution: + { + integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==, + } + cpu: [arm64] + os: [android] + + "@rollup/rollup-darwin-arm64@4.9.1": + resolution: + { + integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==, + } + cpu: [arm64] + os: [darwin] + + "@rollup/rollup-darwin-x64@4.9.1": + resolution: + { + integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==, + } + cpu: [x64] + os: [darwin] + + "@rollup/rollup-linux-arm-gnueabihf@4.9.1": + resolution: + { + integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm64-gnu@4.9.1": + resolution: + { + integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-arm64-musl@4.9.1": + resolution: + { + integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-riscv64-gnu@4.9.1": + resolution: + { + integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-x64-gnu@4.9.1": + resolution: + { + integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-linux-x64-musl@4.9.1": + resolution: + { + integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-win32-arm64-msvc@4.9.1": + resolution: + { + integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==, + } + cpu: [arm64] + os: [win32] + + "@rollup/rollup-win32-ia32-msvc@4.9.1": + resolution: + { + integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==, + } + cpu: [ia32] + os: [win32] + + "@rollup/rollup-win32-x64-msvc@4.9.1": + resolution: + { + integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==, + } + cpu: [x64] + os: [win32] + + "@semantic-release/changelog@6.0.3": + resolution: + { + integrity: sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0" + + "@semantic-release/commit-analyzer@11.1.0": + resolution: + { + integrity: sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==, + } + engines: { node: ^18.17 || >=20.6.1 } + peerDependencies: + semantic-release: ">=20.1.0" + + "@semantic-release/error@3.0.0": + resolution: + { + integrity: sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==, + } + engines: { node: ">=14.17" } + + "@semantic-release/error@4.0.0": + resolution: + { + integrity: sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==, + } + engines: { node: ">=18" } + + "@semantic-release/exec@6.0.3": + resolution: + { + integrity: sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0" + + "@semantic-release/git@10.0.1": + resolution: + { + integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==, + } + engines: { node: ">=14.17" } + peerDependencies: + semantic-release: ">=18.0.0" + + "@semantic-release/github@9.2.6": + resolution: + { + integrity: sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==, + } + engines: { node: ">=18" } + peerDependencies: + semantic-release: ">=20.1.0" + + "@semantic-release/gitlab@13.0.3": + resolution: + { + integrity: sha512-tup9XW+c3TAQ01l7snBroEXVBaSmXydmLVTmsSeCZ+AN+D60AuA4aSqAF8YdMLQLiYLXrGNZkq+vdBxR/rQm6A==, + } + engines: { node: ">=20.8.1" } + peerDependencies: + semantic-release: ">=20.1.0" + + "@semantic-release/npm@11.0.2": + resolution: + { + integrity: sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==, + } + engines: { node: ^18.17 || >=20 } + peerDependencies: + semantic-release: ">=20.1.0" + + "@semantic-release/release-notes-generator@12.1.0": + resolution: + { + integrity: sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==, + } + engines: { node: ^18.17 || >=20.6.1 } + peerDependencies: + semantic-release: ">=20.1.0" + + "@sindresorhus/is@4.6.0": + resolution: + { + integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, + } + engines: { node: ">=10" } + + "@sindresorhus/is@6.1.0": + resolution: + { + integrity: sha512-BuvU07zq3tQ/2SIgBsEuxKYDyDjC0n7Zir52bpHy2xnBbW81+po43aLFPLbeV3HRAheFbGud1qgcqSYfhtHMAg==, + } + engines: { node: ">=16" } + + "@sindresorhus/merge-streams@1.0.0": + resolution: + { + integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==, + } + engines: { node: ">=18" } + + "@stencil/core@2.5.2": + resolution: + { + integrity: sha512-bgjPXkSzzg1WnTgVUm6m5ZzpKt602WmA/QljODAW1xVN40OHJdbGblzF/F6MFzqv2c5Cy30CB41arc8qADIdcQ==, + } + engines: { node: ">=12.10.0", npm: ">=6.0.0" } + hasBin: true + + "@surma/rollup-plugin-off-main-thread@2.2.3": + resolution: + { + integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, + } + + "@szmarczak/http-timer@5.0.1": + resolution: + { + integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, + } + engines: { node: ">=14.16" } + + "@tailwindcss/forms@0.5.7": + resolution: + { + integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==, + } + peerDependencies: + tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1" + + "@tailwindcss/nesting@0.0.0-insiders.565cd3e": + resolution: + { + integrity: sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==, + } + peerDependencies: + postcss: ^8.2.15 + + "@tailwindcss/typography@0.5.10": + resolution: + { + integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==, + } + peerDependencies: + tailwindcss: ">=3.0.0 || insiders" + + "@trysound/sax@0.2.0": + resolution: + { + integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, + } + engines: { node: ">=10.13.0" } + + "@types/conventional-commits-parser@5.0.0": + resolution: + { + integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==, + } + + "@types/estree@0.0.39": + resolution: + { + integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==, + } + + "@types/fscreen@1.0.4": + resolution: + { + integrity: sha512-TsjxyAUvlvuQyao9vNk0yES4nY07K9xoAbkhgXU948JG39EqlLxniWuW9OiZde9Q8ACSpu3fmbXXRAfb/l/HqQ==, + } + + "@types/geojson@7946.0.13": + resolution: + { + integrity: sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==, + } + + "@types/http-cache-semantics@4.0.4": + resolution: + { + integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, + } + + "@types/json-schema@7.0.15": + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + + "@types/leaflet@1.9.8": + resolution: + { + integrity: sha512-EXdsL4EhoUtGm2GC2ZYtXn+Fzc6pluVgagvo2VC1RHWToLGlTRwVYoDpqS/7QXa01rmDyBjJk3Catpf60VMkwg==, + } + + "@types/node@20.10.5": + resolution: + { + integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==, + } + + "@types/normalize-package-data@2.4.4": + resolution: + { + integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, + } + + "@types/parse-path@7.0.3": + resolution: + { + integrity: sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==, + } + + "@types/resolve@1.17.1": + resolution: + { + integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, + } + + "@types/semver@7.5.6": + resolution: + { + integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, + } + + "@types/trusted-types@2.0.7": + resolution: + { + integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, + } + + "@typescript-eslint/eslint-plugin@7.1.0": + resolution: + { + integrity: sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^7.0.0 + eslint: ^8.56.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + "@typescript-eslint/parser@7.1.0": + resolution: + { + integrity: sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^8.56.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + "@typescript-eslint/scope-manager@7.1.0": + resolution: + { + integrity: sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + + "@typescript-eslint/type-utils@7.1.0": + resolution: + { + integrity: sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^8.56.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + "@typescript-eslint/types@7.1.0": + resolution: + { + integrity: sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + + "@typescript-eslint/typescript-estree@7.1.0": + resolution: + { + integrity: sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + "@typescript-eslint/utils@7.1.0": + resolution: + { + integrity: sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^8.56.0 + + "@typescript-eslint/visitor-keys@7.1.0": + resolution: + { + integrity: sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + + "@ungap/structured-clone@1.2.0": + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + + "@vime/core@5.4.1": + resolution: + { + integrity: sha512-ZFpV3xqZJ5tvh5rZOYKRh8zFzNIKr2ZcK6L75nJjFjbWt/ZmFF2nMBxtD9/hC4Xjk9v7hp1+P9cmctL674VFgA==, + } + + JSONStream@1.3.5: + resolution: + { + integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, + } + hasBin: true + + acorn-jsx@5.3.2: + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-node@1.8.2: + resolution: + { + integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==, + } + + acorn-walk@7.2.0: + resolution: + { + integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, + } + engines: { node: ">=0.4.0" } + + acorn@7.4.1: + resolution: + { + integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + acorn@8.11.3: + resolution: + { + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + agent-base@7.1.0: + resolution: + { + integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, + } + engines: { node: ">= 14" } + + aggregate-error@3.1.0: + resolution: + { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: ">=8" } + + aggregate-error@5.0.0: + resolution: + { + integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==, + } + engines: { node: ">=18" } + + ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + + ajv@8.12.0: + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } + + all-contributors-cli@6.26.1: + resolution: + { + integrity: sha512-Ymgo3FJACRBEd1eE653FD1J/+uD0kqpUNYfr9zNC1Qby0LgbhDBzB3EF6uvkAbYpycStkk41J+0oo37Lc02yEw==, + } + engines: { node: ">=4" } + hasBin: true + + amdefine@1.0.1: + resolution: + { + integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==, + } + engines: { node: ">=0.4.2" } + + ansi-escapes@4.3.2: + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: ">=8" } + + ansi-escapes@6.2.0: + resolution: + { + integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==, + } + engines: { node: ">=14.16" } + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } + + ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + + any-promise@1.3.0: + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } + + anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + + arg@5.0.2: + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + argv-formatter@1.0.0: + resolution: + { + integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==, + } + + array-buffer-byte-length@1.0.0: + resolution: + { + integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, + } + + array-from@2.1.1: + resolution: + { + integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, + } + + array-ify@1.0.0: + resolution: + { + integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, + } + + array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + + arraybuffer.prototype.slice@1.0.2: + resolution: + { + integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==, + } + engines: { node: ">= 0.4" } + + ast-transform@0.0.0: + resolution: + { + integrity: sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==, + } + + ast-types@0.7.8: + resolution: + { + integrity: sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==, + } + engines: { node: ">= 0.6" } + + astral-regex@2.0.0: + resolution: + { + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, + } + engines: { node: ">=8" } + + async@3.2.5: + resolution: + { + integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, + } + + at-least-node@1.0.0: + resolution: + { + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, + } + engines: { node: ">= 4.0.0" } + + autoprefixer@10.4.17: + resolution: + { + integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==, + } + engines: { node: ^10 || ^12 || >=14 } + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.5: + resolution: + { + integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, + } + engines: { node: ">= 0.4" } + + babel-plugin-polyfill-corejs2@0.4.7: + resolution: + { + integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==, + } + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.8.7: + resolution: + { + integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==, + } + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.5.4: + resolution: + { + integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==, + } + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + balanced-match@2.0.0: + resolution: + { + integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==, + } + + base64-js@1.3.1: + resolution: + { + integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==, + } + + base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + before-after-hook@2.2.3: + resolution: + { + integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, + } + + binary-extensions@2.2.0: + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + } + engines: { node: ">=8" } + + bl@4.1.0: + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } + + boolbase@1.0.0: + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } + + bottleneck@2.19.5: + resolution: + { + integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, + } + + brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + + brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + + braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + + brfs@2.0.2: + resolution: + { + integrity: sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==, + } + hasBin: true + + brotli@1.3.3: + resolution: + { + integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==, + } + + browser-resolve@1.11.3: + resolution: + { + integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==, + } + + browserify-optional@1.0.1: + resolution: + { + integrity: sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==, + } + + browserslist@4.22.2: + resolution: + { + integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + browserslist@4.23.0: + resolution: + { + integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + buffer-equal@0.0.1: + resolution: + { + integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==, + } + engines: { node: ">=0.4.0" } + + buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + + buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + + builtin-modules@3.3.0: + resolution: + { + integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, + } + engines: { node: ">=6" } + + cacheable-lookup@7.0.0: + resolution: + { + integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, + } + engines: { node: ">=14.16" } + + cacheable-request@10.2.14: + resolution: + { + integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==, + } + engines: { node: ">=14.16" } + + cachedir@2.3.0: + resolution: + { + integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==, + } + engines: { node: ">=6" } + + call-bind@1.0.5: + resolution: + { + integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, + } + + callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + camelcase-css@2.0.1: + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: ">= 6" } + + camelcase@5.3.1: + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: ">=6" } + + caniuse-api@3.0.0: + resolution: + { + integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, + } + + caniuse-lite@1.0.30001572: + resolution: + { + integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==, + } + + caniuse-lite@1.0.30001591: + resolution: + { + integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==, + } + + chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } + + chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + + chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + char-regex@1.0.2: + resolution: + { + integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, + } + engines: { node: ">=10" } + + chardet@0.7.0: + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } + + choices.js@10.2.0: + resolution: + { + integrity: sha512-8PKy6wq7BMjNwDTZwr3+Zry6G2+opJaAJDDA/j3yxvqSCnvkKe7ZIFfIyOhoc7htIWFhsfzF9tJpGUATcpUtPg==, + } + + chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + + ci-info@3.9.0: + resolution: + { + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, + } + engines: { node: ">=8" } + + clean-stack@2.2.0: + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: ">=6" } + + clean-stack@5.2.0: + resolution: + { + integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==, + } + engines: { node: ">=14.16" } + + cli-cursor@3.1.0: + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: ">=8" } + + cli-cursor@4.0.0: + resolution: + { + integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + cli-highlight@2.1.11: + resolution: + { + integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==, + } + engines: { node: ">=8.0.0", npm: ">=5.0.0" } + hasBin: true + + cli-spinners@2.9.2: + resolution: + { + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, + } + engines: { node: ">=6" } + + cli-table3@0.6.3: + resolution: + { + integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, + } + engines: { node: 10.* || >= 12.* } + + cli-truncate@4.0.0: + resolution: + { + integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==, + } + engines: { node: ">=18" } + + cli-width@3.0.0: + resolution: + { + integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, + } + engines: { node: ">= 10" } + + cliui@6.0.0: + resolution: + { + integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, + } + + cliui@7.0.4: + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } + + cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } + + clone@1.0.4: + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + } + engines: { node: ">=0.8" } + + codemirror@6.0.1: + resolution: + { + integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, + } + + color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + + color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + colord@2.9.3: + resolution: + { + integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, + } + + colorette@2.0.20: + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + + commander@11.1.0: + resolution: + { + integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==, + } + engines: { node: ">=16" } + + commander@2.20.3: + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } + + commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: ">= 6" } + + commander@7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: ">= 10" } + + commitizen@4.3.0: + resolution: + { + integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==, + } + engines: { node: ">= 12" } + hasBin: true + + common-tags@1.8.2: + resolution: + { + integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, + } + engines: { node: ">=4.0.0" } + + compare-func@2.0.0: + resolution: + { + integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, + } + + concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + concat-stream@1.6.2: + resolution: + { + integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, + } + engines: { "0": node >= 0.8 } + + config-chain@1.1.13: + resolution: + { + integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, + } + + conventional-changelog-angular@7.0.0: + resolution: + { + integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==, + } + engines: { node: ">=16" } + + conventional-changelog-conventionalcommits@7.0.2: + resolution: + { + integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==, + } + engines: { node: ">=16" } + + conventional-changelog-writer@7.0.1: + resolution: + { + integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==, + } + engines: { node: ">=16" } + hasBin: true + + conventional-commit-types@3.0.0: + resolution: + { + integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==, + } + + conventional-commits-filter@4.0.0: + resolution: + { + integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==, + } + engines: { node: ">=16" } + + conventional-commits-parser@5.0.0: + resolution: + { + integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==, + } + engines: { node: ">=16" } + hasBin: true + + convert-source-map@1.9.0: + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } + + convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + + core-js-compat@3.35.0: + resolution: + { + integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==, + } + + core-js@3.35.0: + resolution: + { + integrity: sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==, + } + + core-util-is@1.0.3: + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } + + cosmiconfig-typescript-loader@5.0.0: + resolution: + { + integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==, + } + engines: { node: ">=v16" } + peerDependencies: + "@types/node": "*" + cosmiconfig: ">=8.2" + typescript: ">=4" + + cosmiconfig@8.3.6: + resolution: + { + integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==, + } + engines: { node: ">=14" } + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + + cosmiconfig@9.0.0: + resolution: + { + integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, + } + engines: { node: ">=14" } + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + + crelt@1.0.6: + resolution: + { + integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, + } + + cross-env@7.0.3: + resolution: + { + integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, + } + engines: { node: ">=10.14", npm: ">=6", yarn: ">=1" } + hasBin: true + + cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + + crypto-js@4.2.0: + resolution: + { + integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==, + } + + crypto-random-string@2.0.0: + resolution: + { + integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, + } + engines: { node: ">=8" } + + crypto-random-string@4.0.0: + resolution: + { + integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==, + } + engines: { node: ">=12" } + + css-blank-pseudo@6.0.1: + resolution: + { + integrity: sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + css-declaration-sorter@7.1.1: + resolution: + { + integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.0.9 + + css-functions-list@3.2.1: + resolution: + { + integrity: sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==, + } + engines: { node: ">=12 || >=16" } + + css-has-pseudo@6.0.2: + resolution: + { + integrity: sha512-Z2Qm5yyOvJRTy6THdUlnGIX6PW/1wOc4FHWlfkcBkfkpZ3oz6lPdG+h+J7t1HZHT4uSSVR8XatXiMpqMUADXow==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + css-prefers-color-scheme@9.0.1: + resolution: + { + integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + css-select@5.1.0: + resolution: + { + integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, + } + + css-tree@2.2.1: + resolution: + { + integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + + css-tree@2.3.1: + resolution: + { + integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + + css-what@6.1.0: + resolution: + { + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + } + engines: { node: ">= 6" } + + cssdb@7.11.1: + resolution: + { + integrity: sha512-F0nEoX/Rv8ENTHsjMPGHd9opdjGfXkgRBafSUGnQKPzGZFB7Lm0BbT10x21TMOCrKLbVsJ0NoCDMk6AfKqw8/A==, + } + + cssesc@3.0.0: + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } + hasBin: true + + cssnano-preset-default@6.0.3: + resolution: + { + integrity: sha512-4y3H370aZCkT9Ev8P4SO4bZbt+AExeKhh8wTbms/X7OLDo5E7AYUUy6YPxa/uF5Grf+AJwNcCnxKhZynJ6luBA==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + cssnano-utils@4.0.1: + resolution: + { + integrity: sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + cssnano@6.0.3: + resolution: + { + integrity: sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + csso@5.0.5: + resolution: + { + integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + + cz-conventional-changelog@3.3.0: + resolution: + { + integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, + } + engines: { node: ">= 10" } + + d3-array@3.2.4: + resolution: + { + integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==, + } + engines: { node: ">=12" } + + d3-color@3.1.0: + resolution: + { + integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, + } + engines: { node: ">=12" } + + d3-dispatch@3.0.1: + resolution: + { + integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==, + } + engines: { node: ">=12" } + + d3-ease@3.0.1: + resolution: + { + integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, + } + engines: { node: ">=12" } + + d3-force@3.0.0: + resolution: + { + integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==, + } + engines: { node: ">=12" } + + d3-geo-projection@4.0.0: + resolution: + { + integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==, + } + engines: { node: ">=12" } + hasBin: true + + d3-geo@3.1.0: + resolution: + { + integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==, + } + engines: { node: ">=12" } + + d3-interpolate@3.0.1: + resolution: + { + integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, + } + engines: { node: ">=12" } + + d3-quadtree@3.0.1: + resolution: + { + integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==, + } + engines: { node: ">=12" } + + d3-selection@3.0.0: + resolution: + { + integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==, + } + engines: { node: ">=12" } + + d3-timer@3.0.1: + resolution: + { + integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, + } + engines: { node: ">=12" } + + d3-transition@3.0.1: + resolution: + { + integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==, + } + engines: { node: ">=12" } + peerDependencies: + d3-selection: 2 - 3 + + d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + + dargs@8.1.0: + resolution: + { + integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==, + } + engines: { node: ">=12" } + + dash-ast@2.0.1: + resolution: + { + integrity: sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==, + } + + debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: ">=0.10.0" } + + decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: ">=10" } + + dedent@0.7.0: + resolution: + { + integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, + } + + deep-equal@1.1.2: + resolution: + { + integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==, + } + engines: { node: ">= 0.4" } + + deep-extend@0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: ">=4.0.0" } + + deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + deepmerge@4.3.1: + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: ">=0.10.0" } + + defaults@1.0.4: + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } + + defer-to-connect@2.0.1: + resolution: + { + integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, + } + engines: { node: ">=10" } + + define-data-property@1.1.1: + resolution: + { + integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, + } + engines: { node: ">= 0.4" } + + define-properties@1.2.1: + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } + + deprecation@2.3.1: + resolution: + { + integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, + } + + detect-file@1.0.0: + resolution: + { + integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, + } + engines: { node: ">=0.10.0" } + + detect-indent@6.1.0: + resolution: + { + integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, + } + engines: { node: ">=8" } + + dfa@1.2.0: + resolution: + { + integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==, + } + + didyoumean@1.2.2: + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } + + dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + + dlv@1.1.3: + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } + + doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + + dom-serializer@2.0.0: + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } + + domelementtype@2.3.0: + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } + + domhandler@5.0.3: + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } + + domutils@3.1.0: + resolution: + { + integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, + } + + dot-prop@5.3.0: + resolution: + { + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, + } + engines: { node: ">=8" } + + duplexer2@0.1.4: + resolution: + { + integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, + } + + eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + ejs@3.1.9: + resolution: + { + integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, + } + engines: { node: ">=0.10.0" } + hasBin: true + + electron-to-chromium@1.4.616: + resolution: + { + integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==, + } + + electron-to-chromium@1.4.689: + resolution: + { + integrity: sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ==, + } + + emoji-regex@10.3.0: + resolution: + { + integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + emojilib@2.4.0: + resolution: + { + integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==, + } + + entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + + env-ci@11.0.0: + resolution: + { + integrity: sha512-apikxMgkipkgTvMdRT9MNqWx5VLOci79F4VBd7Op/7OPjjoanjdAvn6fglMCCEf/1bAh8eOiuEVCUs4V3qP3nQ==, + } + engines: { node: ^18.17 || >=20.6.1 } + + env-paths@2.2.1: + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: ">=6" } + + error-ex@1.3.2: + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } + + es-abstract@1.22.3: + resolution: + { + integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==, + } + engines: { node: ">= 0.4" } + + es-set-tostringtag@2.0.2: + resolution: + { + integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==, + } + engines: { node: ">= 0.4" } + + es-to-primitive@1.2.1: + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: ">= 0.4" } + + es5-ext@0.10.62: + resolution: + { + integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==, + } + engines: { node: ">=0.10" } + + es6-iterator@2.0.3: + resolution: + { + integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, + } + + es6-map@0.1.5: + resolution: + { + integrity: sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==, + } + + es6-set@0.1.6: + resolution: + { + integrity: sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==, + } + engines: { node: ">=0.12" } + + es6-symbol@3.1.3: + resolution: + { + integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, + } + + esbuild@0.19.10: + resolution: + { + integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==, + } + engines: { node: ">=12" } + hasBin: true + + escalade@3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: ">=6" } + + escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } + + escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + escape-string-regexp@5.0.0: + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: ">=12" } + + escodegen@1.14.3: + resolution: + { + integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, + } + engines: { node: ">=4.0" } + hasBin: true + + escodegen@1.2.0: + resolution: + { + integrity: sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + eslint-config-prettier@9.1.0: + resolution: + { + integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, + } + hasBin: true + peerDependencies: + eslint: ">=7.0.0" + + eslint-plugin-prettier@5.1.3: + resolution: + { + integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" + peerDependenciesMeta: + "@types/eslint": + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + eslint@8.57.0: + resolution: + { + integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + + espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + esprima@1.0.4: + resolution: + { + integrity: sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } + hasBin: true + + esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + + esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + + estraverse@1.5.1: + resolution: + { + integrity: sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==, + } + engines: { node: ">=0.4.0" } + + estraverse@4.3.0: + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: ">=4.0" } + + estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + estree-is-function@1.0.0: + resolution: + { + integrity: sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==, + } + + estree-walker@1.0.1: + resolution: + { + integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==, + } + + esutils@1.0.0: + resolution: + { + integrity: sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==, + } + engines: { node: ">=0.10.0" } + + esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } + + event-emitter@0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + + eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + + execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } + + execa@8.0.1: + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: ">=16.17" } + + expand-tilde@2.0.2: + resolution: + { + integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, + } + engines: { node: ">=0.10.0" } + + ext@1.7.0: + resolution: + { + integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, + } + + external-editor@3.1.0: + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: ">=4" } + + fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + fast-diff@1.3.0: + resolution: + { + integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, + } + + fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } + + fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + fastest-levenshtein@1.0.16: + resolution: + { + integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, + } + engines: { node: ">= 4.9.1" } + + fastq@1.16.0: + resolution: + { + integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==, + } + + figures@2.0.0: + resolution: + { + integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==, + } + engines: { node: ">=4" } + + figures@3.2.0: + resolution: + { + integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, + } + engines: { node: ">=8" } + + figures@6.0.1: + resolution: + { + integrity: sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==, + } + engines: { node: ">=18" } + + file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + + file-entry-cache@8.0.0: + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: ">=16.0.0" } + + filelist@1.0.4: + resolution: + { + integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, + } + + fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + + find-node-modules@2.1.3: + resolution: + { + integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==, + } + + find-root@1.1.0: + resolution: + { + integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, + } + + find-up-simple@1.0.0: + resolution: + { + integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==, + } + engines: { node: ">=18" } + + find-up@2.1.0: + resolution: + { + integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, + } + engines: { node: ">=4" } + + find-up@4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } + + find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } + + find-up@7.0.0: + resolution: + { + integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==, + } + engines: { node: ">=18" } + + find-versions@5.1.0: + resolution: + { + integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==, + } + engines: { node: ">=12" } + + findup-sync@4.0.0: + resolution: + { + integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==, + } + engines: { node: ">= 8" } + + flat-cache@3.2.0: + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + + flat-cache@4.0.0: + resolution: + { + integrity: sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==, + } + engines: { node: ">=16" } + + flatpickr@4.6.13: + resolution: + { + integrity: sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==, + } + + flatted@3.2.9: + resolution: + { + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, + } + + for-each@0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } + + foreground-child@3.1.1: + resolution: + { + integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, + } + engines: { node: ">=14" } + + form-data-encoder@4.0.2: + resolution: + { + integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==, + } + engines: { node: ">= 18" } + + formdata-node@6.0.3: + resolution: + { + integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==, + } + engines: { node: ">= 18" } + + fraction.js@4.3.7: + resolution: + { + integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, + } + + from2@2.3.0: + resolution: + { + integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==, + } + + fs-extra@11.2.0: + resolution: + { + integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, + } + engines: { node: ">=14.14" } + + fs-extra@9.1.0: + resolution: + { + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, + } + engines: { node: ">=10" } + + fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + fscreen@1.2.0: + resolution: + { + integrity: sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg==, + } + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + + function.prototype.name@1.1.6: + resolution: + { + integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, + } + engines: { node: ">= 0.4" } + + functions-have-names@1.2.3: + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } + + fuse.js@6.6.2: + resolution: + { + integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==, + } + engines: { node: ">=10" } + + gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } + + get-assigned-identifiers@1.2.0: + resolution: + { + integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==, + } + + get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + + get-east-asian-width@1.2.0: + resolution: + { + integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==, + } + engines: { node: ">=18" } + + get-intrinsic@1.2.2: + resolution: + { + integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, + } + + get-own-enumerable-property-symbols@3.0.2: + resolution: + { + integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, + } + + get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } + + get-stream@7.0.1: + resolution: + { + integrity: sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==, + } + engines: { node: ">=16" } + + get-stream@8.0.1: + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: ">=16" } + + get-symbol-description@1.0.0: + resolution: + { + integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==, + } + engines: { node: ">= 0.4" } + + git-log-parser@1.2.0: + resolution: + { + integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==, + } + + git-raw-commits@4.0.0: + resolution: + { + integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==, + } + engines: { node: ">=16" } + hasBin: true + + glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + + glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + + glob@10.3.10: + resolution: + { + integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, + } + engines: { node: ">=16 || 14 >=14.17" } + hasBin: true + + glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + + global-directory@4.0.1: + resolution: + { + integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==, + } + engines: { node: ">=18" } + + global-dirs@0.1.1: + resolution: + { + integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, + } + engines: { node: ">=4" } + + global-modules@1.0.0: + resolution: + { + integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, + } + engines: { node: ">=0.10.0" } + + global-modules@2.0.0: + resolution: + { + integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, + } + engines: { node: ">=6" } + + global-prefix@1.0.2: + resolution: + { + integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, + } + engines: { node: ">=0.10.0" } + + global-prefix@3.0.0: + resolution: + { + integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, + } + engines: { node: ">=6" } + + globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } + + globals@13.24.0: + resolution: + { + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, + } + engines: { node: ">=8" } + + globalthis@1.0.3: + resolution: + { + integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==, + } + engines: { node: ">= 0.4" } + + globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + + globby@14.0.0: + resolution: + { + integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==, + } + engines: { node: ">=18" } + + globjoin@0.1.4: + resolution: + { + integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==, + } + + gopd@1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } + + got@14.2.0: + resolution: + { + integrity: sha512-dBq2KkHcQl3AwPoIWsLsQScCPpUgRulz1qZVthjPYKYOPmYfBnekR3vxecjZbm91Vc3JUGnV9mqFX7B+Fe2quw==, + } + engines: { node: ">=20" } + + graceful-fs@4.2.10: + resolution: + { + integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, + } + + graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + handlebars@4.7.8: + resolution: + { + integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, + } + engines: { node: ">=0.4.7" } + hasBin: true + + has-bigints@1.0.2: + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + } + + has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } + + has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + has-property-descriptors@1.0.1: + resolution: + { + integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, + } + + has-proto@1.0.1: + resolution: + { + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, + } + engines: { node: ">= 0.4" } + + has-symbols@1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } + + has-tostringtag@1.0.0: + resolution: + { + integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, + } + engines: { node: ">= 0.4" } + + has@1.0.4: + resolution: + { + integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, + } + engines: { node: ">= 0.4.0" } + + hasown@2.0.0: + resolution: + { + integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, + } + engines: { node: ">= 0.4" } + + highlight.js@10.7.3: + resolution: + { + integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==, + } + + homedir-polyfill@1.0.3: + resolution: + { + integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, + } + engines: { node: ">=0.10.0" } + + hook-std@3.0.0: + resolution: + { + integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + hosted-git-info@7.0.1: + resolution: + { + integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + + hpagent@1.2.0: + resolution: + { + integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==, + } + engines: { node: ">=14" } + + html-tags@3.3.1: + resolution: + { + integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==, + } + engines: { node: ">=8" } + + http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + + http-proxy-agent@7.0.0: + resolution: + { + integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, + } + engines: { node: ">= 14" } + + http2-wrapper@2.2.1: + resolution: + { + integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==, + } + engines: { node: ">=10.19.0" } + + https-proxy-agent@7.0.2: + resolution: + { + integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, + } + engines: { node: ">= 14" } + + human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } + + human-signals@5.0.0: + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: ">=16.17.0" } + + husky@9.0.11: + resolution: + { + integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==, + } + engines: { node: ">=18" } + hasBin: true + + iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: ">=0.10.0" } + + iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: ">=0.10.0" } + + idb@7.1.1: + resolution: + { + integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, + } + + ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + ignore@5.3.0: + resolution: + { + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + } + engines: { node: ">= 4" } + + import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + + import-from-esm@1.3.3: + resolution: + { + integrity: sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==, + } + engines: { node: ">=16.20" } + + import-meta-resolve@4.0.0: + resolution: + { + integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, + } + + imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + indent-string@4.0.0: + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: ">=8" } + + indent-string@5.0.0: + resolution: + { + integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==, + } + engines: { node: ">=12" } + + index-to-position@0.1.2: + resolution: + { + integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==, + } + engines: { node: ">=18" } + + inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + + inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + + ini@4.1.1: + resolution: + { + integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + inquirer@7.3.3: + resolution: + { + integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==, + } + engines: { node: ">=8.0.0" } + + inquirer@8.2.5: + resolution: + { + integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, + } + engines: { node: ">=12.0.0" } + + internal-slot@1.0.6: + resolution: + { + integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==, + } + engines: { node: ">= 0.4" } + + internmap@2.0.3: + resolution: + { + integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, + } + engines: { node: ">=12" } + + into-stream@7.0.0: + resolution: + { + integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==, + } + engines: { node: ">=12" } + + is-arguments@1.1.1: + resolution: + { + integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, + } + engines: { node: ">= 0.4" } + + is-array-buffer@3.0.2: + resolution: + { + integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, + } + + is-arrayish@0.2.1: + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } + + is-bigint@1.0.4: + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } + + is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + + is-boolean-object@1.1.2: + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: ">= 0.4" } + + is-callable@1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: ">= 0.4" } + + is-ci@3.0.1: + resolution: + { + integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, + } + hasBin: true + + is-core-module@2.13.1: + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } + + is-date-object@1.0.5: + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: ">= 0.4" } + + is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + + is-fullwidth-code-point@4.0.0: + resolution: + { + integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, + } + engines: { node: ">=12" } + + is-fullwidth-code-point@5.0.0: + resolution: + { + integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==, + } + engines: { node: ">=18" } + + is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + + is-interactive@1.0.0: + resolution: + { + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, + } + engines: { node: ">=8" } + + is-module@1.0.0: + resolution: + { + integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, + } + + is-negative-zero@2.0.2: + resolution: + { + integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, + } + engines: { node: ">= 0.4" } + + is-number-object@1.0.7: + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: ">= 0.4" } + + is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + is-obj@1.0.1: + resolution: + { + integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, + } + engines: { node: ">=0.10.0" } + + is-obj@2.0.0: + resolution: + { + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, + } + engines: { node: ">=8" } + + is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + is-plain-object@5.0.0: + resolution: + { + integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, + } + engines: { node: ">=0.10.0" } + + is-regex@1.1.4: + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: ">= 0.4" } + + is-regexp@1.0.0: + resolution: + { + integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, + } + engines: { node: ">=0.10.0" } + + is-shared-array-buffer@1.0.2: + resolution: + { + integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, + } + + is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + + is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + is-string@1.0.7: + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: ">= 0.4" } + + is-symbol@1.0.4: + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: ">= 0.4" } + + is-text-path@2.0.0: + resolution: + { + integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==, + } + engines: { node: ">=8" } + + is-typed-array@1.1.12: + resolution: + { + integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==, + } + engines: { node: ">= 0.4" } + + is-unicode-supported@0.1.0: + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: ">=10" } + + is-unicode-supported@2.0.0: + resolution: + { + integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==, + } + engines: { node: ">=18" } + + is-utf8@0.2.1: + resolution: + { + integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, + } + + is-weakref@1.0.2: + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } + + is-windows@1.0.2: + resolution: + { + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, + } + engines: { node: ">=0.10.0" } + + isarray@1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } + + isarray@2.0.5: + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } + + isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + issue-parser@6.0.0: + resolution: + { + integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==, + } + engines: { node: ">=10.13" } + + jackspeak@2.3.6: + resolution: + { + integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, + } + engines: { node: ">=14" } + + jake@10.8.7: + resolution: + { + integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==, + } + engines: { node: ">=10" } + hasBin: true + + java-properties@1.0.2: + resolution: + { + integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==, + } + engines: { node: ">= 0.6.0" } + + jest-worker@26.6.2: + resolution: + { + integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, + } + engines: { node: ">= 10.13.0" } + + jiti@1.21.0: + resolution: + { + integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, + } + hasBin: true + + js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + + js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + + jsesc@0.5.0: + resolution: + { + integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, + } + hasBin: true + + jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: ">=4" } + hasBin: true + + json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + json-fixer@1.6.15: + resolution: + { + integrity: sha512-TuDuZ5KrgyjoCIppdPXBMqiGfota55+odM+j2cQ5rt/XKyKmqGB3Whz1F8SN8+60yYGy/Nu5lbRZ+rx8kBIvBw==, + } + engines: { node: ">=10" } + + json-parse-better-errors@1.0.2: + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } + + json-parse-even-better-errors@2.3.1: + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } + + json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + + json-schema@0.4.0: + resolution: + { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, + } + + json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + json-stringify-safe@5.0.1: + resolution: + { + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, + } + + json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + + jsonfile@6.1.0: + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + + jsonparse@1.3.1: + resolution: + { + integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, + } + engines: { "0": node >= 0.2.0 } + + jsonpointer@5.0.1: + resolution: + { + integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, + } + engines: { node: ">=0.10.0" } + + keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + + kind-of@6.0.3: + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: ">=0.10.0" } + + known-css-properties@0.29.0: + resolution: + { + integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==, + } + + leaflet.markercluster@1.5.3: + resolution: + { + integrity: sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==, + } + peerDependencies: + leaflet: ^1.3.1 + + leaflet@1.9.4: + resolution: + { + integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==, + } + + leven@3.1.0: + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + } + engines: { node: ">=6" } + + levn@0.3.0: + resolution: + { + integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, + } + engines: { node: ">= 0.8.0" } + + levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + + lilconfig@2.1.0: + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: ">=10" } + + lilconfig@3.0.0: + resolution: + { + integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==, + } + engines: { node: ">=14" } + + lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + + lint-staged@15.2.2: + resolution: + { + integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==, + } + engines: { node: ">=18.12.0" } + hasBin: true + + listr2@8.0.1: + resolution: + { + integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==, + } + engines: { node: ">=18.0.0" } + + lit-element@4.0.4: + resolution: + { + integrity: sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==, + } + + lit-html@3.1.2: + resolution: + { + integrity: sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==, + } + + lit@3.1.2: + resolution: + { + integrity: sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==, + } + + load-json-file@4.0.0: + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: ">=4" } + + locate-path@2.0.0: + resolution: + { + integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, + } + engines: { node: ">=4" } + + locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } + + locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + + locate-path@7.2.0: + resolution: + { + integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + lodash-es@4.17.21: + resolution: + { + integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, + } + + lodash.camelcase@4.3.0: + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } + + lodash.capitalize@4.2.1: + resolution: + { + integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==, + } + + lodash.castarray@4.4.0: + resolution: + { + integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==, + } + + lodash.debounce@4.0.8: + resolution: + { + integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, + } + + lodash.escaperegexp@4.1.2: + resolution: + { + integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==, + } + + lodash.isplainobject@4.0.6: + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } + + lodash.isstring@4.0.1: + resolution: + { + integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, + } + + lodash.kebabcase@4.1.1: + resolution: + { + integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==, + } + + lodash.map@4.6.0: + resolution: + { + integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==, + } + + lodash.memoize@4.1.2: + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } + + lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + lodash.mergewith@4.6.2: + resolution: + { + integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, + } + + lodash.snakecase@4.1.1: + resolution: + { + integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==, + } + + lodash.sortby@4.7.0: + resolution: + { + integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, + } + + lodash.startcase@4.4.0: + resolution: + { + integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, + } + + lodash.truncate@4.4.2: + resolution: + { + integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, + } + + lodash.uniq@4.5.0: + resolution: + { + integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, + } + + lodash.uniqby@4.7.0: + resolution: + { + integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==, + } + + lodash.upperfirst@4.3.1: + resolution: + { + integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==, + } + + lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + + log-symbols@4.1.0: + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: ">=10" } + + log-update@6.0.0: + resolution: + { + integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==, + } + engines: { node: ">=18" } + + longest@2.0.1: + resolution: + { + integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==, + } + engines: { node: ">=0.10.0" } + + lowercase-keys@3.0.0: + resolution: + { + integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + lru-cache@10.1.0: + resolution: + { + integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==, + } + engines: { node: 14 || >=16.14 } + + lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + + lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + + magic-string@0.25.1: + resolution: + { + integrity: sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==, + } + + magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + + marked-terminal@7.0.0: + resolution: + { + integrity: sha512-sNEx8nn9Ktcm6pL0TnRz8tnXq/mSS0Q1FRSwJOAqw4lAB4l49UeDf85Gm1n9RPFm5qurCPjwi1StAQT2XExhZw==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + marked: ">=1 <13" + + marked@12.0.0: + resolution: + { + integrity: sha512-Vkwtq9rLqXryZnWaQc86+FHLC6tr/fycMfYAhiOIXkrNmeGAyhSxjqu0Rs1i0bBqw5u0S7+lV9fdH2ZSVaoa0w==, + } + engines: { node: ">= 18" } + hasBin: true + + mathml-tag-names@2.1.3: + resolution: + { + integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==, + } + + mdn-data@2.0.28: + resolution: + { + integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, + } + + mdn-data@2.0.30: + resolution: + { + integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==, + } + + meow@12.1.1: + resolution: + { + integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==, + } + engines: { node: ">=16.10" } + + meow@13.2.0: + resolution: + { + integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==, + } + engines: { node: ">=18" } + + merge-source-map@1.0.4: + resolution: + { + integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==, + } + + merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + + merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + + merge@2.1.1: + resolution: + { + integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==, + } + + micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + + mime@4.0.1: + resolution: + { + integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==, + } + engines: { node: ">=16" } + hasBin: true + + mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + + mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + + mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + + mimic-response@4.0.0: + resolution: + { + integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + mini-svg-data-uri@1.4.4: + resolution: + { + integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==, + } + hasBin: true + + minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + + minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + + minimatch@9.0.3: + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + } + engines: { node: ">=16 || 14 >=14.17" } + + minimist@1.2.7: + resolution: + { + integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==, + } + + minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + minipass@7.0.4: + resolution: + { + integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, + } + engines: { node: ">=16 || 14 >=14.17" } + + mitt@3.0.1: + resolution: + { + integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==, + } + + ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + mute-stream@0.0.8: + resolution: + { + integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, + } + + mz@2.7.0: + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } + + nanoid@3.3.7: + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + neo-async@2.6.2: + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } + + nerf-dart@1.0.0: + resolution: + { + integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==, + } + + next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + + node-emoji@2.1.3: + resolution: + { + integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==, + } + engines: { node: ">=18" } + + node-fetch@2.7.0: + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.14: + resolution: + { + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + } + + normalize-package-data@6.0.0: + resolution: + { + integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + + normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + normalize-range@0.1.2: + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: ">=0.10.0" } + + normalize-url@8.0.0: + resolution: + { + integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, + } + engines: { node: ">=14.16" } + + npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } + + npm-run-path@5.2.0: + resolution: + { + integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + npm@10.2.5: + resolution: + { + integrity: sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==, + } + engines: { node: ^18.17.0 || >=20.5.0 } + hasBin: true + bundledDependencies: + - "@isaacs/string-locale-compare" + - "@npmcli/arborist" + - "@npmcli/config" + - "@npmcli/fs" + - "@npmcli/map-workspaces" + - "@npmcli/package-json" + - "@npmcli/promise-spawn" + - "@npmcli/run-script" + - "@sigstore/tuf" + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - cli-table3 + - columnify + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - normalize-package-data + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - npmlog + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - spdx-expression-parse + - ssri + - strip-ansi + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + + nth-check@2.1.1: + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } + + object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } + + object-hash@3.0.0: + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } + + object-inspect@1.13.1: + resolution: + { + integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, + } + + object-is@1.1.5: + resolution: + { + integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, + } + engines: { node: ">= 0.4" } + + object-keys@1.1.1: + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } + + object.assign@4.1.5: + resolution: + { + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, + } + engines: { node: ">= 0.4" } + + once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + + onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } + + optionator@0.8.3: + resolution: + { + integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, + } + engines: { node: ">= 0.8.0" } + + optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + + ora@5.4.1: + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + } + engines: { node: ">=10" } + + os-tmpdir@1.0.2: + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: ">=0.10.0" } + + p-cancelable@4.0.1: + resolution: + { + integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==, + } + engines: { node: ">=14.16" } + + p-each-series@3.0.0: + resolution: + { + integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==, + } + engines: { node: ">=12" } + + p-filter@4.1.0: + resolution: + { + integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==, + } + engines: { node: ">=18" } + + p-is-promise@3.0.0: + resolution: + { + integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==, + } + engines: { node: ">=8" } + + p-limit@1.3.0: + resolution: + { + integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, + } + engines: { node: ">=4" } + + p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } + + p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + + p-limit@4.0.0: + resolution: + { + integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + p-locate@2.0.0: + resolution: + { + integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, + } + engines: { node: ">=4" } + + p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: ">=8" } + + p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + + p-locate@6.0.0: + resolution: + { + integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + p-map@7.0.1: + resolution: + { + integrity: sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==, + } + engines: { node: ">=18" } + + p-reduce@2.1.0: + resolution: + { + integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, + } + engines: { node: ">=8" } + + p-reduce@3.0.0: + resolution: + { + integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==, + } + engines: { node: ">=12" } + + p-try@1.0.0: + resolution: + { + integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, + } + engines: { node: ">=4" } + + p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } + + pako@0.2.9: + resolution: + { + integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==, + } + + parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + + parse-json@4.0.0: + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: ">=4" } + + parse-json@5.2.0: + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: ">=8" } + + parse-json@8.1.0: + resolution: + { + integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==, + } + engines: { node: ">=18" } + + parse-passwd@1.0.0: + resolution: + { + integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, + } + engines: { node: ">=0.10.0" } + + parse-path@7.0.0: + resolution: + { + integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==, + } + + parse-url@9.0.1: + resolution: + { + integrity: sha512-9BTx9oCKV8f+OhbAhU44KqRUCQrKf8tEbxRq0Ld7m2TSWgoqmy+iVt7xnjEixlz28J9V6sAjVBv/wZNv4+2Jsg==, + } + engines: { node: ">=14.13.0" } + + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: + { + integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==, + } + + parse5@5.1.1: + resolution: + { + integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==, + } + + parse5@6.0.1: + resolution: + { + integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, + } + + path-exists@3.0.0: + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: ">=4" } + + path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + path-exists@5.0.0: + resolution: + { + integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } + + path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + path-scurry@1.10.1: + resolution: + { + integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, + } + engines: { node: ">=16 || 14 >=14.17" } + + path-type@4.0.0: + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: ">=8" } + + path-type@5.0.0: + resolution: + { + integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==, + } + engines: { node: ">=12" } + + pdfmake@0.2.8: + resolution: + { + integrity: sha512-lI+amfIaUL8CrPhndxFdhIgMj9JB49Sj4DARltKC1gLm/5NsPohZqfB+D+II8HymtPB6eugUFD5oBxmzO57qHA==, + } + engines: { node: ">=12" } + + pegjs@0.10.0: + resolution: + { + integrity: sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==, + } + engines: { node: ">=0.10" } + hasBin: true + + performance-now@2.1.0: + resolution: + { + integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, + } + + picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + + picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + pidtree@0.6.0: + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: ">=0.10" } + hasBin: true + + pify@2.3.0: + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: ">=0.10.0" } + + pify@3.0.0: + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: ">=4" } + + pify@5.0.0: + resolution: + { + integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, + } + engines: { node: ">=10" } + + pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: ">= 6" } + + pkg-conf@2.1.0: + resolution: + { + integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==, + } + engines: { node: ">=4" } + + png-js@1.0.0: + resolution: + { + integrity: sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==, + } + + polylabel@1.1.0: + resolution: + { + integrity: sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==, + } + + postcss-attribute-case-insensitive@6.0.3: + resolution: + { + integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-calc@9.0.1: + resolution: + { + integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.2.2 + + postcss-clamp@4.1.0: + resolution: + { + integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, + } + engines: { node: ">=7.6.0" } + peerDependencies: + postcss: ^8.4.6 + + postcss-color-functional-notation@6.0.5: + resolution: + { + integrity: sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-color-hex-alpha@9.0.4: + resolution: + { + integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-color-rebeccapurple@9.0.3: + resolution: + { + integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-colormin@6.0.2: + resolution: + { + integrity: sha512-TXKOxs9LWcdYo5cgmcSHPkyrLAh86hX1ijmyy6J8SbOhyv6ua053M3ZAM/0j44UsnQNIWdl8gb5L7xX2htKeLw==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-convert-values@6.0.2: + resolution: + { + integrity: sha512-aeBmaTnGQ+NUSVQT8aY0sKyAD/BaLJenEKZ03YK0JnDE1w1Rr8XShoxdal2V2H26xTJKr3v5haByOhJuyT4UYw==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-custom-media@10.0.3: + resolution: + { + integrity: sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-custom-properties@13.3.5: + resolution: + { + integrity: sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-custom-selectors@7.1.7: + resolution: + { + integrity: sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-dir-pseudo-class@8.0.1: + resolution: + { + integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-discard-comments@6.0.1: + resolution: + { + integrity: sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-duplicates@6.0.1: + resolution: + { + integrity: sha512-1hvUs76HLYR8zkScbwyJ8oJEugfPV+WchpnA+26fpJ7Smzs51CzGBHC32RS03psuX/2l0l0UKh2StzNxOrKCYg==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-empty@6.0.1: + resolution: + { + integrity: sha512-yitcmKwmVWtNsrrRqGJ7/C0YRy53i0mjexBDQ9zYxDwTWVBgbU4+C9jIZLmQlTDT9zhml+u0OMFJh8+31krmOg==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-overridden@6.0.1: + resolution: + { + integrity: sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-double-position-gradients@5.0.4: + resolution: + { + integrity: sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-focus-visible@9.0.1: + resolution: + { + integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-focus-within@8.0.1: + resolution: + { + integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-font-variant@5.0.0: + resolution: + { + integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, + } + peerDependencies: + postcss: ^8.1.0 + + postcss-gap-properties@5.0.1: + resolution: + { + integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-image-set-function@6.0.3: + resolution: + { + integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-import@15.1.0: + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + postcss: ^8.0.0 + + postcss-import@16.0.1: + resolution: + { + integrity: sha512-i2Pci0310NaLHr/5JUFSw1j/8hf1CzwMY13g6ZDxgOavmRHQi2ba3PmUHoihO+sjaum+KmCNzskNsw7JDrg03g==, + } + engines: { node: ">=18.0.0" } + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: + { + integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, + } + engines: { node: ^12 || ^14 || >= 16 } + peerDependencies: + postcss: ^8.4.21 + + postcss-lab-function@6.0.10: + resolution: + { + integrity: sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-load-config@4.0.2: + resolution: + { + integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, + } + engines: { node: ">= 14" } + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-logical@7.0.1: + resolution: + { + integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-merge-longhand@6.0.2: + resolution: + { + integrity: sha512-+yfVB7gEM8SrCo9w2lCApKIEzrTKl5yS1F4yGhV3kSim6JzbfLGJyhR1B6X+6vOT0U33Mgx7iv4X9MVWuaSAfw==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-rules@6.0.3: + resolution: + { + integrity: sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-font-values@6.0.1: + resolution: + { + integrity: sha512-tIwmF1zUPoN6xOtA/2FgVk1ZKrLcCvE0dpZLtzyyte0j9zUeB8RTbCqrHZGjJlxOvNWKMYtunLrrl7HPOiR46w==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-gradients@6.0.1: + resolution: + { + integrity: sha512-M1RJWVjd6IOLPl1hYiOd5HQHgpp6cvJVLrieQYS9y07Yo8itAr6jaekzJphaJFR0tcg4kRewCk3kna9uHBxn/w==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-params@6.0.2: + resolution: + { + integrity: sha512-zwQtbrPEBDj+ApELZ6QylLf2/c5zmASoOuA4DzolyVGdV38iR2I5QRMsZcHkcdkZzxpN8RS4cN7LPskOkTwTZw==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-selectors@6.0.2: + resolution: + { + integrity: sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-nested@5.0.6: + resolution: + { + integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + + postcss-nested@6.0.1: + resolution: + { + integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + + postcss-nesting@12.0.4: + resolution: + { + integrity: sha512-WuCe0KnP4vKjLZK8VNoUWKL8ZLOv/5jiM94mHcI3VszLropHwmjotdUyP/ObzqZpXuQKP2Jf9R12vIHKFSStKw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-normalize-charset@6.0.1: + resolution: + { + integrity: sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-display-values@6.0.1: + resolution: + { + integrity: sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-positions@6.0.1: + resolution: + { + integrity: sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-repeat-style@6.0.1: + resolution: + { + integrity: sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-string@6.0.1: + resolution: + { + integrity: sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-timing-functions@6.0.1: + resolution: + { + integrity: sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-unicode@6.0.2: + resolution: + { + integrity: sha512-Ff2VdAYCTGyMUwpevTZPZ4w0+mPjbZzLLyoLh/RMpqUqeQKZ+xMm31hkxBavDcGKcxm6ACzGk0nBfZ8LZkStKA==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-url@6.0.1: + resolution: + { + integrity: sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-whitespace@6.0.1: + resolution: + { + integrity: sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-opacity-percentage@2.0.0: + resolution: + { + integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.2 + + postcss-ordered-values@6.0.1: + resolution: + { + integrity: sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-overflow-shorthand@5.0.1: + resolution: + { + integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-page-break@3.0.4: + resolution: + { + integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, + } + peerDependencies: + postcss: ^8 + + postcss-place@9.0.1: + resolution: + { + integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-preset-env@9.4.0: + resolution: + { + integrity: sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-pseudo-class-any-link@9.0.1: + resolution: + { + integrity: sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-reduce-initial@6.0.2: + resolution: + { + integrity: sha512-YGKalhNlCLcjcLvjU5nF8FyeCTkCO5UtvJEt0hrPZVCTtRLSOH4z00T1UntQPj4dUmIYZgMj8qK77JbSX95hSw==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-transforms@6.0.1: + resolution: + { + integrity: sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-replace-overflow-wrap@4.0.0: + resolution: + { + integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, + } + peerDependencies: + postcss: ^8.0.3 + + postcss-reporter@7.1.0: + resolution: + { + integrity: sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==, + } + engines: { node: ">=10" } + peerDependencies: + postcss: ^8.1.0 + + postcss-resolve-nested-selector@0.1.1: + resolution: + { + integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==, + } + + postcss-safe-parser@7.0.0: + resolution: + { + integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==, + } + engines: { node: ">=18.0" } + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-not@7.0.2: + resolution: + { + integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-selector-parser@6.0.10: + resolution: + { + integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, + } + engines: { node: ">=4" } + + postcss-selector-parser@6.0.14: + resolution: + { + integrity: sha512-65xXYsT40i9GyWzlHQ5ShZoK7JZdySeOozi/tz2EezDo6c04q6+ckYMeoY7idaie1qp2dT5KoYQ2yky6JuoHnA==, + } + engines: { node: ">=4" } + + postcss-selector-parser@6.0.15: + resolution: + { + integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==, + } + engines: { node: ">=4" } + + postcss-svgo@6.0.2: + resolution: + { + integrity: sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ==, + } + engines: { node: ^14 || ^16 || >= 18 } + peerDependencies: + postcss: ^8.4.31 + + postcss-unique-selectors@6.0.2: + resolution: + { + integrity: sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-value-parser@4.2.0: + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } + + postcss@8.4.35: + resolution: + { + integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==, + } + engines: { node: ^10 || ^12 || >=14 } + + prelude-ls@1.1.2: + resolution: + { + integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, + } + engines: { node: ">= 0.8.0" } + + prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + prettier-linter-helpers@1.0.0: + resolution: + { + integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, + } + engines: { node: ">=6.0.0" } + + prettier-plugin-organize-imports@3.2.4: + resolution: + { + integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==, + } + peerDependencies: + "@volar/vue-language-plugin-pug": ^1.0.4 + "@volar/vue-typescript": ^1.0.4 + prettier: ">=2.0" + typescript: ">=2.9" + peerDependenciesMeta: + "@volar/vue-language-plugin-pug": + optional: true + "@volar/vue-typescript": + optional: true + + prettier@2.8.8: + resolution: + { + integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, + } + engines: { node: ">=10.13.0" } + hasBin: true + + prettier@3.2.5: + resolution: + { + integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, + } + engines: { node: ">=14" } + hasBin: true + + pretty-bytes@5.6.0: + resolution: + { + integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, + } + engines: { node: ">=6" } + + pretty-bytes@6.1.1: + resolution: + { + integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, + } + engines: { node: ^14.13.1 || >=16.0.0 } + + process-nextick-args@2.0.1: + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } + + proto-list@1.2.4: + resolution: + { + integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, + } + + protocols@2.0.1: + resolution: + { + integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==, + } + + punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } + + queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + quick-lru@5.1.1: + resolution: + { + integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, + } + engines: { node: ">=10" } + + quote-stream@1.0.2: + resolution: + { + integrity: sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==, + } + hasBin: true + + raf@3.4.1: + resolution: + { + integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, + } + + randombytes@2.1.0: + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } + + rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + + read-cache@1.0.0: + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } + + read-pkg-up@11.0.0: + resolution: + { + integrity: sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==, + } + engines: { node: ">=18" } + deprecated: Renamed to read-package-up + + read-pkg@9.0.1: + resolution: + { + integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==, + } + engines: { node: ">=18" } + + readable-stream@2.3.8: + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } + + readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + + readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + + redux@4.2.1: + resolution: + { + integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==, + } + + regenerate-unicode-properties@10.1.1: + resolution: + { + integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==, + } + engines: { node: ">=4" } + + regenerate@1.4.2: + resolution: + { + integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, + } + + regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + + regenerator-transform@0.15.2: + resolution: + { + integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, + } + + regexp.prototype.flags@1.5.1: + resolution: + { + integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==, + } + engines: { node: ">= 0.4" } + + regexpu-core@5.3.2: + resolution: + { + integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==, + } + engines: { node: ">=4" } + + registry-auth-token@5.0.2: + resolution: + { + integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==, + } + engines: { node: ">=14" } + + regjsparser@0.9.1: + resolution: + { + integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, + } + hasBin: true + + regression@2.0.1: + resolution: + { + integrity: sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ==, + } + + require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } + + require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } + + require-main-filename@2.0.0: + resolution: + { + integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, + } + + resolve-alpn@1.2.1: + resolution: + { + integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, + } + + resolve-dir@1.0.1: + resolution: + { + integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, + } + engines: { node: ">=0.10.0" } + + resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + resolve-from@5.0.0: + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: ">=8" } + + resolve-global@1.0.0: + resolution: + { + integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, + } + engines: { node: ">=8" } + + resolve@1.1.7: + resolution: + { + integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==, + } + + resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } + hasBin: true + + responselike@3.0.0: + resolution: + { + integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, + } + engines: { node: ">=14.16" } + + restore-cursor@3.1.0: + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: ">=8" } + + restore-cursor@4.0.0: + resolution: + { + integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + rfdc@1.3.0: + resolution: + { + integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==, + } + + rgbcolor@1.0.1: + resolution: + { + integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==, + } + engines: { node: ">= 0.8.15" } + + rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + + rimraf@5.0.5: + resolution: + { + integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==, + } + engines: { node: ">=14" } + hasBin: true + + rollup-plugin-terser@7.0.2: + resolution: + { + integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==, + } + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + + rollup@2.79.1: + resolution: + { + integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==, + } + engines: { node: ">=10.0.0" } + hasBin: true + + rollup@4.9.1: + resolution: + { + integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + + run-async@2.4.1: + resolution: + { + integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, + } + engines: { node: ">=0.12.0" } + + run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + + rxjs@6.6.7: + resolution: + { + integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, + } + engines: { npm: ">=2.0.0" } + + rxjs@7.8.1: + resolution: + { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + } + + safe-array-concat@1.0.1: + resolution: + { + integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==, + } + engines: { node: ">=0.4" } + + safe-buffer@5.1.2: + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } + + safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + safe-regex-test@1.0.0: + resolution: + { + integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==, + } + + safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + sax@1.3.0: + resolution: + { + integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==, + } + + scope-analyzer@2.1.2: + resolution: + { + integrity: sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==, + } + + semantic-release@23.0.2: + resolution: + { + integrity: sha512-OnVYJ6Xgzwe1x8MKswba7RU9+5djS1MWRTrTn5qsq3xZYpslroZkV9Pt0dA2YcIuieeuSZWJhn+yUWoBUHO5Fw==, + } + engines: { node: ">=20.8.1" } + hasBin: true + + semver-diff@4.0.0: + resolution: + { + integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==, + } + engines: { node: ">=12" } + + semver-regex@4.0.5: + resolution: + { + integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==, + } + engines: { node: ">=12" } + + semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + + semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + + semver@7.6.0: + resolution: + { + integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, + } + engines: { node: ">=10" } + hasBin: true + + serialize-javascript@4.0.0: + resolution: + { + integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, + } + + set-blocking@2.0.0: + resolution: + { + integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, + } + + set-function-length@1.1.1: + resolution: + { + integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, + } + engines: { node: ">= 0.4" } + + set-function-name@2.0.1: + resolution: + { + integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==, + } + engines: { node: ">= 0.4" } + + shallow-copy@0.0.1: + resolution: + { + integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==, + } + + shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + + shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + side-channel@1.0.4: + resolution: + { + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, + } + + signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + + signale@1.4.0: + resolution: + { + integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==, + } + engines: { node: ">=6" } + + skin-tone@2.0.0: + resolution: + { + integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==, + } + engines: { node: ">=8" } + + slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } + + slash@5.1.0: + resolution: + { + integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==, + } + engines: { node: ">=14.16" } + + slice-ansi@4.0.0: + resolution: + { + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, + } + engines: { node: ">=10" } + + slice-ansi@5.0.0: + resolution: + { + integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, + } + engines: { node: ">=12" } + + slice-ansi@7.1.0: + resolution: + { + integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==, + } + engines: { node: ">=18" } + + source-map-js@1.0.2: + resolution: + { + integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, + } + engines: { node: ">=0.10.0" } + + source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + + source-map@0.1.43: + resolution: + { + integrity: sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==, + } + engines: { node: ">=0.8.0" } + + source-map@0.5.7: + resolution: + { + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, + } + engines: { node: ">=0.10.0" } + + source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + + source-map@0.8.0-beta.0: + resolution: + { + integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, + } + engines: { node: ">= 8" } + + sourcemap-codec@1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + + spawn-error-forwarder@1.0.0: + resolution: + { + integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==, + } + + spdx-correct@3.2.0: + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } + + spdx-exceptions@2.3.0: + resolution: + { + integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, + } + + spdx-expression-parse@3.0.1: + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } + + spdx-license-ids@3.0.16: + resolution: + { + integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==, + } + + split2@1.0.0: + resolution: + { + integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==, + } + + split2@4.2.0: + resolution: + { + integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, + } + engines: { node: ">= 10.x" } + + stackblur-canvas@2.6.0: + resolution: + { + integrity: sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==, + } + engines: { node: ">=0.1.14" } + + static-eval@2.1.0: + resolution: + { + integrity: sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==, + } + + static-module@3.0.4: + resolution: + { + integrity: sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==, + } + + stencil-wormhole@3.4.1: + resolution: + { + integrity: sha512-ppYTcWTJnIl4ZAKwF39LTA9f/ypHfbVefsHdN2hpMQGrR57wt1TieZo9tlCM/r1Y4SFiZ5yz/cjho564C921Xw==, + } + + stream-combiner2@1.1.1: + resolution: + { + integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==, + } + + string-argv@0.3.2: + resolution: + { + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, + } + engines: { node: ">=0.6.19" } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + + string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + + string-width@7.0.0: + resolution: + { + integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==, + } + engines: { node: ">=18" } + + string.prototype.matchall@4.0.10: + resolution: + { + integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==, + } + + string.prototype.trim@1.2.8: + resolution: + { + integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==, + } + engines: { node: ">= 0.4" } + + string.prototype.trimend@1.0.7: + resolution: + { + integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==, + } + + string.prototype.trimstart@1.0.7: + resolution: + { + integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==, + } + + string_decoder@1.1.1: + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } + + string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + + stringify-object@3.3.0: + resolution: + { + integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, + } + engines: { node: ">=4" } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + + strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } + + strip-bom@4.0.0: + resolution: + { + integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, + } + engines: { node: ">=8" } + + strip-comments@2.0.1: + resolution: + { + integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==, + } + engines: { node: ">=10" } + + strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } + + strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } + + strip-json-comments@2.0.1: + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: ">=0.10.0" } + + strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + style-mod@4.1.0: + resolution: + { + integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, + } + + stylehacks@6.0.2: + resolution: + { + integrity: sha512-00zvJGnCu64EpMjX8b5iCZ3us2Ptyw8+toEkb92VdmkEaRaSGBNKAoK6aWZckhXxmQP8zWiTaFaiMGIU8Ve8sg==, + } + engines: { node: ^14 || ^16 || >=18.0 } + peerDependencies: + postcss: ^8.4.31 + + stylelint-config-recommended@14.0.0: + resolution: + { + integrity: sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==, + } + engines: { node: ">=18.12.0" } + peerDependencies: + stylelint: ^16.0.0 + + stylelint-config-standard@36.0.0: + resolution: + { + integrity: sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==, + } + engines: { node: ">=18.12.0" } + peerDependencies: + stylelint: ^16.1.0 + + stylelint@16.2.1: + resolution: + { + integrity: sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA==, + } + engines: { node: ">=18.12.0" } + hasBin: true + + sucrase@3.35.0: + resolution: + { + integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, + } + engines: { node: ">=16 || 14 >=14.17" } + hasBin: true + + supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } + + supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + + supports-hyperlinks@3.0.0: + resolution: + { + integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==, + } + engines: { node: ">=14.18" } + + supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + + svg-tags@1.0.0: + resolution: + { + integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, + } + + svgo@3.2.0: + resolution: + { + integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==, + } + engines: { node: ">=14.0.0" } + hasBin: true + + synckit@0.8.8: + resolution: + { + integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + + table@6.8.1: + resolution: + { + integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==, + } + engines: { node: ">=10.0.0" } + + tailwindcss@3.4.1: + resolution: + { + integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==, + } + engines: { node: ">=14.0.0" } + hasBin: true + + temp-dir@2.0.0: + resolution: + { + integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, + } + engines: { node: ">=8" } + + temp-dir@3.0.0: + resolution: + { + integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==, + } + engines: { node: ">=14.16" } + + tempy@0.6.0: + resolution: + { + integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==, + } + engines: { node: ">=10" } + + tempy@3.1.0: + resolution: + { + integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==, + } + engines: { node: ">=14.16" } + + terser@5.26.0: + resolution: + { + integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==, + } + engines: { node: ">=10" } + hasBin: true + + text-extensions@2.4.0: + resolution: + { + integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==, + } + engines: { node: ">=8" } + + text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + thenby@1.3.4: + resolution: + { + integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==, + } + + thenify-all@1.6.0: + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: ">=0.8" } + + thenify@3.3.1: + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } + + through2@2.0.5: + resolution: + { + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, + } + + through@2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } + + tiny-inflate@1.0.3: + resolution: + { + integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==, + } + + tinyqueue@2.0.3: + resolution: + { + integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==, + } + + tmp@0.0.33: + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: ">=0.6.0" } + + to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } + + to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + + tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + + tr46@1.0.1: + resolution: + { + integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, + } + + traverse@0.6.8: + resolution: + { + integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==, + } + engines: { node: ">= 0.4" } + + ts-api-utils@1.0.3: + resolution: + { + integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, + } + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + + ts-interface-checker@0.1.13: + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } + + tslib@1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + + tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + + type-check@0.3.2: + resolution: + { + integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, + } + engines: { node: ">= 0.8.0" } + + type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + + type-fest@0.16.0: + resolution: + { + integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, + } + engines: { node: ">=10" } + + type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + type-fest@0.21.3: + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: ">=10" } + + type-fest@1.4.0: + resolution: + { + integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, + } + engines: { node: ">=10" } + + type-fest@2.19.0: + resolution: + { + integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, + } + engines: { node: ">=12.20" } + + type-fest@3.13.1: + resolution: + { + integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, + } + engines: { node: ">=14.16" } + + type-fest@4.9.0: + resolution: + { + integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==, + } + engines: { node: ">=16" } + + type@1.2.0: + resolution: + { + integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, + } + + type@2.7.2: + resolution: + { + integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, + } + + typed-array-buffer@1.0.0: + resolution: + { + integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==, + } + engines: { node: ">= 0.4" } + + typed-array-byte-length@1.0.0: + resolution: + { + integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==, + } + engines: { node: ">= 0.4" } + + typed-array-byte-offset@1.0.0: + resolution: + { + integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==, + } + engines: { node: ">= 0.4" } + + typed-array-length@1.0.4: + resolution: + { + integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==, + } + + typedarray@0.0.6: + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } + + typescript@5.3.3: + resolution: + { + integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, + } + engines: { node: ">=14.17" } + hasBin: true + + uglify-js@3.17.4: + resolution: + { + integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, + } + engines: { node: ">=0.8.0" } + hasBin: true + + unbox-primitive@1.0.2: + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } + + undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: + { + integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, + } + engines: { node: ">=4" } + + unicode-emoji-modifier-base@1.0.0: + resolution: + { + integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==, + } + engines: { node: ">=4" } + + unicode-match-property-ecmascript@2.0.0: + resolution: + { + integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, + } + engines: { node: ">=4" } + + unicode-match-property-value-ecmascript@2.1.0: + resolution: + { + integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==, + } + engines: { node: ">=4" } + + unicode-properties@1.4.1: + resolution: + { + integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==, + } + + unicode-property-aliases-ecmascript@2.1.0: + resolution: + { + integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, + } + engines: { node: ">=4" } + + unicode-trie@2.0.0: + resolution: + { + integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==, + } + + unicorn-magic@0.1.0: + resolution: + { + integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, + } + engines: { node: ">=18" } + + unique-string@2.0.0: + resolution: + { + integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, + } + engines: { node: ">=8" } + + unique-string@3.0.0: + resolution: + { + integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==, + } + engines: { node: ">=12" } + + universal-user-agent@6.0.1: + resolution: + { + integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, + } + + universalify@2.0.1: + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: ">= 10.0.0" } + + upath@1.2.0: + resolution: + { + integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, + } + engines: { node: ">=4" } + + update-browserslist-db@1.0.13: + resolution: + { + integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + + uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + + url-join@4.0.1: + resolution: + { + integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==, + } + + url-join@5.0.0: + resolution: + { + integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + validate-npm-package-license@3.0.4: + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } + + vite-plugin-pwa@0.19.2: + resolution: + { + integrity: sha512-LSQJFPxCAQYbRuSyc9EbRLRqLpaBA9onIZuQFomfUYjWSgHuQLonahetDlPSC9zsxmkSEhQH8dXZN8yL978h3w==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + "@vite-pwa/assets-generator": ^0.2.4 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 + workbox-build: ^7.0.0 + workbox-window: ^7.0.0 + peerDependenciesMeta: + "@vite-pwa/assets-generator": + optional: true + + vite@5.1.4: + resolution: + { + integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + w3c-keyname@2.2.8: + resolution: + { + integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, + } + + wavesurfer.js@7.7.3: + resolution: + { + integrity: sha512-TC7cQb0RVggtNC+Dl05gcnhSFL5U+fww3ZYJUuqgfR+r9oY+bh/hChCipDFDjs5cWtuek3GEtsPXWa93a9XYxw==, + } + + wcwidth@1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } + + webidl-conversions@3.0.1: + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } + + webidl-conversions@4.0.2: + resolution: + { + integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, + } + + whatwg-url@5.0.0: + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } + + whatwg-url@7.1.0: + resolution: + { + integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, + } + + which-boxed-primitive@1.0.2: + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } + + which-module@2.0.1: + resolution: + { + integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, + } + + which-typed-array@1.1.13: + resolution: + { + integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, + } + engines: { node: ">= 0.4" } + + which@1.3.1: + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } + hasBin: true + + which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + + word-wrap@1.2.5: + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: ">=0.10.0" } + + wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + + workbox-background-sync@7.0.0: + resolution: + { + integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==, + } + + workbox-broadcast-update@7.0.0: + resolution: + { + integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==, + } + + workbox-build@7.0.0: + resolution: + { + integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==, + } + engines: { node: ">=16.0.0" } + + workbox-cacheable-response@7.0.0: + resolution: + { + integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==, + } + + workbox-core@7.0.0: + resolution: + { + integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==, + } + + workbox-expiration@7.0.0: + resolution: + { + integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==, + } + + workbox-google-analytics@7.0.0: + resolution: + { + integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==, + } + + workbox-navigation-preload@7.0.0: + resolution: + { + integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==, + } + + workbox-precaching@7.0.0: + resolution: + { + integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==, + } + + workbox-range-requests@7.0.0: + resolution: + { + integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==, + } + + workbox-recipes@7.0.0: + resolution: + { + integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==, + } + + workbox-routing@7.0.0: + resolution: + { + integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==, + } + + workbox-strategies@7.0.0: + resolution: + { + integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==, + } + + workbox-streams@7.0.0: + resolution: + { + integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==, + } + + workbox-sw@7.0.0: + resolution: + { + integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==, + } + + workbox-window@7.0.0: + resolution: + { + integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==, + } + + wrap-ansi@6.2.0: + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: ">=8" } + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + + wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } + + wrap-ansi@9.0.0: + resolution: + { + integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, + } + engines: { node: ">=18" } + + wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + write-file-atomic@5.0.1: + resolution: + { + integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + xml-formatter@3.6.2: + resolution: + { + integrity: sha512-enWhevZNOwffZFUhzl1WMcha8lFLZUgJ7NzFs5Ug4ZOFCoNheGYXz1J9Iz/e+cTn9rCkuT1GwTacz+YlmFHOGw==, + } + engines: { node: ">= 14" } + + xml-parser-xo@4.1.1: + resolution: + { + integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==, + } + engines: { node: ">= 14" } + + xmldoc@1.3.0: + resolution: + { + integrity: sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==, + } + + xtend@4.0.2: + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: ">=0.4" } + + y18n@4.0.3: + resolution: + { + integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, + } + + y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } + + yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + + yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + yaml@2.3.4: + resolution: + { + integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, + } + engines: { node: ">= 14" } + + yargs-parser@18.1.3: + resolution: + { + integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, + } + engines: { node: ">=6" } + + yargs-parser@20.2.9: + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: ">=10" } + + yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + + yargs@15.4.1: + resolution: + { + integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, + } + engines: { node: ">=8" } + + yargs@16.2.0: + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: ">=10" } + + yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } + + yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + yocto-queue@1.0.0: + resolution: + { + integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, + } + engines: { node: ">=12.20" } + +snapshots: + "@aashutoshrathi/word-wrap@1.2.6": {} + + "@alloc/quick-lru@5.2.0": {} + + "@amcharts/amcharts4-geodata@4.1.28": {} + + "@amcharts/amcharts4@4.10.38": dependencies: "@babel/runtime": 7.23.6 core-js: 3.35.0 @@ -247,59 +9179,27 @@ packages: rgbcolor: 1.0.1 stackblur-canvas: 2.6.0 tslib: 2.6.2 - dev: false - /@ampproject/remapping@2.2.1: - resolution: - { - integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, - } - engines: { node: ">=6.0.0" } + "@ampproject/remapping@2.2.1": dependencies: "@jridgewell/gen-mapping": 0.3.3 "@jridgewell/trace-mapping": 0.3.20 - dev: true - /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): - resolution: - { - integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==, - } - engines: { node: ">=10" } - peerDependencies: - ajv: ">=8" + "@apideck/better-ajv-errors@0.3.6(ajv@8.12.0)": dependencies: ajv: 8.12.0 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 - dev: true - /@babel/code-frame@7.23.5: - resolution: - { - integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==, - } - engines: { node: ">=6.9.0" } + "@babel/code-frame@7.23.5": dependencies: "@babel/highlight": 7.23.4 chalk: 2.4.2 - dev: true - /@babel/compat-data@7.23.5: - resolution: - { - integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==, - } - engines: { node: ">=6.9.0" } - dev: true + "@babel/compat-data@7.23.5": {} - /@babel/core@7.23.6: - resolution: - { - integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==, - } - engines: { node: ">=6.9.0" } + "@babel/core@7.23.6": dependencies: "@ampproject/remapping": 2.2.1 "@babel/code-frame": 7.23.5 @@ -318,63 +9218,31 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /@babel/generator@7.23.6: - resolution: - { - integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==, - } - engines: { node: ">=6.9.0" } + "@babel/generator@7.23.6": dependencies: "@babel/types": 7.23.6 "@jridgewell/gen-mapping": 0.3.3 "@jridgewell/trace-mapping": 0.3.20 jsesc: 2.5.2 - dev: true - /@babel/helper-annotate-as-pure@7.22.5: - resolution: - { - integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-annotate-as-pure@7.22.5": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: - { - integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-builder-binary-assignment-operator-visitor@7.22.15": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-compilation-targets@7.23.6: - resolution: - { - integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-compilation-targets@7.23.6": dependencies: "@babel/compat-data": 7.23.5 "@babel/helper-validator-option": 7.23.5 browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 - dev: true - /@babel/helper-create-class-features-plugin@7.23.6(@babel/core@7.23.6): - resolution: - { - integrity: sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/helper-create-class-features-plugin@7.23.6(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 @@ -386,30 +9254,15 @@ packages: "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 "@babel/helper-split-export-declaration": 7.22.6 semver: 6.3.1 - dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.6): - resolution: - { - integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - dev: true - /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + "@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-compilation-targets": 7.23.6 @@ -419,65 +9272,27 @@ packages: resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: - { - integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, - } - engines: { node: ">=6.9.0" } - dev: true + "@babel/helper-environment-visitor@7.22.20": {} - /@babel/helper-function-name@7.23.0: - resolution: - { - integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-function-name@7.23.0": dependencies: "@babel/template": 7.22.15 "@babel/types": 7.23.6 - dev: true - /@babel/helper-hoist-variables@7.22.5: - resolution: - { - integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-hoist-variables@7.22.5": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: - { - integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-member-expression-to-functions@7.23.0": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-module-imports@7.22.15: - resolution: - { - integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-module-imports@7.22.15": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-environment-visitor": 7.22.20 @@ -485,543 +9300,226 @@ packages: "@babel/helper-simple-access": 7.22.5 "@babel/helper-split-export-declaration": 7.22.6 "@babel/helper-validator-identifier": 7.22.20 - dev: true - /@babel/helper-optimise-call-expression@7.22.5: - resolution: - { - integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-optimise-call-expression@7.22.5": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-plugin-utils@7.22.5: - resolution: - { - integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, - } - engines: { node: ">=6.9.0" } - dev: true + "@babel/helper-plugin-utils@7.22.5": {} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.6): - resolution: - { - integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 "@babel/helper-environment-visitor": 7.22.20 "@babel/helper-wrap-function": 7.22.20 - dev: true - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): - resolution: - { - integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-environment-visitor": 7.22.20 "@babel/helper-member-expression-to-functions": 7.23.0 "@babel/helper-optimise-call-expression": 7.22.5 - dev: true - /@babel/helper-simple-access@7.22.5: - resolution: - { - integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-simple-access@7.22.5": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: - { - integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-skip-transparent-expression-wrappers@7.22.5": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: - { - integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-split-export-declaration@7.22.6": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/helper-string-parser@7.23.4: - resolution: - { - integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, - } - engines: { node: ">=6.9.0" } - dev: true + "@babel/helper-string-parser@7.23.4": {} - /@babel/helper-validator-identifier@7.22.20: - resolution: - { - integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, - } - engines: { node: ">=6.9.0" } - dev: true + "@babel/helper-validator-identifier@7.22.20": {} - /@babel/helper-validator-option@7.23.5: - resolution: - { - integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, - } - engines: { node: ">=6.9.0" } - dev: true + "@babel/helper-validator-option@7.23.5": {} - /@babel/helper-wrap-function@7.22.20: - resolution: - { - integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==, - } - engines: { node: ">=6.9.0" } + "@babel/helper-wrap-function@7.22.20": dependencies: "@babel/helper-function-name": 7.23.0 "@babel/template": 7.22.15 "@babel/types": 7.23.6 - dev: true - /@babel/helpers@7.23.6: - resolution: - { - integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==, - } - engines: { node: ">=6.9.0" } + "@babel/helpers@7.23.6": dependencies: "@babel/template": 7.22.15 "@babel/traverse": 7.23.6 "@babel/types": 7.23.6 transitivePeerDependencies: - supports-color - dev: true - /@babel/highlight@7.23.4: - resolution: - { - integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==, - } - engines: { node: ">=6.9.0" } + "@babel/highlight@7.23.4": dependencies: "@babel/helper-validator-identifier": 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true - /@babel/parser@7.23.6: - resolution: - { - integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, - } - engines: { node: ">=6.0.0" } - hasBin: true + "@babel/parser@7.23.6": dependencies: "@babel/types": 7.23.6 - dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.13.0 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 "@babel/plugin-transform-optional-chaining": 7.23.4(@babel/core@7.23.6) - dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-environment-visitor": 7.22.20 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6): - resolution: - { - integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): - resolution: - { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6): - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.6): - resolution: - { - integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-environment-visitor": 7.22.20 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.6) "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-module-imports": 7.22.15 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.12.0 + "@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6): - resolution: - { - integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 @@ -1033,309 +9531,133 @@ packages: "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.6) "@babel/helper-split-export-declaration": 7.22.6 globals: 11.12.0 - dev: true - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/template": 7.22.15 - dev: true - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-builder-binary-assignment-operator-visitor": 7.22.15 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6): - resolution: - { - integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - dev: true - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-compilation-targets": 7.23.6 "@babel/helper-function-name": 7.23.0 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-simple-access": 7.22.5 - dev: true - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-hoist-variables": 7.22.5 "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-validator-identifier": 7.22.20 - dev: true - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6): - resolution: - { - integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/compat-data": 7.23.5 "@babel/core": 7.23.6 @@ -1343,263 +9665,111 @@ packages: "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.6) "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-annotate-as-pure": 7.22.5 "@babel/helper-create-class-features-plugin": 7.23.6(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.23.6) - dev: true - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 regenerator-transform: 0.15.2 - dev: true - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - dev: true - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6): - resolution: - { - integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 + "@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.6) "@babel/helper-plugin-utils": 7.22.5 - dev: true - /@babel/preset-env@7.23.6(@babel/core@7.23.6): - resolution: - { - integrity: sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/preset-env@7.23.6(@babel/core@7.23.6)": dependencies: "@babel/compat-data": 7.23.5 "@babel/core": 7.23.6 @@ -1684,56 +9854,27 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6): - resolution: - { - integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + "@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6)": dependencies: "@babel/core": 7.23.6 "@babel/helper-plugin-utils": 7.22.5 "@babel/types": 7.23.6 esutils: 2.0.3 - dev: true - /@babel/regjsgen@0.8.0: - resolution: - { - integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==, - } - dev: true + "@babel/regjsgen@0.8.0": {} - /@babel/runtime@7.23.6: - resolution: - { - integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==, - } - engines: { node: ">=6.9.0" } + "@babel/runtime@7.23.6": dependencies: regenerator-runtime: 0.14.1 - /@babel/template@7.22.15: - resolution: - { - integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, - } - engines: { node: ">=6.9.0" } + "@babel/template@7.22.15": dependencies: "@babel/code-frame": 7.23.5 "@babel/parser": 7.23.6 "@babel/types": 7.23.6 - dev: true - /@babel/traverse@7.23.6: - resolution: - { - integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==, - } - engines: { node: ">=6.9.0" } + "@babel/traverse@7.23.6": dependencies: "@babel/code-frame": 7.23.5 "@babel/generator": 7.23.6 @@ -1747,54 +9888,28 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/types@7.23.6: - resolution: - { - integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, - } - engines: { node: ">=6.9.0" } + "@babel/types@7.23.6": dependencies: "@babel/helper-string-parser": 7.23.4 "@babel/helper-validator-identifier": 7.22.20 to-fast-properties: 2.0.0 - dev: true - /@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.24.1)(@lezer/common@1.2.0): - resolution: - { - integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==, - } - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 + "@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.24.1)(@lezer/common@1.2.0)": dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 "@codemirror/view": 6.24.1 "@lezer/common": 1.2.0 - dev: false - /@codemirror/commands@6.3.3: - resolution: - { - integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, - } + "@codemirror/commands@6.3.3": dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 "@codemirror/view": 6.24.1 "@lezer/common": 1.2.0 - dev: false - /@codemirror/lang-xml@6.0.2(@codemirror/view@6.24.1): - resolution: - { - integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==, - } + "@codemirror/lang-xml@6.0.2(@codemirror/view@6.24.1)": dependencies: "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.24.1)(@lezer/common@1.2.0) "@codemirror/language": 6.10.1 @@ -1803,13 +9918,8 @@ packages: "@lezer/xml": 1.0.4 transitivePeerDependencies: - "@codemirror/view" - dev: false - /@codemirror/language@6.10.1: - resolution: - { - integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==, - } + "@codemirror/language@6.10.1": dependencies: "@codemirror/state": 6.4.1 "@codemirror/view": 6.24.1 @@ -1817,65 +9927,31 @@ packages: "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 style-mod: 4.1.0 - dev: false - /@codemirror/lint@6.4.2: - resolution: - { - integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, - } + "@codemirror/lint@6.4.2": dependencies: "@codemirror/state": 6.4.1 "@codemirror/view": 6.24.1 crelt: 1.0.6 - dev: false - /@codemirror/search@6.5.5: - resolution: - { - integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, - } + "@codemirror/search@6.5.5": dependencies: "@codemirror/state": 6.4.1 "@codemirror/view": 6.24.1 crelt: 1.0.6 - dev: false - /@codemirror/state@6.4.1: - resolution: - { - integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==, - } - dev: false + "@codemirror/state@6.4.1": {} - /@codemirror/view@6.24.1: - resolution: - { - integrity: sha512-sBfP4rniPBRQzNakwuQEqjEuiJDWJyF2kqLLqij4WXRoVwPPJfjx966Eq3F7+OPQxDtMt/Q9MWLoZLWjeveBlg==, - } + "@codemirror/view@6.24.1": dependencies: "@codemirror/state": 6.4.1 style-mod: 4.1.0 w3c-keyname: 2.2.8 - dev: false - /@colors/colors@1.5.0: - resolution: - { - integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, - } - engines: { node: ">=0.1.90" } - requiresBuild: true - dev: true + "@colors/colors@1.5.0": optional: true - /@commitlint/cli@19.0.3(@types/node@20.10.5)(typescript@5.3.3): - resolution: - { - integrity: sha512-mGhh/aYPib4Vy4h+AGRloMY+CqkmtdeKPV9poMcZeImF5e3knQ5VYaSeAM0mEzps1dbKsHvABwaDpafLUuM96g==, - } - engines: { node: ">=v18" } - hasBin: true + "@commitlint/cli@19.0.3(@types/node@20.10.5)(typescript@5.3.3)": dependencies: "@commitlint/format": 19.0.3 "@commitlint/lint": 19.0.3 @@ -1887,49 +9963,24 @@ packages: transitivePeerDependencies: - "@types/node" - typescript - dev: true - /@commitlint/config-conventional@19.0.3: - resolution: - { - integrity: sha512-vh0L8XeLaEzTe8VCxSd0gAFvfTK0RFolrzw4o431bIuWJfi/yRCHJlsDwus7wW2eJaFFDR0VFXJyjGyDQhi4vA==, - } - engines: { node: ">=v18" } + "@commitlint/config-conventional@19.0.3": dependencies: "@commitlint/types": 19.0.3 conventional-changelog-conventionalcommits: 7.0.2 - dev: true - /@commitlint/config-validator@18.6.1: - resolution: - { - integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==, - } - engines: { node: ">=v18" } - requiresBuild: true + "@commitlint/config-validator@18.6.1": dependencies: "@commitlint/types": 18.6.1 ajv: 8.12.0 - dev: true optional: true - /@commitlint/config-validator@19.0.3: - resolution: - { - integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==, - } - engines: { node: ">=v18" } + "@commitlint/config-validator@19.0.3": dependencies: "@commitlint/types": 19.0.3 ajv: 8.12.0 - dev: true - /@commitlint/ensure@19.0.3: - resolution: - { - integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==, - } - engines: { node: ">=v18" } + "@commitlint/ensure@19.0.3": dependencies: "@commitlint/types": 19.0.3 lodash.camelcase: 4.3.0 @@ -1937,68 +9988,30 @@ packages: lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - dev: true - /@commitlint/execute-rule@18.6.1: - resolution: - { - integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==, - } - engines: { node: ">=v18" } - requiresBuild: true - dev: true + "@commitlint/execute-rule@18.6.1": optional: true - /@commitlint/execute-rule@19.0.0: - resolution: - { - integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==, - } - engines: { node: ">=v18" } - dev: true + "@commitlint/execute-rule@19.0.0": {} - /@commitlint/format@19.0.3: - resolution: - { - integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==, - } - engines: { node: ">=v18" } + "@commitlint/format@19.0.3": dependencies: "@commitlint/types": 19.0.3 chalk: 5.3.0 - dev: true - /@commitlint/is-ignored@19.0.3: - resolution: - { - integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==, - } - engines: { node: ">=v18" } + "@commitlint/is-ignored@19.0.3": dependencies: "@commitlint/types": 19.0.3 semver: 7.6.0 - dev: true - /@commitlint/lint@19.0.3: - resolution: - { - integrity: sha512-uHPyRqIn57iIplYa5xBr6oNu5aPXKGC4WLeuHfqQHclwIqbJ33g3yA5fIA+/NYnp5ZM2EFiujqHFaVUYj6HlKA==, - } - engines: { node: ">=v18" } + "@commitlint/lint@19.0.3": dependencies: "@commitlint/is-ignored": 19.0.3 "@commitlint/parse": 19.0.3 "@commitlint/rules": 19.0.3 "@commitlint/types": 19.0.3 - dev: true - /@commitlint/load@18.6.1(@types/node@20.10.5)(typescript@5.3.3): - resolution: - { - integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==, - } - engines: { node: ">=v18" } - requiresBuild: true + "@commitlint/load@18.6.1(@types/node@20.10.5)(typescript@5.3.3)": dependencies: "@commitlint/config-validator": 18.6.1 "@commitlint/execute-rule": 18.6.1 @@ -2014,15 +10027,9 @@ packages: transitivePeerDependencies: - "@types/node" - typescript - dev: true optional: true - /@commitlint/load@19.0.3(@types/node@20.10.5)(typescript@5.3.3): - resolution: - { - integrity: sha512-18Tk/ZcDFRKIoKfEcl7kC+bYkEQ055iyKmGsYDoYWpKf6FUvBrP9bIWapuy/MB+kYiltmP9ITiUx6UXtqC9IRw==, - } - engines: { node: ">=v18" } + "@commitlint/load@19.0.3(@types/node@20.10.5)(typescript@5.3.3)": dependencies: "@commitlint/config-validator": 19.0.3 "@commitlint/execute-rule": 19.0.0 @@ -2037,48 +10044,23 @@ packages: transitivePeerDependencies: - "@types/node" - typescript - dev: true - /@commitlint/message@19.0.0: - resolution: - { - integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==, - } - engines: { node: ">=v18" } - dev: true + "@commitlint/message@19.0.0": {} - /@commitlint/parse@19.0.3: - resolution: - { - integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==, - } - engines: { node: ">=v18" } + "@commitlint/parse@19.0.3": dependencies: "@commitlint/types": 19.0.3 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - dev: true - /@commitlint/read@19.0.3: - resolution: - { - integrity: sha512-b5AflTyAXkUx5qKw4TkjjcOccXZHql3JqMi522knTQktq2AubKXFz60Sws+K4FsefwPws6fGz9mqiI/NvsvxFA==, - } - engines: { node: ">=v18" } + "@commitlint/read@19.0.3": dependencies: "@commitlint/top-level": 19.0.0 "@commitlint/types": 19.0.3 git-raw-commits: 4.0.0 minimist: 1.2.8 - dev: true - /@commitlint/resolve-extends@18.6.1: - resolution: - { - integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==, - } - engines: { node: ">=v18" } - requiresBuild: true + "@commitlint/resolve-extends@18.6.1": dependencies: "@commitlint/config-validator": 18.6.1 "@commitlint/types": 18.6.1 @@ -2086,15 +10068,9 @@ packages: lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 - dev: true optional: true - /@commitlint/resolve-extends@19.0.3: - resolution: - { - integrity: sha512-18BKmta8OC8+Ub+Q3QGM9l27VjQaXobloVXOrMvu8CpEwJYv62vC/t7Ka5kJnsW0tU9q1eMqJFZ/nN9T/cOaIA==, - } - engines: { node: ">=v18" } + "@commitlint/resolve-extends@19.0.3": dependencies: "@commitlint/config-validator": 19.0.3 "@commitlint/types": 19.0.3 @@ -2102,197 +10078,77 @@ packages: import-meta-resolve: 4.0.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - dev: true - /@commitlint/rules@19.0.3: - resolution: - { - integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==, - } - engines: { node: ">=v18" } + "@commitlint/rules@19.0.3": dependencies: "@commitlint/ensure": 19.0.3 "@commitlint/message": 19.0.0 "@commitlint/to-lines": 19.0.0 "@commitlint/types": 19.0.3 execa: 8.0.1 - dev: true - /@commitlint/to-lines@19.0.0: - resolution: - { - integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==, - } - engines: { node: ">=v18" } - dev: true + "@commitlint/to-lines@19.0.0": {} - /@commitlint/top-level@19.0.0: - resolution: - { - integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==, - } - engines: { node: ">=v18" } + "@commitlint/top-level@19.0.0": dependencies: find-up: 7.0.0 - dev: true - /@commitlint/types@18.6.1: - resolution: - { - integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==, - } - engines: { node: ">=v18" } - requiresBuild: true + "@commitlint/types@18.6.1": dependencies: chalk: 4.1.2 - dev: true optional: true - /@commitlint/types@19.0.3: - resolution: - { - integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==, - } - engines: { node: ">=v18" } + "@commitlint/types@19.0.3": dependencies: "@types/conventional-commits-parser": 5.0.0 chalk: 5.3.0 - dev: true - /@csstools/cascade-layer-name-parser@1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/cascade-layer-name-parser@1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3)": dependencies: "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - dev: true - /@csstools/color-helpers@4.0.0: - resolution: - { - integrity: sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w==, - } - engines: { node: ^14 || ^16 || >=18 } - dev: true + "@csstools/color-helpers@4.0.0": {} - /@csstools/css-calc@1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-calc@1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3)": dependencies: "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - dev: true - /@csstools/css-color-parser@1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-color-parser@1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3)": dependencies: "@csstools/color-helpers": 4.0.0 "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - dev: true - /@csstools/css-parser-algorithms@2.5.0(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-parser-algorithms@2.5.0(@csstools/css-tokenizer@2.2.3)": dependencies: "@csstools/css-tokenizer": 2.2.3 - dev: true - /@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-parser-algorithms@2.6.0(@csstools/css-tokenizer@2.2.3)": dependencies: "@csstools/css-tokenizer": 2.2.3 - dev: true - /@csstools/css-tokenizer@2.2.3: - resolution: - { - integrity: sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==, - } - engines: { node: ^14 || ^16 || >=18 } - dev: true + "@csstools/css-tokenizer@2.2.3": {} - /@csstools/media-query-list-parser@2.1.7(@csstools/css-parser-algorithms@2.5.0)(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-lHPKJDkPUECsyAvD60joYfDmp8UERYxHGkFfyLJFTVK/ERJe0sVlIFLXU5XFxdjNDTerp5L4KeaKG+Z5S94qxQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-parser-algorithms": ^2.5.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/media-query-list-parser@2.1.7(@csstools/css-parser-algorithms@2.5.0)(@csstools/css-tokenizer@2.2.3)": dependencies: "@csstools/css-parser-algorithms": 2.5.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - dev: true - /@csstools/media-query-list-parser@2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3): - resolution: - { - integrity: sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/media-query-list-parser@2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3)": dependencies: "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 - dev: true - /@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-RbkQoOH23yGhWVetgBTwFgIOHEyU2tKMN7blTz/YAKKabR6tr9pP7mYS23Q9snFY2hr8WSaV8Le64KdM9BtUSA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-cascade-layers@4.0.3(postcss@8.4.35)": dependencies: "@csstools/selector-specificity": 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /@csstools/postcss-color-function@3.0.10(postcss@8.4.35): - resolution: - { - integrity: sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-color-function@3.0.10(postcss@8.4.35)": dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -2300,16 +10156,8 @@ packages: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /@csstools/postcss-color-mix-function@2.0.10(postcss@8.4.35): - resolution: - { - integrity: sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-color-mix-function@2.0.10(postcss@8.4.35)": dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -2317,60 +10165,28 @@ packages: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /@csstools/postcss-exponential-functions@1.0.4(postcss@8.4.35): - resolution: - { - integrity: sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-exponential-functions@1.0.4(postcss@8.4.35)": dependencies: "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 - dev: true - /@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.35)": dependencies: "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /@csstools/postcss-gamut-mapping@1.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-gamut-mapping@1.0.3(postcss@8.4.35)": dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 - dev: true - /@csstools/postcss-gradients-interpolation-method@4.0.11(postcss@8.4.35): - resolution: - { - integrity: sha512-LFom5jCVUfzF+iuiOZvhvX7RRN8vc+tKpcKo9s4keEBAU2mPwV5/Fgz5iylEfXP/DZbEdq2C0At20urMi/lupw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-gradients-interpolation-method@4.0.11(postcss@8.4.35)": dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -2378,16 +10194,8 @@ packages: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /@csstools/postcss-hwb-function@3.0.9(postcss@8.4.35): - resolution: - { - integrity: sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-hwb-function@3.0.9(postcss@8.4.35)": dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -2395,194 +10203,82 @@ packages: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /@csstools/postcss-ic-unit@3.0.4(postcss@8.4.35): - resolution: - { - integrity: sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-ic-unit@3.0.4(postcss@8.4.35)": dependencies: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /@csstools/postcss-initial@1.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-initial@1.0.1(postcss@8.4.35)": dependencies: postcss: 8.4.35 - dev: true - /@csstools/postcss-is-pseudo-class@4.0.5(postcss@8.4.35): - resolution: - { - integrity: sha512-qG3MI7IN3KY9UwdaE9E7G7sFydscVW7nAj5OGwaBP9tQPEEVdxXTGI+l1ZW5EUpZFSj+u3q/22fH5+8HI72+Bg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-is-pseudo-class@4.0.5(postcss@8.4.35)": dependencies: "@csstools/selector-specificity": 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /@csstools/postcss-light-dark-function@1.0.0(postcss@8.4.35): - resolution: - { - integrity: sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-light-dark-function@1.0.0(postcss@8.4.35)": dependencies: "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.35)": dependencies: postcss: 8.4.35 - dev: true - /@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.35)": dependencies: postcss: 8.4.35 - dev: true - /@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.35)": dependencies: postcss: 8.4.35 - dev: true - /@csstools/postcss-logical-resize@2.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-logical-resize@2.0.1(postcss@8.4.35)": dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /@csstools/postcss-logical-viewport-units@2.0.6(postcss@8.4.35): - resolution: - { - integrity: sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-logical-viewport-units@2.0.6(postcss@8.4.35)": dependencies: "@csstools/css-tokenizer": 2.2.3 "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /@csstools/postcss-media-minmax@1.1.3(postcss@8.4.35): - resolution: - { - integrity: sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-media-minmax@1.1.3(postcss@8.4.35)": dependencies: "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 "@csstools/media-query-list-parser": 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 - dev: true - /@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.6(postcss@8.4.35): - resolution: - { - integrity: sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.6(postcss@8.4.35)": dependencies: "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 "@csstools/media-query-list-parser": 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 - dev: true - /@csstools/postcss-nested-calc@3.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-nested-calc@3.0.2(postcss@8.4.35)": dependencies: "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.35)": dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /@csstools/postcss-oklab-function@3.0.10(postcss@8.4.35): - resolution: - { - integrity: sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-oklab-function@3.0.10(postcss@8.4.35)": dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -2590,29 +10286,13 @@ packages: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /@csstools/postcss-progressive-custom-properties@3.1.0(postcss@8.4.35): - resolution: - { - integrity: sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-progressive-custom-properties@3.1.0(postcss@8.4.35)": dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /@csstools/postcss-relative-color-syntax@2.0.10(postcss@8.4.35): - resolution: - { - integrity: sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-relative-color-syntax@2.0.10(postcss@8.4.35)": dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -2620,416 +10300,125 @@ packages: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.35)": dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /@csstools/postcss-stepped-value-functions@3.0.5(postcss@8.4.35): - resolution: - { - integrity: sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-stepped-value-functions@3.0.5(postcss@8.4.35)": dependencies: "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 - dev: true - /@csstools/postcss-text-decoration-shorthand@3.0.4(postcss@8.4.35): - resolution: - { - integrity: sha512-yUZmbnUemgQmja7SpOZeU45+P49wNEgQguRdyTktFkZsHf7Gof+ZIYfvF6Cm+LsU1PwSupy4yUeEKKjX5+k6cQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-text-decoration-shorthand@3.0.4(postcss@8.4.35)": dependencies: "@csstools/color-helpers": 4.0.0 postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /@csstools/postcss-trigonometric-functions@3.0.5(postcss@8.4.35): - resolution: - { - integrity: sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-trigonometric-functions@3.0.5(postcss@8.4.35)": dependencies: "@csstools/css-calc": 1.1.7(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 - dev: true - /@csstools/postcss-unset-value@3.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/postcss-unset-value@3.0.1(postcss@8.4.35)": dependencies: postcss: 8.4.35 - dev: true - /@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.15): - resolution: - { - integrity: sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss-selector-parser: ^6.0.13 + "@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.15)": dependencies: postcss-selector-parser: 6.0.15 - dev: true - /@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15): - resolution: - { - integrity: sha512-RpHaZ1h9LE7aALeQXmXrJkRG84ZxIsctEN2biEUmFyKpzFM3zZ35eUMcIzZFsw/2olQE6v69+esEqU2f1MKycg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss-selector-parser: ^6.0.13 + "@csstools/selector-specificity@3.0.2(postcss-selector-parser@6.0.15)": dependencies: postcss-selector-parser: 6.0.15 - dev: true - /@csstools/utilities@1.0.0(postcss@8.4.35): - resolution: - { - integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + "@csstools/utilities@1.0.0(postcss@8.4.35)": dependencies: postcss: 8.4.35 - dev: true - /@esbuild/aix-ppc64@0.19.10: - resolution: - { - integrity: sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true + "@esbuild/aix-ppc64@0.19.10": optional: true - /@esbuild/android-arm64@0.19.10: - resolution: - { - integrity: sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + "@esbuild/android-arm64@0.19.10": optional: true - /@esbuild/android-arm@0.19.10: - resolution: - { - integrity: sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + "@esbuild/android-arm@0.19.10": optional: true - /@esbuild/android-x64@0.19.10: - resolution: - { - integrity: sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + "@esbuild/android-x64@0.19.10": optional: true - /@esbuild/darwin-arm64@0.19.10: - resolution: - { - integrity: sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + "@esbuild/darwin-arm64@0.19.10": optional: true - /@esbuild/darwin-x64@0.19.10: - resolution: - { - integrity: sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + "@esbuild/darwin-x64@0.19.10": optional: true - /@esbuild/freebsd-arm64@0.19.10: - resolution: - { - integrity: sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + "@esbuild/freebsd-arm64@0.19.10": optional: true - /@esbuild/freebsd-x64@0.19.10: - resolution: - { - integrity: sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + "@esbuild/freebsd-x64@0.19.10": optional: true - /@esbuild/linux-arm64@0.19.10: - resolution: - { - integrity: sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-arm64@0.19.10": optional: true - /@esbuild/linux-arm@0.19.10: - resolution: - { - integrity: sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-arm@0.19.10": optional: true - /@esbuild/linux-ia32@0.19.10: - resolution: - { - integrity: sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-ia32@0.19.10": optional: true - /@esbuild/linux-loong64@0.19.10: - resolution: - { - integrity: sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==, - } - engines: { node: ">=12" } - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-loong64@0.19.10": optional: true - /@esbuild/linux-mips64el@0.19.10: - resolution: - { - integrity: sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==, - } - engines: { node: ">=12" } - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-mips64el@0.19.10": optional: true - /@esbuild/linux-ppc64@0.19.10: - resolution: - { - integrity: sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-ppc64@0.19.10": optional: true - /@esbuild/linux-riscv64@0.19.10: - resolution: - { - integrity: sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==, - } - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-riscv64@0.19.10": optional: true - /@esbuild/linux-s390x@0.19.10: - resolution: - { - integrity: sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==, - } - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-s390x@0.19.10": optional: true - /@esbuild/linux-x64@0.19.10: - resolution: - { - integrity: sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + "@esbuild/linux-x64@0.19.10": optional: true - /@esbuild/netbsd-x64@0.19.10: - resolution: - { - integrity: sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + "@esbuild/netbsd-x64@0.19.10": optional: true - /@esbuild/openbsd-x64@0.19.10: - resolution: - { - integrity: sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + "@esbuild/openbsd-x64@0.19.10": optional: true - /@esbuild/sunos-x64@0.19.10: - resolution: - { - integrity: sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + "@esbuild/sunos-x64@0.19.10": optional: true - /@esbuild/win32-arm64@0.19.10: - resolution: - { - integrity: sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + "@esbuild/win32-arm64@0.19.10": optional: true - /@esbuild/win32-ia32@0.19.10: - resolution: - { - integrity: sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + "@esbuild/win32-ia32@0.19.10": optional: true - /@esbuild/win32-x64@0.19.10: - resolution: - { - integrity: sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + "@esbuild/win32-x64@0.19.10": optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + "@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)": dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - dev: true + "@eslint-community/regexpp@4.10.0": {} - /@eslint/eslintrc@2.1.4: - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + "@eslint/eslintrc@2.1.4": dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -3042,54 +10431,23 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.57.0: - resolution: - { - integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true + "@eslint/js@8.57.0": {} - /@floating-ui/core@1.5.2: - resolution: - { - integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==, - } + "@floating-ui/core@1.5.2": dependencies: "@floating-ui/utils": 0.1.6 - dev: false - /@floating-ui/dom@1.6.3: - resolution: - { - integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==, - } + "@floating-ui/dom@1.6.3": dependencies: "@floating-ui/core": 1.5.2 "@floating-ui/utils": 0.2.1 - dev: false - /@floating-ui/utils@0.1.6: - resolution: - { - integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==, - } - dev: false + "@floating-ui/utils@0.1.6": {} - /@floating-ui/utils@0.2.1: - resolution: - { - integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==, - } - dev: false + "@floating-ui/utils@0.2.1": {} - /@foliojs-fork/fontkit@1.9.1: - resolution: - { - integrity: sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==, - } + "@foliojs-fork/fontkit@1.9.1": dependencies: "@foliojs-fork/restructure": 2.0.2 brfs: 2.0.2 @@ -3101,261 +10459,110 @@ packages: tiny-inflate: 1.0.3 unicode-properties: 1.4.1 unicode-trie: 2.0.0 - dev: false - /@foliojs-fork/linebreak@1.1.1: - resolution: - { - integrity: sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==, - } + "@foliojs-fork/linebreak@1.1.1": dependencies: base64-js: 1.3.1 brfs: 2.0.2 unicode-trie: 2.0.0 - dev: false - /@foliojs-fork/pdfkit@0.14.0: - resolution: - { - integrity: sha512-nMOiQAv6id89MT3tVTCgc7HxD5ZMANwio2o5yvs5sexQkC0KI3BLaLakpsrHmFfeGFAhqPmZATZGbJGXTUebpg==, - } + "@foliojs-fork/pdfkit@0.14.0": dependencies: "@foliojs-fork/fontkit": 1.9.1 "@foliojs-fork/linebreak": 1.1.1 crypto-js: 4.2.0 png-js: 1.0.0 - dev: false - /@foliojs-fork/restructure@2.0.2: - resolution: - { - integrity: sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==, - } - dev: false + "@foliojs-fork/restructure@2.0.2": {} - /@github/clipboard-copy-element@1.3.0: - resolution: - { - integrity: sha512-wyntkQkwoLbLo+Hqg2LIVMXDIzcvUb9bSDz+clX6nVJItwzh103rHxdXFRZD+DmxVbuEW5xSznYQXkz1jZT+xg==, - } - dev: false + "@github/clipboard-copy-element@1.3.0": {} - /@github/hotkey@3.1.0: - resolution: - { - integrity: sha512-Lj9QjYa+b+Nk5U1nZtlXLdx3HI8/EeM6ZNwBjpYcGVYqpwHdM2ScRH0p7+5zh28JG6SPbTM9+Rb1dFd742qMTw==, - } - dev: false + "@github/hotkey@3.1.0": {} - /@github/markdown-toolbar-element@2.2.1: - resolution: - { - integrity: sha512-ap+ulyqzG3aVqwKsKjbDdYwM75TQXZpPtmIuPwm+54OTgcC96267oX3cEqd1wSqGsH7O5PonZ//fE9jH7Q4JkA==, - } - dev: false + "@github/markdown-toolbar-element@2.2.1": {} - /@github/relative-time-element@4.3.1: - resolution: - { - integrity: sha512-zL79nlhZVCg7x2Pf/HT5MB0mowmErE71VXpF10/3Wy8dQwkninNO1M9aOizh2wKC5LkSpDXqNYjDZwbH0/bcSg==, - } - dev: false + "@github/relative-time-element@4.3.1": {} - /@humanwhocodes/config-array@0.11.14: - resolution: - { - integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, - } - engines: { node: ">=10.10.0" } + "@humanwhocodes/config-array@0.11.14": dependencies: "@humanwhocodes/object-schema": 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - dev: true + "@humanwhocodes/module-importer@1.0.1": {} - /@humanwhocodes/object-schema@2.0.2: - resolution: - { - integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, - } - dev: true + "@humanwhocodes/object-schema@2.0.2": {} - /@isaacs/cliui@8.0.2: - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: ">=12" } + "@isaacs/cliui@8.0.2": dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@jridgewell/gen-mapping@0.3.3: - resolution: - { - integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, - } - engines: { node: ">=6.0.0" } + "@jridgewell/gen-mapping@0.3.3": dependencies: "@jridgewell/set-array": 1.1.2 "@jridgewell/sourcemap-codec": 1.4.15 "@jridgewell/trace-mapping": 0.3.20 - dev: true - /@jridgewell/resolve-uri@3.1.1: - resolution: - { - integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, - } - engines: { node: ">=6.0.0" } - dev: true + "@jridgewell/resolve-uri@3.1.1": {} - /@jridgewell/set-array@1.1.2: - resolution: - { - integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, - } - engines: { node: ">=6.0.0" } - dev: true + "@jridgewell/set-array@1.1.2": {} - /@jridgewell/source-map@0.3.5: - resolution: - { - integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==, - } + "@jridgewell/source-map@0.3.5": dependencies: "@jridgewell/gen-mapping": 0.3.3 "@jridgewell/trace-mapping": 0.3.20 - dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: - { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, - } - dev: true + "@jridgewell/sourcemap-codec@1.4.15": {} - /@jridgewell/trace-mapping@0.3.20: - resolution: - { - integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, - } + "@jridgewell/trace-mapping@0.3.20": dependencies: "@jridgewell/resolve-uri": 3.1.1 "@jridgewell/sourcemap-codec": 1.4.15 - dev: true - /@lezer/common@1.2.0: - resolution: - { - integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==, - } - dev: false + "@lezer/common@1.2.0": {} - /@lezer/highlight@1.2.0: - resolution: - { - integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, - } + "@lezer/highlight@1.2.0": dependencies: "@lezer/common": 1.2.0 - dev: false - /@lezer/lr@1.3.14: - resolution: - { - integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==, - } + "@lezer/lr@1.3.14": dependencies: "@lezer/common": 1.2.0 - dev: false - /@lezer/xml@1.0.4: - resolution: - { - integrity: sha512-WmXKb5eX8+rRfZYSNRR5TPee/ZoDgBdVS/rj1VCJGDKa5gNldIctQYibCoFVyNhvZsyL/8nHbZJZPM4gnXN2Vw==, - } + "@lezer/xml@1.0.4": dependencies: "@lezer/common": 1.2.0 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 - dev: false - /@lit-labs/ssr-dom-shim@1.2.0: - resolution: - { - integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==, - } - dev: false + "@lit-labs/ssr-dom-shim@1.2.0": {} - /@lit/reactive-element@2.0.4: - resolution: - { - integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==, - } + "@lit/reactive-element@2.0.4": dependencies: "@lit-labs/ssr-dom-shim": 1.2.0 - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } + "@nodelib/fs.scandir@2.1.5": dependencies: "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - dev: true + "@nodelib/fs.stat@2.0.5": {} - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } + "@nodelib/fs.walk@1.2.8": dependencies: "@nodelib/fs.scandir": 2.1.5 fastq: 1.16.0 - dev: true - /@octokit/auth-token@4.0.0: - resolution: - { - integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==, - } - engines: { node: ">= 18" } - dev: true + "@octokit/auth-token@4.0.0": {} - /@octokit/core@5.0.2: - resolution: - { - integrity: sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==, - } - engines: { node: ">= 18" } + "@octokit/core@5.0.2": dependencies: "@octokit/auth-token": 4.0.0 "@octokit/graphql": 7.0.2 @@ -3364,190 +10571,80 @@ packages: "@octokit/types": 12.4.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 - dev: true - /@octokit/endpoint@9.0.4: - resolution: - { - integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==, - } - engines: { node: ">= 18" } + "@octokit/endpoint@9.0.4": dependencies: "@octokit/types": 12.4.0 universal-user-agent: 6.0.1 - dev: true - /@octokit/graphql@7.0.2: - resolution: - { - integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==, - } - engines: { node: ">= 18" } + "@octokit/graphql@7.0.2": dependencies: "@octokit/request": 8.1.6 "@octokit/types": 12.4.0 universal-user-agent: 6.0.1 - dev: true - /@octokit/openapi-types@19.1.0: - resolution: - { - integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==, - } - dev: true + "@octokit/openapi-types@19.1.0": {} - /@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.0.2): - resolution: - { - integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==, - } - engines: { node: ">= 18" } - peerDependencies: - "@octokit/core": ">=5" + "@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.0.2)": dependencies: "@octokit/core": 5.0.2 "@octokit/types": 12.4.0 - dev: true - /@octokit/plugin-retry@6.0.1(@octokit/core@5.0.2): - resolution: - { - integrity: sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==, - } - engines: { node: ">= 18" } - peerDependencies: - "@octokit/core": ">=5" + "@octokit/plugin-retry@6.0.1(@octokit/core@5.0.2)": dependencies: "@octokit/core": 5.0.2 "@octokit/request-error": 5.0.1 "@octokit/types": 12.4.0 bottleneck: 2.19.5 - dev: true - /@octokit/plugin-throttling@8.1.3(@octokit/core@5.0.2): - resolution: - { - integrity: sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==, - } - engines: { node: ">= 18" } - peerDependencies: - "@octokit/core": ^5.0.0 + "@octokit/plugin-throttling@8.1.3(@octokit/core@5.0.2)": dependencies: "@octokit/core": 5.0.2 "@octokit/types": 12.4.0 bottleneck: 2.19.5 - dev: true - /@octokit/request-error@5.0.1: - resolution: - { - integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==, - } - engines: { node: ">= 18" } + "@octokit/request-error@5.0.1": dependencies: "@octokit/types": 12.4.0 deprecation: 2.3.1 once: 1.4.0 - dev: true - /@octokit/request@8.1.6: - resolution: - { - integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==, - } - engines: { node: ">= 18" } + "@octokit/request@8.1.6": dependencies: "@octokit/endpoint": 9.0.4 "@octokit/request-error": 5.0.1 "@octokit/types": 12.4.0 universal-user-agent: 6.0.1 - dev: true - /@octokit/types@12.4.0: - resolution: - { - integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==, - } + "@octokit/types@12.4.0": dependencies: "@octokit/openapi-types": 19.1.0 - dev: true - /@pkgjs/parseargs@0.11.0: - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: ">=14" } - requiresBuild: true - dev: true + "@pkgjs/parseargs@0.11.0": optional: true - /@pkgr/core@0.1.1: - resolution: - { - integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } - dev: true + "@pkgr/core@0.1.1": {} - /@pnpm/config.env-replace@1.1.0: - resolution: - { - integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==, - } - engines: { node: ">=12.22.0" } - dev: true + "@pnpm/config.env-replace@1.1.0": {} - /@pnpm/network.ca-file@1.0.2: - resolution: - { - integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==, - } - engines: { node: ">=12.22.0" } + "@pnpm/network.ca-file@1.0.2": dependencies: graceful-fs: 4.2.10 - dev: true - /@pnpm/npm-conf@2.2.2: - resolution: - { - integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==, - } - engines: { node: ">=12" } + "@pnpm/npm-conf@2.2.2": dependencies: "@pnpm/config.env-replace": 1.1.0 "@pnpm/network.ca-file": 1.0.2 config-chain: 1.1.13 - dev: true - /@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(rollup@2.79.1): - resolution: - { - integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, - } - engines: { node: ">= 10.0.0" } - peerDependencies: - "@babel/core": ^7.0.0 - "@types/babel__core": ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - "@types/babel__core": - optional: true + "@rollup/plugin-babel@5.3.1(@babel/core@7.23.6)(rollup@2.79.1)": dependencies: "@babel/core": 7.23.6 "@babel/helper-module-imports": 7.22.15 "@rollup/pluginutils": 3.1.0(rollup@2.79.1) rollup: 2.79.1 - dev: true - /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): - resolution: - { - integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==, - } - engines: { node: ">= 10.0.0" } - peerDependencies: - rollup: ^1.20.0||^2.0.0 + "@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1)": dependencies: "@rollup/pluginutils": 3.1.0(rollup@2.79.1) "@types/resolve": 1.17.1 @@ -3556,203 +10653,68 @@ packages: is-module: 1.0.0 resolve: 1.22.8 rollup: 2.79.1 - dev: true - /@rollup/plugin-replace@2.4.2(rollup@2.79.1): - resolution: - { - integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, - } - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 + "@rollup/plugin-replace@2.4.2(rollup@2.79.1)": dependencies: "@rollup/pluginutils": 3.1.0(rollup@2.79.1) magic-string: 0.25.9 rollup: 2.79.1 - dev: true - /@rollup/pluginutils@3.1.0(rollup@2.79.1): - resolution: - { - integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, - } - engines: { node: ">= 8.0.0" } - peerDependencies: - rollup: ^1.20.0||^2.0.0 + "@rollup/pluginutils@3.1.0(rollup@2.79.1)": dependencies: "@types/estree": 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 rollup: 2.79.1 - dev: true - /@rollup/rollup-android-arm-eabi@4.9.1: - resolution: - { - integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==, - } - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + "@rollup/rollup-android-arm-eabi@4.9.1": optional: true - /@rollup/rollup-android-arm64@4.9.1: - resolution: - { - integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==, - } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + "@rollup/rollup-android-arm64@4.9.1": optional: true - /@rollup/rollup-darwin-arm64@4.9.1: - resolution: - { - integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==, - } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + "@rollup/rollup-darwin-arm64@4.9.1": optional: true - /@rollup/rollup-darwin-x64@4.9.1: - resolution: - { - integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==, - } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + "@rollup/rollup-darwin-x64@4.9.1": optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.1: - resolution: - { - integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==, - } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + "@rollup/rollup-linux-arm-gnueabihf@4.9.1": optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.1: - resolution: - { - integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + "@rollup/rollup-linux-arm64-gnu@4.9.1": optional: true - /@rollup/rollup-linux-arm64-musl@4.9.1: - resolution: - { - integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + "@rollup/rollup-linux-arm64-musl@4.9.1": optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.1: - resolution: - { - integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==, - } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + "@rollup/rollup-linux-riscv64-gnu@4.9.1": optional: true - /@rollup/rollup-linux-x64-gnu@4.9.1: - resolution: - { - integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + "@rollup/rollup-linux-x64-gnu@4.9.1": optional: true - /@rollup/rollup-linux-x64-musl@4.9.1: - resolution: - { - integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + "@rollup/rollup-linux-x64-musl@4.9.1": optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.1: - resolution: - { - integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==, - } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + "@rollup/rollup-win32-arm64-msvc@4.9.1": optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.1: - resolution: - { - integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==, - } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + "@rollup/rollup-win32-ia32-msvc@4.9.1": optional: true - /@rollup/rollup-win32-x64-msvc@4.9.1: - resolution: - { - integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==, - } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + "@rollup/rollup-win32-x64-msvc@4.9.1": optional: true - /@semantic-release/changelog@6.0.3(semantic-release@23.0.2): - resolution: - { - integrity: sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==, - } - engines: { node: ">=14.17" } - peerDependencies: - semantic-release: ">=18.0.0" + "@semantic-release/changelog@6.0.3(semantic-release@23.0.2)": dependencies: "@semantic-release/error": 3.0.0 aggregate-error: 3.1.0 fs-extra: 11.2.0 lodash: 4.17.21 semantic-release: 23.0.2(typescript@5.3.3) - dev: true - /@semantic-release/commit-analyzer@11.1.0(semantic-release@23.0.2): - resolution: - { - integrity: sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==, - } - engines: { node: ^18.17 || >=20.6.1 } - peerDependencies: - semantic-release: ">=20.1.0" + "@semantic-release/commit-analyzer@11.1.0(semantic-release@23.0.2)": dependencies: conventional-changelog-angular: 7.0.0 conventional-commits-filter: 4.0.0 @@ -3764,32 +10726,12 @@ packages: semantic-release: 23.0.2(typescript@5.3.3) transitivePeerDependencies: - supports-color - dev: true - /@semantic-release/error@3.0.0: - resolution: - { - integrity: sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==, - } - engines: { node: ">=14.17" } - dev: true + "@semantic-release/error@3.0.0": {} - /@semantic-release/error@4.0.0: - resolution: - { - integrity: sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==, - } - engines: { node: ">=18" } - dev: true + "@semantic-release/error@4.0.0": {} - /@semantic-release/exec@6.0.3(semantic-release@23.0.2): - resolution: - { - integrity: sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==, - } - engines: { node: ">=14.17" } - peerDependencies: - semantic-release: ">=18.0.0" + "@semantic-release/exec@6.0.3(semantic-release@23.0.2)": dependencies: "@semantic-release/error": 3.0.0 aggregate-error: 3.1.0 @@ -3800,16 +10742,8 @@ packages: semantic-release: 23.0.2(typescript@5.3.3) transitivePeerDependencies: - supports-color - dev: true - /@semantic-release/git@10.0.1(semantic-release@23.0.2): - resolution: - { - integrity: sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==, - } - engines: { node: ">=14.17" } - peerDependencies: - semantic-release: ">=18.0.0" + "@semantic-release/git@10.0.1(semantic-release@23.0.2)": dependencies: "@semantic-release/error": 3.0.0 aggregate-error: 3.1.0 @@ -3822,16 +10756,8 @@ packages: semantic-release: 23.0.2(typescript@5.3.3) transitivePeerDependencies: - supports-color - dev: true - /@semantic-release/github@9.2.6(semantic-release@23.0.2): - resolution: - { - integrity: sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==, - } - engines: { node: ">=18" } - peerDependencies: - semantic-release: ">=20.1.0" + "@semantic-release/github@9.2.6(semantic-release@23.0.2)": dependencies: "@octokit/core": 5.0.2 "@octokit/plugin-paginate-rest": 9.1.5(@octokit/core@5.0.2) @@ -3852,16 +10778,8 @@ packages: url-join: 5.0.0 transitivePeerDependencies: - supports-color - dev: true - /@semantic-release/gitlab@13.0.3(semantic-release@23.0.2): - resolution: - { - integrity: sha512-tup9XW+c3TAQ01l7snBroEXVBaSmXydmLVTmsSeCZ+AN+D60AuA4aSqAF8YdMLQLiYLXrGNZkq+vdBxR/rQm6A==, - } - engines: { node: ">=20.8.1" } - peerDependencies: - semantic-release: ">=20.1.0" + "@semantic-release/gitlab@13.0.3(semantic-release@23.0.2)": dependencies: "@semantic-release/error": 4.0.0 aggregate-error: 5.0.0 @@ -3879,16 +10797,8 @@ packages: url-join: 4.0.1 transitivePeerDependencies: - supports-color - dev: true - /@semantic-release/npm@11.0.2(semantic-release@23.0.2): - resolution: - { - integrity: sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==, - } - engines: { node: ^18.17 || >=20 } - peerDependencies: - semantic-release: ">=20.1.0" + "@semantic-release/npm@11.0.2(semantic-release@23.0.2)": dependencies: "@semantic-release/error": 4.0.0 aggregate-error: 5.0.0 @@ -3904,16 +10814,8 @@ packages: semantic-release: 23.0.2(typescript@5.3.3) semver: 7.6.0 tempy: 3.1.0 - dev: true - /@semantic-release/release-notes-generator@12.1.0(semantic-release@23.0.2): - resolution: - { - integrity: sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==, - } - engines: { node: ^18.17 || >=20.6.1 } - peerDependencies: - semantic-release: ">=20.1.0" + "@semantic-release/release-notes-generator@12.1.0(semantic-release@23.0.2)": dependencies: conventional-changelog-angular: 7.0.0 conventional-changelog-writer: 7.0.1 @@ -3928,221 +10830,81 @@ packages: semantic-release: 23.0.2(typescript@5.3.3) transitivePeerDependencies: - supports-color - dev: true - /@sindresorhus/is@4.6.0: - resolution: - { - integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, - } - engines: { node: ">=10" } - dev: true + "@sindresorhus/is@4.6.0": {} - /@sindresorhus/is@6.1.0: - resolution: - { - integrity: sha512-BuvU07zq3tQ/2SIgBsEuxKYDyDjC0n7Zir52bpHy2xnBbW81+po43aLFPLbeV3HRAheFbGud1qgcqSYfhtHMAg==, - } - engines: { node: ">=16" } - dev: true + "@sindresorhus/is@6.1.0": {} - /@sindresorhus/merge-streams@1.0.0: - resolution: - { - integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==, - } - engines: { node: ">=18" } - dev: true + "@sindresorhus/merge-streams@1.0.0": {} - /@stencil/core@2.5.2: - resolution: - { - integrity: sha512-bgjPXkSzzg1WnTgVUm6m5ZzpKt602WmA/QljODAW1xVN40OHJdbGblzF/F6MFzqv2c5Cy30CB41arc8qADIdcQ==, - } - engines: { node: ">=12.10.0", npm: ">=6.0.0" } - hasBin: true - dev: false + "@stencil/core@2.5.2": {} - /@surma/rollup-plugin-off-main-thread@2.2.3: - resolution: - { - integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, - } + "@surma/rollup-plugin-off-main-thread@2.2.3": dependencies: ejs: 3.1.9 json5: 2.2.3 magic-string: 0.25.9 string.prototype.matchall: 4.0.10 - dev: true - /@szmarczak/http-timer@5.0.1: - resolution: - { - integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==, - } - engines: { node: ">=14.16" } + "@szmarczak/http-timer@5.0.1": dependencies: defer-to-connect: 2.0.1 - dev: true - /@tailwindcss/forms@0.5.7(tailwindcss@3.4.1): - resolution: - { - integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==, - } - peerDependencies: - tailwindcss: ">=3.0.0 || >= 3.0.0-alpha.1" + "@tailwindcss/forms@0.5.7(tailwindcss@3.4.1)": dependencies: mini-svg-data-uri: 1.4.4 tailwindcss: 3.4.1 - dev: true - /@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.35): - resolution: - { - integrity: sha512-WhHoFBx19TnH/c+xLwT/sxei6+4RpdfiyG3MYXfmLaMsADmVqBkF7B6lDalgZD9YdM459MF7DtxVbWkOrV7IaQ==, - } - peerDependencies: - postcss: ^8.2.15 + "@tailwindcss/nesting@0.0.0-insiders.565cd3e(postcss@8.4.35)": dependencies: postcss: 8.4.35 postcss-nested: 5.0.6(postcss@8.4.35) - dev: false - /@tailwindcss/typography@0.5.10(tailwindcss@3.4.1): - resolution: - { - integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==, - } - peerDependencies: - tailwindcss: ">=3.0.0 || insiders" + "@tailwindcss/typography@0.5.10(tailwindcss@3.4.1)": dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 tailwindcss: 3.4.1 - dev: true - /@trysound/sax@0.2.0: - resolution: - { - integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, - } - engines: { node: ">=10.13.0" } - dev: true + "@trysound/sax@0.2.0": {} - /@types/conventional-commits-parser@5.0.0: - resolution: - { - integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==, - } + "@types/conventional-commits-parser@5.0.0": dependencies: "@types/node": 20.10.5 - dev: true - /@types/estree@0.0.39: - resolution: - { - integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==, - } - dev: true + "@types/estree@0.0.39": {} - /@types/fscreen@1.0.4: - resolution: - { - integrity: sha512-TsjxyAUvlvuQyao9vNk0yES4nY07K9xoAbkhgXU948JG39EqlLxniWuW9OiZde9Q8ACSpu3fmbXXRAfb/l/HqQ==, - } - dev: false + "@types/fscreen@1.0.4": {} - /@types/geojson@7946.0.13: - resolution: - { - integrity: sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==, - } - dev: true + "@types/geojson@7946.0.13": {} - /@types/http-cache-semantics@4.0.4: - resolution: - { - integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, - } - dev: true + "@types/http-cache-semantics@4.0.4": {} - /@types/json-schema@7.0.15: - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - dev: true + "@types/json-schema@7.0.15": {} - /@types/leaflet@1.9.8: - resolution: - { - integrity: sha512-EXdsL4EhoUtGm2GC2ZYtXn+Fzc6pluVgagvo2VC1RHWToLGlTRwVYoDpqS/7QXa01rmDyBjJk3Catpf60VMkwg==, - } + "@types/leaflet@1.9.8": dependencies: "@types/geojson": 7946.0.13 - dev: true - /@types/node@20.10.5: - resolution: - { - integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==, - } + "@types/node@20.10.5": dependencies: undici-types: 5.26.5 - dev: true - /@types/normalize-package-data@2.4.4: - resolution: - { - integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, - } - dev: true + "@types/normalize-package-data@2.4.4": {} - /@types/parse-path@7.0.3: - resolution: - { - integrity: sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==, - } - dev: true + "@types/parse-path@7.0.3": {} - /@types/resolve@1.17.1: - resolution: - { - integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, - } + "@types/resolve@1.17.1": dependencies: "@types/node": 20.10.5 - dev: true - /@types/semver@7.5.6: - resolution: - { - integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, - } - dev: true + "@types/semver@7.5.6": {} - /@types/trusted-types@2.0.7: - resolution: - { - integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, - } + "@types/trusted-types@2.0.7": {} - /@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true + "@typescript-eslint/eslint-plugin@7.1.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.3.3)": dependencies: "@eslint-community/regexpp": 4.10.0 "@typescript-eslint/parser": 7.1.0(eslint@8.57.0)(typescript@5.3.3) @@ -4160,20 +10922,8 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^8.56.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true + "@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3)": dependencies: "@typescript-eslint/scope-manager": 7.1.0 "@typescript-eslint/types": 7.1.0 @@ -4184,31 +10934,13 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@7.1.0: - resolution: - { - integrity: sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + "@typescript-eslint/scope-manager@7.1.0": dependencies: "@typescript-eslint/types": 7.1.0 "@typescript-eslint/visitor-keys": 7.1.0 - dev: true - /@typescript-eslint/type-utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^8.56.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true + "@typescript-eslint/type-utils@7.1.0(eslint@8.57.0)(typescript@5.3.3)": dependencies: "@typescript-eslint/typescript-estree": 7.1.0(typescript@5.3.3) "@typescript-eslint/utils": 7.1.0(eslint@8.57.0)(typescript@5.3.3) @@ -4218,27 +10950,10 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@7.1.0: - resolution: - { - integrity: sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: true + "@typescript-eslint/types@7.1.0": {} - /@typescript-eslint/typescript-estree@7.1.0(typescript@5.3.3): - resolution: - { - integrity: sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true + "@typescript-eslint/typescript-estree@7.1.0(typescript@5.3.3)": dependencies: "@typescript-eslint/types": 7.1.0 "@typescript-eslint/visitor-keys": 7.1.0 @@ -4251,16 +10966,8 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@7.1.0(eslint@8.57.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^8.56.0 + "@typescript-eslint/utils@7.1.0(eslint@8.57.0)(typescript@5.3.3)": dependencies: "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) "@types/json-schema": 7.0.15 @@ -4273,163 +10980,74 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@7.1.0: - resolution: - { - integrity: sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + "@typescript-eslint/visitor-keys@7.1.0": dependencies: "@typescript-eslint/types": 7.1.0 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: - { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, - } - dev: true + "@ungap/structured-clone@1.2.0": {} - /@vime/core@5.4.1: - resolution: - { - integrity: sha512-ZFpV3xqZJ5tvh5rZOYKRh8zFzNIKr2ZcK6L75nJjFjbWt/ZmFF2nMBxtD9/hC4Xjk9v7hp1+P9cmctL674VFgA==, - } + "@vime/core@5.4.1": dependencies: "@stencil/core": 2.5.2 "@types/fscreen": 1.0.4 fscreen: 1.2.0 mitt: 3.0.1 stencil-wormhole: 3.4.1 - dev: false - /JSONStream@1.3.5: - resolution: - { - integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, - } - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-node@1.8.2: - resolution: - { - integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==, - } + acorn-node@1.8.2: dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 xtend: 4.0.2 - dev: false - /acorn-walk@7.2.0: - resolution: - { - integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, - } - engines: { node: ">=0.4.0" } - dev: false + acorn-walk@7.2.0: {} - /acorn@7.4.1: - resolution: - { - integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, - } - engines: { node: ">=0.4.0" } - hasBin: true - dev: false + acorn@7.4.1: {} - /acorn@8.11.3: - resolution: - { - integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, - } - engines: { node: ">=0.4.0" } - hasBin: true - dev: true + acorn@8.11.3: {} - /agent-base@7.1.0: - resolution: - { - integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==, - } - engines: { node: ">= 14" } + agent-base@7.1.0: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /aggregate-error@3.1.0: - resolution: - { - integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, - } - engines: { node: ">=8" } + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - /aggregate-error@5.0.0: - resolution: - { - integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==, - } - engines: { node: ">=18" } + aggregate-error@5.0.0: dependencies: clean-stack: 5.2.0 indent-string: 5.0.0 - dev: true - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: - { - integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, - } + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /all-contributors-cli@6.26.1: - resolution: - { - integrity: sha512-Ymgo3FJACRBEd1eE653FD1J/+uD0kqpUNYfr9zNC1Qby0LgbhDBzB3EF6uvkAbYpycStkk41J+0oo37Lc02yEw==, - } - engines: { node: ">=4" } - hasBin: true + all-contributors-cli@6.26.1: dependencies: "@babel/runtime": 7.23.6 async: 3.2.5 @@ -4445,159 +11063,57 @@ packages: prettier: 2.8.8 transitivePeerDependencies: - encoding - dev: true - /amdefine@1.0.1: - resolution: - { - integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==, - } - engines: { node: ">=0.4.2" } - requiresBuild: true - dev: false + amdefine@1.0.1: optional: true - /ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: ">=8" } + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-escapes@6.2.0: - resolution: - { - integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==, - } - engines: { node: ">=14.16" } + ansi-escapes@6.2.0: dependencies: type-fest: 3.13.1 - dev: true - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - dev: true + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: - { - integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, - } - engines: { node: ">=12" } - dev: true + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: ">=4" } + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: ">=12" } - dev: true + ansi-styles@6.2.1: {} - /any-promise@1.3.0: - resolution: - { - integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, - } - dev: true + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - /arg@5.0.2: - resolution: - { - integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, - } - dev: true + arg@5.0.2: {} - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - dev: true + argparse@2.0.1: {} - /argv-formatter@1.0.0: - resolution: - { - integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==, - } - dev: true + argv-formatter@1.0.0: {} - /array-buffer-byte-length@1.0.0: - resolution: - { - integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==, - } + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.5 is-array-buffer: 3.0.2 - dev: true - /array-from@2.1.1: - resolution: - { - integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==, - } - dev: false + array-from@2.1.1: {} - /array-ify@1.0.0: - resolution: - { - integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, - } - dev: true + array-ify@1.0.0: {} - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - dev: true + array-union@2.1.0: {} - /arraybuffer.prototype.slice@1.0.2: - resolution: - { - integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==, - } - engines: { node: ">= 0.4" } + arraybuffer.prototype.slice@1.0.2: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.5 @@ -4606,59 +11122,22 @@ packages: get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - dev: true - /ast-transform@0.0.0: - resolution: - { - integrity: sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==, - } + ast-transform@0.0.0: dependencies: escodegen: 1.2.0 esprima: 1.0.4 through: 2.3.8 - dev: false - /ast-types@0.7.8: - resolution: - { - integrity: sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==, - } - engines: { node: ">= 0.6" } - dev: false + ast-types@0.7.8: {} - /astral-regex@2.0.0: - resolution: - { - integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, - } - engines: { node: ">=8" } - dev: true + astral-regex@2.0.0: {} - /async@3.2.5: - resolution: - { - integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, - } - dev: true + async@3.2.5: {} - /at-least-node@1.0.0: - resolution: - { - integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, - } - engines: { node: ">= 4.0.0" } - dev: true + at-least-node@1.0.0: {} - /autoprefixer@10.4.17(postcss@8.4.35): - resolution: - { - integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==, - } - engines: { node: ^10 || ^12 || >=14 } - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.17(postcss@8.4.35): dependencies: browserslist: 4.23.0 caniuse-lite: 1.0.30001591 @@ -4667,23 +11146,10 @@ packages: picocolors: 1.0.0 postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /available-typed-arrays@1.0.5: - resolution: - { - integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==, - } - engines: { node: ">= 0.4" } - dev: true + available-typed-arrays@1.0.5: {} - /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.6): - resolution: - { - integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.6): dependencies: "@babel/compat-data": 7.23.5 "@babel/core": 7.23.6 @@ -4691,249 +11157,106 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): - resolution: - { - integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): dependencies: "@babel/core": 7.23.6 "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.6) core-js-compat: 3.35.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.6): - resolution: - { - integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.6): dependencies: "@babel/core": 7.23.6 "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.6) transitivePeerDependencies: - supports-color - dev: true - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - dev: true + balanced-match@1.0.2: {} - /balanced-match@2.0.0: - resolution: - { - integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==, - } - dev: true + balanced-match@2.0.0: {} - /base64-js@1.3.1: - resolution: - { - integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==, - } - dev: false + base64-js@1.3.1: {} - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + base64-js@1.5.1: {} - /before-after-hook@2.2.3: - resolution: - { - integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, - } - dev: true + before-after-hook@2.2.3: {} - /binary-extensions@2.2.0: - resolution: - { - integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, - } - engines: { node: ">=8" } - dev: true + binary-extensions@2.2.0: {} - /bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - /boolbase@1.0.0: - resolution: - { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, - } - dev: true + boolbase@1.0.0: {} - /bottleneck@2.19.5: - resolution: - { - integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==, - } - dev: true + bottleneck@2.19.5: {} - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true - /brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: ">=8" } + braces@3.0.2: dependencies: fill-range: 7.0.1 - dev: true - /brfs@2.0.2: - resolution: - { - integrity: sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==, - } - hasBin: true + brfs@2.0.2: dependencies: quote-stream: 1.0.2 resolve: 1.22.8 static-module: 3.0.4 through2: 2.0.5 - dev: false - /brotli@1.3.3: - resolution: - { - integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==, - } + brotli@1.3.3: dependencies: base64-js: 1.5.1 - dev: false - /browser-resolve@1.11.3: - resolution: - { - integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==, - } + browser-resolve@1.11.3: dependencies: resolve: 1.1.7 - dev: false - /browserify-optional@1.0.1: - resolution: - { - integrity: sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==, - } + browserify-optional@1.0.1: dependencies: ast-transform: 0.0.0 ast-types: 0.7.8 browser-resolve: 1.11.3 - dev: false - /browserslist@4.22.2: - resolution: - { - integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true + browserslist@4.22.2: dependencies: caniuse-lite: 1.0.30001572 electron-to-chromium: 1.4.616 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: true - /browserslist@4.23.0: - resolution: - { - integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001591 electron-to-chromium: 1.4.689 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: true - /buffer-equal@0.0.1: - resolution: - { - integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==, - } - engines: { node: ">=0.4.0" } - dev: false + buffer-equal@0.0.1: {} - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - /builtin-modules@3.3.0: - resolution: - { - integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, - } - engines: { node: ">=6" } - dev: true + builtin-modules@3.3.0: {} - /cacheable-lookup@7.0.0: - resolution: - { - integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==, - } - engines: { node: ">=14.16" } - dev: true + cacheable-lookup@7.0.0: {} - /cacheable-request@10.2.14: - resolution: - { - integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==, - } - engines: { node: ">=14.16" } + cacheable-request@10.2.14: dependencies: "@types/http-cache-semantics": 4.0.4 get-stream: 6.0.1 @@ -4942,139 +11265,56 @@ packages: mimic-response: 4.0.0 normalize-url: 8.0.0 responselike: 3.0.0 - dev: true - /cachedir@2.3.0: - resolution: - { - integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==, - } - engines: { node: ">=6" } - dev: true + cachedir@2.3.0: {} - /call-bind@1.0.5: - resolution: - { - integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, - } + call-bind@1.0.5: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 set-function-length: 1.1.1 - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - dev: true + callsites@3.1.0: {} - /camelcase-css@2.0.1: - resolution: - { - integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, - } - engines: { node: ">= 6" } - dev: true + camelcase-css@2.0.1: {} - /camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - } - engines: { node: ">=6" } - dev: true + camelcase@5.3.1: {} - /caniuse-api@3.0.0: - resolution: - { - integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, - } + caniuse-api@3.0.0: dependencies: browserslist: 4.22.2 caniuse-lite: 1.0.30001572 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - dev: true - /caniuse-lite@1.0.30001572: - resolution: - { - integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==, - } - dev: true + caniuse-lite@1.0.30001572: {} - /caniuse-lite@1.0.30001591: - resolution: - { - integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==, - } - dev: true + caniuse-lite@1.0.30001591: {} - /chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: ">=4" } + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true + chalk@5.3.0: {} - /char-regex@1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - } - engines: { node: ">=10" } - dev: true + char-regex@1.0.2: {} - /chardet@0.7.0: - resolution: - { - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, - } - dev: true + chardet@0.7.0: {} - /choices.js@10.2.0: - resolution: - { - integrity: sha512-8PKy6wq7BMjNwDTZwr3+Zry6G2+opJaAJDDA/j3yxvqSCnvkKe7ZIFfIyOhoc7htIWFhsfzF9tJpGUATcpUtPg==, - } + choices.js@10.2.0: dependencies: deepmerge: 4.3.1 fuse.js: 6.6.2 redux: 4.2.1 - dev: false - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: ">= 8.10.0" } + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -5085,61 +11325,24 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: ">=8" } - dev: true + ci-info@3.9.0: {} - /clean-stack@2.2.0: - resolution: - { - integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, - } - engines: { node: ">=6" } - dev: true + clean-stack@2.2.0: {} - /clean-stack@5.2.0: - resolution: - { - integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==, - } - engines: { node: ">=14.16" } + clean-stack@5.2.0: dependencies: escape-string-regexp: 5.0.0 - dev: true - /cli-cursor@3.1.0: - resolution: - { - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, - } - engines: { node: ">=8" } + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-cursor@4.0.0: - resolution: - { - integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: true - /cli-highlight@2.1.11: - resolution: - { - integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==, - } - engines: { node: ">=8.0.0", npm: ">=5.0.0" } - hasBin: true + cli-highlight@2.1.11: dependencies: chalk: 4.1.2 highlight.js: 10.7.3 @@ -5147,93 +11350,43 @@ packages: parse5: 5.1.1 parse5-htmlparser2-tree-adapter: 6.0.1 yargs: 16.2.0 - dev: true - /cli-spinners@2.9.2: - resolution: - { - integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, - } - engines: { node: ">=6" } - dev: true + cli-spinners@2.9.2: {} - /cli-table3@0.6.3: - resolution: - { - integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==, - } - engines: { node: 10.* || >= 12.* } + cli-table3@0.6.3: dependencies: string-width: 4.2.3 optionalDependencies: "@colors/colors": 1.5.0 - dev: true - /cli-truncate@4.0.0: - resolution: - { - integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==, - } - engines: { node: ">=18" } + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 string-width: 7.0.0 - dev: true - /cli-width@3.0.0: - resolution: - { - integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, - } - engines: { node: ">= 10" } - dev: true + cli-width@3.0.0: {} - /cliui@6.0.0: - resolution: - { - integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, - } + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true - /cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: ">=12" } + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - } - engines: { node: ">=0.8" } + clone@1.0.4: {} - /codemirror@6.0.1(@lezer/common@1.2.0): - resolution: - { - integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, - } + codemirror@6.0.1(@lezer/common@1.2.0): dependencies: "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.24.1)(@lezer/common@1.2.0) "@codemirror/commands": 6.3.3 @@ -5244,92 +11397,32 @@ packages: "@codemirror/view": 6.24.1 transitivePeerDependencies: - "@lezer/common" - dev: false - /color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: true - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: true - /color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } - dev: true + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - dev: true + color-name@1.1.4: {} - /colord@2.9.3: - resolution: - { - integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, - } - dev: true + colord@2.9.3: {} - /colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } - dev: true + colorette@2.0.20: {} - /commander@11.1.0: - resolution: - { - integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==, - } - engines: { node: ">=16" } - dev: true + commander@11.1.0: {} - /commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } - dev: true + commander@2.20.3: {} - /commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: ">= 6" } - dev: true + commander@4.1.1: {} - /commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: ">= 10" } + commander@7.2.0: {} - /commitizen@4.3.0(@types/node@20.10.5)(typescript@5.3.3): - resolution: - { - integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==, - } - engines: { node: ">= 12" } - hasBin: true + commitizen@4.3.0(@types/node@20.10.5)(typescript@5.3.3): dependencies: cachedir: 2.3.0 cz-conventional-changelog: 3.3.0(@types/node@20.10.5)(typescript@5.3.3) @@ -5348,83 +11441,37 @@ packages: transitivePeerDependencies: - "@types/node" - typescript - dev: true - /common-tags@1.8.2: - resolution: - { - integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, - } - engines: { node: ">=4.0.0" } - dev: true + common-tags@1.8.2: {} - /compare-func@2.0.0: - resolution: - { - integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, - } + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - dev: true + concat-map@0.0.1: {} - /concat-stream@1.6.2: - resolution: - { - integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, - } - engines: { "0": node >= 0.8 } + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - dev: false - /config-chain@1.1.13: - resolution: - { - integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, - } + config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 - dev: true - /conventional-changelog-angular@7.0.0: - resolution: - { - integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==, - } - engines: { node: ">=16" } + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - dev: true - /conventional-changelog-conventionalcommits@7.0.2: - resolution: - { - integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==, - } - engines: { node: ">=16" } + conventional-changelog-conventionalcommits@7.0.2: dependencies: compare-func: 2.0.0 - dev: true - /conventional-changelog-writer@7.0.1: - resolution: - { - integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==, - } - engines: { node: ">=16" } - hasBin: true + conventional-changelog-writer@7.0.1: dependencies: conventional-commits-filter: 4.0.0 handlebars: 4.7.8 @@ -5432,311 +11479,120 @@ packages: meow: 12.1.1 semver: 7.6.0 split2: 4.2.0 - dev: true - /conventional-commit-types@3.0.0: - resolution: - { - integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==, - } - dev: true + conventional-commit-types@3.0.0: {} - /conventional-commits-filter@4.0.0: - resolution: - { - integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==, - } - engines: { node: ">=16" } - dev: true + conventional-commits-filter@4.0.0: {} - /conventional-commits-parser@5.0.0: - resolution: - { - integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==, - } - engines: { node: ">=16" } - hasBin: true + conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 2.0.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /convert-source-map@1.9.0: - resolution: - { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, - } - dev: false + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } - dev: true + convert-source-map@2.0.0: {} - /core-js-compat@3.35.0: - resolution: - { - integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==, - } + core-js-compat@3.35.0: dependencies: browserslist: 4.22.2 - dev: true - /core-js@3.35.0: - resolution: - { - integrity: sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==, - } - requiresBuild: true - dev: false + core-js@3.35.0: {} - /core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + core-util-is@1.0.3: {} - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.5)(cosmiconfig@8.3.6)(typescript@5.3.3): - resolution: - { - integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==, - } - engines: { node: ">=v16" } - requiresBuild: true - peerDependencies: - "@types/node": "*" - cosmiconfig: ">=8.2" - typescript: ">=4" + cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.5)(cosmiconfig@8.3.6)(typescript@5.3.3): dependencies: "@types/node": 20.10.5 cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 typescript: 5.3.3 - dev: true - /cosmiconfig@8.3.6(typescript@5.3.3): - resolution: - { - integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==, - } - engines: { node: ">=14" } - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.3.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.3.3 - dev: true - /cosmiconfig@9.0.0(typescript@5.3.3): - resolution: - { - integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, - } - engines: { node: ">=14" } - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.3.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 typescript: 5.3.3 - dev: true - /crelt@1.0.6: - resolution: - { - integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, - } - dev: false + crelt@1.0.6: {} - /cross-env@7.0.3: - resolution: - { - integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, - } - engines: { node: ">=10.14", npm: ">=6", yarn: ">=1" } - hasBin: true + cross-env@7.0.3: dependencies: cross-spawn: 7.0.3 - dev: true - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true - /crypto-js@4.2.0: - resolution: - { - integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==, - } - dev: false + crypto-js@4.2.0: {} - /crypto-random-string@2.0.0: - resolution: - { - integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, - } - engines: { node: ">=8" } - dev: true + crypto-random-string@2.0.0: {} - /crypto-random-string@4.0.0: - resolution: - { - integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==, - } - engines: { node: ">=12" } + crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 - dev: true - /css-blank-pseudo@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-goSnEITByxTzU4Oh5oJZrEWudxTqk7L6IXj1UW69pO6Hv0UdX+Vsrt02FFu5DweRh2bLu6WpX/+zsQCu5O1gKw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + css-blank-pseudo@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /css-declaration-sorter@7.1.1(postcss@8.4.35): - resolution: - { - integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.0.9 + css-declaration-sorter@7.1.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /css-functions-list@3.2.1: - resolution: - { - integrity: sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==, - } - engines: { node: ">=12 || >=16" } - dev: true + css-functions-list@3.2.1: {} - /css-has-pseudo@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-Z2Qm5yyOvJRTy6THdUlnGIX6PW/1wOc4FHWlfkcBkfkpZ3oz6lPdG+h+J7t1HZHT4uSSVR8XatXiMpqMUADXow==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + css-has-pseudo@6.0.2(postcss@8.4.35): dependencies: "@csstools/selector-specificity": 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 - dev: true - /css-prefers-color-scheme@9.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + css-prefers-color-scheme@9.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /css-select@5.1.0: - resolution: - { - integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, - } + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: true - /css-tree@2.2.1: - resolution: - { - integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + css-tree@2.2.1: dependencies: mdn-data: 2.0.28 source-map-js: 1.0.2 - dev: true - /css-tree@2.3.1: - resolution: - { - integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + css-tree@2.3.1: dependencies: mdn-data: 2.0.30 source-map-js: 1.0.2 - dev: true - /css-what@6.1.0: - resolution: - { - integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, - } - engines: { node: ">= 6" } - dev: true + css-what@6.1.0: {} - /cssdb@7.11.1: - resolution: - { - integrity: sha512-F0nEoX/Rv8ENTHsjMPGHd9opdjGfXkgRBafSUGnQKPzGZFB7Lm0BbT10x21TMOCrKLbVsJ0NoCDMk6AfKqw8/A==, - } - dev: true + cssdb@7.11.1: {} - /cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: ">=4" } - hasBin: true + cssesc@3.0.0: {} - /cssnano-preset-default@6.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-4y3H370aZCkT9Ev8P4SO4bZbt+AExeKhh8wTbms/X7OLDo5E7AYUUy6YPxa/uF5Grf+AJwNcCnxKhZynJ6luBA==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + cssnano-preset-default@6.0.3(postcss@8.4.35): dependencies: css-declaration-sorter: 7.1.1(postcss@8.4.35) cssnano-utils: 4.0.1(postcss@8.4.35) @@ -5768,50 +11624,22 @@ packages: postcss-reduce-transforms: 6.0.1(postcss@8.4.35) postcss-svgo: 6.0.2(postcss@8.4.35) postcss-unique-selectors: 6.0.2(postcss@8.4.35) - dev: true - /cssnano-utils@4.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + cssnano-utils@4.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /cssnano@6.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + cssnano@6.0.3(postcss@8.4.35): dependencies: cssnano-preset-default: 6.0.3(postcss@8.4.35) lilconfig: 3.0.0 postcss: 8.4.35 - dev: true - /csso@5.0.5: - resolution: - { - integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + csso@5.0.5: dependencies: css-tree: 2.2.1 - dev: true - /cz-conventional-changelog@3.3.0(@types/node@20.10.5)(typescript@5.3.3): - resolution: - { - integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, - } - engines: { node: ">= 10" } + cz-conventional-changelog@3.3.0(@types/node@20.10.5)(typescript@5.3.3): dependencies: chalk: 2.4.2 commitizen: 4.3.0(@types/node@20.10.5)(typescript@5.3.3) @@ -5824,119 +11652,44 @@ packages: transitivePeerDependencies: - "@types/node" - typescript - dev: true - /d3-array@3.2.4: - resolution: - { - integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==, - } - engines: { node: ">=12" } + d3-array@3.2.4: dependencies: internmap: 2.0.3 - dev: false - /d3-color@3.1.0: - resolution: - { - integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, - } - engines: { node: ">=12" } - dev: false + d3-color@3.1.0: {} - /d3-dispatch@3.0.1: - resolution: - { - integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==, - } - engines: { node: ">=12" } - dev: false + d3-dispatch@3.0.1: {} - /d3-ease@3.0.1: - resolution: - { - integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, - } - engines: { node: ">=12" } - dev: false + d3-ease@3.0.1: {} - /d3-force@3.0.0: - resolution: - { - integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==, - } - engines: { node: ">=12" } + d3-force@3.0.0: dependencies: d3-dispatch: 3.0.1 d3-quadtree: 3.0.1 d3-timer: 3.0.1 - dev: false - /d3-geo-projection@4.0.0: - resolution: - { - integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==, - } - engines: { node: ">=12" } - hasBin: true + d3-geo-projection@4.0.0: dependencies: commander: 7.2.0 d3-array: 3.2.4 d3-geo: 3.1.0 - dev: false - /d3-geo@3.1.0: - resolution: - { - integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==, - } - engines: { node: ">=12" } + d3-geo@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /d3-interpolate@3.0.1: - resolution: - { - integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, - } - engines: { node: ">=12" } + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-quadtree@3.0.1: - resolution: - { - integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==, - } - engines: { node: ">=12" } - dev: false + d3-quadtree@3.0.1: {} - /d3-selection@3.0.0: - resolution: - { - integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==, - } - engines: { node: ">=12" } - dev: false + d3-selection@3.0.0: {} - /d3-timer@3.0.1: - resolution: - { - integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, - } - engines: { node: ">=12" } - dev: false + d3-timer@3.0.1: {} - /d3-transition@3.0.1(d3-selection@3.0.0): - resolution: - { - integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==, - } - engines: { node: ">=12" } - peerDependencies: - d3-selection: 2 - 3 + d3-transition@3.0.1(d3-selection@3.0.0): dependencies: d3-color: 3.1.0 d3-dispatch: 3.0.1 @@ -5944,79 +11697,29 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 - dev: false - /d@1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } + d@1.0.1: dependencies: es5-ext: 0.10.62 type: 1.2.0 - dev: false - /dargs@8.1.0: - resolution: - { - integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==, - } - engines: { node: ">=12" } - dev: true + dargs@8.1.0: {} - /dash-ast@2.0.1: - resolution: - { - integrity: sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==, - } - dev: false + dash-ast@2.0.1: {} - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - dev: true - /decamelize@1.2.0: - resolution: - { - integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, - } - engines: { node: ">=0.10.0" } - dev: true + decamelize@1.2.0: {} - /decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: ">=10" } + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: true - /dedent@0.7.0: - resolution: - { - integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, - } - dev: true + dedent@0.7.0: {} - /deep-equal@1.1.2: - resolution: - { - integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==, - } - engines: { node: ">= 0.4" } + deep-equal@1.1.2: dependencies: is-arguments: 1.1.1 is-date-object: 1.0.5 @@ -6024,291 +11727,109 @@ packages: object-is: 1.1.5 object-keys: 1.1.1 regexp.prototype.flags: 1.5.1 - dev: false - /deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: ">=4.0.0" } - dev: true + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + deep-is@0.1.4: {} - /deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: ">=0.10.0" } + deepmerge@4.3.1: {} - /defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - } + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /defer-to-connect@2.0.1: - resolution: - { - integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, - } - engines: { node: ">=10" } - dev: true + defer-to-connect@2.0.1: {} - /define-data-property@1.1.1: - resolution: - { - integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, - } - engines: { node: ">= 0.4" } + define-data-property@1.1.1: dependencies: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - /define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - } - engines: { node: ">= 0.4" } + define-properties@1.2.1: dependencies: define-data-property: 1.1.1 has-property-descriptors: 1.0.1 object-keys: 1.1.1 - /deprecation@2.3.1: - resolution: - { - integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, - } - dev: true + deprecation@2.3.1: {} - /detect-file@1.0.0: - resolution: - { - integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, - } - engines: { node: ">=0.10.0" } - dev: true + detect-file@1.0.0: {} - /detect-indent@6.1.0: - resolution: - { - integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, - } - engines: { node: ">=8" } - dev: true + detect-indent@6.1.0: {} - /dfa@1.2.0: - resolution: - { - integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==, - } - dev: false + dfa@1.2.0: {} - /didyoumean@1.2.2: - resolution: - { - integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, - } - dev: true + didyoumean@1.2.2: {} - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /dlv@1.1.3: - resolution: - { - integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, - } - dev: true + dlv@1.1.3: {} - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: true - /domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } - dev: true + domelementtype@2.3.0: {} - /domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: ">= 4" } + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: true - /domutils@3.1.0: - resolution: - { - integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, - } + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: true - /dot-prop@5.3.0: - resolution: - { - integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, - } - engines: { node: ">=8" } + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /duplexer2@0.1.4: - resolution: - { - integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==, - } + duplexer2@0.1.4: dependencies: readable-stream: 2.3.8 - /eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } - dev: true + eastasianwidth@0.2.0: {} - /ejs@3.1.9: - resolution: - { - integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==, - } - engines: { node: ">=0.10.0" } - hasBin: true + ejs@3.1.9: dependencies: jake: 10.8.7 - dev: true - /electron-to-chromium@1.4.616: - resolution: - { - integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==, - } - dev: true + electron-to-chromium@1.4.616: {} - /electron-to-chromium@1.4.689: - resolution: - { - integrity: sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ==, - } - dev: true + electron-to-chromium@1.4.689: {} - /emoji-regex@10.3.0: - resolution: - { - integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==, - } - dev: true + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } - dev: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } - dev: true + emoji-regex@9.2.2: {} - /emojilib@2.4.0: - resolution: - { - integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==, - } - dev: true + emojilib@2.4.0: {} - /entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } - dev: true + entities@4.5.0: {} - /env-ci@11.0.0: - resolution: - { - integrity: sha512-apikxMgkipkgTvMdRT9MNqWx5VLOci79F4VBd7Op/7OPjjoanjdAvn6fglMCCEf/1bAh8eOiuEVCUs4V3qP3nQ==, - } - engines: { node: ^18.17 || >=20.6.1 } + env-ci@11.0.0: dependencies: execa: 8.0.1 java-properties: 1.0.2 - dev: true - /env-paths@2.2.1: - resolution: - { - integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, - } - engines: { node: ">=6" } - dev: true + env-paths@2.2.1: {} - /error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-abstract@1.22.3: - resolution: - { - integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==, - } - engines: { node: ">= 0.4" } + es-abstract@1.22.3: dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 @@ -6349,61 +11870,32 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.13 - dev: true - /es-set-tostringtag@2.0.2: - resolution: - { - integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==, - } - engines: { node: ">= 0.4" } + es-set-tostringtag@2.0.2: dependencies: get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 hasown: 2.0.0 - dev: true - /es-to-primitive@1.2.1: - resolution: - { - integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, - } - engines: { node: ">= 0.4" } + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true - /es5-ext@0.10.62: - resolution: - { - integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==, - } - engines: { node: ">=0.10" } - requiresBuild: true + es5-ext@0.10.62: dependencies: es6-iterator: 2.0.3 es6-symbol: 3.1.3 next-tick: 1.1.0 - dev: false - /es6-iterator@2.0.3: - resolution: - { - integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, - } + es6-iterator@2.0.3: dependencies: d: 1.0.1 es5-ext: 0.10.62 es6-symbol: 3.1.3 - dev: false - /es6-map@0.1.5: - resolution: - { - integrity: sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==, - } + es6-map@0.1.5: dependencies: d: 1.0.1 es5-ext: 0.10.62 @@ -6411,14 +11903,8 @@ packages: es6-set: 0.1.6 es6-symbol: 3.1.3 event-emitter: 0.3.5 - dev: false - /es6-set@0.1.6: - resolution: - { - integrity: sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==, - } - engines: { node: ">=0.12" } + es6-set@0.1.6: dependencies: d: 1.0.1 es5-ext: 0.10.62 @@ -6426,26 +11912,13 @@ packages: es6-symbol: 3.1.3 event-emitter: 0.3.5 type: 2.7.2 - dev: false - /es6-symbol@3.1.3: - resolution: - { - integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, - } + es6-symbol@3.1.3: dependencies: d: 1.0.1 ext: 1.7.0 - dev: false - /esbuild@0.19.10: - resolution: - { - integrity: sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true + esbuild@0.19.10: optionalDependencies: "@esbuild/aix-ppc64": 0.19.10 "@esbuild/android-arm": 0.19.10 @@ -6470,47 +11943,16 @@ packages: "@esbuild/win32-arm64": 0.19.10 "@esbuild/win32-ia32": 0.19.10 "@esbuild/win32-x64": 0.19.10 - dev: true - /escalade@3.1.1: - resolution: - { - integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, - } - engines: { node: ">=6" } - dev: true + escalade@3.1.1: {} - /escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: ">=0.8.0" } - dev: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - dev: true + escape-string-regexp@4.0.0: {} - /escape-string-regexp@5.0.0: - resolution: - { - integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, - } - engines: { node: ">=12" } - dev: true + escape-string-regexp@5.0.0: {} - /escodegen@1.14.3: - resolution: - { - integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, - } - engines: { node: ">=4.0" } - hasBin: true + escodegen@1.14.3: dependencies: esprima: 4.0.1 estraverse: 4.3.0 @@ -6518,85 +11960,35 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 - dev: false - /escodegen@1.2.0: - resolution: - { - integrity: sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==, - } - engines: { node: ">=0.4.0" } - hasBin: true + escodegen@1.2.0: dependencies: esprima: 1.0.4 estraverse: 1.5.1 esutils: 1.0.0 optionalDependencies: source-map: 0.1.43 - dev: false - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: - { - integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, - } - hasBin: true - peerDependencies: - eslint: ">=7.0.0" + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): - resolution: - { - integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==, - } - engines: { node: ^14.18.0 || >=16.0.0 } - peerDependencies: - "@types/eslint": ">=8.0.0" - eslint: ">=8.0.0" - eslint-config-prettier: "*" - prettier: ">=3.0.0" - peerDependenciesMeta: - "@types/eslint": - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): dependencies: eslint: 8.57.0 eslint-config-prettier: 9.1.0(eslint@8.57.0) prettier: 3.2.5 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 - dev: true - /eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: - { - integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true + eslint@8.57.0: dependencies: "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) "@eslint-community/regexpp": 4.10.0 @@ -6638,134 +12030,47 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@1.0.4: - resolution: - { - integrity: sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==, - } - engines: { node: ">=0.4.0" } - hasBin: true - dev: false + esprima@1.0.4: {} - /esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: ">=4" } - hasBin: true - dev: false + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@1.5.1: - resolution: - { - integrity: sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==, - } - engines: { node: ">=0.4.0" } - dev: false + estraverse@1.5.1: {} - /estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: ">=4.0" } - dev: false + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - dev: true + estraverse@5.3.0: {} - /estree-is-function@1.0.0: - resolution: - { - integrity: sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==, - } - dev: false + estree-is-function@1.0.0: {} - /estree-walker@1.0.1: - resolution: - { - integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==, - } - dev: true + estree-walker@1.0.1: {} - /esutils@1.0.0: - resolution: - { - integrity: sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==, - } - engines: { node: ">=0.10.0" } - dev: false + esutils@1.0.0: {} - /esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: ">=0.10.0" } + esutils@2.0.3: {} - /event-emitter@0.3.5: - resolution: - { - integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, - } + event-emitter@0.3.5: dependencies: d: 1.0.1 es5-ext: 0.10.62 - dev: false - /eventemitter3@5.0.1: - resolution: - { - integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, - } - dev: true + eventemitter3@5.0.1: {} - /execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: ">=10" } + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -6776,14 +12081,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@8.0.1: - resolution: - { - integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, - } - engines: { node: ">=16.17" } + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -6794,521 +12093,209 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /expand-tilde@2.0.2: - resolution: - { - integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, - } - engines: { node: ">=0.10.0" } + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - dev: true - /ext@1.7.0: - resolution: - { - integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, - } + ext@1.7.0: dependencies: type: 2.7.2 - dev: false - /external-editor@3.1.0: - resolution: - { - integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, - } - engines: { node: ">=4" } + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - dev: true + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: - { - integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, - } - dev: true + fast-diff@1.3.0: {} - /fast-glob@3.3.2: - resolution: - { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, - } - engines: { node: ">=8.6.0" } + fast-glob@3.3.2: dependencies: "@nodelib/fs.stat": 2.0.5 "@nodelib/fs.walk": 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + fast-levenshtein@2.0.6: {} - /fastest-levenshtein@1.0.16: - resolution: - { - integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, - } - engines: { node: ">= 4.9.1" } - dev: true + fastest-levenshtein@1.0.16: {} - /fastq@1.16.0: - resolution: - { - integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==, - } + fastq@1.16.0: dependencies: reusify: 1.0.4 - dev: true - /figures@2.0.0: - resolution: - { - integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==, - } - engines: { node: ">=4" } + figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /figures@3.2.0: - resolution: - { - integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, - } - engines: { node: ">=8" } + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /figures@6.0.1: - resolution: - { - integrity: sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==, - } - engines: { node: ">=18" } + figures@6.0.1: dependencies: is-unicode-supported: 2.0.0 - dev: true - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-entry-cache@8.0.0: - resolution: - { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, - } - engines: { node: ">=16.0.0" } + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.0 - dev: true - /filelist@1.0.4: - resolution: - { - integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, - } + filelist@1.0.4: dependencies: minimatch: 5.1.6 - dev: true - /fill-range@7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - } - engines: { node: ">=8" } + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: true - /find-node-modules@2.1.3: - resolution: - { - integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==, - } + find-node-modules@2.1.3: dependencies: findup-sync: 4.0.0 merge: 2.1.1 - dev: true - /find-root@1.1.0: - resolution: - { - integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, - } - dev: true + find-root@1.1.0: {} - /find-up-simple@1.0.0: - resolution: - { - integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==, - } - engines: { node: ">=18" } - dev: true + find-up-simple@1.0.0: {} - /find-up@2.1.0: - resolution: - { - integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, - } - engines: { node: ">=4" } + find-up@2.1.0: dependencies: locate-path: 2.0.0 - dev: true - /find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: ">=8" } + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: ">=10" } + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /find-up@7.0.0: - resolution: - { - integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==, - } - engines: { node: ">=18" } + find-up@7.0.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 unicorn-magic: 0.1.0 - dev: true - /find-versions@5.1.0: - resolution: - { - integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==, - } - engines: { node: ">=12" } + find-versions@5.1.0: dependencies: semver-regex: 4.0.5 - dev: true - /findup-sync@4.0.0: - resolution: - { - integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==, - } - engines: { node: ">= 8" } + findup-sync@4.0.0: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 micromatch: 4.0.5 resolve-dir: 1.0.1 - dev: true - /flat-cache@3.2.0: - resolution: - { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } + flat-cache@3.2.0: dependencies: flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flat-cache@4.0.0: - resolution: - { - integrity: sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==, - } - engines: { node: ">=16" } + flat-cache@4.0.0: dependencies: flatted: 3.2.9 keyv: 4.5.4 rimraf: 5.0.5 - dev: true - /flatpickr@4.6.13: - resolution: - { - integrity: sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==, - } - dev: false + flatpickr@4.6.13: {} - /flatted@3.2.9: - resolution: - { - integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, - } - dev: true + flatted@3.2.9: {} - /for-each@0.3.3: - resolution: - { - integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, - } + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@3.1.1: - resolution: - { - integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, - } - engines: { node: ">=14" } + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true - /form-data-encoder@4.0.2: - resolution: - { - integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==, - } - engines: { node: ">= 18" } - dev: true + form-data-encoder@4.0.2: {} - /formdata-node@6.0.3: - resolution: - { - integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==, - } - engines: { node: ">= 18" } - dev: true + formdata-node@6.0.3: {} - /fraction.js@4.3.7: - resolution: - { - integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, - } - dev: true + fraction.js@4.3.7: {} - /from2@2.3.0: - resolution: - { - integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==, - } + from2@2.3.0: dependencies: inherits: 2.0.4 readable-stream: 2.3.8 - dev: true - /fs-extra@11.2.0: - resolution: - { - integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, - } - engines: { node: ">=14.14" } + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@9.1.0: - resolution: - { - integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, - } - engines: { node: ">=10" } + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - dev: true + fs.realpath@1.0.0: {} - /fscreen@1.2.0: - resolution: - { - integrity: sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg==, - } - dev: false + fscreen@1.2.0: {} - /fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: - { - integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, - } - engines: { node: ">= 0.4" } + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: - { - integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, - } + functions-have-names@1.2.3: {} - /fuse.js@6.6.2: - resolution: - { - integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==, - } - engines: { node: ">=10" } - dev: false + fuse.js@6.6.2: {} - /gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: ">=6.9.0" } - dev: true + gensync@1.0.0-beta.2: {} - /get-assigned-identifiers@1.2.0: - resolution: - { - integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==, - } - dev: false + get-assigned-identifiers@1.2.0: {} - /get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } - dev: true + get-caller-file@2.0.5: {} - /get-east-asian-width@1.2.0: - resolution: - { - integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==, - } - engines: { node: ">=18" } - dev: true + get-east-asian-width@1.2.0: {} - /get-intrinsic@1.2.2: - resolution: - { - integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, - } + get-intrinsic@1.2.2: dependencies: function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - /get-own-enumerable-property-symbols@3.0.2: - resolution: - { - integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, - } - dev: true + get-own-enumerable-property-symbols@3.0.2: {} - /get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: ">=10" } - dev: true + get-stream@6.0.1: {} - /get-stream@7.0.1: - resolution: - { - integrity: sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==, - } - engines: { node: ">=16" } - dev: true + get-stream@7.0.1: {} - /get-stream@8.0.1: - resolution: - { - integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, - } - engines: { node: ">=16" } - dev: true + get-stream@8.0.1: {} - /get-symbol-description@1.0.0: - resolution: - { - integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==, - } - engines: { node: ">= 0.4" } + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 - dev: true - /git-log-parser@1.2.0: - resolution: - { - integrity: sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==, - } + git-log-parser@1.2.0: dependencies: argv-formatter: 1.0.0 spawn-error-forwarder: 1.0.0 @@ -7316,61 +12303,30 @@ packages: stream-combiner2: 1.1.1 through2: 2.0.5 traverse: 0.6.8 - dev: true - /git-raw-commits@4.0.0: - resolution: - { - integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==, - } - engines: { node: ">=16" } - hasBin: true + git-raw-commits@4.0.0: dependencies: dargs: 8.1.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@10.3.10: - resolution: - { - integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==, - } - engines: { node: ">=16 || 14 >=14.17" } - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 path-scurry: 1.10.1 - dev: true - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7378,112 +12334,51 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /global-directory@4.0.1: - resolution: - { - integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==, - } - engines: { node: ">=18" } + global-directory@4.0.1: dependencies: ini: 4.1.1 - dev: true - /global-dirs@0.1.1: - resolution: - { - integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==, - } - engines: { node: ">=4" } - requiresBuild: true + global-dirs@0.1.1: dependencies: ini: 1.3.8 - dev: true optional: true - /global-modules@1.0.0: - resolution: - { - integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, - } - engines: { node: ">=0.10.0" } + global-modules@1.0.0: dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 - dev: true - /global-modules@2.0.0: - resolution: - { - integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, - } - engines: { node: ">=6" } + global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - dev: true - /global-prefix@1.0.2: - resolution: - { - integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, - } - engines: { node: ">=0.10.0" } + global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 homedir-polyfill: 1.0.3 ini: 1.3.8 is-windows: 1.0.2 which: 1.3.1 - dev: true - /global-prefix@3.0.0: - resolution: - { - integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, - } - engines: { node: ">=6" } + global-prefix@3.0.0: dependencies: ini: 1.3.8 kind-of: 6.0.3 which: 1.3.1 - dev: true - /globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: ">=4" } - dev: true + globals@11.12.0: {} - /globals@13.24.0: - resolution: - { - integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, - } - engines: { node: ">=8" } + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: - { - integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==, - } - engines: { node: ">= 0.4" } + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: true - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -7491,14 +12386,8 @@ packages: ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby@14.0.0: - resolution: - { - integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==, - } - engines: { node: ">=18" } + globby@14.0.0: dependencies: "@sindresorhus/merge-streams": 1.0.0 fast-glob: 3.3.2 @@ -7506,29 +12395,14 @@ packages: path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 - dev: true - /globjoin@0.1.4: - resolution: - { - integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==, - } - dev: true + globjoin@0.1.4: {} - /gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } + gopd@1.0.1: dependencies: get-intrinsic: 1.2.2 - /got@14.2.0: - resolution: - { - integrity: sha512-dBq2KkHcQl3AwPoIWsLsQScCPpUgRulz1qZVthjPYKYOPmYfBnekR3vxecjZbm91Vc3JUGnV9mqFX7B+Fe2quw==, - } - engines: { node: ">=20" } + got@14.2.0: dependencies: "@sindresorhus/is": 6.1.0 "@szmarczak/http-timer": 5.0.1 @@ -7541,36 +12415,14 @@ packages: lowercase-keys: 3.0.0 p-cancelable: 4.0.1 responselike: 3.0.0 - dev: true - /graceful-fs@4.2.10: - resolution: - { - integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, - } - dev: true + graceful-fs@4.2.10: {} - /graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } - dev: true + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - dev: true + graphemer@1.4.0: {} - /handlebars@4.7.8: - resolution: - { - integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, - } - engines: { node: ">=0.4.7" } - hasBin: true + handlebars@4.7.8: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -7578,341 +12430,122 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: true - /has-bigints@1.0.2: - resolution: - { - integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, - } - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: ">=4" } - dev: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.1: - resolution: - { - integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, - } + has-property-descriptors@1.0.1: dependencies: get-intrinsic: 1.2.2 - /has-proto@1.0.1: - resolution: - { - integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, - } - engines: { node: ">= 0.4" } + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: ">= 0.4" } + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: - { - integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==, - } - engines: { node: ">= 0.4" } + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - /has@1.0.4: - resolution: - { - integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, - } - engines: { node: ">= 0.4.0" } - dev: false + has@1.0.4: {} - /hasown@2.0.0: - resolution: - { - integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, - } - engines: { node: ">= 0.4" } + hasown@2.0.0: dependencies: function-bind: 1.1.2 - /highlight.js@10.7.3: - resolution: - { - integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==, - } - dev: true + highlight.js@10.7.3: {} - /homedir-polyfill@1.0.3: - resolution: - { - integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, - } - engines: { node: ">=0.10.0" } + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - dev: true - /hook-std@3.0.0: - resolution: - { - integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true + hook-std@3.0.0: {} - /hosted-git-info@7.0.1: - resolution: - { - integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + hosted-git-info@7.0.1: dependencies: lru-cache: 10.1.0 - dev: true - /hpagent@1.2.0: - resolution: - { - integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==, - } - engines: { node: ">=14" } - dev: true + hpagent@1.2.0: {} - /html-tags@3.3.1: - resolution: - { - integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==, - } - engines: { node: ">=8" } - dev: true + html-tags@3.3.1: {} - /http-cache-semantics@4.1.1: - resolution: - { - integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, - } - dev: true + http-cache-semantics@4.1.1: {} - /http-proxy-agent@7.0.0: - resolution: - { - integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==, - } - engines: { node: ">= 14" } + http-proxy-agent@7.0.0: dependencies: agent-base: 7.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /http2-wrapper@2.2.1: - resolution: - { - integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==, - } - engines: { node: ">=10.19.0" } + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - dev: true - /https-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==, - } - engines: { node: ">= 14" } + https-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: ">=10.17.0" } - dev: true + human-signals@2.1.0: {} - /human-signals@5.0.0: - resolution: - { - integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, - } - engines: { node: ">=16.17.0" } - dev: true + human-signals@5.0.0: {} - /husky@9.0.11: - resolution: - { - integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==, - } - engines: { node: ">=18" } - hasBin: true - dev: true + husky@9.0.11: {} - /iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: ">=0.10.0" } + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: ">=0.10.0" } + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: false - /idb@7.1.1: - resolution: - { - integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, - } - dev: true + idb@7.1.1: {} - /ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - dev: true + ieee754@1.2.1: {} - /ignore@5.3.0: - resolution: - { - integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, - } - engines: { node: ">= 4" } - dev: true + ignore@5.3.0: {} - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-from-esm@1.3.3: - resolution: - { - integrity: sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==, - } - engines: { node: ">=16.20" } + import-from-esm@1.3.3: dependencies: debug: 4.3.4 import-meta-resolve: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /import-meta-resolve@4.0.0: - resolution: - { - integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, - } - dev: true + import-meta-resolve@4.0.0: {} - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: - { - integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, - } - engines: { node: ">=8" } - dev: true + indent-string@4.0.0: {} - /indent-string@5.0.0: - resolution: - { - integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==, - } - engines: { node: ">=12" } - dev: true + indent-string@5.0.0: {} - /index-to-position@0.1.2: - resolution: - { - integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==, - } - engines: { node: ">=18" } - dev: true + index-to-position@0.1.2: {} - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + inherits@2.0.4: {} - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - dev: true + ini@1.3.8: {} - /ini@4.1.1: - resolution: - { - integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - dev: true + ini@4.1.1: {} - /inquirer@7.3.3: - resolution: - { - integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==, - } - engines: { node: ">=8.0.0" } + inquirer@7.3.3: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -7927,14 +12560,8 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 - dev: true - /inquirer@8.2.5: - resolution: - { - integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, - } - engines: { node: ">=12.0.0" } + inquirer@8.2.5: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -7951,701 +12578,251 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 - dev: true - /internal-slot@1.0.6: - resolution: - { - integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==, - } - engines: { node: ">= 0.4" } + internal-slot@1.0.6: dependencies: get-intrinsic: 1.2.2 hasown: 2.0.0 side-channel: 1.0.4 - dev: true - /internmap@2.0.3: - resolution: - { - integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, - } - engines: { node: ">=12" } - dev: false + internmap@2.0.3: {} - /into-stream@7.0.0: - resolution: - { - integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==, - } - engines: { node: ">=12" } + into-stream@7.0.0: dependencies: from2: 2.3.0 p-is-promise: 3.0.0 - dev: true - /is-arguments@1.1.1: - resolution: - { - integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==, - } - engines: { node: ">= 0.4" } + is-arguments@1.1.1: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: false - /is-array-buffer@3.0.2: - resolution: - { - integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==, - } + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: true - /is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: - { - integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, - } + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - dev: true - /is-boolean-object@1.1.2: - resolution: - { - integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, - } - engines: { node: ">= 0.4" } + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: true - /is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: ">= 0.4" } - dev: true + is-callable@1.2.7: {} - /is-ci@3.0.1: - resolution: - { - integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, - } - hasBin: true + is-ci@3.0.1: dependencies: ci-info: 3.9.0 - dev: true - /is-core-module@2.13.1: - resolution: - { - integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, - } + is-core-module@2.13.1: dependencies: hasown: 2.0.0 - /is-date-object@1.0.5: - resolution: - { - integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, - } - engines: { node: ">= 0.4" } + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.0 - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - dev: true + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: ">=8" } - dev: true + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: - { - integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, - } - engines: { node: ">=12" } - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-fullwidth-code-point@5.0.0: - resolution: - { - integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==, - } - engines: { node: ">=18" } + is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.2.0 - dev: true - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-interactive@1.0.0: - resolution: - { - integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, - } - engines: { node: ">=8" } - dev: true + is-interactive@1.0.0: {} - /is-module@1.0.0: - resolution: - { - integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, - } - dev: true + is-module@1.0.0: {} - /is-negative-zero@2.0.2: - resolution: - { - integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, - } - engines: { node: ">= 0.4" } - dev: true + is-negative-zero@2.0.2: {} - /is-number-object@1.0.7: - resolution: - { - integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, - } - engines: { node: ">= 0.4" } + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - dev: true + is-number@7.0.0: {} - /is-obj@1.0.1: - resolution: - { - integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, - } - engines: { node: ">=0.10.0" } - dev: true + is-obj@1.0.1: {} - /is-obj@2.0.0: - resolution: - { - integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, - } - engines: { node: ">=8" } - dev: true + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - dev: true + is-path-inside@3.0.3: {} - /is-plain-object@5.0.0: - resolution: - { - integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==, - } - engines: { node: ">=0.10.0" } - dev: true + is-plain-object@5.0.0: {} - /is-regex@1.1.4: - resolution: - { - integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, - } - engines: { node: ">= 0.4" } + is-regex@1.1.4: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - /is-regexp@1.0.0: - resolution: - { - integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, - } - engines: { node: ">=0.10.0" } - dev: true + is-regexp@1.0.0: {} - /is-shared-array-buffer@1.0.2: - resolution: - { - integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==, - } + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.5 - dev: true - /is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: - { - integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: - { - integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, - } - engines: { node: ">= 0.4" } + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-symbol@1.0.4: - resolution: - { - integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, - } - engines: { node: ">= 0.4" } + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-text-path@2.0.0: - resolution: - { - integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==, - } - engines: { node: ">=8" } + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 - dev: true - /is-typed-array@1.1.12: - resolution: - { - integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==, - } - engines: { node: ">= 0.4" } + is-typed-array@1.1.12: dependencies: which-typed-array: 1.1.13 - dev: true - /is-unicode-supported@0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - } - engines: { node: ">=10" } - dev: true + is-unicode-supported@0.1.0: {} - /is-unicode-supported@2.0.0: - resolution: - { - integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==, - } - engines: { node: ">=18" } - dev: true + is-unicode-supported@2.0.0: {} - /is-utf8@0.2.1: - resolution: - { - integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, - } - dev: true + is-utf8@0.2.1: {} - /is-weakref@1.0.2: - resolution: - { - integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, - } + is-weakref@1.0.2: dependencies: call-bind: 1.0.5 - dev: true - /is-windows@1.0.2: - resolution: - { - integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, - } - engines: { node: ">=0.10.0" } - dev: true + is-windows@1.0.2: {} - /isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + isarray@1.0.0: {} - /isarray@2.0.5: - resolution: - { - integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, - } - dev: true + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - dev: true + isexe@2.0.0: {} - /issue-parser@6.0.0: - resolution: - { - integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==, - } - engines: { node: ">=10.13" } + issue-parser@6.0.0: dependencies: lodash.capitalize: 4.2.1 lodash.escaperegexp: 4.1.2 lodash.isplainobject: 4.0.6 lodash.isstring: 4.0.1 lodash.uniqby: 4.7.0 - dev: true - /jackspeak@2.3.6: - resolution: - { - integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, - } - engines: { node: ">=14" } + jackspeak@2.3.6: dependencies: "@isaacs/cliui": 8.0.2 optionalDependencies: "@pkgjs/parseargs": 0.11.0 - dev: true - /jake@10.8.7: - resolution: - { - integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==, - } - engines: { node: ">=10" } - hasBin: true + jake@10.8.7: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: true - /java-properties@1.0.2: - resolution: - { - integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==, - } - engines: { node: ">= 0.6.0" } - dev: true + java-properties@1.0.2: {} - /jest-worker@26.6.2: - resolution: - { - integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, - } - engines: { node: ">= 10.13.0" } + jest-worker@26.6.2: dependencies: "@types/node": 20.10.5 merge-stream: 2.0.0 supports-color: 7.2.0 - dev: true - /jiti@1.21.0: - resolution: - { - integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, - } - hasBin: true - dev: true + jiti@1.21.0: {} - /js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } - dev: true + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsesc@0.5.0: - resolution: - { - integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, - } - hasBin: true - dev: true + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: - { - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, - } - engines: { node: ">=4" } - hasBin: true - dev: true + jsesc@2.5.2: {} - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - dev: true + json-buffer@3.0.1: {} - /json-fixer@1.6.15: - resolution: - { - integrity: sha512-TuDuZ5KrgyjoCIppdPXBMqiGfota55+odM+j2cQ5rt/XKyKmqGB3Whz1F8SN8+60yYGy/Nu5lbRZ+rx8kBIvBw==, - } - engines: { node: ">=10" } + json-fixer@1.6.15: dependencies: "@babel/runtime": 7.23.6 chalk: 4.1.2 pegjs: 0.10.0 - dev: true - /json-parse-better-errors@1.0.2: - resolution: - { - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, - } - dev: true + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } - dev: true + json-schema-traverse@1.0.0: {} - /json-schema@0.4.0: - resolution: - { - integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, - } - dev: true + json-schema@0.4.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: - { - integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, - } - dev: true + json-stringify-safe@5.0.1: {} - /json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: ">=6" } - hasBin: true - dev: true + json5@2.2.3: {} - /jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { "0": node >= 0.2.0 } - dev: true + jsonparse@1.3.1: {} - /jsonpointer@5.0.1: - resolution: - { - integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, - } - engines: { node: ">=0.10.0" } - dev: true + jsonpointer@5.0.1: {} - /keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: ">=0.10.0" } - dev: true + kind-of@6.0.3: {} - /known-css-properties@0.29.0: - resolution: - { - integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==, - } - dev: true + known-css-properties@0.29.0: {} - /leaflet.markercluster@1.5.3(leaflet@1.9.4): - resolution: - { - integrity: sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==, - } - peerDependencies: - leaflet: ^1.3.1 + leaflet.markercluster@1.5.3(leaflet@1.9.4): dependencies: leaflet: 1.9.4 - dev: false - /leaflet@1.9.4: - resolution: - { - integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==, - } - dev: false + leaflet@1.9.4: {} - /leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: ">=6" } - dev: true + leven@3.1.0: {} - /levn@0.3.0: - resolution: - { - integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, - } - engines: { node: ">= 0.8.0" } + levn@0.3.0: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 - dev: false - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lilconfig@2.1.0: - resolution: - { - integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, - } - engines: { node: ">=10" } - dev: true + lilconfig@2.1.0: {} - /lilconfig@3.0.0: - resolution: - { - integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==, - } - engines: { node: ">=14" } - dev: true + lilconfig@3.0.0: {} - /lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } - dev: true + lines-and-columns@1.2.4: {} - /lint-staged@15.2.2: - resolution: - { - integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==, - } - engines: { node: ">=18.12.0" } - hasBin: true + lint-staged@15.2.2: dependencies: chalk: 5.3.0 commander: 11.1.0 @@ -8659,14 +12836,8 @@ packages: yaml: 2.3.4 transitivePeerDependencies: - supports-color - dev: true - /listr2@8.0.1: - resolution: - { - integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==, - } - engines: { node: ">=18.0.0" } + listr2@8.0.1: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -8674,335 +12845,125 @@ packages: log-update: 6.0.0 rfdc: 1.3.0 wrap-ansi: 9.0.0 - dev: true - /lit-element@4.0.4: - resolution: - { - integrity: sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==, - } + lit-element@4.0.4: dependencies: "@lit-labs/ssr-dom-shim": 1.2.0 "@lit/reactive-element": 2.0.4 lit-html: 3.1.2 - dev: false - /lit-html@3.1.2: - resolution: - { - integrity: sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==, - } + lit-html@3.1.2: dependencies: "@types/trusted-types": 2.0.7 - dev: false - /lit@3.1.2: - resolution: - { - integrity: sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==, - } + lit@3.1.2: dependencies: "@lit/reactive-element": 2.0.4 lit-element: 4.0.4 lit-html: 3.1.2 - dev: false - /load-json-file@4.0.0: - resolution: - { - integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, - } - engines: { node: ">=4" } + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /locate-path@2.0.0: - resolution: - { - integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, - } - engines: { node: ">=4" } + locate-path@2.0.0: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: ">=8" } + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /locate-path@7.2.0: - resolution: - { - integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash-es@4.17.21: - resolution: - { - integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, - } - dev: true + lodash-es@4.17.21: {} - /lodash.camelcase@4.3.0: - resolution: - { - integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, - } - dev: true + lodash.camelcase@4.3.0: {} - /lodash.capitalize@4.2.1: - resolution: - { - integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==, - } - dev: true + lodash.capitalize@4.2.1: {} - /lodash.castarray@4.4.0: - resolution: - { - integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==, - } - dev: true + lodash.castarray@4.4.0: {} - /lodash.debounce@4.0.8: - resolution: - { - integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, - } - dev: true + lodash.debounce@4.0.8: {} - /lodash.escaperegexp@4.1.2: - resolution: - { - integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==, - } - dev: true + lodash.escaperegexp@4.1.2: {} - /lodash.isplainobject@4.0.6: - resolution: - { - integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, - } - dev: true + lodash.isplainobject@4.0.6: {} - /lodash.isstring@4.0.1: - resolution: - { - integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, - } - dev: true + lodash.isstring@4.0.1: {} - /lodash.kebabcase@4.1.1: - resolution: - { - integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==, - } - dev: true + lodash.kebabcase@4.1.1: {} - /lodash.map@4.6.0: - resolution: - { - integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==, - } - dev: true + lodash.map@4.6.0: {} - /lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } - dev: true + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - dev: true + lodash.merge@4.6.2: {} - /lodash.mergewith@4.6.2: - resolution: - { - integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, - } - requiresBuild: true - dev: true + lodash.mergewith@4.6.2: {} - /lodash.snakecase@4.1.1: - resolution: - { - integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==, - } - dev: true + lodash.snakecase@4.1.1: {} - /lodash.sortby@4.7.0: - resolution: - { - integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, - } - dev: true + lodash.sortby@4.7.0: {} - /lodash.startcase@4.4.0: - resolution: - { - integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, - } - dev: true + lodash.startcase@4.4.0: {} - /lodash.truncate@4.4.2: - resolution: - { - integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, - } - dev: true + lodash.truncate@4.4.2: {} - /lodash.uniq@4.5.0: - resolution: - { - integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, - } - dev: true + lodash.uniq@4.5.0: {} - /lodash.uniqby@4.7.0: - resolution: - { - integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==, - } - dev: true + lodash.uniqby@4.7.0: {} - /lodash.upperfirst@4.3.1: - resolution: - { - integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==, - } - dev: true + lodash.upperfirst@4.3.1: {} - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: true + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - } - engines: { node: ">=10" } + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log-update@6.0.0: - resolution: - { - integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==, - } - engines: { node: ">=18" } + log-update@6.0.0: dependencies: ansi-escapes: 6.2.0 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - dev: true - /longest@2.0.1: - resolution: - { - integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==, - } - engines: { node: ">=0.10.0" } - dev: true + longest@2.0.1: {} - /lowercase-keys@3.0.0: - resolution: - { - integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true + lowercase-keys@3.0.0: {} - /lru-cache@10.1.0: - resolution: - { - integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==, - } - engines: { node: 14 || >=16.14 } - dev: true + lru-cache@10.1.0: {} - /lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /magic-string@0.25.1: - resolution: - { - integrity: sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==, - } + magic-string@0.25.1: dependencies: sourcemap-codec: 1.4.8 - dev: false - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 - dev: true - /marked-terminal@7.0.0(marked@12.0.0): - resolution: - { - integrity: sha512-sNEx8nn9Ktcm6pL0TnRz8tnXq/mSS0Q1FRSwJOAqw4lAB4l49UeDf85Gm1n9RPFm5qurCPjwi1StAQT2XExhZw==, - } - engines: { node: ">=16.0.0" } - peerDependencies: - marked: ">=1 <13" + marked-terminal@7.0.0(marked@12.0.0): dependencies: ansi-escapes: 6.2.0 chalk: 5.3.0 @@ -9011,532 +12972,159 @@ packages: marked: 12.0.0 node-emoji: 2.1.3 supports-hyperlinks: 3.0.0 - dev: true - /marked@12.0.0: - resolution: - { - integrity: sha512-Vkwtq9rLqXryZnWaQc86+FHLC6tr/fycMfYAhiOIXkrNmeGAyhSxjqu0Rs1i0bBqw5u0S7+lV9fdH2ZSVaoa0w==, - } - engines: { node: ">= 18" } - hasBin: true + marked@12.0.0: {} - /mathml-tag-names@2.1.3: - resolution: - { - integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==, - } - dev: true + mathml-tag-names@2.1.3: {} - /mdn-data@2.0.28: - resolution: - { - integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, - } - dev: true + mdn-data@2.0.28: {} - /mdn-data@2.0.30: - resolution: - { - integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==, - } - dev: true + mdn-data@2.0.30: {} - /meow@12.1.1: - resolution: - { - integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==, - } - engines: { node: ">=16.10" } - dev: true + meow@12.1.1: {} - /meow@13.2.0: - resolution: - { - integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==, - } - engines: { node: ">=18" } - dev: true + meow@13.2.0: {} - /merge-source-map@1.0.4: - resolution: - { - integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==, - } + merge-source-map@1.0.4: dependencies: source-map: 0.5.7 - dev: false - /merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: true + merge2@1.4.1: {} - /merge@2.1.1: - resolution: - { - integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==, - } - dev: true + merge@2.1.1: {} - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - /mime@4.0.1: - resolution: - { - integrity: sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==, - } - engines: { node: ">=16" } - hasBin: true - dev: true + mime@4.0.1: {} - /mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: ">=6" } - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: - { - integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, - } - engines: { node: ">=12" } - dev: true + mimic-fn@4.0.0: {} - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } - dev: true + mimic-response@3.1.0: {} - /mimic-response@4.0.0: - resolution: - { - integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true + mimic-response@4.0.0: {} - /mini-svg-data-uri@1.4.4: - resolution: - { - integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==, - } - hasBin: true - dev: true + mini-svg-data-uri@1.4.4: {} - /minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: ">=16 || 14 >=14.17" } + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.7: - resolution: - { - integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==, - } - dev: true + minimist@1.2.7: {} - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + minimist@1.2.8: {} - /minipass@7.0.4: - resolution: - { - integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, - } - engines: { node: ">=16 || 14 >=14.17" } - dev: true + minipass@7.0.4: {} - /mitt@3.0.1: - resolution: - { - integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==, - } - dev: false + mitt@3.0.1: {} - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - dev: true + ms@2.1.2: {} - /mute-stream@0.0.8: - resolution: - { - integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, - } - dev: true + mute-stream@0.0.8: {} - /mz@2.7.0: - resolution: - { - integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, - } + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true - /nanoid@3.3.7: - resolution: - { - integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - dev: true + natural-compare@1.4.0: {} - /neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } - dev: true + neo-async@2.6.2: {} - /nerf-dart@1.0.0: - resolution: - { - integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==, - } - dev: true + nerf-dart@1.0.0: {} - /next-tick@1.1.0: - resolution: - { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, - } - dev: false + next-tick@1.1.0: {} - /node-emoji@2.1.3: - resolution: - { - integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==, - } - engines: { node: ">=18" } + node-emoji@2.1.3: dependencies: "@sindresorhus/is": 4.6.0 char-regex: 1.0.2 emojilib: 2.4.0 skin-tone: 2.0.0 - dev: true - /node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - dev: true - /node-releases@2.0.14: - resolution: - { - integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, - } - dev: true + node-releases@2.0.14: {} - /normalize-package-data@6.0.0: - resolution: - { - integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + normalize-package-data@6.0.0: dependencies: hosted-git-info: 7.0.1 is-core-module: 2.13.1 semver: 7.6.0 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - dev: true + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: - { - integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, - } - engines: { node: ">=0.10.0" } - dev: true + normalize-range@0.1.2: {} - /normalize-url@8.0.0: - resolution: - { - integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==, - } - engines: { node: ">=14.16" } - dev: true + normalize-url@8.0.0: {} - /npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: ">=8" } + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.2.0: - resolution: - { - integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + npm-run-path@5.2.0: dependencies: path-key: 4.0.0 - dev: true - /npm@10.2.5: - resolution: - { - integrity: sha512-lXdZ7titEN8CH5YJk9C/aYRU9JeDxQ4d8rwIIDsvH3SMjLjHTukB2CFstMiB30zXs4vCrPN2WH6cDq1yHBeJAw==, - } - engines: { node: ^18.17.0 || >=20.5.0 } - hasBin: true - dev: true - bundledDependencies: - - "@isaacs/string-locale-compare" - - "@npmcli/arborist" - - "@npmcli/config" - - "@npmcli/fs" - - "@npmcli/map-workspaces" - - "@npmcli/package-json" - - "@npmcli/promise-spawn" - - "@npmcli/run-script" - - "@sigstore/tuf" - - abbrev - - archy - - cacache - - chalk - - ci-info - - cli-columns - - cli-table3 - - columnify - - fastest-levenshtein - - fs-minipass - - glob - - graceful-fs - - hosted-git-info - - ini - - init-package-json - - is-cidr - - json-parse-even-better-errors - - libnpmaccess - - libnpmdiff - - libnpmexec - - libnpmfund - - libnpmhook - - libnpmorg - - libnpmpack - - libnpmpublish - - libnpmsearch - - libnpmteam - - libnpmversion - - make-fetch-happen - - minimatch - - minipass - - minipass-pipeline - - ms - - node-gyp - - nopt - - normalize-package-data - - npm-audit-report - - npm-install-checks - - npm-package-arg - - npm-pick-manifest - - npm-profile - - npm-registry-fetch - - npm-user-validate - - npmlog - - p-map - - pacote - - parse-conflict-json - - proc-log - - qrcode-terminal - - read - - semver - - spdx-expression-parse - - ssri - - strip-ansi - - supports-color - - tar - - text-table - - tiny-relative-date - - treeverse - - validate-npm-package-name - - which - - write-file-atomic + npm@10.2.5: {} - /nth-check@2.1.1: - resolution: - { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, - } + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: true - /object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: ">=0.10.0" } - dev: true + object-assign@4.1.1: {} - /object-hash@3.0.0: - resolution: - { - integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, - } - engines: { node: ">= 6" } - dev: true + object-hash@3.0.0: {} - /object-inspect@1.13.1: - resolution: - { - integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, - } + object-inspect@1.13.1: {} - /object-is@1.1.5: - resolution: - { - integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==, - } - engines: { node: ">= 0.4" } + object-is@1.1.5: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 - dev: false - /object-keys@1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - } - engines: { node: ">= 0.4" } + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: - { - integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, - } - engines: { node: ">= 0.4" } + object.assign@4.1.5: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: ">=6" } + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: - { - integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, - } - engines: { node: ">=12" } + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /optionator@0.8.3: - resolution: - { - integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, - } - engines: { node: ">= 0.8.0" } + optionator@0.8.3: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -9544,14 +13132,8 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.5 - dev: false - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } + optionator@0.9.3: dependencies: "@aashutoshrathi/word-wrap": 1.2.6 deep-is: 0.1.4 @@ -9559,14 +13141,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@5.4.1: - resolution: - { - integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, - } - engines: { node: ">=10" } + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -9577,514 +13153,180 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /os-tmpdir@1.0.2: - resolution: - { - integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, - } - engines: { node: ">=0.10.0" } - dev: true + os-tmpdir@1.0.2: {} - /p-cancelable@4.0.1: - resolution: - { - integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==, - } - engines: { node: ">=14.16" } - dev: true + p-cancelable@4.0.1: {} - /p-each-series@3.0.0: - resolution: - { - integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==, - } - engines: { node: ">=12" } - dev: true + p-each-series@3.0.0: {} - /p-filter@4.1.0: - resolution: - { - integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==, - } - engines: { node: ">=18" } + p-filter@4.1.0: dependencies: p-map: 7.0.1 - dev: true - /p-is-promise@3.0.0: - resolution: - { - integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==, - } - engines: { node: ">=8" } - dev: true + p-is-promise@3.0.0: {} - /p-limit@1.3.0: - resolution: - { - integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, - } - engines: { node: ">=4" } + p-limit@1.3.0: dependencies: p-try: 1.0.0 - dev: true - /p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: ">=6" } + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: true - /p-limit@4.0.0: - resolution: - { - integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@2.0.0: - resolution: - { - integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, - } - engines: { node: ">=4" } + p-locate@2.0.0: dependencies: p-limit: 1.3.0 - dev: true - /p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: ">=8" } + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-locate@6.0.0: - resolution: - { - integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /p-map@7.0.1: - resolution: - { - integrity: sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==, - } - engines: { node: ">=18" } - dev: true + p-map@7.0.1: {} - /p-reduce@2.1.0: - resolution: - { - integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, - } - engines: { node: ">=8" } - dev: true + p-reduce@2.1.0: {} - /p-reduce@3.0.0: - resolution: - { - integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==, - } - engines: { node: ">=12" } - dev: true + p-reduce@3.0.0: {} - /p-try@1.0.0: - resolution: - { - integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, - } - engines: { node: ">=4" } - dev: true + p-try@1.0.0: {} - /p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: ">=6" } - dev: true + p-try@2.2.0: {} - /pako@0.2.9: - resolution: - { - integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==, - } - dev: false + pako@0.2.9: {} - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@4.0.0: - resolution: - { - integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, - } - engines: { node: ">=4" } + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: ">=8" } + parse-json@5.2.0: dependencies: "@babel/code-frame": 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parse-json@8.1.0: - resolution: - { - integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==, - } - engines: { node: ">=18" } + parse-json@8.1.0: dependencies: "@babel/code-frame": 7.23.5 index-to-position: 0.1.2 type-fest: 4.9.0 - dev: true - /parse-passwd@1.0.0: - resolution: - { - integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, - } - engines: { node: ">=0.10.0" } - dev: true + parse-passwd@1.0.0: {} - /parse-path@7.0.0: - resolution: - { - integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==, - } + parse-path@7.0.0: dependencies: protocols: 2.0.1 - dev: true - /parse-url@9.0.1: - resolution: - { - integrity: sha512-9BTx9oCKV8f+OhbAhU44KqRUCQrKf8tEbxRq0Ld7m2TSWgoqmy+iVt7xnjEixlz28J9V6sAjVBv/wZNv4+2Jsg==, - } - engines: { node: ">=14.13.0" } + parse-url@9.0.1: dependencies: "@types/parse-path": 7.0.3 parse-path: 7.0.0 - dev: true - /parse5-htmlparser2-tree-adapter@6.0.1: - resolution: - { - integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==, - } + parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 - dev: true - /parse5@5.1.1: - resolution: - { - integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==, - } - dev: true + parse5@5.1.1: {} - /parse5@6.0.1: - resolution: - { - integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, - } - dev: true + parse5@6.0.1: {} - /path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: ">=4" } - dev: true + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - dev: true + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: - { - integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - dev: true + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: - { - integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, - } - engines: { node: ">=12" } - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: - { - integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==, - } - engines: { node: ">=16 || 14 >=14.17" } + path-scurry@1.10.1: dependencies: lru-cache: 10.1.0 minipass: 7.0.4 - dev: true - /path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: ">=8" } - dev: true + path-type@4.0.0: {} - /path-type@5.0.0: - resolution: - { - integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==, - } - engines: { node: ">=12" } - dev: true + path-type@5.0.0: {} - /pdfmake@0.2.8: - resolution: - { - integrity: sha512-lI+amfIaUL8CrPhndxFdhIgMj9JB49Sj4DARltKC1gLm/5NsPohZqfB+D+II8HymtPB6eugUFD5oBxmzO57qHA==, - } - engines: { node: ">=12" } + pdfmake@0.2.8: dependencies: "@foliojs-fork/linebreak": 1.1.1 "@foliojs-fork/pdfkit": 0.14.0 iconv-lite: 0.6.3 xmldoc: 1.3.0 - dev: false - /pegjs@0.10.0: - resolution: - { - integrity: sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==, - } - engines: { node: ">=0.10" } - hasBin: true - dev: true + pegjs@0.10.0: {} - /performance-now@2.1.0: - resolution: - { - integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, - } - dev: false + performance-now@2.1.0: {} - /picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - } + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - dev: true + picomatch@2.3.1: {} - /pidtree@0.6.0: - resolution: - { - integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, - } - engines: { node: ">=0.10" } - hasBin: true - dev: true + pidtree@0.6.0: {} - /pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: ">=0.10.0" } - dev: true + pify@2.3.0: {} - /pify@3.0.0: - resolution: - { - integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, - } - engines: { node: ">=4" } - dev: true + pify@3.0.0: {} - /pify@5.0.0: - resolution: - { - integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, - } - engines: { node: ">=10" } - dev: true + pify@5.0.0: {} - /pirates@4.0.6: - resolution: - { - integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, - } - engines: { node: ">= 6" } - dev: true + pirates@4.0.6: {} - /pkg-conf@2.1.0: - resolution: - { - integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==, - } - engines: { node: ">=4" } + pkg-conf@2.1.0: dependencies: find-up: 2.1.0 load-json-file: 4.0.0 - dev: true - /png-js@1.0.0: - resolution: - { - integrity: sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==, - } - dev: false + png-js@1.0.0: {} - /polylabel@1.1.0: - resolution: - { - integrity: sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==, - } + polylabel@1.1.0: dependencies: tinyqueue: 2.0.3 - dev: false - /postcss-attribute-case-insensitive@6.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-attribute-case-insensitive@6.0.3(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-calc@9.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.2.2 + postcss-calc@9.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.14 postcss-value-parser: 4.2.0 - dev: true - /postcss-clamp@4.1.0(postcss@8.4.35): - resolution: - { - integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, - } - engines: { node: ">=7.6.0" } - peerDependencies: - postcss: ^8.4.6 + postcss-clamp@4.1.0(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-color-functional-notation@6.0.5(postcss@8.4.35): - resolution: - { - integrity: sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-color-functional-notation@6.0.5(postcss@8.4.35): dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -10092,90 +13334,42 @@ packages: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /postcss-color-hex-alpha@9.0.4(postcss@8.4.35): - resolution: - { - integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-color-hex-alpha@9.0.4(postcss@8.4.35): dependencies: "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-color-rebeccapurple@9.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-color-rebeccapurple@9.0.3(postcss@8.4.35): dependencies: "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-colormin@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-TXKOxs9LWcdYo5cgmcSHPkyrLAh86hX1ijmyy6J8SbOhyv6ua053M3ZAM/0j44UsnQNIWdl8gb5L7xX2htKeLw==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-colormin@6.0.2(postcss@8.4.35): dependencies: browserslist: 4.22.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-convert-values@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-aeBmaTnGQ+NUSVQT8aY0sKyAD/BaLJenEKZ03YK0JnDE1w1Rr8XShoxdal2V2H26xTJKr3v5haByOhJuyT4UYw==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-convert-values@6.0.2(postcss@8.4.35): dependencies: browserslist: 4.22.2 postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-custom-media@10.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-custom-media@10.0.3(postcss@8.4.35): dependencies: "@csstools/cascade-layer-name-parser": 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 "@csstools/media-query-list-parser": 2.1.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) postcss: 8.4.35 - dev: true - /postcss-custom-properties@13.3.5(postcss@8.4.35): - resolution: - { - integrity: sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-custom-properties@13.3.5(postcss@8.4.35): dependencies: "@csstools/cascade-layer-name-parser": 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -10183,214 +13377,87 @@ packages: "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-custom-selectors@7.1.7(postcss@8.4.35): - resolution: - { - integrity: sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-custom-selectors@7.1.7(postcss@8.4.35): dependencies: "@csstools/cascade-layer-name-parser": 1.0.8(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-dir-pseudo-class@8.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-dir-pseudo-class@8.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-discard-comments@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-discard-comments@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-discard-duplicates@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-1hvUs76HLYR8zkScbwyJ8oJEugfPV+WchpnA+26fpJ7Smzs51CzGBHC32RS03psuX/2l0l0UKh2StzNxOrKCYg==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-discard-duplicates@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-discard-empty@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-yitcmKwmVWtNsrrRqGJ7/C0YRy53i0mjexBDQ9zYxDwTWVBgbU4+C9jIZLmQlTDT9zhml+u0OMFJh8+31krmOg==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-discard-empty@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-discard-overridden@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-discard-overridden@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-double-position-gradients@5.0.4(postcss@8.4.35): - resolution: - { - integrity: sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-double-position-gradients@5.0.4(postcss@8.4.35): dependencies: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-focus-visible@9.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-focus-visible@9.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-focus-within@8.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-focus-within@8.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-font-variant@5.0.0(postcss@8.4.35): - resolution: - { - integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, - } - peerDependencies: - postcss: ^8.1.0 + postcss-font-variant@5.0.0(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-gap-properties@5.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-gap-properties@5.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-image-set-function@6.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-image-set-function@6.0.3(postcss@8.4.35): dependencies: "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-import@15.1.0(postcss@8.4.35): - resolution: - { - integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - postcss: ^8.0.0 + postcss-import@15.1.0(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - dev: true - /postcss-import@16.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-i2Pci0310NaLHr/5JUFSw1j/8hf1CzwMY13g6ZDxgOavmRHQi2ba3PmUHoihO+sjaum+KmCNzskNsw7JDrg03g==, - } - engines: { node: ">=18.0.0" } - peerDependencies: - postcss: ^8.0.0 + postcss-import@16.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - dev: true - /postcss-js@4.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, - } - engines: { node: ^12 || ^14 || >= 16 } - peerDependencies: - postcss: ^8.4.21 + postcss-js@4.0.1(postcss@8.4.35): dependencies: camelcase-css: 2.0.1 postcss: 8.4.35 - dev: true - /postcss-lab-function@6.0.10(postcss@8.4.35): - resolution: - { - integrity: sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-lab-function@6.0.10(postcss@8.4.35): dependencies: "@csstools/css-color-parser": 1.5.2(@csstools/css-parser-algorithms@2.6.0)(@csstools/css-tokenizer@2.2.3) "@csstools/css-parser-algorithms": 2.6.0(@csstools/css-tokenizer@2.2.3) @@ -10398,355 +13465,142 @@ packages: "@csstools/postcss-progressive-custom-properties": 3.1.0(postcss@8.4.35) "@csstools/utilities": 1.0.0(postcss@8.4.35) postcss: 8.4.35 - dev: true - /postcss-load-config@4.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, - } - engines: { node: ">= 14" } - peerDependencies: - postcss: ">=8.0.9" - ts-node: ">=9.0.0" - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@4.0.2(postcss@8.4.35): dependencies: lilconfig: 3.0.0 postcss: 8.4.35 yaml: 2.3.4 - dev: true - /postcss-logical@7.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-logical@7.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-merge-longhand@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-+yfVB7gEM8SrCo9w2lCApKIEzrTKl5yS1F4yGhV3kSim6JzbfLGJyhR1B6X+6vOT0U33Mgx7iv4X9MVWuaSAfw==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-merge-longhand@6.0.2(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 stylehacks: 6.0.2(postcss@8.4.35) - dev: true - /postcss-merge-rules@6.0.3(postcss@8.4.35): - resolution: - { - integrity: sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-merge-rules@6.0.3(postcss@8.4.35): dependencies: browserslist: 4.22.2 caniuse-api: 3.0.0 cssnano-utils: 4.0.1(postcss@8.4.35) postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-minify-font-values@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-tIwmF1zUPoN6xOtA/2FgVk1ZKrLcCvE0dpZLtzyyte0j9zUeB8RTbCqrHZGjJlxOvNWKMYtunLrrl7HPOiR46w==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-minify-font-values@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-minify-gradients@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-M1RJWVjd6IOLPl1hYiOd5HQHgpp6cvJVLrieQYS9y07Yo8itAr6jaekzJphaJFR0tcg4kRewCk3kna9uHBxn/w==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-minify-gradients@6.0.1(postcss@8.4.35): dependencies: colord: 2.9.3 cssnano-utils: 4.0.1(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-minify-params@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-zwQtbrPEBDj+ApELZ6QylLf2/c5zmASoOuA4DzolyVGdV38iR2I5QRMsZcHkcdkZzxpN8RS4cN7LPskOkTwTZw==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-minify-params@6.0.2(postcss@8.4.35): dependencies: browserslist: 4.22.2 cssnano-utils: 4.0.1(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-minify-selectors@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-minify-selectors@6.0.2(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-nested@5.0.6(postcss@8.4.35): - resolution: - { - integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==, - } - engines: { node: ">=12.0" } - peerDependencies: - postcss: ^8.2.14 + postcss-nested@5.0.6(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.14 - dev: false - /postcss-nested@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, - } - engines: { node: ">=12.0" } - peerDependencies: - postcss: ^8.2.14 + postcss-nested@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.14 - dev: true - /postcss-nesting@12.0.4(postcss@8.4.35): - resolution: - { - integrity: sha512-WuCe0KnP4vKjLZK8VNoUWKL8ZLOv/5jiM94mHcI3VszLropHwmjotdUyP/ObzqZpXuQKP2Jf9R12vIHKFSStKw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-nesting@12.0.4(postcss@8.4.35): dependencies: "@csstools/selector-specificity": 3.0.2(postcss-selector-parser@6.0.15) postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-normalize-charset@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-charset@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-normalize-display-values@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-display-values@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-positions@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-positions@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-repeat-style@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-repeat-style@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-string@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-string@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-timing-functions@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-timing-functions@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-unicode@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-Ff2VdAYCTGyMUwpevTZPZ4w0+mPjbZzLLyoLh/RMpqUqeQKZ+xMm31hkxBavDcGKcxm6ACzGk0nBfZ8LZkStKA==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-unicode@6.0.2(postcss@8.4.35): dependencies: browserslist: 4.22.2 postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-url@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-url@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-normalize-whitespace@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-normalize-whitespace@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-opacity-percentage@2.0.0(postcss@8.4.35): - resolution: - { - integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.2 + postcss-opacity-percentage@2.0.0(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-ordered-values@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-ordered-values@6.0.1(postcss@8.4.35): dependencies: cssnano-utils: 4.0.1(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-overflow-shorthand@5.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-overflow-shorthand@5.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-page-break@3.0.4(postcss@8.4.35): - resolution: - { - integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, - } - peerDependencies: - postcss: ^8 + postcss-page-break@3.0.4(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-place@9.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-place@9.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-preset-env@9.4.0(postcss@8.4.35): - resolution: - { - integrity: sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-preset-env@9.4.0(postcss@8.4.35): dependencies: "@csstools/postcss-cascade-layers": 4.0.3(postcss@8.4.35) "@csstools/postcss-color-function": 3.0.10(postcss@8.4.35) @@ -10809,391 +13663,152 @@ packages: postcss-pseudo-class-any-link: 9.0.1(postcss@8.4.35) postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.35) postcss-selector-not: 7.0.2(postcss@8.4.35) - dev: true - /postcss-pseudo-class-any-link@9.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-cKYGGZ9yzUZi+dZd7XT2M8iSDfo+T2Ctbpiizf89uBTBfIpZpjvTavzIJXpCReMVXSKROqzpxClNu6fz4DHM0Q==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-pseudo-class-any-link@9.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-reduce-initial@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-YGKalhNlCLcjcLvjU5nF8FyeCTkCO5UtvJEt0hrPZVCTtRLSOH4z00T1UntQPj4dUmIYZgMj8qK77JbSX95hSw==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-reduce-initial@6.0.2(postcss@8.4.35): dependencies: browserslist: 4.22.2 caniuse-api: 3.0.0 postcss: 8.4.35 - dev: true - /postcss-reduce-transforms@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-reduce-transforms@6.0.1(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 - dev: true - /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.35): - resolution: - { - integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, - } - peerDependencies: - postcss: ^8.0.3 + postcss-replace-overflow-wrap@4.0.0(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-reporter@7.1.0(postcss@8.4.35): - resolution: - { - integrity: sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==, - } - engines: { node: ">=10" } - peerDependencies: - postcss: ^8.1.0 + postcss-reporter@7.1.0(postcss@8.4.35): dependencies: picocolors: 1.0.0 postcss: 8.4.35 thenby: 1.3.4 - dev: true - /postcss-resolve-nested-selector@0.1.1: - resolution: - { - integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==, - } - dev: true + postcss-resolve-nested-selector@0.1.1: {} - /postcss-safe-parser@7.0.0(postcss@8.4.35): - resolution: - { - integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==, - } - engines: { node: ">=18.0" } - peerDependencies: - postcss: ^8.4.31 + postcss-safe-parser@7.0.0(postcss@8.4.35): dependencies: postcss: 8.4.35 - dev: true - /postcss-selector-not@7.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==, - } - engines: { node: ^14 || ^16 || >=18 } - peerDependencies: - postcss: ^8.4 + postcss-selector-not@7.0.2(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-selector-parser@6.0.10: - resolution: - { - integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, - } - engines: { node: ">=4" } - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-selector-parser@6.0.14: - resolution: - { - integrity: sha512-65xXYsT40i9GyWzlHQ5ShZoK7JZdySeOozi/tz2EezDo6c04q6+ckYMeoY7idaie1qp2dT5KoYQ2yky6JuoHnA==, - } - engines: { node: ">=4" } + postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-selector-parser@6.0.15: - resolution: - { - integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==, - } - engines: { node: ">=4" } + postcss-selector-parser@6.0.14: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true - /postcss-svgo@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ==, - } - engines: { node: ^14 || ^16 || >= 18 } - peerDependencies: - postcss: ^8.4.31 + postcss-selector-parser@6.0.15: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@6.0.2(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-value-parser: 4.2.0 svgo: 3.2.0 - dev: true - /postcss-unique-selectors@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + postcss-unique-selectors@6.0.2(postcss@8.4.35): dependencies: postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } - dev: true + postcss-value-parser@4.2.0: {} - /postcss@8.4.35: - resolution: - { - integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==, - } - engines: { node: ^10 || ^12 || >=14 } + postcss@8.4.35: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - /prelude-ls@1.1.2: - resolution: - { - integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, - } - engines: { node: ">= 0.8.0" } - dev: false + prelude-ls@1.1.2: {} - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - dev: true + prelude-ls@1.2.1: {} - /prettier-linter-helpers@1.0.0: - resolution: - { - integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, - } - engines: { node: ">=6.0.0" } + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier-plugin-organize-imports@3.2.4(prettier@3.2.5)(typescript@5.3.3): - resolution: - { - integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==, - } - peerDependencies: - "@volar/vue-language-plugin-pug": ^1.0.4 - "@volar/vue-typescript": ^1.0.4 - prettier: ">=2.0" - typescript: ">=2.9" - peerDependenciesMeta: - "@volar/vue-language-plugin-pug": - optional: true - "@volar/vue-typescript": - optional: true + prettier-plugin-organize-imports@3.2.4(prettier@3.2.5)(typescript@5.3.3): dependencies: prettier: 3.2.5 typescript: 5.3.3 - dev: true - /prettier@2.8.8: - resolution: - { - integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, - } - engines: { node: ">=10.13.0" } - hasBin: true - requiresBuild: true - dev: true + prettier@2.8.8: optional: true - /prettier@3.2.5: - resolution: - { - integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, - } - engines: { node: ">=14" } - hasBin: true - dev: true + prettier@3.2.5: {} - /pretty-bytes@5.6.0: - resolution: - { - integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, - } - engines: { node: ">=6" } - dev: true + pretty-bytes@5.6.0: {} - /pretty-bytes@6.1.1: - resolution: - { - integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, - } - engines: { node: ^14.13.1 || >=16.0.0 } - dev: true + pretty-bytes@6.1.1: {} - /process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } + process-nextick-args@2.0.1: {} - /proto-list@1.2.4: - resolution: - { - integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, - } - dev: true + proto-list@1.2.4: {} - /protocols@2.0.1: - resolution: - { - integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==, - } - dev: true + protocols@2.0.1: {} - /punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } - dev: true + punycode@2.3.1: {} - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - dev: true + queue-microtask@1.2.3: {} - /quick-lru@5.1.1: - resolution: - { - integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, - } - engines: { node: ">=10" } - dev: true + quick-lru@5.1.1: {} - /quote-stream@1.0.2: - resolution: - { - integrity: sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==, - } - hasBin: true + quote-stream@1.0.2: dependencies: buffer-equal: 0.0.1 minimist: 1.2.8 through2: 2.0.5 - dev: false - /raf@3.4.1: - resolution: - { - integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, - } + raf@3.4.1: dependencies: performance-now: 2.1.0 - dev: false - /randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true - /read-cache@1.0.0: - resolution: - { - integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, - } + read-cache@1.0.0: dependencies: pify: 2.3.0 - dev: true - /read-pkg-up@11.0.0: - resolution: - { - integrity: sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==, - } - engines: { node: ">=18" } - deprecated: Renamed to read-package-up + read-pkg-up@11.0.0: dependencies: find-up-simple: 1.0.0 read-pkg: 9.0.1 type-fest: 4.9.0 - dev: true - /read-pkg@9.0.1: - resolution: - { - integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==, - } - engines: { node: ">=18" } + read-pkg@9.0.1: dependencies: "@types/normalize-package-data": 2.4.4 normalize-package-data: 6.0.0 parse-json: 8.1.0 type-fest: 4.9.0 unicorn-magic: 0.1.0 - dev: true - /readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -11203,86 +13818,39 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /redux@4.2.1: - resolution: - { - integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==, - } + redux@4.2.1: dependencies: "@babel/runtime": 7.23.6 - dev: false - /regenerate-unicode-properties@10.1.1: - resolution: - { - integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==, - } - engines: { node: ">=4" } + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 - dev: true - /regenerate@1.4.2: - resolution: - { - integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, - } - dev: true + regenerate@1.4.2: {} - /regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } + regenerator-runtime@0.14.1: {} - /regenerator-transform@0.15.2: - resolution: - { - integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, - } + regenerator-transform@0.15.2: dependencies: "@babel/runtime": 7.23.6 - dev: true - /regexp.prototype.flags@1.5.1: - resolution: - { - integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==, - } - engines: { node: ">= 0.4" } + regexp.prototype.flags@1.5.1: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 - /regexpu-core@5.3.2: - resolution: - { - integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==, - } - engines: { node: ">=4" } + regexpu-core@5.3.2: dependencies: "@babel/regjsgen": 0.8.0 regenerate: 1.4.2 @@ -11290,232 +13858,88 @@ packages: regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - dev: true - /registry-auth-token@5.0.2: - resolution: - { - integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==, - } - engines: { node: ">=14" } + registry-auth-token@5.0.2: dependencies: "@pnpm/npm-conf": 2.2.2 - dev: true - /regjsparser@0.9.1: - resolution: - { - integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, - } - hasBin: true + regjsparser@0.9.1: dependencies: jsesc: 0.5.0 - dev: true - /regression@2.0.1: - resolution: - { - integrity: sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ==, - } - dev: false + regression@2.0.1: {} - /require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: ">=0.10.0" } - dev: true + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: ">=0.10.0" } - dev: true + require-from-string@2.0.2: {} - /require-main-filename@2.0.0: - resolution: - { - integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, - } - dev: true + require-main-filename@2.0.0: {} - /resolve-alpn@1.2.1: - resolution: - { - integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, - } - dev: true + resolve-alpn@1.2.1: {} - /resolve-dir@1.0.1: - resolution: - { - integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, - } - engines: { node: ">=0.10.0" } + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 - dev: true - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } - dev: true + resolve-from@5.0.0: {} - /resolve-global@1.0.0: - resolution: - { - integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==, - } - engines: { node: ">=8" } - requiresBuild: true + resolve-global@1.0.0: dependencies: global-dirs: 0.1.1 - dev: true optional: true - /resolve@1.1.7: - resolution: - { - integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==, - } - dev: false + resolve@1.1.7: {} - /resolve@1.22.8: - resolution: - { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, - } - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /responselike@3.0.0: - resolution: - { - integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==, - } - engines: { node: ">=14.16" } + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: - { - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, - } - engines: { node: ">=8" } + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /restore-cursor@4.0.0: - resolution: - { - integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - dev: true + reusify@1.0.4: {} - /rfdc@1.3.0: - resolution: - { - integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==, - } - dev: true + rfdc@1.3.0: {} - /rgbcolor@1.0.1: - resolution: - { - integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==, - } - engines: { node: ">= 0.8.15" } - dev: false + rgbcolor@1.0.1: {} - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /rimraf@5.0.5: - resolution: - { - integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==, - } - engines: { node: ">=14" } - hasBin: true + rimraf@5.0.5: dependencies: glob: 10.3.10 - dev: true - /rollup-plugin-terser@7.0.2(rollup@2.79.1): - resolution: - { - integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==, - } - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser - peerDependencies: - rollup: ^2.0.0 + rollup-plugin-terser@7.0.2(rollup@2.79.1): dependencies: "@babel/code-frame": 7.23.5 jest-worker: 26.6.2 rollup: 2.79.1 serialize-javascript: 4.0.0 terser: 5.26.0 - dev: true - /rollup@2.79.1: - resolution: - { - integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==, - } - engines: { node: ">=10.0.0" } - hasBin: true + rollup@2.79.1: optionalDependencies: fsevents: 2.3.3 - dev: true - /rollup@4.9.1: - resolution: - { - integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==, - } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } - hasBin: true + rollup@4.9.1: optionalDependencies: "@rollup/rollup-android-arm-eabi": 4.9.1 "@rollup/rollup-android-arm64": 4.9.1 @@ -11531,99 +13955,43 @@ packages: "@rollup/rollup-win32-ia32-msvc": 4.9.1 "@rollup/rollup-win32-x64-msvc": 4.9.1 fsevents: 2.3.3 - dev: true - /run-async@2.4.1: - resolution: - { - integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, - } - engines: { node: ">=0.12.0" } - dev: true + run-async@2.4.1: {} - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@6.6.7: - resolution: - { - integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==, - } - engines: { npm: ">=2.0.0" } + rxjs@6.6.7: dependencies: tslib: 1.14.1 - dev: true - /rxjs@7.8.1: - resolution: - { - integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, - } + rxjs@7.8.1: dependencies: tslib: 2.6.2 - dev: true - /safe-array-concat@1.0.1: - resolution: - { - integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==, - } - engines: { node: ">=0.4" } + safe-array-concat@1.0.1: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: true + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.0: - resolution: - { - integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==, - } + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + safer-buffer@2.1.2: {} - /sax@1.3.0: - resolution: - { - integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==, - } - dev: false + sax@1.3.0: {} - /scope-analyzer@2.1.2: - resolution: - { - integrity: sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==, - } + scope-analyzer@2.1.2: dependencies: array-from: 2.1.1 dash-ast: 2.0.1 @@ -11632,15 +14000,8 @@ packages: es6-symbol: 3.1.3 estree-is-function: 1.0.0 get-assigned-identifiers: 1.2.0 - dev: false - /semantic-release@23.0.2(typescript@5.3.3): - resolution: - { - integrity: sha512-OnVYJ6Xgzwe1x8MKswba7RU9+5djS1MWRTrTn5qsq3xZYpslroZkV9Pt0dA2YcIuieeuSZWJhn+yUWoBUHO5Fw==, - } - engines: { node: ">=20.8.1" } - hasBin: true + semantic-release@23.0.2(typescript@5.3.3): dependencies: "@semantic-release/commit-analyzer": 11.1.0(semantic-release@23.0.2) "@semantic-release/error": 4.0.0 @@ -11674,359 +14035,141 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /semver-diff@4.0.0: - resolution: - { - integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==, - } - engines: { node: ">=12" } + semver-diff@4.0.0: dependencies: semver: 7.6.0 - dev: true - /semver-regex@4.0.5: - resolution: - { - integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==, - } - engines: { node: ">=12" } - dev: true + semver-regex@4.0.5: {} - /semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } - hasBin: true - dev: true + semver@6.3.1: {} - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.6.0: - resolution: - { - integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, - } - engines: { node: ">=10" } - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: true - /serialize-javascript@4.0.0: - resolution: - { - integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, - } + serialize-javascript@4.0.0: dependencies: randombytes: 2.1.0 - dev: true - /set-blocking@2.0.0: - resolution: - { - integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, - } - dev: true + set-blocking@2.0.0: {} - /set-function-length@1.1.1: - resolution: - { - integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, - } - engines: { node: ">= 0.4" } + set-function-length@1.1.1: dependencies: define-data-property: 1.1.1 get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - /set-function-name@2.0.1: - resolution: - { - integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==, - } - engines: { node: ">= 0.4" } + set-function-name@2.0.1: dependencies: define-data-property: 1.1.1 functions-have-names: 1.2.3 has-property-descriptors: 1.0.1 - /shallow-copy@0.0.1: - resolution: - { - integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==, - } - dev: false + shallow-copy@0.0.1: {} - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - dev: true + shebang-regex@3.0.0: {} - /side-channel@1.0.4: - resolution: - { - integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, - } + side-channel@1.0.4: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 object-inspect: 1.13.1 - dev: true - /signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - dev: true + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: ">=14" } - dev: true + signal-exit@4.1.0: {} - /signale@1.4.0: - resolution: - { - integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==, - } - engines: { node: ">=6" } + signale@1.4.0: dependencies: chalk: 2.4.2 figures: 2.0.0 pkg-conf: 2.1.0 - dev: true - /skin-tone@2.0.0: - resolution: - { - integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==, - } - engines: { node: ">=8" } + skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 - dev: true - /slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: ">=8" } - dev: true + slash@3.0.0: {} - /slash@5.1.0: - resolution: - { - integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==, - } - engines: { node: ">=14.16" } - dev: true + slash@5.1.0: {} - /slice-ansi@4.0.0: - resolution: - { - integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, - } - engines: { node: ">=10" } + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - dev: true - /slice-ansi@5.0.0: - resolution: - { - integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, - } - engines: { node: ">=12" } + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /slice-ansi@7.1.0: - resolution: - { - integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==, - } - engines: { node: ">=18" } + slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - dev: true - /source-map-js@1.0.2: - resolution: - { - integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, - } - engines: { node: ">=0.10.0" } + source-map-js@1.0.2: {} - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map@0.1.43: - resolution: - { - integrity: sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==, - } - engines: { node: ">=0.8.0" } - requiresBuild: true + source-map@0.1.43: dependencies: amdefine: 1.0.1 - dev: false optional: true - /source-map@0.5.7: - resolution: - { - integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, - } - engines: { node: ">=0.10.0" } - dev: false + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } + source-map@0.6.1: {} - /source-map@0.8.0-beta.0: - resolution: - { - integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, - } - engines: { node: ">= 8" } + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: true - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead + sourcemap-codec@1.4.8: {} - /spawn-error-forwarder@1.0.0: - resolution: - { - integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==, - } - dev: true + spawn-error-forwarder@1.0.0: {} - /spdx-correct@3.2.0: - resolution: - { - integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, - } + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.16 - dev: true - /spdx-exceptions@2.3.0: - resolution: - { - integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==, - } - dev: true + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - } + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.16 - dev: true - /spdx-license-ids@3.0.16: - resolution: - { - integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==, - } - dev: true + spdx-license-ids@3.0.16: {} - /split2@1.0.0: - resolution: - { - integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==, - } + split2@1.0.0: dependencies: through2: 2.0.5 - dev: true - /split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: ">= 10.x" } - dev: true + split2@4.2.0: {} - /stackblur-canvas@2.6.0: - resolution: - { - integrity: sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==, - } - engines: { node: ">=0.1.14" } - dev: false + stackblur-canvas@2.6.0: {} - /static-eval@2.1.0: - resolution: - { - integrity: sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==, - } + static-eval@2.1.0: dependencies: escodegen: 1.14.3 - dev: false - /static-module@3.0.4: - resolution: - { - integrity: sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==, - } + static-module@3.0.4: dependencies: acorn-node: 1.8.2 concat-stream: 1.6.2 @@ -12042,74 +14185,35 @@ packages: shallow-copy: 0.0.1 static-eval: 2.1.0 through2: 2.0.5 - dev: false - /stencil-wormhole@3.4.1: - resolution: - { - integrity: sha512-ppYTcWTJnIl4ZAKwF39LTA9f/ypHfbVefsHdN2hpMQGrR57wt1TieZo9tlCM/r1Y4SFiZ5yz/cjho564C921Xw==, - } - dev: false + stencil-wormhole@3.4.1: {} - /stream-combiner2@1.1.1: - resolution: - { - integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==, - } + stream-combiner2@1.1.1: dependencies: duplexer2: 0.1.4 readable-stream: 2.3.8 - dev: true - /string-argv@0.3.2: - resolution: - { - integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, - } - engines: { node: ">=0.6.19" } - dev: true + string-argv@0.3.2: {} - /string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: ">=8" } + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: ">=12" } + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true - /string-width@7.0.0: - resolution: - { - integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==, - } - engines: { node: ">=18" } + string-width@7.0.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: true - /string.prototype.matchall@4.0.10: - resolution: - { - integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==, - } + string.prototype.matchall@4.0.10: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 @@ -12120,200 +14224,79 @@ packages: regexp.prototype.flags: 1.5.1 set-function-name: 2.0.1 side-channel: 1.0.4 - dev: true - /string.prototype.trim@1.2.8: - resolution: - { - integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==, - } - engines: { node: ">= 0.4" } + string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /string.prototype.trimend@1.0.7: - resolution: - { - integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==, - } + string.prototype.trimend@1.0.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /string.prototype.trimstart@1.0.7: - resolution: - { - integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==, - } + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: true - /string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: true - /stringify-object@3.3.0: - resolution: - { - integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, - } - engines: { node: ">=4" } + stringify-object@3.3.0: dependencies: get-own-enumerable-property-symbols: 3.0.2 is-obj: 1.0.1 is-regexp: 1.0.0 - dev: true - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: true - /strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: ">=12" } + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: true - /strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: ">=4" } - dev: true + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - } - engines: { node: ">=8" } - dev: true + strip-bom@4.0.0: {} - /strip-comments@2.0.1: - resolution: - { - integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==, - } - engines: { node: ">=10" } - dev: true + strip-comments@2.0.1: {} - /strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: ">=6" } - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: - { - integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, - } - engines: { node: ">=12" } - dev: true + strip-final-newline@3.0.0: {} - /strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: ">=0.10.0" } - dev: true + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: ">=8" } - dev: true + strip-json-comments@3.1.1: {} - /style-mod@4.1.0: - resolution: - { - integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, - } - dev: false + style-mod@4.1.0: {} - /stylehacks@6.0.2(postcss@8.4.35): - resolution: - { - integrity: sha512-00zvJGnCu64EpMjX8b5iCZ3us2Ptyw8+toEkb92VdmkEaRaSGBNKAoK6aWZckhXxmQP8zWiTaFaiMGIU8Ve8sg==, - } - engines: { node: ^14 || ^16 || >=18.0 } - peerDependencies: - postcss: ^8.4.31 + stylehacks@6.0.2(postcss@8.4.35): dependencies: browserslist: 4.22.2 postcss: 8.4.35 postcss-selector-parser: 6.0.15 - dev: true - /stylelint-config-recommended@14.0.0(stylelint@16.2.1): - resolution: - { - integrity: sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==, - } - engines: { node: ">=18.12.0" } - peerDependencies: - stylelint: ^16.0.0 + stylelint-config-recommended@14.0.0(stylelint@16.2.1): dependencies: stylelint: 16.2.1(typescript@5.3.3) - dev: true - /stylelint-config-standard@36.0.0(stylelint@16.2.1): - resolution: - { - integrity: sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==, - } - engines: { node: ">=18.12.0" } - peerDependencies: - stylelint: ^16.1.0 + stylelint-config-standard@36.0.0(stylelint@16.2.1): dependencies: stylelint: 16.2.1(typescript@5.3.3) stylelint-config-recommended: 14.0.0(stylelint@16.2.1) - dev: true - /stylelint@16.2.1(typescript@5.3.3): - resolution: - { - integrity: sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA==, - } - engines: { node: ">=18.12.0" } - hasBin: true + stylelint@16.2.1(typescript@5.3.3): dependencies: "@csstools/css-parser-algorithms": 2.5.0(@csstools/css-tokenizer@2.2.3) "@csstools/css-tokenizer": 2.2.3 @@ -12356,15 +14339,8 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /sucrase@3.35.0: - resolution: - { - integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, - } - engines: { node: ">=16 || 14 >=14.17" } - hasBin: true + sucrase@3.35.0: dependencies: "@jridgewell/gen-mapping": 0.3.3 commander: 4.1.1 @@ -12373,60 +14349,25 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: true - /supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: ">=4" } + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: true - /supports-hyperlinks@3.0.0: - resolution: - { - integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==, - } - engines: { node: ">=14.18" } + supports-hyperlinks@3.0.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } + supports-preserve-symlinks-flag@1.0.0: {} - /svg-tags@1.0.0: - resolution: - { - integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, - } - dev: true + svg-tags@1.0.0: {} - /svgo@3.2.0: - resolution: - { - integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==, - } - engines: { node: ">=14.0.0" } - hasBin: true + svgo@3.2.0: dependencies: "@trysound/sax": 0.2.0 commander: 7.2.0 @@ -12435,40 +14376,21 @@ packages: css-what: 6.1.0 csso: 5.0.5 picocolors: 1.0.0 - dev: true - /synckit@0.8.8: - resolution: - { - integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + synckit@0.8.8: dependencies: "@pkgr/core": 0.1.1 tslib: 2.6.2 - dev: true - /table@6.8.1: - resolution: - { - integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==, - } - engines: { node: ">=10.0.0" } + table@6.8.1: dependencies: ajv: 8.12.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /tailwindcss@3.4.1: - resolution: - { - integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==, - } - engines: { node: ">=14.0.0" } - hasBin: true + tailwindcss@3.4.1: dependencies: "@alloc/quick-lru": 5.2.0 arg: 5.0.2 @@ -12494,601 +14416,221 @@ packages: sucrase: 3.35.0 transitivePeerDependencies: - ts-node - dev: true - /temp-dir@2.0.0: - resolution: - { - integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, - } - engines: { node: ">=8" } - dev: true + temp-dir@2.0.0: {} - /temp-dir@3.0.0: - resolution: - { - integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==, - } - engines: { node: ">=14.16" } - dev: true + temp-dir@3.0.0: {} - /tempy@0.6.0: - resolution: - { - integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==, - } - engines: { node: ">=10" } + tempy@0.6.0: dependencies: is-stream: 2.0.1 temp-dir: 2.0.0 type-fest: 0.16.0 unique-string: 2.0.0 - dev: true - /tempy@3.1.0: - resolution: - { - integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==, - } - engines: { node: ">=14.16" } + tempy@3.1.0: dependencies: is-stream: 3.0.0 temp-dir: 3.0.0 type-fest: 2.19.0 unique-string: 3.0.0 - dev: true - /terser@5.26.0: - resolution: - { - integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==, - } - engines: { node: ">=10" } - hasBin: true + terser@5.26.0: dependencies: "@jridgewell/source-map": 0.3.5 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /text-extensions@2.4.0: - resolution: - { - integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==, - } - engines: { node: ">=8" } - dev: true + text-extensions@2.4.0: {} - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - dev: true + text-table@0.2.0: {} - /thenby@1.3.4: - resolution: - { - integrity: sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==, - } - dev: true + thenby@1.3.4: {} - /thenify-all@1.6.0: - resolution: - { - integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, - } - engines: { node: ">=0.8" } + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: true - /thenify@3.3.1: - resolution: - { - integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, - } + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: true - /through2@2.0.5: - resolution: - { - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, - } + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - /through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } + through@2.3.8: {} - /tiny-inflate@1.0.3: - resolution: - { - integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==, - } - dev: false + tiny-inflate@1.0.3: {} - /tinyqueue@2.0.3: - resolution: - { - integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==, - } - dev: false + tinyqueue@2.0.3: {} - /tmp@0.0.33: - resolution: - { - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, - } - engines: { node: ">=0.6.0" } + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: ">=4" } - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: true + tr46@0.0.3: {} - /tr46@1.0.1: - resolution: - { - integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, - } + tr46@1.0.1: dependencies: punycode: 2.3.1 - dev: true - /traverse@0.6.8: - resolution: - { - integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==, - } - engines: { node: ">= 0.4" } - dev: true + traverse@0.6.8: {} - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: - { - integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, - } - engines: { node: ">=16.13.0" } - peerDependencies: - typescript: ">=4.2.0" + ts-api-utils@1.0.3(typescript@5.3.3): dependencies: typescript: 5.3.3 - dev: true - /ts-interface-checker@0.1.13: - resolution: - { - integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, - } - dev: true + ts-interface-checker@0.1.13: {} - /tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } - dev: true + tslib@1.14.1: {} - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } + tslib@2.6.2: {} - /type-check@0.3.2: - resolution: - { - integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, - } - engines: { node: ">= 0.8.0" } + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 - dev: false - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-fest@0.16.0: - resolution: - { - integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, - } - engines: { node: ">=10" } - dev: true + type-fest@0.16.0: {} - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: - { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, - } - engines: { node: ">=10" } - dev: true + type-fest@0.21.3: {} - /type-fest@1.4.0: - resolution: - { - integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, - } - engines: { node: ">=10" } - dev: true + type-fest@1.4.0: {} - /type-fest@2.19.0: - resolution: - { - integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, - } - engines: { node: ">=12.20" } - dev: true + type-fest@2.19.0: {} - /type-fest@3.13.1: - resolution: - { - integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==, - } - engines: { node: ">=14.16" } - dev: true + type-fest@3.13.1: {} - /type-fest@4.9.0: - resolution: - { - integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==, - } - engines: { node: ">=16" } - dev: true + type-fest@4.9.0: {} - /type@1.2.0: - resolution: - { - integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, - } - dev: false + type@1.2.0: {} - /type@2.7.2: - resolution: - { - integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, - } - dev: false + type@2.7.2: {} - /typed-array-buffer@1.0.0: - resolution: - { - integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==, - } - engines: { node: ">= 0.4" } + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: true - /typed-array-byte-length@1.0.0: - resolution: - { - integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==, - } - engines: { node: ">= 0.4" } + typed-array-byte-length@1.0.0: dependencies: call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true - /typed-array-byte-offset@1.0.0: - resolution: - { - integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==, - } - engines: { node: ">= 0.4" } + typed-array-byte-offset@1.0.0: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true - /typed-array-length@1.0.4: - resolution: - { - integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==, - } + typed-array-length@1.0.4: dependencies: call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 - dev: true - /typedarray@0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } - dev: false + typedarray@0.0.6: {} - /typescript@5.3.3: - resolution: - { - integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, - } - engines: { node: ">=14.17" } - hasBin: true - dev: true + typescript@5.3.3: {} - /uglify-js@3.17.4: - resolution: - { - integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==, - } - engines: { node: ">=0.8.0" } - hasBin: true - requiresBuild: true - dev: true + uglify-js@3.17.4: optional: true - /unbox-primitive@1.0.2: - resolution: - { - integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, - } + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } - requiresBuild: true - dev: true + undici-types@5.26.5: {} - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: - { - integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, - } - engines: { node: ">=4" } - dev: true + unicode-canonical-property-names-ecmascript@2.0.0: {} - /unicode-emoji-modifier-base@1.0.0: - resolution: - { - integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==, - } - engines: { node: ">=4" } - dev: true + unicode-emoji-modifier-base@1.0.0: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: - { - integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, - } - engines: { node: ">=4" } + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - dev: true - /unicode-match-property-value-ecmascript@2.1.0: - resolution: - { - integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==, - } - engines: { node: ">=4" } - dev: true + unicode-match-property-value-ecmascript@2.1.0: {} - /unicode-properties@1.4.1: - resolution: - { - integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==, - } + unicode-properties@1.4.1: dependencies: base64-js: 1.5.1 unicode-trie: 2.0.0 - dev: false - /unicode-property-aliases-ecmascript@2.1.0: - resolution: - { - integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, - } - engines: { node: ">=4" } - dev: true + unicode-property-aliases-ecmascript@2.1.0: {} - /unicode-trie@2.0.0: - resolution: - { - integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==, - } + unicode-trie@2.0.0: dependencies: pako: 0.2.9 tiny-inflate: 1.0.3 - dev: false - /unicorn-magic@0.1.0: - resolution: - { - integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, - } - engines: { node: ">=18" } - dev: true + unicorn-magic@0.1.0: {} - /unique-string@2.0.0: - resolution: - { - integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, - } - engines: { node: ">=8" } + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 - dev: true - /unique-string@3.0.0: - resolution: - { - integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==, - } - engines: { node: ">=12" } + unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 - dev: true - /universal-user-agent@6.0.1: - resolution: - { - integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, - } - dev: true + universal-user-agent@6.0.1: {} - /universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } - dev: true + universalify@2.0.1: {} - /upath@1.2.0: - resolution: - { - integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, - } - engines: { node: ">=4" } - dev: true + upath@1.2.0: {} - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: - { - integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, - } - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" + update-browserslist-db@1.0.13(browserslist@4.22.2): dependencies: browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 - dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: - { - integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, - } - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.1 picocolors: 1.0.0 - dev: true - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /url-join@4.0.1: - resolution: - { - integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==, - } - dev: true + url-join@4.0.1: {} - /url-join@5.0.0: - resolution: - { - integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true + url-join@5.0.0: {} - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + util-deprecate@1.0.2: {} - /validate-npm-package-license@3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - } + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /vite-plugin-pwa@0.19.2(vite@5.1.4)(workbox-build@7.0.0)(workbox-window@7.0.0): - resolution: - { - integrity: sha512-LSQJFPxCAQYbRuSyc9EbRLRqLpaBA9onIZuQFomfUYjWSgHuQLonahetDlPSC9zsxmkSEhQH8dXZN8yL978h3w==, - } - engines: { node: ">=16.0.0" } - peerDependencies: - "@vite-pwa/assets-generator": ^0.2.4 - vite: ^3.1.0 || ^4.0.0 || ^5.0.0 - workbox-build: ^7.0.0 - workbox-window: ^7.0.0 - peerDependenciesMeta: - "@vite-pwa/assets-generator": - optional: true + vite-plugin-pwa@0.19.2(vite@5.1.4)(workbox-build@7.0.0)(workbox-window@7.0.0): dependencies: debug: 4.3.4 fast-glob: 3.3.2 @@ -13098,38 +14640,8 @@ packages: workbox-window: 7.0.0 transitivePeerDependencies: - supports-color - dev: true - /vite@5.1.4(@types/node@20.10.5): - resolution: - { - integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==, - } - engines: { node: ^18.0.0 || >=20.0.0 } - hasBin: true - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.1.4(@types/node@20.10.5): dependencies: "@types/node": 20.10.5 esbuild: 0.19.10 @@ -13137,160 +14649,70 @@ packages: rollup: 4.9.1 optionalDependencies: fsevents: 2.3.3 - dev: true - /w3c-keyname@2.2.8: - resolution: - { - integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, - } - dev: false + w3c-keyname@2.2.8: {} - /wavesurfer.js@7.7.3: - resolution: - { - integrity: sha512-TC7cQb0RVggtNC+Dl05gcnhSFL5U+fww3ZYJUuqgfR+r9oY+bh/hChCipDFDjs5cWtuek3GEtsPXWa93a9XYxw==, - } - dev: false + wavesurfer.js@7.7.3: {} - /wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - } + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } - dev: true + webidl-conversions@3.0.1: {} - /webidl-conversions@4.0.2: - resolution: - { - integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, - } - dev: true + webidl-conversions@4.0.2: {} - /whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true - /whatwg-url@7.1.0: - resolution: - { - integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, - } + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true - /which-boxed-primitive@1.0.2: - resolution: - { - integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, - } + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-module@2.0.1: - resolution: - { - integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, - } - dev: true + which-module@2.0.1: {} - /which-typed-array@1.1.13: - resolution: - { - integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==, - } - engines: { node: ">= 0.4" } + which-typed-array@1.1.13: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: true - /which@1.3.1: - resolution: - { - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, - } - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: ">=0.10.0" } + word-wrap@1.2.5: {} - /wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } - dev: true + wordwrap@1.0.0: {} - /workbox-background-sync@7.0.0: - resolution: - { - integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==, - } + workbox-background-sync@7.0.0: dependencies: idb: 7.1.1 workbox-core: 7.0.0 - dev: true - /workbox-broadcast-update@7.0.0: - resolution: - { - integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==, - } + workbox-broadcast-update@7.0.0: dependencies: workbox-core: 7.0.0 - dev: true - /workbox-build@7.0.0: - resolution: - { - integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==, - } - engines: { node: ">=16.0.0" } + workbox-build@7.0.0: dependencies: "@apideck/better-ajv-errors": 0.3.6(ajv@8.12.0) "@babel/core": 7.23.6 @@ -13332,80 +14754,40 @@ packages: transitivePeerDependencies: - "@types/babel__core" - supports-color - dev: true - /workbox-cacheable-response@7.0.0: - resolution: - { - integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==, - } + workbox-cacheable-response@7.0.0: dependencies: workbox-core: 7.0.0 - dev: true - /workbox-core@7.0.0: - resolution: - { - integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==, - } - dev: true + workbox-core@7.0.0: {} - /workbox-expiration@7.0.0: - resolution: - { - integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==, - } + workbox-expiration@7.0.0: dependencies: idb: 7.1.1 workbox-core: 7.0.0 - dev: true - /workbox-google-analytics@7.0.0: - resolution: - { - integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==, - } + workbox-google-analytics@7.0.0: dependencies: workbox-background-sync: 7.0.0 workbox-core: 7.0.0 workbox-routing: 7.0.0 workbox-strategies: 7.0.0 - dev: true - /workbox-navigation-preload@7.0.0: - resolution: - { - integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==, - } + workbox-navigation-preload@7.0.0: dependencies: workbox-core: 7.0.0 - dev: true - /workbox-precaching@7.0.0: - resolution: - { - integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==, - } + workbox-precaching@7.0.0: dependencies: workbox-core: 7.0.0 workbox-routing: 7.0.0 workbox-strategies: 7.0.0 - dev: true - /workbox-range-requests@7.0.0: - resolution: - { - integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==, - } + workbox-range-requests@7.0.0: dependencies: workbox-core: 7.0.0 - dev: true - /workbox-recipes@7.0.0: - resolution: - { - integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==, - } + workbox-recipes@7.0.0: dependencies: workbox-cacheable-response: 7.0.0 workbox-core: 7.0.0 @@ -13413,223 +14795,90 @@ packages: workbox-precaching: 7.0.0 workbox-routing: 7.0.0 workbox-strategies: 7.0.0 - dev: true - /workbox-routing@7.0.0: - resolution: - { - integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==, - } + workbox-routing@7.0.0: dependencies: workbox-core: 7.0.0 - dev: true - /workbox-strategies@7.0.0: - resolution: - { - integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==, - } + workbox-strategies@7.0.0: dependencies: workbox-core: 7.0.0 - dev: true - /workbox-streams@7.0.0: - resolution: - { - integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==, - } + workbox-streams@7.0.0: dependencies: workbox-core: 7.0.0 workbox-routing: 7.0.0 - dev: true - /workbox-sw@7.0.0: - resolution: - { - integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==, - } - dev: true + workbox-sw@7.0.0: {} - /workbox-window@7.0.0: - resolution: - { - integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==, - } + workbox-window@7.0.0: dependencies: "@types/trusted-types": 2.0.7 workbox-core: 7.0.0 - dev: true - /wrap-ansi@6.2.0: - resolution: - { - integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, - } - engines: { node: ">=8" } + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: ">=10" } + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: ">=12" } + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true - /wrap-ansi@9.0.0: - resolution: - { - integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, - } - engines: { node: ">=18" } + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 string-width: 7.0.0 strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - dev: true + wrappy@1.0.2: {} - /write-file-atomic@5.0.1: - resolution: - { - integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 signal-exit: 4.1.0 - dev: true - /xml-formatter@3.6.2: - resolution: - { - integrity: sha512-enWhevZNOwffZFUhzl1WMcha8lFLZUgJ7NzFs5Ug4ZOFCoNheGYXz1J9Iz/e+cTn9rCkuT1GwTacz+YlmFHOGw==, - } - engines: { node: ">= 14" } + xml-formatter@3.6.2: dependencies: xml-parser-xo: 4.1.1 - dev: false - /xml-parser-xo@4.1.1: - resolution: - { - integrity: sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==, - } - engines: { node: ">= 14" } - dev: false + xml-parser-xo@4.1.1: {} - /xmldoc@1.3.0: - resolution: - { - integrity: sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==, - } + xmldoc@1.3.0: dependencies: sax: 1.3.0 - dev: false - /xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: ">=0.4" } + xtend@4.0.2: {} - /y18n@4.0.3: - resolution: - { - integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, - } - dev: true + y18n@4.0.3: {} - /y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: ">=10" } - dev: true + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } - dev: true + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - dev: true + yallist@4.0.0: {} - /yaml@2.3.4: - resolution: - { - integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, - } - engines: { node: ">= 14" } - dev: true + yaml@2.3.4: {} - /yargs-parser@18.1.3: - resolution: - { - integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, - } - engines: { node: ">=6" } + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - dev: true - /yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: ">=10" } - dev: true + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: ">=12" } - dev: true + yargs-parser@21.1.1: {} - /yargs@15.4.1: - resolution: - { - integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, - } - engines: { node: ">=8" } + yargs@15.4.1: dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -13642,14 +14891,8 @@ packages: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - dev: true - /yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: ">=10" } + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -13658,14 +14901,8 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - } - engines: { node: ">=12" } + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -13674,20 +14911,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - dev: true + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: - { - integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, - } - engines: { node: ">=12.20" } - dev: true + yocto-queue@1.0.0: {} diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 526574ad..717a152c 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -117,6 +117,7 @@ module.exports = { cards: "repeat(auto-fill, minmax(14rem, 1fr))", latestEpisodes: "repeat(5, 1fr)", colorButtons: "repeat(auto-fill, minmax(4rem, 1fr))", + platforms: "repeat(auto-fill, minmax(18rem, 1fr))", }, gridTemplateRows: { admin: "40px 1fr", diff --git a/themes/cp_admin/podcast/platforms.php b/themes/cp_admin/podcast/platforms.php index 0e3eaee6..e06a2d0f 100644 --- a/themes/cp_admin/podcast/platforms.php +++ b/themes/cp_admin/podcast/platforms.php @@ -14,9 +14,10 @@ section('content') ?> - + +